diff --git a/CMakeLists.txt b/CMakeLists.txt index 4267de2fb9..70b7ed5679 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,13 +27,13 @@ option(SLIC3R_STATIC "Compile PrusaSlicer with static libraries (Boost, TBB, option(SLIC3R_GUI "Compile PrusaSlicer with GUI components (OpenGL, wxWidgets)" 1) option(SLIC3R_FHS "Assume PrusaSlicer is to be installed in a FHS directory structure" 0) option(SLIC3R_WX_STABLE "Build against wxWidgets stable (3.0) as oppsed to dev (3.1) on Linux" 0) -option(SLIC3R_PROFILE "Compile PrusaSlicer with an invasive Shiny profiler" 0) option(SLIC3R_PCH "Use precompiled headers" 1) option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1) option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1) option(SLIC3R_PERL_XS "Compile XS Perl module and enable Perl unit and integration tests" 0) option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0) option(SLIC3R_UBSAN "Enable UBSan on Clang and GCC" 0) +option(SLIC3R_ENABLE_FORMAT_STEP "Enable compilation of STEP file support" 1) # If SLIC3R_FHS is 1 -> SLIC3R_DESKTOP_INTEGRATION is always 0, othrewise variable. CMAKE_DEPENDENT_OPTION(SLIC3R_DESKTOP_INTEGRATION "Allow perfoming desktop integration during runtime" 1 "NOT SLIC3R_FHS" 0) @@ -327,25 +327,6 @@ 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) -endif () - -# Disable optimization even with debugging on. -if (0) - message(STATUS "Perl compiled without optimization. Disabling optimization for the PrusaSlicer build.") - message("Old CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}") - message("Old CMAKE_CXX_FLAGS_RELWITHDEBINFO: ${CMAKE_CXX_FLAGS_RELEASE}") - message("Old CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS_RELEASE}") - set(CMAKE_CXX_FLAGS_RELEASE "/MD /Od /Zi /EHsc /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_C_FLAGS_RELEASE "/MD /Od /Zi /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "/MD /Od /Zi /EHsc /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "/MD /Od /Zi /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_CXX_FLAGS "/MD /Od /Zi /EHsc /DWIN32 /DTBB_USE_ASSERT") - set(CMAKE_C_FLAGS "/MD /Od /Zi /DWIN32 /DTBB_USE_ASSERT") -endif() - # Find and configure boost if(SLIC3R_STATIC) # Use static boost libraries. diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index d129ff1c2a..b00f85ba70 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -75,6 +75,9 @@ function(prusaslicer_add_cmake_project projectname) if (MSVC) set(_gen CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}") set(_build_j "/m") + if (${projectname} STREQUAL "OCCT") + set(_build_j "/m:1") + endif () endif () ExternalProject_Add( @@ -188,7 +191,9 @@ endif () include(JPEG/JPEG.cmake) include(TIFF/TIFF.cmake) +include(NanoSVG/NanoSVG.cmake) include(wxWidgets/wxWidgets.cmake) +include(OCCT/OCCT.cmake) set(_dep_list dep_Boost @@ -201,6 +206,7 @@ set(_dep_list dep_OpenCSG dep_CGAL dep_Qhull + dep_OCCT ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} diff --git a/deps/GLEW/GLEW.cmake b/deps/GLEW/GLEW.cmake index ae2832577a..76ffc0a8d6 100644 --- a/deps/GLEW/GLEW.cmake +++ b/deps/GLEW/GLEW.cmake @@ -4,8 +4,8 @@ find_package(OpenGL QUIET REQUIRED) prusaslicer_add_cmake_project( GLEW - URL https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0.zip - URL_HASH SHA256=2700383d4de2455f06114fbaf872684f15529d4bdc5cdea69b5fb0e9aa7763f1 + URL https://sourceforge.net/projects/glew/files/glew/2.2.0/glew-2.2.0.zip + URL_HASH SHA256=a9046a913774395a095edcc0b0ac2d81c3aacca61787b39839b941e9be14e0d4 SOURCE_SUBDIR build/cmake CMAKE_ARGS -DBUILD_UTILS=OFF diff --git a/deps/NanoSVG/NanoSVG.cmake b/deps/NanoSVG/NanoSVG.cmake new file mode 100644 index 0000000000..9623d32260 --- /dev/null +++ b/deps/NanoSVG/NanoSVG.cmake @@ -0,0 +1,4 @@ +prusaslicer_add_cmake_project(NanoSVG + URL https://github.com/memononen/nanosvg/archive/4c8f0139b62c6e7faa3b67ce1fbe6e63590ed148.zip + URL_HASH SHA256=584e084af1a75bf633f79753ce2f6f6ec8686002ca27f35f1037c25675fecfb6 +) \ No newline at end of file diff --git a/deps/OCCT/OCCT.cmake b/deps/OCCT/OCCT.cmake new file mode 100644 index 0000000000..efb529a5aa --- /dev/null +++ b/deps/OCCT/OCCT.cmake @@ -0,0 +1,27 @@ +prusaslicer_add_cmake_project(OCCT + #LMBBS: changed version to 7.6.2 + URL https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V7_6_2.zip + URL_HASH SHA256=c696b923593e8c18d059709717dbf155b3e72fdd283c8522047a790ec3a432c5 + + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/occt_toolkit.cmake ./adm/cmake/ + CMAKE_ARGS + -DINSTALL_DIR_LAYOUT=Unix # LMBBS + -DBUILD_LIBRARY_TYPE=Static + -DUSE_TK=OFF + -DUSE_TBB=OFF + -DUSE_FREETYPE=OFF + -DUSE_FFMPEG=OFF + -DUSE_VTK=OFF + -DUSE_FREETYPE=OFF + -DBUILD_MODULE_ApplicationFramework=OFF + #-DBUILD_MODULE_DataExchange=OFF + -DBUILD_MODULE_Draw=OFF + -DBUILD_MODULE_FoundationClasses=OFF + -DBUILD_MODULE_ModelingAlgorithms=OFF + -DBUILD_MODULE_ModelingData=OFF + -DBUILD_MODULE_Visualization=OFF +) + +if (MSVC) + add_debug_dep(dep_OCCT) +endif () diff --git a/deps/OCCT/occt_toolkit.cmake b/deps/OCCT/occt_toolkit.cmake new file mode 100644 index 0000000000..1b77eb1b29 --- /dev/null +++ b/deps/OCCT/occt_toolkit.cmake @@ -0,0 +1,453 @@ +# script for each OCCT toolkit + +# filling some variables by default values(src) or using custom(tools, samples) +set (RELATIVE_SOURCES_DIR "${RELATIVE_DIR}") +if ("${RELATIVE_SOURCES_DIR}" STREQUAL "") + #if it is not defined, use default directory + set (RELATIVE_SOURCES_DIR "src") +endif() + +set (OCC_MODULES_LIST "${MODULES_LIST}") +if ("${OCC_MODULES_LIST}" STREQUAL "") + set (OCC_MODULES_LIST ${OCCT_MODULES}) +endif() + +set (OCC_TARGET_FOLDER "${TARGET_FOLDER}") +if ("${OCC_TARGET_FOLDER}" STREQUAL "") + set (OCC_TARGET_FOLDER "Modules") +endif() + +set (OCCT_TOOLKITS_NAME_SUFFIX "${TOOLKITS_NAME_SUFFIX}") +if ("${OCCT_TOOLKITS_NAME_SUFFIX}" STREQUAL "") + set (OCCT_TOOLKITS_NAME_SUFFIX "TOOLKITS") +endif() + +# parse PACKAGES file +FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/PACKAGES" USED_PACKAGES) +if ("${USED_PACKAGES}" STREQUAL "") + set (USED_PACKAGES ${PROJECT_NAME}) +endif() + +if (USE_QT) + # Qt dependencies + OCCT_INCLUDE_CMAKE_FILE (adm/cmake/qt_macro) + FIND_QT_PACKAGE(PROJECT_LIBRARIES_DEBUG PROJECT_LIBRARIES_RELEASE PROJECT_INCLUDES) + include_directories("${PROJECT_INCLUDES}") +endif(USE_QT) + +set (PRECOMPILED_DEFS) + +if (NOT BUILD_SHARED_LIBS) + list (APPEND PRECOMPILED_DEFS "-DOCCT_NO_PLUGINS") + if (WIN32 AND NOT EXECUTABLE_PROJECT) + list (APPEND PRECOMPILED_DEFS "-DOCCT_STATIC_BUILD") + endif() +endif() + +# Get all used packages from toolkit +UNSET(RESOURCE_FILES) +foreach (OCCT_PACKAGE ${USED_PACKAGES}) + + #remove part after "/" in the OCCT_PACKAGE variable if exists + string (FIND "${OCCT_PACKAGE}" "/" _index) + if (_index GREATER -1) + math (EXPR _index "${_index}") + string (SUBSTRING "${OCCT_PACKAGE}" 0 ${_index} OCCT_PACKAGE_NAME) + else() + set (OCCT_PACKAGE_NAME "${OCCT_PACKAGE}") + endif() + + if (WIN32) + list (APPEND PRECOMPILED_DEFS "-D__${OCCT_PACKAGE_NAME}_DLL") + endif() + + set (SOURCE_FILES) + set (HEADER_FILES) + + # Generate Flex and Bison files + if (${BUILD_YACCLEX}) + # flex files + OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]lex" SOURCE_FILES_FLEX) + list (LENGTH SOURCE_FILES_FLEX SOURCE_FILES_FLEX_LEN) + + # bison files + OCCT_ORIGIN_AND_PATCHED_FILES ("${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}" "*[.]yacc" SOURCE_FILES_BISON) + list (LENGTH SOURCE_FILES_BISON SOURCE_FILES_BISON_LEN) + + if (${SOURCE_FILES_FLEX_LEN} EQUAL ${SOURCE_FILES_BISON_LEN} AND NOT ${SOURCE_FILES_FLEX_LEN} EQUAL 0) + + list (SORT SOURCE_FILES_FLEX) + list (SORT SOURCE_FILES_BISON) + + math (EXPR SOURCE_FILES_FLEX_LEN "${SOURCE_FILES_FLEX_LEN} - 1") + foreach (FLEX_FILE_INDEX RANGE ${SOURCE_FILES_FLEX_LEN}) + + list (GET SOURCE_FILES_FLEX ${FLEX_FILE_INDEX} CURRENT_FLEX_FILE) + get_filename_component (CURRENT_FLEX_FILE_NAME ${CURRENT_FLEX_FILE} NAME_WE) + + list (GET SOURCE_FILES_BISON ${FLEX_FILE_INDEX} CURRENT_BISON_FILE) + get_filename_component (CURRENT_BISON_FILE_NAME ${CURRENT_BISON_FILE} NAME_WE) + + string (COMPARE EQUAL ${CURRENT_FLEX_FILE_NAME} ${CURRENT_BISON_FILE_NAME} ARE_FILES_EQUAL) + + if (EXISTS "${CURRENT_FLEX_FILE}" AND EXISTS "${CURRENT_BISON_FILE}" AND ${ARE_FILES_EQUAL}) + + # Note: files are generated in original source directory (not in patch!) + set (FLEX_BISON_TARGET_DIR "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}") + + # choose appropriate extension for generated files: "cxx" if source file contains + # instruction to generate C++ code, "c" otherwise + set (BISON_OUTPUT_FILE_EXT "c") + set (FLEX_OUTPUT_FILE_EXT "c") + file (STRINGS "${CURRENT_BISON_FILE}" FILE_BISON_CONTENT) + foreach (FILE_BISON_CONTENT_LINE ${FILE_BISON_CONTENT}) + string (REGEX MATCH "%language \"C\\+\\+\"" CXX_BISON_LANGUAGE_FOUND ${FILE_BISON_CONTENT_LINE}) + if (CXX_BISON_LANGUAGE_FOUND) + set (BISON_OUTPUT_FILE_EXT "cxx") + endif() + endforeach() + file (STRINGS "${CURRENT_FLEX_FILE}" FILE_FLEX_CONTENT) + foreach (FILE_FLEX_CONTENT_LINE ${FILE_FLEX_CONTENT}) + string (REGEX MATCH "%option c\\+\\+" CXX_FLEX_LANGUAGE_FOUND ${FILE_FLEX_CONTENT_LINE}) + if (CXX_FLEX_LANGUAGE_FOUND) + set (FLEX_OUTPUT_FILE_EXT "cxx") + + # install copy of FlexLexer.h locally to allow further building without flex + if (FLEX_INCLUDE_DIR AND EXISTS "${FLEX_INCLUDE_DIR}/FlexLexer.h") + configure_file("${FLEX_INCLUDE_DIR}/FlexLexer.h" "${FLEX_BISON_TARGET_DIR}/FlexLexer.h" @ONLY NEWLINE_STYLE LF) + endif() + endif() + endforeach() + set (BISON_OUTPUT_FILE ${CURRENT_BISON_FILE_NAME}.tab.${BISON_OUTPUT_FILE_EXT}) + set (FLEX_OUTPUT_FILE lex.${CURRENT_FLEX_FILE_NAME}.${FLEX_OUTPUT_FILE_EXT}) + + BISON_TARGET (Parser_${CURRENT_BISON_FILE_NAME} ${CURRENT_BISON_FILE} "${FLEX_BISON_TARGET_DIR}/${BISON_OUTPUT_FILE}" + COMPILE_FLAGS "-p ${CURRENT_BISON_FILE_NAME} -l -M ${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/=") + FLEX_TARGET (Scanner_${CURRENT_FLEX_FILE_NAME} ${CURRENT_FLEX_FILE} "${FLEX_BISON_TARGET_DIR}/${FLEX_OUTPUT_FILE}" + COMPILE_FLAGS "-P${CURRENT_FLEX_FILE_NAME} -L") + ADD_FLEX_BISON_DEPENDENCY (Scanner_${CURRENT_FLEX_FILE_NAME} Parser_${CURRENT_BISON_FILE_NAME}) + + list (APPEND SOURCE_FILES ${BISON_OUTPUT_FILE} ${FLEX_OUTPUT_FILE}) + endif() + endforeach() + endif() + endif() + + # header files + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") + + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") + if(APPLE) + file (STRINGS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") + endif() + else() + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_M REGEX ".+[.]h") + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_LXX REGEX ".+[.]lxx") + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" HEADER_FILES_GXX REGEX ".+[.]gxx") + + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_C REGEX ".+[.]c") + if(APPLE) + file (STRINGS "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/FILES" SOURCE_FILES_M REGEX ".+[.]mm") + endif() + endif() + + list (APPEND HEADER_FILES ${HEADER_FILES_M} ${HEADER_FILES_LXX} ${SOURCE_FILES_GXX}) + list (APPEND SOURCE_FILES ${SOURCE_FILES_C}) + if(APPLE) + list (APPEND SOURCE_FILES ${SOURCE_FILES_M}) + endif() + + foreach(HEADER_FILE ${HEADER_FILES}) + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + list (APPEND USED_INCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + else() + list (APPEND USED_INCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + SOURCE_GROUP ("Header Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${HEADER_FILE}") + endif() + endforeach() + + foreach(SOURCE_FILE ${SOURCE_FILES}) + if (BUILD_PATCH AND EXISTS "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + message (STATUS "Info: consider patched file: ${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + list (APPEND USED_SRCFILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${BUILD_PATCH}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + else() + list (APPEND USED_SRCFILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + SOURCE_GROUP ("Source Files\\${OCCT_PACKAGE_NAME}" FILES "${CMAKE_SOURCE_DIR}/${RELATIVE_SOURCES_DIR}/${OCCT_PACKAGE}/${SOURCE_FILE}") + endif() + endforeach() + + if (USE_QT) + FIND_AND_INSTALL_QT_RESOURCES (${OCCT_PACKAGE} RESOURCE_FILES) + #message("Qt Resource files are: ${QT_RESOURCE_FILES} in ${OCCT_PACKAGE}") + endif(USE_QT) + + #message("Resource files are: ${RESOURCE_FILES} in ${OCCT_PACKAGE}") + foreach(RESOURCE_FILE ${RESOURCE_FILES}) + SOURCE_GROUP ("Resource Files\\${OCCT_PACKAGE_NAME}" FILES "${RESOURCE_FILE}") + endforeach() +endforeach() +string (REGEX REPLACE ";" " " PRECOMPILED_DEFS "${PRECOMPILED_DEFS}") + +set (USED_RCFILE "") +if (MSVC) + set (USED_RCFILE "${CMAKE_BINARY_DIR}/resources/${PROJECT_NAME}.rc") + + if (APPLY_OCCT_PATCH_DIR AND EXISTS "${APPLY_OCCT_PATCH_DIR}/adm/templates/occt_toolkit.rc.in") + configure_file("${APPLY_OCCT_PATCH_DIR}/adm/templates/occt_toolkit.rc.in" "${USED_RCFILE}" @ONLY) + else() + configure_file("${CMAKE_SOURCE_DIR}/adm/templates/occt_toolkit.rc.in" "${USED_RCFILE}" @ONLY) + endif() +endif() + +set (CURRENT_MODULE) +foreach (OCCT_MODULE ${OCC_MODULES_LIST}) + list (FIND ${OCCT_MODULE}_${OCCT_TOOLKITS_NAME_SUFFIX} ${PROJECT_NAME} CURRENT_PROJECT_IS_BUILT) + + if (NOT ${CURRENT_PROJECT_IS_BUILT} EQUAL -1) + set (CURRENT_MODULE ${OCCT_MODULE}) + endif() +endforeach() + +if (MSVC) + OCCT_INSERT_CODE_FOR_TARGET () +endif() + +if (USE_QT) + FIND_AND_WRAP_MOC_FILES("${USED_INCFILES}" "${PROJECT_NAME}_MOC_FILES") + #message("MOC files: ${${PROJECT_NAME}_MOC_FILES}") +endif (USE_QT) + +if (EXECUTABLE_PROJECT) + add_executable (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RESOURCE_FILES} ${${PROJECT_NAME}_MOC_FILES}) + + install (TARGETS ${PROJECT_NAME} + DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}") + + if (EMSCRIPTEN) + install(FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${PROJECT_NAME}.wasm DESTINATION "${INSTALL_DIR_BIN}/${OCCT_INSTALL_BIN_LETTER}") + endif() +else() + add_library (${PROJECT_NAME} ${USED_SRCFILES} ${USED_INCFILES} ${USED_RCFILE} ${RESOURCE_FILES} ${${PROJECT_NAME}_MOC_FILES}) + + if (MSVC) + if (BUILD_FORCE_RelWithDebInfo) + set (aReleasePdbConf "Release") + else() + set (aReleasePdbConf) + endif() + # install (FILES ${CMAKE_BINARY_DIR}/${OS_WITH_BIT}/${COMPILER}/bin\${OCCT_INSTALL_BIN_LETTER}/${PROJECT_NAME}.pdb + # CONFIGURATIONS Debug ${aReleasePdbConf} RelWithDebInfo + # DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}") + endif() + + if (BUILD_SHARED_LIBS AND NOT "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}" STREQUAL "") + set (CMAKE_SHARED_LIBRARY_SUFFIX_DEFAULT ${CMAKE_SHARED_LIBRARY_SUFFIX}) + set (CMAKE_SHARED_LIBRARY_SUFFIX "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}${CMAKE_SHARED_LIBRARY_SUFFIX}") + endif() + + install (TARGETS ${PROJECT_NAME} + EXPORT OpenCASCADE${CURRENT_MODULE}Targets + RUNTIME DESTINATION "${INSTALL_DIR_BIN}\${OCCT_INSTALL_BIN_LETTER}" + ARCHIVE DESTINATION "${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}" + LIBRARY DESTINATION "${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}") + + if (NOT WIN32) + if (BUILD_SHARED_LIBS AND NOT "${BUILD_SHARED_LIBRARY_NAME_POSTFIX}" STREQUAL "") + set (LINK_NAME "${INSTALL_DIR}/${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX_DEFAULT}") + set (LIBRARY_NAME "${INSTALL_DIR}/${INSTALL_DIR_LIB}\${OCCT_INSTALL_BIN_LETTER}/lib${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}") + OCCT_CREATE_SYMLINK_TO_FILE (${LIBRARY_NAME} ${LINK_NAME}) + endif() + endif() +endif() + +if (CURRENT_MODULE) + set_target_properties (${PROJECT_NAME} PROPERTIES FOLDER "${OCC_TARGET_FOLDER}/${CURRENT_MODULE}") + set_target_properties (${PROJECT_NAME} PROPERTIES MODULE "${CURRENT_MODULE}") + if (APPLE) + if (NOT "${INSTALL_NAME_DIR}" STREQUAL "") + set_target_properties (${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "${INSTALL_NAME_DIR}") + endif() + endif() +endif() + +get_property (OCC_VERSION_MAJOR GLOBAL PROPERTY OCC_VERSION_MAJOR) +get_property (OCC_VERSION_MINOR GLOBAL PROPERTY OCC_VERSION_MINOR) +get_property (OCC_VERSION_MAINTENANCE GLOBAL PROPERTY OCC_VERSION_MAINTENANCE) + +if (ANDROID) + # do not append version to the filename + set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}") +else() + set_target_properties (${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "${PRECOMPILED_DEFS}" + SOVERSION "${OCC_VERSION_MAJOR}" + VERSION "${OCC_VERSION_MAJOR}.${OCC_VERSION_MINOR}.${OCC_VERSION_MAINTENANCE}") +endif() + +set (USED_TOOLKITS_BY_CURRENT_PROJECT) +set (USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT) + +# parse EXTERNLIB file +if (CUSTOM_EXTERNLIB) + set (USED_EXTERNLIB_AND_TOOLKITS ${CUSTOM_EXTERNLIB}) +else() + FILE_TO_LIST ("${RELATIVE_SOURCES_DIR}/${PROJECT_NAME}/EXTERNLIB" USED_EXTERNLIB_AND_TOOLKITS) +endif() +foreach (USED_ITEM ${USED_EXTERNLIB_AND_TOOLKITS}) + string (REGEX MATCH "^ *#" COMMENT_FOUND ${USED_ITEM}) + if (NOT COMMENT_FOUND) + string (REGEX MATCH "^TK" TK_FOUND ${USED_ITEM}) + string (REGEX MATCH "^vtk" VTK_FOUND ${USED_ITEM}) + + if (NOT "${TK_FOUND}" STREQUAL "" OR NOT "${VTK_FOUND}" STREQUAL "") + list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT ${USED_ITEM}) + if (NOT "${VTK_FOUND}" STREQUAL "" AND BUILD_SHARED_LIBS AND INSTALL_VTK AND COMMAND OCCT_INSTALL_VTK) + OCCT_INSTALL_VTK(${USED_ITEM}) + endif() + else() + string (REGEX MATCH "^CSF_" CSF_FOUND ${USED_ITEM}) + if ("${CSF_FOUND}" STREQUAL "") + message (STATUS "Info: ${USED_ITEM} from ${PROJECT_NAME} skipped due to it is empty") + else() # get CSF_ value + set (CURRENT_CSF ${${USED_ITEM}}) + if (NOT "x${CURRENT_CSF}" STREQUAL "x") + if ("${CURRENT_CSF}" STREQUAL "CSF_OpenGlLibs") + add_definitions (-DHAVE_OPENGL) + endif() + if ("${CURRENT_CSF}" STREQUAL "CSF_OpenGlesLibs") + add_definitions (-DHAVE_GLES2) + endif() + + set (LIBRARY_FROM_CACHE 0) + separate_arguments (CURRENT_CSF) + foreach (CSF_LIBRARY ${CURRENT_CSF}) + string (TOLOWER "${CSF_LIBRARY}" CSF_LIBRARY) + string (REPLACE "+" "[+]" CSF_LIBRARY "${CSF_LIBRARY}") + string (REPLACE "." "" CSF_LIBRARY "${CSF_LIBRARY}") + get_cmake_property(ALL_CACHE_VARIABLES CACHE_VARIABLES) + string (REGEX MATCHALL "(^|;)3RDPARTY_[^;]+_LIBRARY[^;]*" ALL_CACHE_VARIABLES "${ALL_CACHE_VARIABLES}") + foreach (CACHE_VARIABLE ${ALL_CACHE_VARIABLES}) + set (CURRENT_CACHE_LIBRARY ${${CACHE_VARIABLE}}) + string (TOLOWER "${CACHE_VARIABLE}" CACHE_VARIABLE) + + if (EXISTS "${CURRENT_CACHE_LIBRARY}" AND NOT IS_DIRECTORY "${CURRENT_CACHE_LIBRARY}") + string (REGEX MATCH "_${CSF_LIBRARY}$" IS_ENDING "${CACHE_VARIABLE}") + string (REGEX MATCH "^([a-z]+)" CSF_WO_VERSION "${CSF_LIBRARY}") + string (REGEX MATCH "_${CSF_WO_VERSION}$" IS_ENDING_WO_VERSION "${CACHE_VARIABLE}") + if ("3rdparty_${CSF_LIBRARY}_library" STREQUAL "${CACHE_VARIABLE}" OR + "3rdparty_${CSF_WO_VERSION}_library" STREQUAL "${CACHE_VARIABLE}" OR + NOT "x${IS_ENDING}" STREQUAL "x" OR + NOT "x${IS_ENDING_WO_VERSION}" STREQUAL "x") + list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT "${CURRENT_CACHE_LIBRARY}") + set (LIBRARY_FROM_CACHE 1) + endif() + endif() + endforeach() + endforeach() + + if (NOT ${LIBRARY_FROM_CACHE}) + # prepare a list from a string with whitespaces + separate_arguments (CURRENT_CSF) + list (APPEND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT ${CURRENT_CSF}) + endif() + endif() + endif() + endif() + endif() +endforeach() + +if (APPLE) + list (FIND USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT X11 IS_X11_FOUND) + if (NOT ${IS_X11_FOUND} EQUAL -1) + find_package (X11 COMPONENTS X11) + if (NOT X11_FOUND) + message (STATUS "Warning: X11 is not found. It's required to install The XQuartz project: http://www.xquartz.org") + endif() + endif() +endif() + +# Update list of used VTK libraries if OpenGL2 Rendering BackEnd is used. +# Add VTK_OPENGL2_BACKEND definition. +if("${VTK_RENDERING_BACKEND}" STREQUAL "OpenGL2" OR IS_VTK_9XX) + add_definitions(-DVTK_OPENGL2_BACKEND) + foreach (VTK_EXCLUDE_LIBRARY vtkRenderingOpenGL vtkRenderingFreeTypeOpenGL) + list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "${VTK_EXCLUDE_LIBRARY}" IS_VTK_OPENGL_FOUND) + if (NOT ${IS_VTK_OPENGL_FOUND} EQUAL -1) + list (REMOVE_ITEM USED_TOOLKITS_BY_CURRENT_PROJECT ${VTK_EXCLUDE_LIBRARY}) + if (${VTK_EXCLUDE_LIBRARY} STREQUAL vtkRenderingOpenGL) + list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT vtkRenderingOpenGL2) + if(VTK_MAJOR_VERSION GREATER 6) + list (APPEND USED_TOOLKITS_BY_CURRENT_PROJECT vtkRenderingGL2PSOpenGL2) + endif() + endif() + endif() + endforeach() +else() + if(VTK_MAJOR_VERSION EQUAL 6 AND VTK_MINOR_VERSION GREATER 2 OR VTK_MAJOR_VERSION GREATER 6) + list (FIND USED_TOOLKITS_BY_CURRENT_PROJECT "vtkRenderingFreeTypeOpenGL" IS_VTK_RENDER_FREETYPE_FOUND) + if (NOT ${IS_VTK_RENDER_FREETYPE_FOUND} EQUAL -1) + list (REMOVE_ITEM USED_TOOLKITS_BY_CURRENT_PROJECT "vtkRenderingFreeTypeOpenGL") + endif() + endif() +endif() + +if (BUILD_SHARED_LIBS OR EXECUTABLE_PROJECT) + if(IS_VTK_9XX) + string (REGEX REPLACE "vtk" "VTK::" USED_TOOLKITS_BY_CURRENT_PROJECT "${USED_TOOLKITS_BY_CURRENT_PROJECT}") + endif() + target_link_libraries (${PROJECT_NAME} ${USED_TOOLKITS_BY_CURRENT_PROJECT} ${USED_EXTERNAL_LIBS_BY_CURRENT_PROJECT}) +endif() + +if (USE_QT) + foreach (PROJECT_LIBRARY_DEBUG ${PROJECT_LIBRARIES_DEBUG}) + target_link_libraries (${PROJECT_NAME} debug ${PROJECT_LIBRARY_DEBUG}) + endforeach() + foreach (PROJECT_LIBRARY_RELEASE ${PROJECT_LIBRARIES_RELEASE}) + target_link_libraries (${PROJECT_NAME} optimized ${PROJECT_LIBRARY_RELEASE}) + endforeach() +endif() + +# suppress deprecation warnings inside OCCT itself for old gcc versions with unavailable Standard_DISABLE_DEPRECATION_WARNINGS +if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6.0) + add_definitions("-DOCCT_NO_DEPRECATED") + message (STATUS "Warning: internal deprecation warnings by Standard_DEPRECATED have been disabled due to old gcc version being used") + endif() +endif() + +# use Cotire to accelerate build via usage of precompiled headers +if (BUILD_USE_PCH) + if (WIN32) + # prevent definition of min and max macros through inclusion of Windows.h + # (for cotire builds) + add_definitions("-DNOMINMAX") + # avoid warnings on deprecated names from standard C library (see strsafe.h) + add_definitions("-DSTRSAFE_NO_DEPRECATE") + # avoid "std::Equal1" warning in QANCollection_Stl.cxx in debug mode + # suggesting using msvc "Checked Iterators" + add_definitions("-D_SCL_SECURE_NO_WARNINGS") + endif() + + # Exclude system-provided glext.h. + # These macros are already defined within OpenGl_GlFunctions.hxx, + # however we have to duplicate them here for building TKOpenGl with PCH. + add_definitions("-DGL_GLEXT_LEGACY") + add_definitions("-DGLX_GLXEXT_LEGACY") + + # workaround for old gcc + if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + add_definitions("-D__STDC_CONSTANT_MACROS") + add_definitions("-D__STDC_FORMAT_MACROS") + endif() + + # unity builds are not used since they do not add speed but cause conflicts + # in TKV3d + set_target_properties(${PROJECT_NAME} PROPERTIES COTIRE_ADD_UNITY_BUILD FALSE) + + cotire(${PROJECT_NAME}) +endif() diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake index bf5fd62894..29374974bd 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/wxWidgets/wxWidgets.cmake @@ -1,5 +1,3 @@ -set(_wx_git_tag v3.1.4-patched) - set(_wx_toolkit "") if(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(_gtk_ver 2) @@ -15,11 +13,9 @@ if (UNIX AND NOT APPLE) # wxWidgets will not use char as the underlying type for endif() prusaslicer_add_cmake_project(wxWidgets - # GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets" - # GIT_TAG tm_cross_compile #${_wx_git_tag} - URL https://github.com/prusa3d/wxWidgets/archive/489f6118256853cf5b299d595868641938566cdb.zip - URL_HASH SHA256=5b22d465377cedd8044bba69bea958b248953fd3628c1de4913a84d4e6f6175b - DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} dep_TIFF dep_JPEG + URL https://github.com/prusa3d/wxWidgets/archive/2a0b365df947138c513a888d707d46248d78a341.zip + URL_HASH SHA256=9ab05cd5179196fad4ae702c78eaae9418e73a402cfd390f7438e469b13eb735 + DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} dep_TIFF dep_JPEG dep_NanoSVG CMAKE_ARGS -DwxBUILD_PRECOMP=ON ${_wx_toolkit} @@ -32,13 +28,16 @@ prusaslicer_add_cmake_project(wxWidgets -DwxUSE_OPENGL=ON -DwxUSE_LIBPNG=sys -DwxUSE_ZLIB=sys - -DwxUSE_REGEX=builtin + -DwxUSE_NANOSVG=sys + -DwxUSE_NANOSVG_EXTERNAL=ON + -DwxUSE_REGEX=OFF -DwxUSE_LIBXPM=builtin -DwxUSE_LIBJPEG=sys -DwxUSE_LIBTIFF=sys -DwxUSE_EXPAT=sys -DwxUSE_LIBSDL=OFF -DwxUSE_XTEST=OFF + -DwxUSE_GLCANVAS_EGL=OFF ) if (MSVC) diff --git a/doc/Dependencies.md b/doc/Dependencies.md index f37f454668..d8ced6318a 100644 --- a/doc/Dependencies.md +++ b/doc/Dependencies.md @@ -24,7 +24,6 @@ * miniz: No packages, author suggests using in the source tree * qhull: libqhull-dev does not contain libqhullcpp => link errors. Until it is fixed, we will use the builtin version. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925540 * semver: One module C library, author expects to use clib for installation. No packages. -* Shiny: no packages ## Header only * igl diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 61e786785c..d9da31bf34 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: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,54 +18,54 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, possible-c-format, possible-boost-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 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/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "" @@ -189,7 +189,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "" @@ -247,19 +247,18 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "" @@ -292,7 +291,7 @@ msgid "Load shape from STL..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "" @@ -305,7 +304,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "" @@ -504,19 +503,19 @@ msgstr "" msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "" @@ -625,7 +624,7 @@ msgid "Standard" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "" @@ -865,7 +864,7 @@ msgstr "" msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "" @@ -1157,7 +1156,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "" @@ -1756,7 +1755,7 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1772,7 +1771,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "" @@ -1782,7 +1781,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "" @@ -1963,8 +1962,8 @@ msgstr "" msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "" @@ -2019,7 +2018,7 @@ msgstr "" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "" @@ -2243,7 +2242,7 @@ msgid "Add..." msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "" @@ -2290,7 +2289,7 @@ msgid "Next Undo action: %1%" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "" @@ -2330,7 +2329,7 @@ msgid "Selection-Remove from rectangle" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "" @@ -2585,7 +2584,7 @@ msgid "Quality" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "" @@ -2688,7 +2687,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "" @@ -2705,7 +2704,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "" @@ -2756,7 +2755,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "" @@ -2840,7 +2839,7 @@ msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "" @@ -3605,7 +3604,7 @@ msgid "Speed" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3628,52 +3627,51 @@ msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "" @@ -3815,7 +3813,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "" @@ -3876,7 +3874,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "" @@ -4507,11 +4505,11 @@ msgstr "" msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "" @@ -4792,7 +4790,7 @@ msgstr "" msgid "Attention!" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "" @@ -4829,7 +4827,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "" @@ -5172,13 +5170,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "" @@ -5215,7 +5213,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "" @@ -5293,7 +5291,7 @@ msgid "Keyboard shortcuts" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "" @@ -5301,11 +5299,11 @@ msgstr "" msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "" @@ -5331,13 +5329,13 @@ msgid "Print Settings" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "" @@ -5420,621 +5418,621 @@ msgstr "" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 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:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, possible-c-format, possible-boost-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, possible-c-format, possible-boost-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, possible-c-format, possible-boost-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, possible-boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, possible-c-format, possible-boost-format msgid "%d presets successfully imported." msgstr "" @@ -6256,8 +6254,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "" @@ -6327,7 +6325,7 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "" @@ -6475,7 +6473,7 @@ msgid "Select what kind of support do you need" msgstr "" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "" @@ -6573,7 +6571,7 @@ msgid "(including spool)" msgstr "" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "" @@ -7039,10 +7037,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "" @@ -7471,7 +7469,7 @@ msgid "Add/Remove presets" msgstr "" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "" @@ -7483,7 +7481,7 @@ msgstr "" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "" @@ -7780,11 +7778,11 @@ msgstr "" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "" @@ -7893,12 +7891,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "" @@ -8147,7 +8145,7 @@ msgstr "" msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "" @@ -8235,7 +8233,7 @@ msgstr "" msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "" @@ -8243,52 +8241,52 @@ msgstr "" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, possible-c-format, possible-boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8301,82 +8299,82 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8389,20 +8387,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8410,64 +8408,64 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8476,105 +8474,105 @@ msgstr "" msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 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:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 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:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, possible-boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8582,14 +8580,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8599,7 +8597,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -8607,84 +8605,84 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, possible-boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, possible-boost-format msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8692,23 +8690,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8716,13 +8714,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 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:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -8730,17 +8728,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 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:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -8748,68 +8746,68 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 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 "" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, possible-boost-format 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:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "" @@ -8892,7 +8890,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -8953,49 +8951,49 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -9589,26 +9587,26 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, possible-boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10291,8 +10289,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "" @@ -10307,9 +10305,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "" @@ -10495,8 +10492,8 @@ msgstr "" msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10623,8 +10620,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "" @@ -10690,7 +10688,7 @@ msgid "Extruder Color" msgstr "" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" @@ -10766,7 +10764,7 @@ msgstr "" msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "" @@ -10917,8 +10915,8 @@ msgid "" "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "" @@ -10976,7 +10974,7 @@ msgstr "" msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "" @@ -12463,7 +12461,7 @@ msgid "" "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -12983,33 +12981,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13021,11 +13021,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13034,63 +13034,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13099,462 +13071,462 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 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:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 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:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 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:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 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:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 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:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 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:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -13562,111 +13534,111 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -13675,240 +13647,240 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 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:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -13916,80 +13888,80 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 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:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 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:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 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:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 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:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/ca/PrusaSlicer_ca.po b/resources/localization/ca/PrusaSlicer_ca.po index 643d410af3..eedceabc81 100644 --- a/resources/localization/ca/PrusaSlicer_ca.po +++ b/resources/localization/ca/PrusaSlicer_ca.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2022-03-04 17:01+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Porcions del copyright" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Copyright" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "Els acords de llicència de tots els programes (biblioteques) següents formen " "part de l'acord de llicència de l'aplicació" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Sobre %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Versió" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "està llicenciat sota el/els" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, versió 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "PrusaSlicer està basat en Slic3r d'Alessandro Ranellucci i la comunitat " "RepRap." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, I. Sapir, Mike Sheldrake, Vojtech Bubnik i molts " "d'altres." -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Copiar Informació de Versió" @@ -217,7 +217,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "Mida" @@ -277,19 +277,18 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -324,7 +323,7 @@ msgid "Load shape from STL..." msgstr "Carregar forma des de l'STL..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Configuració" @@ -337,7 +336,7 @@ msgid "Load..." msgstr "Carregar..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Eliminar" @@ -565,21 +564,21 @@ msgstr "He de canviar al patró de farciment rectilini?" msgid "Infill" msgstr "Farciment" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "" "La penetració del capçal no hauria de ser més gran que l'amplada del capçal." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Penetració del capçal invàlida" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" "El diàmetre del cap d'agulla ha de ser més petit que el diàmetre del pilar." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Diàmetre del cap d'agulla invàlid" @@ -688,7 +687,7 @@ msgid "Standard" msgstr "Estàndard" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Tots" @@ -963,7 +962,7 @@ msgstr "Trieu un altre fabricant compatible amb %s" msgid "Firmware Type" msgstr "Tipus de Microprogramari(Firmware)" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Microprogramari(Firmware)" @@ -1287,7 +1286,7 @@ msgstr "Realitzar" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Desfer" @@ -1948,7 +1947,7 @@ msgstr "Confirmació" msgid "Cancelling..." msgstr "Cancel·lant..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Galeria de Formes" @@ -1964,7 +1963,7 @@ msgstr "Afegir a la base" msgid "Add selected shape(s) to the bed" msgstr "Afegir la(es) forma(es) seleccionada(es) a la base" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Afegir" @@ -1974,7 +1973,7 @@ msgstr "Afegir una o més formes personalitzades" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Esborrar" @@ -2159,8 +2158,8 @@ msgstr "Moviment" msgid "Extrusion" msgstr "Extrusió" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Retracció" @@ -2215,7 +2214,7 @@ msgstr "Configuració d'impressio" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -2439,7 +2438,7 @@ msgid "Add..." msgstr "Afegir..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Eliminar tot" @@ -2486,7 +2485,7 @@ msgid "Next Undo action: %1%" msgstr "Següent acció de Desfer: %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Refer" @@ -2528,7 +2527,7 @@ msgid "Selection-Remove from rectangle" msgstr "Selecció-Retirar del rectangle" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Retalla" @@ -2791,7 +2790,7 @@ msgid "Quality" msgstr "Qualitat" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Distància de tancament" @@ -2899,7 +2898,7 @@ msgstr "Moure" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Girar" @@ -2916,7 +2915,7 @@ msgstr "Aplicar" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Escala" @@ -2970,7 +2969,7 @@ msgstr "" "La simplificació de moment només es permet quan se selecciona una sola peça" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Error" @@ -3054,7 +3053,7 @@ msgid "Minimal points distance" msgstr "Distància mínima de punts" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Densitat de punts de suport" @@ -3911,7 +3910,7 @@ msgid "Speed" msgstr "Velocitat" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3934,52 +3933,51 @@ msgstr "Faldilla i bassa" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Avançat" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Suports" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Pad" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Buidant l'interior" @@ -4121,7 +4119,7 @@ msgid "Revert conversion from meters" msgstr "Reverteix la conversió des de metres" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Combinar" @@ -4182,7 +4180,7 @@ msgid "Split the selected object into individual parts" msgstr "Dividir l'objecte seleccionat en parts individuals" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Dividir" @@ -4841,11 +4839,11 @@ msgstr "Alçada" msgid "Width" msgstr "Amplada" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Velocitat del ventilador" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Temperatura" @@ -5142,7 +5140,7 @@ msgstr "No pots carregar un projecte SLA amb diverses peces a la base" msgid "Attention!" msgstr "Atenció!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Dreceres de teclat" @@ -5179,7 +5177,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "Carregar Configuració des de ini/amf/3mf/gcode i combina" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Exportar el codi G" @@ -5534,13 +5532,13 @@ msgstr "Establir el número d'extrusor per als elements seleccionats" msgid "Objects List" msgstr "Llista d'objectes" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Obrir un fitxer de codi G" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Carregar la base des del disc" @@ -5577,7 +5575,7 @@ msgid "Show/Hide G-code window" msgstr "Mostrar/Ocultar finestra de codi G" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Previsualització" @@ -5661,7 +5659,7 @@ msgid "Keyboard shortcuts" msgstr "Dreceres de teclat" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Obrir instància nova de PrusaSlicer" @@ -5669,11 +5667,11 @@ msgstr "Obrir instància nova de PrusaSlicer" msgid "G-code preview" msgstr "Previsualització codi G" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Obrir visor codi G" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Obrir PrusaSlicer" @@ -5699,13 +5697,13 @@ msgid "Print Settings" msgstr "Configuració d'Impressió" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Configuració del Material" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Configuració del Filament" @@ -5788,7 +5786,7 @@ msgstr "Mostrar Sobre" msgid "Show Tip of the Day" msgstr "Mostra Consell del dia" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5796,94 +5794,94 @@ msgstr "" "Obre la notificació del Consell del dia a la part inferior dreta o mostra un " "altre consell si ja està obert." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Mostrar la llista de les dreceres de teclat" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Vista Iso" #. 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "Superior" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Vista superior" #. 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:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "Inferior" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Vista inferior" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Frontal" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Vista frontal" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Al darrere" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Vista del darrere" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Esquerra" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Vista esquerra" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Dreta" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Vista dreta" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Nou projecte" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Començar un nou projecte" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&Obrir Projecte" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Obrir un fitxer de projecte" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Projectes recents" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5891,511 +5889,511 @@ msgstr "" "El projecte seleccionat no està disponible.\n" "Voleu suprimir-lo de la llista de projectes recents?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "&Desar Projecte" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Desar el projecte actual com" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Desar Projecte &com" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Desar fitxer de projecte actual com" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importar STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Carregar un model" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Importar STL (unitats imperials)" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Carregar un model guardat en unitats imperials" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Importar fitxer SL1 / SL1S" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Carregar un fitxer SL1 / SL1S" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importar &Configuració" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Carregar fitxer de configuració exportat" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Importar Configuració des d'un &Projecte" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Carregar configuració des del fitxer de projecte" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importar &Conjunt de Configuració" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Carregar ajustaments d'un paquet" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Importar" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Exportar el codi &G" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Exportar plataforma actual com a codi G" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "&Enviar codi G" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Enviar per imprimir la plataforma actual com a codi G" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exportar G-code a la targeta SD/disc USB" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Exporta a G-code a la targeta SD / disc USB" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Exportar plataforma com a &ST" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Exportar plataforma actual com a STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Exportar plataforma com a STL &incloent suports" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Exportar la plataforma actual com a STL incloent suports" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Exportar &trajectòries d'eines com OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Exportar trajectòries d'eines com a OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Exportar &Configuració" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Exportar la configuració actual al fitxer" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Exportar Conjunt d'&Ajustos" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Exportar todos los ajustes al archivo" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Exportar Paquet de Configuració Amb Impressores Físiques" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" "Exportar tots els paràmetres preestablerts, incloses les impressores " "físiques, a l'arxiu" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Expulsar targeta &SD / disc USB" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" "Expulsar la targeta SD / disc USB després que s'hi hagi exportat codi G." -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Laminat ràpid" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Laminar un fitxer en un codi G" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Laminat ràpid i Desa Com" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Laminar un fitxer en un codi G, guardar com" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Repetir el darrer laminat Ràpid" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Repetir el darrer laminat ràpid" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)Laminar &Ara" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Començar un nou procés de laminat" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "&Reparar fitxer STL" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Repara automàticament un fitxer STL" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Previsualització codi &G" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "&Sortir" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Tanca %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "&Seleccionar-ho tot" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Selecciona tots els objectes" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "&Deseleccionar-ho tot" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Desmarca tots els objectes" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Eliminar Selecció" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Suprimeix la selecció actual" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Eliminar &tot" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Suprimeix tots els objectes" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "&Desfer" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Refer" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Copia" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Copia la selecció al porta-retalls" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&Enganxa" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Enganxa el porta-retalls" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "&Recarregar des del disc" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "&Cercar" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Cerca a la configuració" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&Pestanya Base d'impressió" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Mostrar la base" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Configuració d'&Impressió" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Mostra la configuració d'impressió" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Pestanya Configuració &Filament" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Mostra la configuració del filament" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Pestanya Configuració &Impressora" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Mostra la configuració de la impressora" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "&3D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Mostra la visualització d'edició 3D" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "&Previsualització" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Mostra la vista 3D preliminar del laminat" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Obre el diàleg per modificar la galeria de formes" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Cua de pujada al &host d'impressió" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Mostra la finestra de la cua de càrrega de l'amfitrió" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Obre una instància nova" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Compara els predefinits" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Compara els predefinits" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Mostra les &etiquetes" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Mostra les etiquetes d'objecte/instància a l'escena 3D" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "Barra lateral ocultable (&C)" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Amagar barra lateral" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "&Pantalla completa" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Pantalla completa" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Arxiu" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Editar" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Finestra" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Vista" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Ajuda" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&Obrir codi G" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Obre &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "&Enviar per imprimir" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Pestanya Configuració del &material" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Trieu un fitxer per laminar (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Cap fitxer prèviament laminat." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Arxiu anterior laminat (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") no trobat." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Arxiu no trobat" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Desa %s fitxer com a:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "Codi G" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Desa el fitxer zip com a:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Laminant" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Processant %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% ha estat laminat amb èxit." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Laminat realitzat!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Seleccioneu el fitxer STL que voleu reparar:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Desar fitxer OBJ (menys propens a errors de coordinació que STL) com:" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "S'ha reparat el fitxer." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Reparar" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Desa la configuració com a:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "S'està carregant un fitxer de configuració" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Seleccioneu la configuració que voleu carregar:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "S'està exportant el paquet de configuració" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6403,15 +6401,15 @@ msgstr "" "Alguns paràmetres estan modificats i els canvis no desats no s'exportaran al " "paquet de configuració." -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Desa el paquet predefinit com a:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Carregant un paquet de configuració" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d paràmetres inicials importats amb èxit." @@ -6638,8 +6636,8 @@ msgstr "Instàncies" msgid "Instance %d" msgstr "Instància %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Capes" @@ -6718,7 +6716,7 @@ msgstr "Nom descriptiu de la impressora" msgid "Add preset for this printer device" msgstr "Afegir ajustament preestablert per a aquest dispositiu d'impressió" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Cua de pujada al host d'impressió" @@ -6882,7 +6880,7 @@ msgid "Select what kind of support do you need" msgstr "Selecciona quin tipus de suport necessites" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Suport a la base només" @@ -6982,7 +6980,7 @@ msgid "(including spool)" msgstr "(inclosa la bobina)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Cost" @@ -7503,10 +7501,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "Enganxa des del porta-retalls" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "General" @@ -8025,7 +8023,7 @@ msgid "Add/Remove presets" msgstr "Afegeix o suprimeix els predefinits" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Afegeix una impressora física" @@ -8037,7 +8035,7 @@ msgstr "Edita el predefinit" msgid "Change extruder color" msgstr "Canvia el color de l'extrusora" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Edita la impressora física" @@ -8356,11 +8354,11 @@ msgstr "NO EMPENAR EN ABSOLUT" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -8477,12 +8475,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "Simplement canvieu a la configuració predeterminada \"%1%\"" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Silenciós" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normal" @@ -8754,7 +8752,7 @@ msgstr "nom complet del perfil" msgid "symbolic profile name" msgstr "nom simbòlic del perfil" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Capes i Perímetres" @@ -8842,7 +8840,7 @@ msgstr "Superposició" msgid "Flow" msgstr "Fluxe" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Altre" @@ -8850,53 +8848,53 @@ msgstr "Altre" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Opcions de sortida" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Impressió seqüencial" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Separació de l'extrusor" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Fitxer de sortida" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Scripts de postprocessament" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Notes" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Dependències" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Dependències del perfil" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Els scripts de postprocessament modificaran el fitxer de codi G al seu lloc." -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8917,82 +8915,82 @@ msgstr[1] "" "del codi G i\n" "l'estimació del temps d'impressió." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Trobades paraules clau reservades a" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Anul·lacions de filaments" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Broquet( nozzle )" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Llit" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Refredament" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Activar" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Configuració del ventilador" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Llindars de refrigeració" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Propietats del filament" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Substitució de velocitat d'impressió" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Paràmetres de la torre de neteja" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Paràmetres del canvi d'eina per a impressores d'un únic extrusor MM" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Configuració d'empenyiment" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Codi G personalitzat" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Codi G inicial" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "Codi G final" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Els consells de flux volumètric no estan disponibles" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -9014,20 +9012,20 @@ msgstr "" "\"engranatge\" a la pestanya Configuració d'impressora. Els perfils de la " "impressora física s'emmagatzemen al directori PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Mida i coordenades" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Capacitats" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Nombre d'extrusores de la impressora." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -9039,64 +9037,64 @@ msgstr "" "Voleu canviar el diàmetre de tots els extrusors al valor del diàmetre del " "nozzle del primer extrusor?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Diàmetre del broquet(nozzle)" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "Codi G per abans d'un canvi de capa" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "Codi G per després d'un canvi de capa" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "Codi G de canvi d'eina" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "Codi G per a entre objectes (per a impressió seqüencial)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "Codi G Canvi Color" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "Codi G per a Pausa d'Impressió" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Plantilla Codi G Personalitzat" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Pantalla" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Inclinació" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Temps d'inclinació" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Correccions" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Exposició" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -9105,39 +9103,39 @@ msgstr "Exposició" msgid "Machine limits" msgstr "Límits de la màquina" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Els valors d'aquesta columna són per al mode Normal" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Els valors d'aquesta columna són per al mode Silenciós" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Velocitats d'alimentació màximes" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Acceleracions màximes" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Límits de jerk" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Velocitats d'alimentació mínimes" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Ajust per a MM amb un sol extrusor" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Paràmetres multimaterial per a un sol extrusor" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9145,19 +9143,19 @@ msgstr "" "Aquesta és una impressora multimaterial d'extrusor únic, els diàmetres de " "tots els extrusors s'establiran segons el valor nou. Vols procedir-hi?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Límits d'alçada de la capa" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Posició (per a impressores multi-extrusora)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Només aixecar Z" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9165,11 +9163,11 @@ msgstr "" "Retracció quan l'eina està desactivada (configuracions avançades per a " "configuracions d'extrusors múltiples)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Reinicialitza el color del filament" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9178,31 +9176,31 @@ msgstr "" "L'opció Netejar no està disponible quan utilitzeu el mode Retracció de " "firmware. L'inhabilito per habilitar la Retracció de firmware?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Retracció del microprogramari( fimware )" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "S'ha seleccionat una configuració nova de la impressora" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Separat" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "eliminar" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "esborrar" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "És un últim valor per defecte per a aquesta impressora." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9211,7 +9209,7 @@ msgstr "" "Esteu segur que voleu suprimir la configuració preestablerta \"%1%\" de la " "impressora física \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9223,7 +9221,7 @@ msgstr[1] "" "Les impressores físiques que es mostren a continuació es basen en la " "configuració predefinida, la qual s'eliminarà." -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9234,7 +9232,7 @@ msgstr[1] "" "Tingueu en compte que la configuració predefinida seleccionada també " "s'eliminarà d'aquestes impressores." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9248,7 +9246,7 @@ msgstr[1] "" "Les impressores físiques que es mostren a continuació es basen únicament en " "la configuració predefinida, la qual s'eliminarà." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9260,57 +9258,57 @@ msgstr[1] "" "Tingueu en compte que aquestes impressores s'esborraran després d'esborrar " "la configuració predefinida seleccionada." -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Segur que desitges %1% el predefinit seleccionat?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Predefinit" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Ajust" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Cercar" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Substitueix-ho per" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Expressió normal" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "No distingeix minúscules/majúscules" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Paraula sencera" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Coincideix amb una sola línia" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Esteu segur que voleu suprimir totes les substitucions?" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Els límits de la màquina s'incorporaran al codi G i es faran servir per " "calcular el temps d'impressió." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -9320,7 +9318,7 @@ msgstr "" "estimar el temps d'impressió, que per tant pot no ser exacte ja que la " "impressora pot aplicar un conjunt diferent de límits de la màquina." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9328,12 +9326,12 @@ msgstr "" "Els límits de la màquina no estan establerts, per tant, el temps d'impressió " "estimat pot no ser exacte." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "PANY BLOQUEJAT" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9341,12 +9339,12 @@ msgstr "" "indica que els paràmetres són els mateixos que els valors del sistema (o per " "defecte) per al grup d'opcions actual" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "PANY DESBLOQUEJAT" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9358,12 +9356,12 @@ msgstr "" "Feu clic a la icona PANY DESBLOQUEJAT per restablir tots els paràmetres del " "grup d'opcions actuals als valors del sistema (o per defecte)." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "VINYETA BLANCA" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -9372,12 +9370,12 @@ msgstr "" "predeterminat),\n" "per al botó dret: indica que la configuració no s'ha modificat." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "FLETXA ENRERE" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9389,7 +9387,7 @@ msgstr "" "Feu clic al símbol FLETXA ENRERE per resetejar tots els paràmetres del grup " "d'opcions actuals als gravats anteriorment." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9397,7 +9395,7 @@ msgstr "" "La icona de PANY BLOQUEJAT indica que els paràmetres són els mateixos que " "els valors del sistema (per defecte) per al grup d'opcions actual" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9410,13 +9408,13 @@ msgstr "" "Feu clic per restablir totes les configuracions per al grup d'opcions " "actuals als valors del sistema (o per defecte)." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "La icona de VINYETA BLANCA indica un predifinit no del sistema (o no per " "defecte)" -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9425,7 +9423,7 @@ msgstr "" "els de la darrera vegada que heu salvat els paràmetres per al grup d'opcions " "actual." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9436,7 +9434,7 @@ msgstr "" "són iguals als que es van desar per al grup d'opcions actual.\n" "Feu clic per tornar aquests valors als darrers desats." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9444,7 +9442,7 @@ msgstr "" "La icona de PANY BLOQUEJAT indica que el valor és el mateix que el del " "sistema (per defecte)" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9454,7 +9452,7 @@ msgstr "" "configuracions i no són iguals als valors del sistema (o predeterminats).\n" "Feu clic per reiniciar el valor actual als del sistema (o predeterminats)" -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9462,7 +9460,7 @@ msgstr "" "El símbol de VINYETA BLANCA indica que els valors són els mateixos que els " "dels paràmetres desats la darrera vegada." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9472,31 +9470,31 @@ msgstr "" "desat la darrera vegada.\n" "Feu clic per restaurar el valor al darrer paràmetre desat." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Material" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Perfil d'impressió de material" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Cap del suport" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Pilar de suport" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Connexió de les varetes de suport i unions" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Generació automàtica" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9505,11 +9503,11 @@ msgstr "" "\"%1%\" està desactivat perquè \"%2%\" és a la categoria \"%3%\".\n" "Per activar \"%1%\", si us plau desactiva \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Elevació de l'objecte" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Pad al voltant de l'objecte" @@ -9602,7 +9600,7 @@ msgstr "" "per a què pregunti sobre els canvis no guardats novament." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9672,39 +9670,39 @@ msgstr "" "els canvis següents:" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Comptador d'extrusors" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Seleccioneu els predefinits per comparar" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Mostra tots els predefinits (inclosos els incompatibles)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Valor predefinit esquerre" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Valor predefinit dret" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "No s'ha trobat un dels predefinits" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Els predefinits comparats tenen una tecnologia d'impressora diferent" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Els predefinits són els mateixos" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9713,11 +9711,11 @@ msgstr "" "Feu clic en aquest botó per seleccionar el mateix predefinit per al " "predefinit dret i esquerre." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Categoria sense definir" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Grup sense definir" @@ -10398,7 +10396,7 @@ msgstr "" "No es pot calcular l'amplada d'extrusió per a %1%: Variable \"%2%\" no " "accessible." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10407,7 +10405,7 @@ msgstr "" "El fitxer 3mf seleccionat s'ha desat amb una versió més recent de %1% i no " "és compatible." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10415,7 +10413,7 @@ msgstr "" "El 3MF seleccionat conté L'objecte pintat amb una versió més recent del " "PrusaSlicer i no és compatible." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10423,7 +10421,7 @@ msgstr "" "El 3MF seleccionat conté un objecte pintat amb costura utilitzant una versió " "més recent del PrusaSlicer i no és compatible." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -11238,8 +11236,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -11256,9 +11254,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -11481,8 +11478,8 @@ msgstr "" msgid "Default print profile" msgstr "Perfil d'impressió per defecte" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11637,8 +11634,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm o %" @@ -11725,7 +11723,7 @@ msgid "Extruder Color" msgstr "Color de l'extrusor" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Això només s'utilitza a la interfície Slic3r com a ajuda visual." @@ -11823,7 +11821,7 @@ msgstr "" msgid "approximate seconds" msgstr "segons aproximats" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Color" @@ -12010,8 +12008,8 @@ msgstr "" "tant, utilitzeu un calibre i realitzeu múltiples mesuraments al llarg del " "filament, després calculeu la mitjana." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Densitat" @@ -12081,7 +12079,7 @@ msgstr "" msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Desconegut)" @@ -13888,7 +13886,7 @@ msgstr "" "Utilitzeu aquesta opció per girar el patró de material de suport en el pla " "horitzontal." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -14536,33 +14534,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14574,11 +14574,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14587,63 +14587,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14652,63 +14624,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Amplada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Amplada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Alçada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Alçada de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Nombre de píxels a" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Nombre de píxels en X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Nombre de píxels en Y" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Mirall horitzontal de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Reflectir horitzontalment" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Activar mirall horitzontal de sortida d'imatges" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Mirall vertical de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Reflectir verticalment" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Activar mirall vertical de sortida d'imatges" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Orientació de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -14718,55 +14690,55 @@ msgstr "" "mode retrat canviarà el significat dels paràmetres d'ample i alt de la " "pantalla i les imatges de sortida giraran 90 graus." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Paisatge" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Retrat" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Ràpida" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Inclinació ràpida" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Tiempo de la inclinación rápida" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Lenta" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Inclinació lenta" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Temps de la inclinació lenta" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Àrea de farciment" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14777,40 +14749,40 @@ msgstr "" "llavors s'utilitzarà una inclinació lenta, en cas contrari - una inclinació " "ràpida" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Correcció d'escala de la impressora" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Correcció d'escalat de la impressora a l'eix X" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Correcció de l'eix X d'escalat de la impressora" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Correcció d'escalat de la impressora a l'eix Y" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Correcció de l'eix X d'escalat de la impressora" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Correcció d'escalat de la impressora a l'eix Z" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Correcció de l'eix X d'escalat de la impressora" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Correcció absoluta de la impressora" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14818,22 +14790,22 @@ msgstr "" "Augmentarà o reduirà el nombre de polígons 2D laminats d'acord amb el signe " "de la correcció." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Amplada mínima del peu d'elefant" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Amplada mínima de les característiques a mantenir quan es fa una compensació " "del peu d'elefant." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Correcció gamma de la impressora" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14843,43 +14815,43 @@ msgstr "" "gamma de zero significa que el llindar es troba al mig. Aquest comportament " "elimina l'antialiasing sense perdre forats als polígons." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Tipus de material SLA" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Alçada de la capa inicial" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Volum de l'ampolla" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Pes de l'ampolla" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "diners/ampolla" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Capes esvaïdes" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14887,106 +14859,106 @@ msgstr "" "El nombre de capes necessàries per al temps d'exposició s'esvaeix des del " "temps d'exposició inicial fins al temps d'exposició" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Temps mínim d'exposició" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Temps màxim d'exposició" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Temps d'exposició" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Temps mínim d'exposició inicial" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Temps màxim d'exposició inicial" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Temps d'exposició inicial" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Correcció per a l'expansió" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Correcció per a l'expansió en l'eix X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Correcció per a l'expansió en l'eix Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Correcció per a l'expansió en l'eix Z" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Notes de material d'impressió de l'SLA" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "" "Podeu posar les vostres notes sobre el material d'impressió de l'SLA aquí." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Perfil de material de l'SLA per defecte" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Generar suports" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Generar suports per als models" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Diàmetre frontal del cap" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Diàmetre de la part en punta del cap" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Penetració del cap" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "Quant ha de penetrar el cap del pin a la superfície del model" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Amplada del cap" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "" "Amplada des del centre de l'esfera posterior fins al centre de l'esfera " "frontal" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Diàmetre del pilar" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Diàmetre en mm dels pilars de suport" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Percentatge de diàmetre de pilar petit" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -14994,11 +14966,11 @@ msgstr "" "El percentatge de pilars més petits en comparació del diàmetre de pilar " "normal que s'utilitzen en àrees problemàtiques on no hi ha cap pilar normal." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Ponts màxims en un pilar" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -15006,11 +14978,11 @@ msgstr "" "Nombre màxim de ponts que es poden col·locar sobre un pilar. Els ponts " "mantenen els punts de suport i es connecten als pilars com branques petites." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Mode de connexió del pilar" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -15020,23 +14992,23 @@ msgstr "" "(doble ziga-zaga) o dinàmica que canviarà automàticament entre els dos " "primers en funció de la distància dels dos pilars." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Ziga-Zaga" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Creu" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dinàmic" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Factor d'eixamplament del pilar" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -15044,27 +15016,27 @@ msgstr "" "La fusió de ponts o pilars a altres pilars pot augmentar el radi. Zero vol " "dir que no hi ha augment, un significa augment total." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Diàmetre de la base de suport" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Diàmetre en mm de la base del pilar" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Alçada de la base de suport" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "L'alçada del con de la base d'un pilar" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Distància de seguretat de la base de suports" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -15074,27 +15046,27 @@ msgstr "" "mode de zero elevació on hi ha un buit d'acord quan aquest paràmetre " "s'introdueix entre el model i el pad." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Angle crític" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "L'angle per defecte per connectar pals de suport i unions." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Longitud màxima del pont" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "La longitud màxima d'un pont" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Distància màxima d'enllaç del pilar" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -15102,7 +15074,7 @@ msgstr "" "La distància màxima entre dos pilars perquè s'uneixin entre si. Un valor " "zero prohibirà l'encadenament de pilars." -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -15110,39 +15082,39 @@ msgstr "" "Quant els suports haurien d'aixecar l'objecte suportat. Si \"Pad al voltant " "de l'objecte\" està activat, aquest valor serà ignorat." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Aquesta és una mesura relativa de la densitat de punts de suport." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Distància mínima dels punts de suport" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "No es col·locaran punts de suport més a prop d'aquest llindar." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Utilitza el pad" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Afegeix un pad sota el model compatible" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Gruix de la paret del pad" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "El gruix dels pads i les parets de cavitat opcionals." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Alçada de la paret del pad" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -15154,19 +15126,19 @@ msgstr "" "algunes resines poden produir un efecte de succió extrem dins de la cavitat, " "cosa que dificulta l'enlairament de la impressió de la làmina de la cuba." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Grandària de la vora del pad" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "Fins on cal estendre el pad al voltant de la geometria continguda" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Distància màxima de combinació" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -15177,11 +15149,11 @@ msgstr "" "centre de dos pads més petits. Si són més a prop, es fusionaran en un sol " "pad." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Pendent de paret del pad" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15189,23 +15161,23 @@ msgstr "" "El pendent de la paret del pad en relació amb el pla del llit. 90 graus " "significa parets rectes." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Crea un pad al voltant de l'objecte i ignora l'elevació de suport" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Pad al voltant de l'objecte a tot arreu" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Força el pad al voltant de l'objecte a tot arreu" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Espai del pad amb l'objecte" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15213,54 +15185,54 @@ msgstr "" "L'espai entre la part de sota l'objecte i el pad generat en mode de zero " "elevació." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Pas del connector de l'objecte al Pad" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "Distància entre dos palets de suport entre la peça i la base generada." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Amplada del connector del pad amb l'objecte" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "Ample dels palets de suport que connecten la peça i la base generada." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Penetració del connector de l'objecte al Pad" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Com haurien de penetrar els connectors petits al model del cos." -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Habilitar buidatge" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Buidar un model per tenir un interior buit" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Gruix de la paret" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Gruix mínim de paret d'un model buit." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Precisió" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15268,7 +15240,7 @@ msgstr "" "Rendiment vs precisió de càlcul. Els valors més baixos poden produir " "artefactes no desitjats." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -15282,11 +15254,11 @@ msgstr "" "de tancament més gran fa que interior sigui més arrodonit. Si és zero, " "l'interior sembla molt a l'exterior." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Velocitat d'impressió" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15296,63 +15268,63 @@ msgstr "" "amb més viscositat o amb algunes peces buides. Alenteix el moviment " "d'inclinació i afegeix un retard abans de l'exposició." -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Exporta OBJ" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Exporta el/s model/s com a OBJ." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Exporta SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Laminar el model i exportar les capes d'impressió d'SLA com a PNG." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Exporta 3MF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Exporta el/s model/s com a 3MF." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Exporta AMF" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Exporta el/s model/s com a AMF." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Exporta STL" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Exporta el/s model/s com a STL." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Laminar el model i exportar les trajectòries com a codi G." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Visualitzador de codi G" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Visualitzar un codi G ja laminat i desat" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Laminar" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15360,73 +15332,73 @@ msgstr "" "Laminar el model com FFF o SLA basat en el valor de configuració de " "printer_technology." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Ajuda" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Mostra aquesta ajuda." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Ajuda (opcions FFF)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "" "Mostra la llista completa d'opcions de configuració d'impressió/G-code." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Ajuda (opcions de l'SLA)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "" "Mostra la llista completa d'opcions de configuració d'impressió de l'SLA." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Informació del model de sortida" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Escriure informació sobre el model a la consola." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Desa el fitxer de configuració" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Desa la configuració al fitxer especificat." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Alinear xy" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Alinear el model amb el punt donat." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Tallar model a una Z donada." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Centre" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Centrar la impressió al voltant del centre donat." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "No organitzar" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15434,11 +15406,11 @@ msgstr "" "No reordeneu els models donats abans de fusionar-los i mantingueu les " "coordenades XY originals." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Assegurar a la base" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15446,23 +15418,23 @@ msgstr "" "Eleva l'objecte per sobre del llit quan està parcialment a sota. Activat per " "defecte, utilitza --no-ensure-on-bed per desactivar-lo." -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Duplicar" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Multiplica les còpies per aquest factor." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Duplicar per quadrícula" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Multiplica les còpies creant una quadrícula." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15470,7 +15442,7 @@ msgstr "" "Organitzar els models subministrats en una base i combinar-los en un sol " "model per fer accions una vegada." -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -15479,31 +15451,31 @@ msgstr "" "implícitament cada vegada que necessitem laminar el model per fer l'acció " "sol·licitada)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Angle de rotació al voltant de l'eix Z en graus." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Rotar al voltant de l'eix X" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Angle de rotació al voltant de l'eix X en graus." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Rotar al voltant de l'eix Y" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Angle de rotació al voltant de l'eix Y en graus." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Factor d'escalat o percentatge." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15511,23 +15483,23 @@ msgstr "" "Detecta parts no connectades en els models indicats i els divideix en " "objectes separats." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Escalar per Adaptar-se" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Escala per ajustar-se al volum donat." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignora els fitxers de configuració inexistents" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "No fallar si el fitxer subministrat per a --load no existeix." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15535,7 +15507,7 @@ msgstr "" "Regla de compatibilitat en carregar configuracions des de fitxers de " "configuració i fitxers de projecte (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15548,11 +15520,11 @@ msgstr "" "abandonar o substituir un valor desconegut amb un valor per defecte " "silenciosament o verbosament." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Sortir en cas de valors de configuració desconeguts" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15560,7 +15532,7 @@ msgstr "" "Permet la lectura de valors de configuració desconeguts substituint-los " "verbosament pels predeterminats." -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15568,11 +15540,11 @@ msgstr "" "Permet llegir valors de configuració desconeguts substituint-los " "silenciosament pels predeterminats." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Carrega el fitxer de configuració" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15580,11 +15552,11 @@ msgstr "" "Carrega la configuració des del fitxer especificat. Es pot utilitzar més " "d'una vegada per carregar les opcions des de diversos fitxers." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Fitxer de sortida" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15592,11 +15564,11 @@ msgstr "" "El fitxer on s'escriurà la sortida (si no s'especifica, es basarà en el " "fitxer d'entrada)." -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Mode d'instància única" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15607,11 +15579,11 @@ msgstr "" "una finestra del PrusaSlicer existent. Substitueix el valor de configuració " "\"single_instance\" de les preferències de l'aplicació." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Directori de dades" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15621,11 +15593,11 @@ msgstr "" "mantenir diferents perfils o incloure configuracions des d'un emmagatzematge " "de xarxa." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Nivell de registre" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15635,11 +15607,11 @@ msgstr "" "depuració, 5:traça\n" "Per exemple. loglevel=2 registrarà missatges de fallada, error i perill." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Renderitzar amb un programari renderitzador" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/cs/PrusaSlicer.mo b/resources/localization/cs/PrusaSlicer.mo index 256f2244ff..f6a80823af 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 054f720617..44aafff770 100644 --- a/resources/localization/cs/PrusaSlicer_cs.po +++ b/resources/localization/cs/PrusaSlicer_cs.po @@ -9,7 +9,7 @@ msgstr "" "%10 <=9)) || (n%100 >= 12 && n%100 <= 14)) ? 2 : 3);\n" "X-Generator: Prusalator\n" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -37,9 +37,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -152,7 +151,7 @@ msgstr[2] "%1% (%2$d stěny)" msgstr[3] "%1% (%2$d stěn)" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Přednastavení" @@ -171,7 +170,7 @@ msgstr "" msgid "%1% was substituted with %2%" msgstr "%2% bylo nahrazeno hodnotou %1%" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% byl úspěšně naslicován." @@ -193,7 +192,7 @@ msgstr "%3.2f mm³/s při rychlosti filamentu %3.2f mm/s." msgid "%d lines: %.2f mm" msgstr "%d perimetry: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d přednastavení úspěšně importováno." @@ -365,7 +364,7 @@ msgstr "" msgid "&About %s" msgstr "&O %su" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "&Sbalit Postranní panel" @@ -377,27 +376,27 @@ msgstr "&Konfigurace" msgid "&Configuration Snapshots" msgstr "Zálohy konfigura&ce" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Kopírovat" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Sma&zat vybrané" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Editovat" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Exportovat" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Panel Nastavení &filamentu" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Soubor" @@ -405,19 +404,19 @@ msgstr "&Soubor" msgid "&Finish" msgstr "&Dokončit" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "&Fullscreen" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "&G-code Prohlížeč" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Pomoc" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Importovat" @@ -425,7 +424,7 @@ msgstr "&Importovat" msgid "&Language" msgstr "&Jazyk" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Nový projekt" @@ -433,19 +432,19 @@ msgstr "&Nový projekt" msgid "&Next >" msgstr "&Další>" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&Otevřít G-code" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&Otevřít projekt" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "Vloži&t" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&Panel Podložka" @@ -453,35 +452,35 @@ msgstr "&Panel Podložka" msgid "&Preferences" msgstr "Nas&tavení" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "Ukonči&t" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Vpřed" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "Op&ravit soubor STL" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "&Uložit projekt" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "Vybrat &Vše" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "&Zpět" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Zobrazení" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Okno" @@ -490,7 +489,7 @@ msgstr "&Okno" msgid "(All)" msgstr "(Všechny)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "&(Znovu) Slicovat" @@ -502,7 +501,7 @@ msgstr "(Znovu)Slicovat" msgid "(Some lines not shown)" msgstr "(Některé řádky nejsou zobrazeny)" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Neznámý)" @@ -514,7 +513,7 @@ msgstr "(včetně cívky)" msgid "(minimum)" msgstr "(minimálně)" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") nebyl nalezen." @@ -570,7 +569,7 @@ msgstr "2 mm" msgid "3 (heavy)" msgstr "3 (silné)" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" @@ -660,7 +659,7 @@ msgstr "" "Obecným pravidlem je 60 °C pro PLA a 110 °C pro ABS. Zadejte nula, pokud " "nemáte vyhřívanou podložku." -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -686,7 +685,7 @@ msgstr "API klíč" msgid "Abort" msgstr "Přerušit" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "O %s" @@ -703,7 +702,7 @@ msgstr "Kontrola akcelerací (pokročilé)" msgid "Access violation" msgstr "Porušení přístupu" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Přesnost" @@ -743,7 +742,7 @@ msgstr "" "abyste zkrátili dobu tisku a snížili spotřebu filamentu? Přečtěte si více v " "dokumentaci." -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Přidat" @@ -806,7 +805,7 @@ msgstr "Přidání tvaru z galerie" msgid "Add Shapes from Gallery" msgstr "Přidat tvary z galerie" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Pod podepíraný model přidá podložku" @@ -923,7 +922,7 @@ msgid "Add pause print" msgstr "Přidat pozastavení tisku" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Přidat fyzickou tiskárnu" @@ -1022,17 +1021,16 @@ msgstr "Adresa" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Pokročilý" @@ -1067,16 +1065,16 @@ msgstr "" "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:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-code po změně vrstvy" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Zarovnat XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Zarovnejte model s daným bodem." @@ -1089,7 +1087,7 @@ msgid "Aligned Rectilinear" msgstr "Zarovnaný přímočarý" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Všechny" @@ -1289,7 +1287,7 @@ msgstr "Automaticky aplikovat změnu barvy" msgid "Apply to all the remaining small objects being loaded." msgstr "Použít na všechny zbývající malé načítané objekty." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "Arachne" @@ -1301,7 +1299,7 @@ msgstr "Arachne generátor perimetrů" msgid "Archimedean Chords" msgstr "Archimedean Chords" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Opravdu chcete %1% vybrané přednastavení?" @@ -1318,7 +1316,7 @@ msgstr "" msgid "Are you sure you want to continue?" msgstr "Opravdu chcete pokračovat?" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -1331,7 +1329,7 @@ msgstr "" msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Opravdu chcete odstranit tiskárnu \"%1%\"?" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Jste si jisti, že chcete odstranit všechna nahrazení?" @@ -1339,7 +1337,7 @@ msgstr "Jste si jisti, že chcete odstranit všechna nahrazení?" msgid "Are you sure you want to do it?" msgstr "Opravdu to chcete udělat?" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Zaplněná plocha" @@ -1371,7 +1369,7 @@ msgstr "" "Uspořádat upravit velikost mezery mezi objekty a umožnit automatické " "otáčení modelů?" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -1524,7 +1522,7 @@ msgstr "Automatické generování podpěrných bodů" 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:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Automatické generování" @@ -1532,7 +1530,7 @@ msgstr "Automatické generování" msgid "Automatic updates" msgstr "Automatické aktualizace" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Automaticky opravit STL soubor" @@ -1548,11 +1546,11 @@ msgstr "Vyhnout se přejíždění perimetrů" msgid "Avoid crossing perimeters - Max detour length" msgstr "Vyhnout se přejíždění perimetrů - maximální délka objízdné cesty" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "ŠIPKA ZPĚT" -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -1564,7 +1562,7 @@ msgstr "" "Klikněte pro reset všech nastavení pro aktuální skupinu nastavení na " "naposledy uložené přednastavení." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -1578,7 +1576,7 @@ msgstr "" msgid "Background processing" msgstr "Zpracování na pozadí" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Záchrana při neznámých hodnotách konfigurace" @@ -1586,7 +1584,7 @@ msgstr "Záchrana při neznámých hodnotách konfigurace" msgid "Balanced" msgstr "Vyvážené" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Tisková podložka" @@ -1634,7 +1632,7 @@ 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/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-code před změnou vrstvy" @@ -1659,7 +1657,7 @@ msgstr "Nejlepší kvalita povrchu" msgid "Between objects G-code" msgstr "G-code mezi objekty" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-code mezi objekty (pro sekvenční tisk)" @@ -1681,11 +1679,11 @@ msgstr "Blokování podpěr" msgid "Block supports by angle" msgstr "Blokování podpěr dle úhlu" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Objem láhve" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Hmotnost láhve" @@ -1702,7 +1700,7 @@ msgstr "Spodních" msgid "Bottom" msgstr "Zespod" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Pohled zespod" @@ -1977,8 +1975,8 @@ 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:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Možnosti" @@ -1986,7 +1984,7 @@ msgstr "Možnosti" msgid "Capture a configuration snapshot" msgstr "Vytvořit aktuální zálohu konfigurace" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Nerozlišovat malá a velká písmena" @@ -1994,11 +1992,11 @@ msgstr "Nerozlišovat malá a velká písmena" msgid "Category" msgstr "Kategorie" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Střed" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Vycentrujte tisk kolem daného středu." @@ -2106,7 +2104,7 @@ msgstr "" "Vyberte soubor, ze kterého chcete importovat texturu pro tiskovou podložku " "(PNG/SVG):" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Zvolit soubor ke slicování (STL/OBJ/AMF/3MF/PRUSA):" @@ -2154,7 +2152,7 @@ msgstr "Kruh" msgid "Circular" msgstr "Kruhový" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "Klasický" @@ -2162,12 +2160,13 @@ msgstr "Klasický" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" "Klasický generátor obvodových stěn vytváří perimetry s konstantní šířkou " "vytlačovaného materiálu a pro velmi malé plochy se používá technika " "vyplňování mezer. Algoritmus Arachne vytváří perimetry s proměnnou šířkou " -"vytlačovaného materiálu." +"vytlačovaného materiálu. Toto nastavení ovlivňuje také koncentrickou výplň." #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -2246,7 +2245,7 @@ msgid "Closing PrusaSlicer. Current project is modified." msgstr "Zavírání PrusaSliceru. Aktuální projekt je upravený." #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Vzdálenost uzavření" @@ -2254,7 +2253,7 @@ msgstr "Vzdálenost uzavření" msgid "Closing radius" msgstr "Poloměr uzavření" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Sbalit postranní panel" @@ -2262,11 +2261,11 @@ msgstr "Sbalit postranní panel" msgid "Collapse/Expand the sidebar" msgstr "Sbalit/Rozbalit postranní panel" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Barva" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-code pro změnu barvy" @@ -2329,12 +2328,12 @@ msgstr "Příkazy" msgid "Comment:" msgstr "Komentář:" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Porovnání přednastavení" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Porovnání přednastavení" @@ -2342,7 +2341,7 @@ msgstr "Porovnání přednastavení" msgid "Compare this preset with some another" msgstr "Porovnat toto přednastavení s jiným" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Srovnávaná přednastavení mají odlišnou technologii tisku" @@ -2506,7 +2505,7 @@ msgstr "" "omezena na infill_anchor, ale ne delší než tento parametr. Nastavením tohoto " "parametru na nulu ukotvení zakážete." -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Spojení podpůrných tyčí a spojek" @@ -2562,7 +2561,7 @@ msgstr "Pokračovat a instalovat aktualizace konfigurace?" msgid "Continue to activate a configuration snapshot %1%?" msgstr "Pokračovat v aktivaci zálohy konfigurace %1%?" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -2580,7 +2579,7 @@ 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:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -2598,7 +2597,7 @@ msgstr "Převod z imperiálních jednotek" msgid "Convert from meters" msgstr "Převod z metrů" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Chlazení" @@ -2610,7 +2609,7 @@ msgstr "Chladicí pohyby se postupně zrychlují a začínají touto rychlostí. 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:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Podmínky chlazení" @@ -2631,11 +2630,11 @@ msgctxt "PresetName" msgid "Copy" msgstr "Kopie" -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Zkopírovat číslo verze" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Kopírovat výběr do schránky" @@ -2696,32 +2695,32 @@ msgstr "" "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:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Autorská práva" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Korekce expanze" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Korekce roztažnosti v ose X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Korekce roztažnosti v ose Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Korekce roztažnosti v ose Z" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Korekce" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Náklady" @@ -2794,7 +2793,7 @@ msgstr "" "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/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" "Vytvoří podložku kolem objektu a ignorujte nadzvednutí objektu podpěrami" @@ -2811,7 +2810,7 @@ msgstr "Vytváření nového projektu. Některá přednastavení jsou upravená. msgid "Creating a new project while the current project is modified." msgstr "Vytvoření nového projektu. Současný projekt byl změněn." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Kritický úhel" @@ -2819,7 +2818,7 @@ msgstr "Kritický úhel" msgid "Critical error" msgstr "Kritická chyba" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Cross" @@ -2865,8 +2864,8 @@ msgstr "" "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:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Vlastní G-code" @@ -2910,7 +2909,7 @@ msgid "Custom template (\"%1%\")" msgstr "Vlastní šablona (\"%1%\")" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Řezat" @@ -2918,7 +2917,7 @@ msgstr "Řezat" msgid "Cut by Plane" msgstr "Řez Rovinou" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Rozříznout model v dané výšce Z." @@ -2926,7 +2925,7 @@ msgstr "Rozříznout model v dané výšce Z." msgid "Cylinder" msgstr "Válec" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "Odznačit Vš&e" @@ -2934,7 +2933,7 @@ msgstr "Odznačit Vš&e" msgid "Dark mode (experimental)" msgstr "Tmavý režim (experimentální)" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Složka Data" @@ -2960,7 +2959,7 @@ msgstr "Odebrání Instancí" msgid "Default" msgstr "Výchozí" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Výchozí profil pro SLA materiál" @@ -2999,8 +2998,8 @@ msgstr "" msgid "Default print profile" msgstr "Výchozí tiskový profil" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -3013,7 +3012,7 @@ msgstr "" msgid "Define a custom printer profile" msgstr "Vytvořit vlastní tiskový profil" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -3031,11 +3030,11 @@ msgstr "Zpoždění po vyjmutí" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Smazat" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Sm&azat Vše" @@ -3089,7 +3088,7 @@ msgid "Delete Subobject" msgstr "Smazání dílčího objektu" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Smazat vše" @@ -3146,16 +3145,16 @@ msgstr "Smazat značku - Levé tlačítko myši nebo klávesa \"-\"" msgid "Delete tool change" msgstr "Smazat změnu nástroje" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Smazat všechny objekty" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Smaže aktuální výběr" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Hustota" @@ -3167,9 +3166,9 @@ msgstr "Hustota vnitřní výplně vyjádřená v rozmezí 0 až 100 %." msgid "Density of the first raft or support layer." msgstr "Hustota prvního vrstvy raftu nebo podpěrné vrstvy." -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Závislosti" @@ -3193,7 +3192,7 @@ msgstr "Odznačit vše" msgid "Deselect by rectangle" msgstr "Odznačit obdélníkovým výběrem myši" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Odznačit všechny objekty" @@ -3229,7 +3228,7 @@ msgstr "Oddělit od systémového přednastavení" msgid "Detach preset" msgstr "Oddělení přednastavení" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Odpojeno" @@ -3253,7 +3252,7 @@ msgstr "" msgid "Detect thin walls" msgstr "Detekovat tenké stěny" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -3277,15 +3276,15 @@ msgstr "Zařízení:" msgid "Diameter" msgstr "Průměr" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Průměr základny podpěr v mm" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Průměr podpěrných sloupů v mm" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Průměr konce podpůrného hrotu" @@ -3348,31 +3347,31 @@ msgstr "Odstranit všechny vámi provedené změny" msgid "Discard changes" msgstr "Zahodit změny" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Displej" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Výška displeje" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Horizontální zrcadlení displeje" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Orientace displeje" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Zobrazit okno s frontou nahrávání do tiskového serveru" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Vertikální zrcadlení displeje" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Šířka displeje" @@ -3391,7 +3390,7 @@ msgstr "" "Vzdálenost mezi obrysem a límcem (pokud není použit ochranný štít) nebo " "objekty." -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -3428,11 +3427,11 @@ msgstr "Vzdálenost, použitá pro funkci automatického rozmístění po podlo msgid "Divide by zero" msgstr "Dělení nulou" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 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:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -3488,7 +3487,7 @@ msgstr "Chcete pro tyto modely tiskáren vybrat výchozí SLA materiály?" 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/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Neuspořádávat" @@ -3552,11 +3551,11 @@ msgstr "" msgid "Drop to bed" msgstr "Spadnout na podložku" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Duplikovat" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Duplikovat mřížkou" @@ -3573,11 +3572,11 @@ msgstr "Během ostatních vrstev bude ventilátor vždy běžet na %1%%%" msgid "During the other layers, fan will be turned off." msgstr "Během ostatních vrstev bude ventilátor vypnutý." -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dynamic" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "E&xportovat" @@ -3628,7 +3627,7 @@ msgstr "Upravit vlastní G-code" msgid "Edit pause print message" msgstr "Upravit zprávu při pozastavení tisku" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Upravit fyzickou tiskárnu" @@ -3652,7 +3651,7 @@ msgstr "Editace" msgid "Eigen vectorization supported:" msgstr "Podporovaná vlastní vektorizace:" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Vysunou&t SD kartu / Flash disk" @@ -3660,7 +3659,7 @@ msgstr "Vysunou&t SD kartu / Flash disk" msgid "Eject SD card / Flash drive" msgstr "Vysunout SD kartu / Flash disk" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 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." @@ -3677,7 +3676,7 @@ msgstr "Vysunutí zařízení %s(%s) se nezdařilo." msgid "Elephant foot compensation" msgstr "Kompenzace rozplácnutí první vrstvy" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Minimální šířka po kompenzaci rozplácnutí první vrstvy" @@ -3710,7 +3709,7 @@ msgstr "Emitovat do G-codu" msgid "Empty layer between %1% and %2%." msgstr "Prázdná vrstva mezi %1% a %2%." -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Zapnout" @@ -3727,11 +3726,11 @@ msgstr "Aktivace tmavého režimu" msgid "Enable fan if layer print time is below" msgstr "Zapnout ventilátor, pokud je doba tisku vrstvy kratší než" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Povolit tvorbu dutin" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Zapne horizontální zrcadlení výstupních obrázků" @@ -3744,7 +3743,7 @@ 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:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -3752,7 +3751,7 @@ msgstr "" "Umožňuje načítání neznámých konfiguračních hodnot jejich tichým nahrazením " "výchozími hodnotami." -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -3802,7 +3801,7 @@ msgstr "" msgid "Enable variable layer height feature" msgstr "Zapnout variabilní výšku vrstev" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Zapne vertikální zrcadlení výstupních obrázků" @@ -3818,7 +3817,7 @@ msgstr "" "Umožňuje vyplnit mezery mezi perimetry a mezi nejvnitřnějšími perimetry a " "výplní." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" @@ -3850,7 +3849,7 @@ msgstr "Vynucení podpěr" msgid "Enqueued" msgstr "Zařazeno do fronty" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Zajistit položení na podložku" @@ -3959,7 +3958,7 @@ msgstr "" "Chyba: \"%2%\"" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Chyba" @@ -4107,23 +4106,23 @@ msgstr "Expertní režim" msgid "Export" msgstr "Exportovat" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Exportovat Konfigura&ci" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Exportovat &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Exportovat &Trasy extruderu jako OBJ" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Exportovat 3MF" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Exportovat AMF" @@ -4131,11 +4130,11 @@ msgstr "Exportovat AMF" msgid "Export AMF file:" msgstr "Exportovat AMF soubor:" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Exportovat Konfigurační &Balík" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Exportovat Konfigurační balík včetně fyzických tiskáren" @@ -4144,15 +4143,15 @@ msgid "Export G-Code." msgstr "Export G-codu." #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Exportovat G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exportovat G-code na SD kartu / Flash disk" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Exportovat OBJ" @@ -4160,19 +4159,19 @@ msgstr "Exportovat OBJ" msgid "Export OBJ file:" msgstr "Exportovat OBJ soubor:" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Exportovat Plochu jako &STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Exportovat T&iskovou plochu včetně podpěr jako STL" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Exportovat SLA" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Exportovat STL" @@ -4180,11 +4179,11 @@ msgstr "Exportovat STL" msgid "Export STL file:" msgstr "Exportovat STL soubor:" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 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:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Exportovat všechna přednastavení do souboru" @@ -4196,23 +4195,23 @@ msgstr "Exportovat jako STL" msgid "Export config" msgstr "Exportovat konfiguraci" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Exportovat současnou konfiguraci do souboru" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Exportovat stávající plochu do G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 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:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Exportovat stávající plochu jako STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Exportovat stávající plochu včetně podpěr jako STL" @@ -4229,19 +4228,19 @@ msgstr "Export dočasného 3MF souboru selhalo" msgid "Export sources full pathnames to 3mf and amf" msgstr "Exportovat absolutní cesty k 3mf a amf souborům" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Exportovat model(y) jako 3MF." -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Exportovat model(y) jako AMF." -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Exportovat model(y) jako OBJ." -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Exportovat model(y) jako STL." @@ -4249,7 +4248,7 @@ msgstr "Exportovat model(y) jako STL." msgid "Export to SD card / Flash drive" msgstr "Export na SD kartu / Flash disk" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Exportovat trasy extruderu jako OBJ" @@ -4261,7 +4260,7 @@ msgstr "Export." msgid "Exporting G-code" msgstr "Exportování souboru G-code" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Exportování konfiguračního balíku" @@ -4282,11 +4281,11 @@ msgstr "Exportování." msgid "Exposition time is out of printer profile bounds." msgstr "Doba osvitu je mimo rozsah profilu tiskárny." -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Osvit" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Doba osvitu" @@ -4348,7 +4347,7 @@ msgstr "Barva extruderu" msgid "Extruder changed to" msgstr "Extruder změněn na" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Kolizní oblast extruderu" @@ -4357,7 +4356,7 @@ msgid "Extruder offset" msgstr "Odsazení extruderu" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -4365,7 +4364,7 @@ msgid "Extruders" msgstr "Extrudery" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Počet extruderů" @@ -4405,7 +4404,7 @@ msgstr "Tiskárny technologie FFF" msgid "Facets" msgstr "Facety" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Vrstvy počátečního osvitu" @@ -4434,11 +4433,11 @@ msgstr "Některé otvory se do modelu nepodařilo se vyvrtat" msgid "Fan Speed (%)" msgstr "Rychlost ventilátoru (%)" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Nastavení ventilátoru" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Rychlost ventilátoru" @@ -4471,11 +4470,11 @@ msgstr "Ventilátor vždy poběží na %1%%%" msgid "Fan will be turned off." msgstr "Ventilátor bude vypnutý." -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Rychlý" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Rychlý náklon" @@ -4499,7 +4498,7 @@ msgstr "Typy extrudování" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -4511,7 +4510,7 @@ msgstr "Průměr filamentu:" msgid "Filament End G-code" msgstr "Filament Konec G-code" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Přepsání globálních hodnot" @@ -4520,7 +4519,7 @@ msgid "Filament Profiles Selection" msgstr "Výběr Filamentových Profilů" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Nastavení filamentu" @@ -4562,7 +4561,7 @@ msgstr "Poznámky k filamentu" msgid "Filament parking position" msgstr "Parkovací pozice filamentu" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Vlastnosti filamentu" @@ -4579,7 +4578,7 @@ msgstr "Doba vysouvání filamentu" msgid "Filaments" msgstr "Filamenty" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Soubor nenalezen" @@ -4647,7 +4646,7 @@ msgstr "Vyplní zbývající tiskovou plochu instancemi vybraného objektu" msgid "Filling bed" msgstr "Vyplňování podložky" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Najít" @@ -4659,11 +4658,11 @@ msgstr "Vyhledávání / nahrazování vzorů v řádcích G-code a jejich nahra msgid "Finished" msgstr "Dokončeno" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Firmware Retrakce" @@ -4878,7 +4877,7 @@ 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:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Vynutit podložku všude okolo objektů" @@ -4912,7 +4911,7 @@ msgstr "" "Formát náhledových obrázků G-codu: Pro nejlepší kvalitu PNG, pro nejmenší " "velikost JPG, pro firmware s malou pamětí QOI" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -4920,7 +4919,7 @@ msgstr "" "Pravidlo dopředné kompatibility při načítání konfigurací z konfiguračních " "souborů a souborů projektů (3MF, AMF)." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Nalezená vyhrazená klíčová slova v" @@ -4932,11 +4931,11 @@ msgstr "Předchozí extruder" 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:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Zepředu" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Pohled zepředu" @@ -4944,7 +4943,7 @@ msgstr "Pohled zepředu" msgid "Full fan speed at layer" msgstr "Maximální otáčky ventilátoru ve vrstvě" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Fullscreen" @@ -4992,7 +4991,7 @@ msgstr "Tloušťka členitého povrchu" msgid "Fuzzy skin type." msgstr "Typ členitého povrchu." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-code" @@ -5029,11 +5028,11 @@ msgstr "Nahrazení G-codu" msgid "G-code thumbnails" msgstr "Náhledy G-codu" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Prohlížeč G-codu" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, verze 3" @@ -5050,10 +5049,10 @@ msgstr "Galerie" msgid "Gap fill" msgstr "Výplň tenkých stěn" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Obecné" @@ -5083,11 +5082,11 @@ msgstr "" "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:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Generovat podpěry" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Generovat podpěry modelů" @@ -5279,11 +5278,11 @@ msgstr "" msgid "Head diameter" msgstr "Průměr hrotu" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Průnik podpěry do modelu" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 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." @@ -5307,7 +5306,7 @@ msgstr "Výška (mm)" msgid "Height of skirt expressed in layers." msgstr "Výška obrysu vyjádřená ve vrstvách." -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Výška displeje" @@ -5332,15 +5331,15 @@ 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:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Nápověda" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Nápověda (pro FFF)" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Nápověda (pro SLA)" @@ -5375,7 +5374,7 @@ msgstr "Vysoká" 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:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Vysoká viskozita" @@ -5407,7 +5406,7 @@ msgstr "Průměr otvoru" msgid "Hollow and drill" msgstr "Vydutit a vyvrtat" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Vyduťte model, abyste měli vnitřek prázdný" @@ -5415,16 +5414,16 @@ msgstr "Vyduťte model, abyste měli vnitřek prázdný" msgid "Hollow this object" msgstr "Vydutit tento objekt" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Vytvoření dutiny" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -5492,19 +5491,19 @@ msgstr "" "Pro více informací přejeďte kurzorem nad tlačítky\n" "nebo na tlačítko klikněte." -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 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:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Jak hluboko mají spojky proniknou do modelu." -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -5721,7 +5720,7 @@ msgstr "" "Pokud je povoleno, bude v pravém horním rohu 3D scény zobrazeno tlačítko pro " "ovládání bočního panelu" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -5990,7 +5989,7 @@ msgstr "" "offline distribučních bodů. Tuto možnost lze povolit pro certifikáty " "podepsané vlastním podpisem v případě, že se připojení nezdaří." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignorovat neexistující konfigurační soubory" @@ -6008,15 +6007,15 @@ msgstr "Nepovolený příkaz" msgid "Import" msgstr "Importovat" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importovat Konfigura&ci" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importovat Konfigurační &Balík" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Načíst konfiguraci z &Projektu" @@ -6032,7 +6031,7 @@ msgstr "Importovat Objekt" msgid "Import Objects" msgstr "Importovat Objekty" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Importovat SL1 / SL1S Archiv" @@ -6040,11 +6039,11 @@ msgstr "Importovat SL1 / SL1S Archiv" msgid "Import SLA archive" msgstr "Importovat SLA archiv" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Importovat STL (imperiální jednotky)" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importovat STL/OBJ/AM&F/3MF" @@ -6172,11 +6171,11 @@ msgstr "Zdědí profil" 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:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Doba počátečního osvitu" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Výška první vrstvy" @@ -6280,7 +6279,7 @@ msgstr "Vnitřní chyba: %1%" msgid "Internal infill" msgstr "Vnitřní výplň" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Neplatný průnik podpěry do modelu" @@ -6308,7 +6307,7 @@ msgstr "" msgid "Invalid numeric input." msgstr "Neplatný číselný vstup." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Průměr hrotu podpěry je neplatný" @@ -6343,11 +6342,11 @@ msgstr "Způsob vyhlazování" msgid "Is it safe?" msgstr "Je to bezpečné?" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Izometrické" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Izometrické zobrazení" @@ -6374,7 +6373,7 @@ msgstr "" "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/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "Toto je poslední přednastavení pro tuto fyzickou tiskárnu." @@ -6386,7 +6385,7 @@ msgstr "SLA technologií nelze tisknout vícedílné objekty." 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:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Ryv limity" @@ -6452,7 +6451,7 @@ msgstr "Zachovejte vybraná nastavení." msgid "Keep upper part" msgstr "Zachovat horní část" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" @@ -6460,11 +6459,11 @@ msgstr "Klávesové zkratky" msgid "Keyboard shortcuts" msgstr "Klávesové zkratky" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "ZAMČENÝ ZÁMEK" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -6472,7 +6471,7 @@ 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:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -6484,7 +6483,7 @@ msgstr "" msgid "Label objects" msgstr "Označování objektů" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Orientace na šířku" @@ -6524,7 +6523,7 @@ msgstr "" "\n" "Výška vrstvy bude resetována na 0,01." -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Výškové limity vrstvy" @@ -6532,8 +6531,8 @@ msgstr "Výškové limity vrstvy" msgid "Layer range Settings to modify" msgstr "Nastavení pro vrstvy v rozsahu" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Vrstvy" @@ -6550,7 +6549,7 @@ msgstr "Vrstvy" msgid "Layers and Perimeters" msgstr "Vrstvy a perimetry" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Vrstvy a perimetry" @@ -6563,15 +6562,15 @@ msgstr "Možnosti rozložení" msgid "Leave \"%1%\" enabled" msgstr "Ponechat možnost \"%1%\" povolenou" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Zleva" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Hodnota levého přednastavení" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Pohled zleva" @@ -6610,7 +6609,7 @@ msgid "Length of the infill anchor" msgstr "Délka výplňové kotvy" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -6622,7 +6621,7 @@ msgstr "" msgid "Lift Z" msgstr "Zvednout Z" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -6648,7 +6647,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2293 msgid "Limited" -msgstr "Omezené" +msgstr "Omezeno" #: src/libslic3r/PrintConfig.cpp:1170 msgid "Line" @@ -6682,19 +6681,19 @@ msgstr "Přidání části" msgid "Load Project" msgstr "Načíst Projekt" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Načíst model" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Načíst SL1 / SL1S archiv" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Načíst jako model v imperiálních jednotkách" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -6703,7 +6702,7 @@ 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:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Načíst konfigurační soubor" @@ -6722,11 +6721,11 @@ msgstr "" "SL1 / SL1S archiv, která rovněž umožňuje rekonstruovat 3D modely z " "voxelových dat." -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Načíst konfiguraci z projektu" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -6734,11 +6733,11 @@ 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:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Načíst exportovaný konfigurační soubor" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Načíst přednastavení z balíku" @@ -6770,11 +6769,11 @@ msgstr "Načítání konfigurace" msgid "Loading file" msgstr "Načítání souboru" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Načítání konfiguračního balíku" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Načítání konfiguračního souboru" @@ -6813,7 +6812,7 @@ msgstr "Lokální souřadnice" msgid "Lock supports under new islands" msgstr "Ukotvi podpěry pod novými ostrůvky" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Úroveň logování" @@ -6829,7 +6828,7 @@ msgstr "Nízká" msgid "Lowest Z height" msgstr "Nejnižší výška v ose Z" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -6838,14 +6837,14 @@ msgstr "Nejnižší výška v ose Z" msgid "Machine limits" msgstr "Limity stroje" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" "Nejsou nastaveny limity zařízení, proto nemusí být odhad doby tisku přesný." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -6855,7 +6854,7 @@ msgstr "" "tisku, což však nemusí být přesné, protože tiskárna může použít jinou sadu " "limitů." -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" @@ -6880,20 +6879,20 @@ msgstr "Manuální úprava" msgid "Masked SLA file exported to %1%" msgstr "Soubor pro SLA byl exportován do %1%" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Shoda na jednom řádku" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Panel Nastavení mate&riálu" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Materiál" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Nastavení materiálu" @@ -6902,7 +6901,7 @@ msgstr "Nastavení materiálu" msgid "Material Settings Tab" msgstr "Panel Nastavení materiálu" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Profil tiskového materiálu" @@ -6910,19 +6909,19 @@ msgstr "Profil tiskového materiálu" msgid "Max" msgstr "Maximum" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Maximální délka mostu" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Max počet mostů na sloupu" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Maximální vzdálenost pro sloučení" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Max. vzdálenost propojení podpěr" @@ -7018,7 +7017,7 @@ msgstr "Maximální zrychlení při retrakci" msgid "Maximum acceleration when retracting (M204 R)" msgstr "Maximální zrychlení při retrakci (M204 R)" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Maximální zrychlení" @@ -7039,7 +7038,7 @@ msgstr "" "vytvoří low poly efekt a protože redukce G-codu se provádí v každé vrstvě " "nezávisle, mohou vznikat viditelné artefakty." -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Maximální doba osvitu" @@ -7075,11 +7074,11 @@ msgstr "Maximální rychlost posuvu osy Y" msgid "Maximum feedrate of the Z axis" msgstr "Maximální rychlost posuvu osy Z" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Maximální rychlosti posuvu" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Maximální doba počátečního osvitu" @@ -7119,7 +7118,7 @@ msgstr "Maximální ryv (jerk) osy Z" msgid "Maximum length of the infill anchor" msgstr "Maximální délka výplňové kotvy" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -7150,7 +7149,7 @@ msgid "Medium" msgstr "Střední" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Sloučit" @@ -7166,7 +7165,7 @@ msgstr "Sloučit objekty do jednoho vícedílného objektu" msgid "Merged" msgstr "Sloučení" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -7205,7 +7204,7 @@ msgstr "Minimum" msgid "Min print speed" msgstr "Minimální rychlost tisku" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Minimální vzdálenost podpěrných bodů" @@ -7247,11 +7246,11 @@ msgstr "" "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:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Minimální doba osvitu" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Minimum feature size" msgstr "Minimální velikost prvku" @@ -7263,15 +7262,15 @@ msgstr "Minimální rychlosti posuvu během extruze" msgid "Minimum feedrate when extruding (M205 S)" msgstr "Minimální rychlosti posuvu během extruze (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Minimální rychlosti posuvu" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Minimální doba počátečního osvitu" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Minimální šířka perimetru" @@ -7295,15 +7294,18 @@ msgstr "" msgid "Minimum thickness of a top / bottom shell" msgstr "Minimální tloušťka vrchní / spodní skořepiny" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" "Minimální tloušťka tenkých prvků. Prvky modelu, které jsou tenčí než tato " "hodnota, nebudou vytištěny, zatímco prvky silnější než minimální velikost " -"prvku budou rozšířeny na minimální šířku perimetru." +"prvku budou rozšířeny na minimální šířku perimetru. Pokud je vyjádřeno v " +"procentech (například 25%), bude vypočítáno na základě průměru trysky." #: src/libslic3r/PrintConfig.cpp:2899 msgid "Minimum top shell thickness" @@ -7326,11 +7328,11 @@ msgstr "Minimální rychlost při přesunu" msgid "Minimum travel feedrate (M205 T)" msgstr "Minimální rychlost při přesunu (M205 T)" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Minimální tloušťka stěny dutého modelu." -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" @@ -7356,7 +7358,7 @@ msgstr "" msgid "Mirror Object" msgstr "Zrcadlit Objekt" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Zrcadlit horizontálně" @@ -7376,7 +7378,7 @@ msgstr "Zrcadlit rozměr vybraného objektu podél osy Y" msgid "Mirror the selected object along the Z axis" msgstr "Zrcadlit rozměr vybraného objektu podél osy Z" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Zrcadlit vertikálně" @@ -7552,11 +7554,11 @@ msgstr "" "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:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Vynásobí kopie vytvořením mřížky." -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Vynásobí kopie tímto číslem." @@ -7646,7 +7648,7 @@ msgstr "Nové rozvržení, přístup přes tlačítko nastavení v horním menu" msgid "New prerelease version %1% is available." msgstr "K dispozici je nová předběžná verze %1%." -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Zvoleno nové přednastavení tiskárny" @@ -7705,7 +7707,7 @@ msgstr "" 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:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Žádné dříve slicované soubory." @@ -7713,7 +7715,7 @@ msgstr "Žádné dříve slicované soubory." msgid "No sparse layers (EXPERIMENTAL)" msgstr "Bez řídkých vrstev (EXPERIMENTÁLNÍ)" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 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." @@ -7729,7 +7731,7 @@ msgid "None" msgstr "Žádné" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normální" @@ -7745,7 +7747,7 @@ msgstr "Nenalezeno:" msgid "Note" msgstr "Poznámka" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -7754,7 +7756,7 @@ msgstr[1] "Pozor, vybrané přednastavení bude odstraněno i z těchto tiskáre msgstr[2] "Pozor, vybrané přednastavení bude odstraněno i z těchto tiskáren." msgstr[3] "Pozor, vybrané přednastavení bude odstraněno i z těchto tiskáren." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -7772,7 +7774,7 @@ msgstr[3] "" "Upozorňujeme, že tyto tiskárny budou po smazání vybraného přednastavení " "odstraněny." -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -7821,12 +7823,12 @@ msgstr "Upozornění: Taoto přednastavení bude po uložení nahrazeno" 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:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Poznámky" @@ -7840,7 +7842,7 @@ msgstr "Oznámení" msgid "Notify about new releases" msgstr "Upozornění na nové verze" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Tryska" @@ -7852,7 +7854,7 @@ msgstr "Průměr trysky:" msgid "Nozzle and Bed Temperatures" msgstr "Teplota trysky a tiskové podložky" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Průměr trysky" @@ -7883,7 +7885,7 @@ msgstr "" msgid "Number of cooling moves" msgstr "Počet chladících pohybů" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Počet extrudérů tiskárny." @@ -7911,15 +7913,15 @@ msgstr "" "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:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Počet pixelů v ose" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Počet pixelů v ose X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Počet pixelů v ose Y" @@ -7935,7 +7937,7 @@ msgstr "Počet plných vrstev generovaných na vrchních a spodních površích. msgid "Number of solid layers to generate on top surfaces." msgstr "Počet vrchních generovaných plných vrstev." -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -7950,7 +7952,7 @@ msgstr "Počet změn nástroje" msgid "Object Settings to modify" msgstr "Změna nastavení objektu" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Nadzvednutí objektu" @@ -8073,7 +8075,7 @@ msgstr "Zapnou/vypnout režim jedné vrstvy vertikálního posuvníku" msgid "One layer mode" msgstr "Zobrazení po jedné vrstvě" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Jedno z přednastavení nebylo nalezeno" @@ -8096,7 +8098,7 @@ msgstr "" "odeberte všechny objekty kromě posledního, nebo povolte sekvenční režim " "pomocí \"complete_objects\"." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -8108,7 +8110,7 @@ msgstr "" msgid "Only infill where needed" msgstr "Výplň pouze kde je potřeba" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Pouze zvednout Z" @@ -8150,7 +8152,7 @@ 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:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Otevřít &PrusaSlicer" @@ -8170,11 +8172,11 @@ msgstr "Otevřít složku." msgid "Open G-code file:" msgstr "Otevřít soubor G-code:" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Otevřít prohlížeč G-codu" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Otevřít Novou Instanci" @@ -8182,20 +8184,20 @@ msgstr "Otevřít Novou Instanci" msgid "Open Preferences." msgstr "Otevřít Nastavení." -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Otevřít PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Otevřít G-code" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Otevře novou instanci PrusaSliceru" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Otevřít soubor s projektem" @@ -8238,7 +8240,7 @@ msgstr "Otevřít webovou stránku %s v prohlížeči" 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:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Otevřete dialogové okno pro úpravu galerie tvarů" @@ -8254,7 +8256,7 @@ msgstr "Otevírání průvodce nastavením" msgid "Opening new project while some presets are unsaved." msgstr "Otevírání nového projektu. Některá přednastavení nejsou uložena." -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -8331,7 +8333,7 @@ msgstr "Hledání optimální orientace zrušeno." msgid "Origin" msgstr "Počátek" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Ostatní" @@ -8351,15 +8353,15 @@ msgstr "Vnější a vnitřní límec" msgid "Outer brim only" msgstr "Pouze vnější okraj" -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Výstupní soubor" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Info o výstupním modelu" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Výstupní soubor" @@ -8367,7 +8369,7 @@ msgstr "Výstupní soubor" msgid "Output filename format" msgstr "Formát názvu výstupního souboru" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Možnosti výstupu" @@ -8392,19 +8394,19 @@ msgstr "Mezní úhel převisu" msgid "Overlap" msgstr "Překrytí" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Panel Nastavení &tisku" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Podložka" @@ -8412,15 +8414,15 @@ msgstr "Podložka" msgid "Pad and Support" msgstr "Podložka a Podpěry" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Podložka okolo objektu" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Podložka všude okolo objektu" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Velikost límce podložky" @@ -8428,31 +8430,31 @@ msgstr "Velikost límce podložky" 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:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Průnik spojky Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Rozteč spojek Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Šířka spojky Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Mezera Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Výška bočnice podložky" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Sklon bočnice podložky" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Tloušťka stěny podložky" @@ -8583,7 +8585,7 @@ msgstr "Vložit" msgid "Paste From Clipboard" msgstr "Vložení ze schránky" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Vložit ze schránky" @@ -8621,7 +8623,7 @@ msgstr "Vzor použitý pro generování podpěr." msgid "Pause" msgstr "Pozastavení" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G-code pro pozastavení tisku" @@ -8656,7 +8658,7 @@ msgstr "" "Provést integraci do systému (Nastaví tuto binárku tak, aby ji systém mohl " "prohledávat)." -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -8699,7 +8701,7 @@ msgstr "" msgid "Perimeter" msgstr "Perimetr" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Počet ovlivněných perimetrů" @@ -8711,15 +8713,15 @@ msgstr "Extruder pro perimetry" msgid "Perimeter generator" msgstr "Generátor obvodových stěn" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Délka přechodu perimetru" -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Filtr přechodového rozpětí perimetrů" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Prahový úhel přechodu perimetru" @@ -8770,27 +8772,27 @@ msgstr "" "Velikosti obrázků budou uloženy do souborů .gcode / .sl1 / .sl1s, v " "následujícím formátu: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Způsob propojení podpěr" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Průměr podpěry" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Koeficient rozšiřování podpěry" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 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:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Průměr podpěrného hrotu" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Šířka podpěrného hrotu" @@ -8838,11 +8840,11 @@ msgstr "" msgid "Please select the file to reload" msgstr "Vyberte soubor, který chcete znovu načíst" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Autorská práva" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Orientace na výšku" @@ -8851,7 +8853,7 @@ msgstr "Orientace na výšku" msgid "Position" msgstr "Pozice" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Pozice (pro tiskárny s více extrudery)" @@ -8867,7 +8869,7 @@ msgstr "Pozice Y" msgid "Position of perimeters starting points." msgstr "Pozice začátku perimetrů." -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "Post-processing skripty musí G-code upravit in place." @@ -8890,11 +8892,11 @@ msgstr "" "Upravte prosím skript tak, aby změnil G-code in place. V manuálu případně " "dohledáte jak G-code po zpracování přejmenovat.\n" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Post-processing skripty" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "&Náhled" @@ -8965,7 +8967,7 @@ msgstr "" msgid "Preset with name \"%1%\" already exists." msgstr "Přednastavení s názvem \"%1%\" již existuje." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -8974,7 +8976,7 @@ msgstr "" "Kliknutím na toto tlačítko vyberete stejná nastavení pro pravé i levé " "přednastavení." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Přednastavení jsou shodná" @@ -9014,7 +9016,7 @@ msgstr "" msgid "Pressure equalizer (experimental)" msgstr "Vyrovnávač tlaku (experimentální)" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -9035,7 +9037,7 @@ msgstr "" "průměru trysky." #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Náhled" @@ -9043,7 +9045,7 @@ msgstr "Náhled" msgid "Preview hollowed and drilled model" msgstr "Náhled dutého modelu" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Dříve slicovaný soubor (" @@ -9055,7 +9057,7 @@ msgstr "Příprava všech tiskových extruderů" msgid "Print" msgstr "Tisk" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Fronta na&hrávání do tiskového serveru" @@ -9063,7 +9065,7 @@ msgstr "Fronta na&hrávání do tiskového serveru" msgid "Print Diameters" msgstr "Parametry extruderu" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Nahrávání do tiskového serveru" @@ -9102,15 +9104,15 @@ msgstr "Pauzy tisku" msgid "Print settings" msgstr "Nastavení tisku" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Rychlost tisku" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Přepsání rychlosti tisku" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Panel Nastav&ení tiskárny" @@ -9145,11 +9147,11 @@ msgstr "Nastavení tiskárny" msgid "Printer Settings Tab" msgstr "Panel Nastavení tiskárny" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Absolutní korekce tiskárny" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Gamma korekce tiskárny" @@ -9161,32 +9163,32 @@ msgstr "Poznámky o tiskárně" msgid "Printer preset names" msgstr "Názvy přednastavení tiskáren" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Korekce měřítka v ose X" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Korekce měřítka v ose Y" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Korekce měřítka v ose Z" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Korekce měřítka tisku" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Korekce měřítka v ose X" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Korekce měřítka v ose Y" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Korekce měřítka v ose Z" @@ -9233,7 +9235,7 @@ msgid "Process %1% / 100" msgstr "Zpracováno %1% / 100" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Zpracovávám %s" @@ -9247,9 +9249,9 @@ msgstr "" "Zpracování modelu '%1%' s více než milionem trojúhelníků může být pomalé. " "Doporučujeme snížit množství trojúhelníků." -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Profilové závislosti" @@ -9341,7 +9343,7 @@ msgid "" "PrusaSlicer has encountered an error while taking a configuration snapshot." msgstr "PrusaSlicer narazil na chybu při pořizování zálohy konfigurace." -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -9460,15 +9462,15 @@ msgstr "Rychlé" msgid "Quick Add Settings (%s)" msgstr "Rychlé přidání nastavení (%s)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Rychlé Slicování" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Rychlé Slicování a Uložit jako" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Ukončit %s" @@ -9537,7 +9539,7 @@ msgstr "Šířka linky při rapidní extruzi" msgid "Ramming parameters" msgstr "Parametry rapidní extruze" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Nastavení rapidní extruze" @@ -9557,8 +9559,8 @@ msgstr "Rozsah" msgid "Rasterizing layers" msgstr "Rasterizace vrstev" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Znovu &načíst z disku" @@ -9570,15 +9572,15 @@ msgstr "Přenastavit" msgid "Ready" msgstr "Připraveno" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Zezadu" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Pohled zezadu" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "N&edávné projekty" @@ -9621,7 +9623,7 @@ msgid "Rectilinear grid" msgstr "Přímočará mřížka" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Vpřed" @@ -9654,7 +9656,7 @@ msgstr "Obnovit tiskárny" msgid "Regular" msgstr "Obvyklý" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Regulární výraz" @@ -9704,9 +9706,9 @@ msgstr "Znovu načíst z:" msgid "Reload plater from disk" msgstr "Znovu načíst podložku z disku" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Znovu načíst podložku z disku" @@ -9732,7 +9734,7 @@ msgid "Remember output directory" msgstr "Pamatovat si výstupní složku" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Odebrat" @@ -9859,11 +9861,11 @@ msgstr "" msgid "Render" msgstr "Render" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Vykreslování pomocí softwaru" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -9871,7 +9873,7 @@ msgstr "" "Vykreslení pomocí softwaru. Namísto výchozího ovladače OpenGL je načten " "dodaný softwarový renderer MESA." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Oprava" @@ -9903,11 +9905,11 @@ msgstr "Opravování modelu službou Netfabb" msgid "Repairing was canceled" msgstr "Oprava byla zrušena" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Opakovat poslední rychlé slicování" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Opakovat poslední rychlé slicování" @@ -9919,7 +9921,7 @@ msgstr "Nahradit z:" msgid "Replace the selected volume with new STL" msgstr "Nahradit vybraný objekt novým STL souborem" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Nahradit" @@ -9987,7 +9989,7 @@ msgstr "Výchozí měřítko" msgid "Reset selection" msgstr "Resetovat výběr" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Obnovit na barvu filamentu" @@ -10011,8 +10013,8 @@ msgstr "Délka retrakce před očištěním" msgid "Retract on layer change" msgstr "Retrakce při změně vrstvy" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Retrakce" @@ -10035,7 +10037,7 @@ msgstr "" "Retrakce není spuštěna, pokud jsou rychloposuny pojezdu kratší než tato " "délka." -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -10067,15 +10069,15 @@ msgstr "Vrátit převod z metrů" msgid "Review the substitutions and adjust them if needed." msgstr "Zkontrolujte náhrady a případně je upravte." -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Zprava" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Hodnota pravého přednastavení" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Pohled zprava" @@ -10112,15 +10114,15 @@ msgstr "Pravé tlačítko myši:" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Otočit" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Otočit okolo osy X" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Otočit okolo osy Y" @@ -10148,15 +10150,15 @@ msgstr "" msgid "Rotation" msgstr "Otáčení" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Úhel otočení kolem osy X ve stupních." -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Úhel otočení kolem osy Y ve stupních." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Úhel otočení kolem osy Z ve stupních." @@ -10174,11 +10176,11 @@ msgstr "Spustit %s" msgid "Running post-processing scripts" msgstr "Vykonávají se postprodukční skripty" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "Od&eslat G-code" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "Od&eslat do tiskárny" @@ -10208,7 +10210,7 @@ msgstr "Klávesové zkratky pro SLA gizma" msgid "SLA material" msgstr "SLA materiál" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Typ SLA materiálu" @@ -10220,7 +10222,7 @@ msgstr "SLA materiály" msgid "SLA print" msgstr "SLA tisk" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Poznámky pro SLA materiál" @@ -10232,7 +10234,7 @@ msgstr "Nastavení SLA tisku" msgid "SLA supports outside the print area were detected." msgstr "Byly zjištěny SLA podpěry mimo tiskovou oblast." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" @@ -10251,7 +10253,7 @@ msgstr "Uložit" msgid "Save %s as:" msgstr "Uložit %s jako:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Uložit %s soubor jako:" @@ -10260,11 +10262,11 @@ msgstr "Uložit %s soubor jako:" msgid "Save G-code file as:" msgstr "Uložit G-code jako:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 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/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Uložit Projekt j&ako" @@ -10272,15 +10274,15 @@ msgstr "Uložit Projekt j&ako" msgid "Save SL1 / SL1S file as:" msgstr "Uložit SL1 / SL1S soubor jako:" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Uložit konfigurační soubor" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Uložit konfiguraci jako:" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Uložit konfiguraci do zadaného souboru." @@ -10290,11 +10292,11 @@ msgstr "Uložit konfiguraci do zadaného souboru." msgid "Save current %s" msgstr "Uložit stávající %s" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Uložit stávající projekt" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Uložit stávající projekt jako" @@ -10307,7 +10309,7 @@ msgstr "Uložit soubor jako:" msgid "Save preset" msgstr "Uložit přednastavení" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Uložit balík přednastavení jako:" @@ -10336,7 +10338,7 @@ msgstr "Uloží vybraná nastaneví do přednastavení \"%1%\"." msgid "Save the selected options." msgstr "Uložte vybrané možnosti." -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Uložit ZIP soubor jako:" @@ -10350,7 +10352,7 @@ msgstr "Ukládání meshe do 3MF kontejneru selhalo." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Měřítko" @@ -10368,11 +10370,11 @@ msgstr "" "Přizpůsobit měřítko vybraného objektu, aby se objekt vešel do tiksového " "objemu" -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Vyplnit tiskový objem" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Změnit velikost, aby se objekt vešel do zadaného tiskového prostoru." @@ -10380,7 +10382,7 @@ msgstr "Změnit velikost, aby se objekt vešel do zadaného tiskového prostoru. msgid "Scale to print volume" msgstr "Změnit velikost podle tiskového objemu" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Procentuální měřítko." @@ -10411,7 +10413,7 @@ msgstr "Seam preferred direction jitter" msgid "Seams" msgstr "Švy" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Vy&hledávání" @@ -10435,7 +10437,7 @@ msgstr "" msgid "Search in English" msgstr "Hledat v angličtině" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Vyhledávání v nastavení" @@ -10522,7 +10524,7 @@ msgstr "Vyberte jak chcete na soubor otevřít" msgid "Select by rectangle" msgstr "Označit obdélníkovým výběrem myši" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Zvolte konfiguraci k načtení:" @@ -10530,7 +10532,7 @@ msgstr "Zvolte konfiguraci k načtení:" 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/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Zvolte přednastavení k porovnání" @@ -10542,7 +10544,7 @@ msgstr "Vyberte tvar z galerie" msgid "Select showing settings" msgstr "Zvolte nastavení zobrazení" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Vyberte STL soubor k opravě:" @@ -10626,7 +10628,7 @@ msgstr "Výběr - Odebrání v seznamu" msgid "Selection-Remove from rectangle" msgstr "Výběr - Odebrání obdélníkovým výběrem" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Vybrat všechny objekty" @@ -10643,7 +10645,7 @@ msgstr "Odeslat G-code" msgid "Send system info" msgstr "Odeslat systémové informace" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Odeslat k tisku stávající plochu jako G-code" @@ -10667,7 +10669,7 @@ msgstr "Odesílání systémových informací..." msgid "Seq." msgstr "Sekv." -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Sekvenční tisk" @@ -10683,7 +10685,7 @@ msgstr "Sériový port:" msgid "Service name" msgstr "Název služby" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Nastavit" @@ -10810,7 +10812,7 @@ msgstr "Nastavení vybraných položek jako tisknuté/netisknuté" msgid "Set settings tabs as menu items (experimental)" msgstr "Karty s nastavením zobrazovat jako položky v menu (experimentální)" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -10965,7 +10967,7 @@ msgstr "" msgid "Set upper thumb as active" msgstr "Nastavit horní ukazatel jako aktivní" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -10976,7 +10978,7 @@ msgstr "" "Například. loglevel=2 zaznamenává fatální chyby, chyby a varovné zprávy." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Nastavení" @@ -11025,7 +11027,7 @@ msgstr "Mám synchronizovat vrstvy podpěr, aby bylo možné zapnout Čistící msgid "Shape" msgstr "Tvar" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Galerie Tvarů" @@ -11076,7 +11078,7 @@ msgstr "Zobrazovat \"Tip dne\" po spuštění" msgid "Show &Configuration Folder" msgstr "Otevřít adresář s &konfiguracemi" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Zobrazit &Popisky" @@ -11092,7 +11094,7 @@ msgstr "Zobrazit okno o Slic3ru" msgid "Show advanced settings" msgstr "Zobrazit rozšířená nastavení" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Zobrazit všechna přednastavení (včetně nekompatibilních)" @@ -11132,7 +11134,7 @@ msgstr "Zobrazit výšku objektu" msgid "Show object height on the ruler" msgstr "Zobrazit výšku objektu na pravítku" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Zobrazit popisky objektů / instancí ve 3D scéně" @@ -11160,43 +11162,43 @@ msgstr "Zobrazit podpěry" msgid "Show system information" msgstr "Zobrazit systémové informace" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Zobrazit 3D editaci" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Zobrazit 3D náhled vrstev" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Zobrazit nastavení filamentu" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "Zobrazit kompletní seznam možností konfigurace SLA tisku." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "Zobrazit kompletní seznam možností konfigurace tisku / G-codu." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Zobrazit seznam klávesových zkratek" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Zobrazit podložku" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Zobrazit nastavení tisku" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Zobrazit nastavení tiskárny" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Zobrazí tuto nápovědu." @@ -11281,7 +11283,7 @@ msgstr "Zjednodušit model" msgid "Single Extruder Multi Material" msgstr "MultiMaterial tisk s jedním extrudérem" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -11293,15 +11295,15 @@ msgstr "" "Chcete nastavit průměry všech extruderových trysek podle průměru prvního " "extruderu?" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Nastavení jednoho extruderu MM" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Parametry jednoho multi materiálového extruderu" -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Režim jedné instance" @@ -11320,7 +11322,7 @@ msgstr "Velikost" msgid "Size" msgstr "Rozměr" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Rozměry a počátek" @@ -11389,15 +11391,15 @@ msgstr "" msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r nebude měnit rychlost pod tuto rychlost." -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Slicovat" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Slicovat soubor do G-code" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Slicovat soubor do G-code, uložit jako" @@ -11414,15 +11416,15 @@ msgstr "Slicovat" msgid "Slice resolution" msgstr "Rozlišení slicování" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 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:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Naslicujte model a exportujte trasy jako G-code." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -11439,13 +11441,13 @@ msgstr "Informace o slicování" msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "Slicovaný objekt \"%1%\" vypadá jako logo nebo nápis" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Slicování" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Slicování dokončeno!" @@ -11481,7 +11483,7 @@ msgstr "Slicuji model" msgid "Slicing supports" msgstr "Slicování podpěr" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Pomalý" @@ -11489,7 +11491,7 @@ msgstr "Pomalý" msgid "Slow down if layer print time is below" msgstr "Zpomalit tisk pokud je doba tisku kratší než" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Pomalý náklon" @@ -11497,7 +11499,7 @@ msgstr "Pomalý náklon" msgid "Small perimeters" msgstr "Malé perimetry" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Procentní průměr malých pilířů" @@ -11594,7 +11596,7 @@ msgid "Some SLA materials were uninstalled." msgstr "Některé SLA materiály byly odinstalovány." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -11619,7 +11621,7 @@ msgid "" msgstr "" "Některé objekty jsou příliš vysoké a nelze je tisknout bez kolizí extruderu." -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -11637,7 +11639,7 @@ msgstr "" "Některá přednastavení jsou upravená a neuložené změny nebudou zachyceny v " "záloze konfigurace." -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -11823,7 +11825,7 @@ msgid "Spiral vase" msgstr "Spirálová váza" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Rozdělit" @@ -11888,13 +11890,13 @@ msgstr "Běžné" msgid "Stars" msgstr "Hvězdy" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Začátek G-code" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Vytvořit nový projekt" @@ -11902,7 +11904,7 @@ msgstr "Vytvořit nový projekt" msgid "Start at height" msgstr "Začít ve výšce" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Zahájit nový slicovací proces" @@ -11952,7 +11954,7 @@ msgid "Status:" msgstr "Stav:" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Tichý" @@ -12011,19 +12013,19 @@ msgstr "Vynucení podpěr" msgid "Support Generator" msgstr "Generátor Podpěr" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Průměr podpěrné základny" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Výška podpěrné základny" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Bezpečná vzdálenost podpěrné základny" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Hrot podpěry" @@ -12077,7 +12079,7 @@ msgid "Support material/raft/skirt extruder" msgstr "Extruder pro podpěry/raft/obrys" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Pouze na tiskové podložce" @@ -12085,12 +12087,12 @@ msgstr "Pouze na tiskové podložce" msgid "Support parameter change" msgstr "Změna nastavení podpěr" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Podpěrný pilíř" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Hustota podpěrných bodů" @@ -12099,16 +12101,16 @@ msgid "Support points edit" msgstr "Úprava podpěrných bodů" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Podpěry" @@ -12262,7 +12264,7 @@ msgstr "Pořizování konfiguračního snapshotu" msgid "Taking a configuration snapshot failed." msgstr "Pořizování konfiguračního snapshotu selhalo." -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Teplota" @@ -12288,7 +12290,7 @@ msgstr "Kolísání teploty" msgid "Temperatures" msgstr "Teploty" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Šablona s vlastním G-code" @@ -12443,7 +12445,7 @@ 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/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -12500,7 +12502,7 @@ msgstr "" "pouze tehdy, když je informace o rotacích zapsána do koordinátů daného " "objektu." -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "Výchozí úhel pro připojení nosných tyčí a spojek." @@ -12617,7 +12619,7 @@ msgstr "Typ filamentu pro použití ve vlastních G-code." msgid "The file does not exist." msgstr "Soubor neexistuje." -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -12649,7 +12651,7 @@ msgstr "Následující modely SLA tiskáren nemají vybrané žádné materiály msgid "The following characters are not allowed by a FAT file system:" msgstr "Následující znaky nejsou v souborovém systému FAT povoleny:" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -12718,7 +12720,7 @@ msgstr "" msgid "The following values were substituted:" msgstr "Byly nahrazeny následující hodnoty:" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -12726,7 +12728,7 @@ msgstr "" "Mezera mezi spodkem objektu a generovanou podložkou v režimu nulového " "nadzvednutí." -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Výška ukotvení podpěrného kužele" @@ -12764,7 +12766,7 @@ msgstr "Poslední změny barev byly uloženy pro tisk s více extrudery." 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:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -12772,7 +12774,7 @@ 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:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "Maximální délka přemostění" @@ -12796,7 +12798,7 @@ msgstr "" "Maximální vzdálenost, o kterou může být každý bod pláště posunut (oběma " "směry), měřeno kolmo k obvodové stěně." -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -12831,7 +12833,7 @@ msgstr "" "bottom_solid_layers, je-li to nutné k dosažení minimální tloušťky spodní " "skořepiny." -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -12872,7 +12874,7 @@ msgstr "" "Objekt se zvýší tímto počtem vrstev a pod ním bude vytvořen podpůrný " "materiál." -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -12881,7 +12883,7 @@ msgstr "" "pilířů. Menší pilíře jsou použity v problematických místech, kam se normální " "nevejdou." -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -12891,7 +12893,7 @@ msgstr "" "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/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -12909,7 +12911,7 @@ msgstr[3] "" "Níže uvedené fyzické tiskárny jsou založeny na přednastavení, které se " "chystáte odstranit." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -12983,7 +12985,7 @@ msgstr "Zadaný název je neplatný." msgid "The provided name is not valid;" msgstr "Zadaný název není platný;" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -12991,7 +12993,7 @@ msgstr "" "Vybraný 3MF soubor obsahuje objekt s namalovanými podpěrami novější verze " "PrusaSliceru a proto není kompatibilní." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -12999,7 +13001,7 @@ msgstr "" "Vybraný 3MF soubor obsahuje objekt multimateriálovým malováním pomocí " "novější verze PrusaSliceru a proto není kompatibilní." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -13007,7 +13009,7 @@ msgstr "" "Vybraný 3MF soubor obsahuje objekt s namalovaný švem pomocí novější verze " "PrusaSliceru a proto není kompatibilní." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -13048,7 +13050,7 @@ msgid "" msgstr "" "Vybraný objekt nebylo možné rozdělit, protože obsahuje pouze jednu část." -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -13083,7 +13085,7 @@ msgstr "Velikost objektu lze určit v palcích" msgid "The size of the object is zero" msgstr "Velikost objektu je nulová" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -13155,7 +13157,7 @@ msgstr "Zadaný název není platný;" msgid "The supplied settings will cause an empty print." msgstr "Zadané nastavení způsobí prázdný tisk." -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Tloušťka podložky a její volitelné duté stěny." @@ -13543,11 +13545,11 @@ msgstr "" msgid "This is a default preset." msgstr "Toto je výchozí přednastavení." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Relativní míra hustoty podpěrných bodů." -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -13560,7 +13562,7 @@ msgid "This is a system preset." msgstr "Toto je systémové přednastavení." #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Toto je v Slic3ru jako názorná pomoc." @@ -13865,7 +13867,7 @@ msgstr "" "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:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -13877,7 +13879,7 @@ msgstr "" "například rozšířit seznam podporovaných druhů firmwaru. Lze se rozhodnout, " "že to budeme ignorovat, nebo že neznámou hodnotu nahradíme výchozí hodnotou." -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -13899,15 +13901,15 @@ 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:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Náklon" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Tilt pro resin s vysokou viskozitou" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Doba náklonu" @@ -13936,15 +13938,15 @@ msgstr "" "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:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Doba trvání rychlého náklonu" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Doba trvání pomalého náklonu" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Čas super pomalého náklonu" @@ -14006,7 +14008,7 @@ msgstr "Nástroj" msgid "Tool #" msgstr "Nástroj #" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-code pro výměnu nástroje" @@ -14028,7 +14030,7 @@ msgstr "Poloha nástroje" msgid "Tool type" msgstr "Typ nástroje" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Parametry při výměně (Multi Material s jedním extruderem)" @@ -14051,7 +14053,7 @@ msgstr "" "Nápověda pro tloušťku vrchní / spodní skořepiny: Není k dipozici z důvodu " "neplatné výšky vrstvy." -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Pohled svrchu" @@ -14144,7 +14146,7 @@ msgstr "Rychloposun" msgid "Triangles" msgstr "Trojúhelníky" -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14165,11 +14167,11 @@ msgstr "Typ tiskárny." msgid "Type:" msgstr "Typ:" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "ODEMČENÝ ZÁMEK" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -14181,7 +14183,7 @@ msgstr "" "Klikněte pro reset všech nastavení aktuální skupiny nastavení na systémové " "hodnoty." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -14222,11 +14224,11 @@ msgstr "Nelze nahradit více než jednou částí" msgid "Undef" msgstr "Nedefinováno" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Nedefinovaná kategorie" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Nedefinovaná skupina" @@ -14240,7 +14242,7 @@ msgstr "Podtečení" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Zpět" @@ -14437,7 +14439,7 @@ msgstr "Scéna v režimu „free camera“" msgid "Use inches" msgstr "Používat palce" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Použít podložku" @@ -14526,11 +14528,11 @@ 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:2644 +#: src/slic3r/GUI/Tab.cpp:2642 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:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Hodnoty v tomto sloupci jsou pro Tichý režim" @@ -14575,7 +14577,7 @@ msgstr "Výrobce:" msgid "Verbose G-code" msgstr "Komentáře do G-code" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Verze" @@ -14620,7 +14622,7 @@ msgid "" "to changes your choice." msgstr "Pro změnu předvolby jděte do Nastavení a zaškrtněte \"%1%\"." -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Vizualizuje již naslicovaný a uložený G-code" @@ -14645,7 +14647,7 @@ msgstr "Změna pořadí Těles v Objektu" msgid "Volumetric" msgstr "Volumetrický" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Doporučení pro objemový průtok nejsou k dispozici" @@ -14668,16 +14670,16 @@ msgstr "Objemová rychlost" msgid "WARNING:" msgstr "VAROVÁNÍ:" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "BÍLÁ TEČKA" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 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:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -14685,7 +14687,7 @@ 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -14693,7 +14695,7 @@ msgstr "" "Ikona BÍLÉ TEČKY indikuje, že je hodnota shodná s naposledy uloženým " "přednastavením." -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Tloušťka stěny" @@ -14847,7 +14849,7 @@ msgstr "" "Když je retrakce kompenzována po rychloposunu, extruder vytlačuje toto další " "množství filamentu. Toto nastavení je zřídkakdy potřeba." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14862,16 +14864,19 @@ msgstr "" "perimetrů, ale mohou vzniknout mezery nebo vytlačení nadbytečného množství " "materiálu." -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" "Při přechodu mezi různými počty perimetrů se ztenčujícím se dílem, je " -"vyhrazen určitý prostor pro rozdělení nebo spojení perimetrů." +"vyhrazen určitý prostor pro rozdělení nebo spojení perimetrů. Pokud je " +"vyjádřeno v procentech (například 100%), bude vypočítáno na základě průměru " +"trysky." -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Celé slovo" @@ -14883,7 +14888,7 @@ msgstr "Šířka" msgid "Width (mm)" msgstr "Šířka (mm)" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 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" @@ -14891,16 +14896,16 @@ msgstr "Šířka od středu zadní koule ke středu přední koule" msgid "Width of a wipe tower" msgstr "Šířka čistící věže" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 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:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Šířka displeje" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14913,7 +14918,7 @@ msgstr "" "perimetr stejně tlustý jako samotný prvek. Je-li vyjádřené procentuálně " "(například 85%), bude vypočteno v závislosti na průměru trysky." -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14958,7 +14963,7 @@ msgstr "Čistící věž - Úprava objemu čištění" msgid "Wipe tower brim width" msgstr "Šířka límce čistící věže" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Parametry čistící věže" @@ -15023,7 +15028,7 @@ msgstr "" "\n" "Aktualizované balíčky nastavení:" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Vypsat informace o modelu do konsole." @@ -15109,7 +15114,7 @@ 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:3524 +#: src/libslic3r/PrintConfig.cpp:3497 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." @@ -15268,7 +15273,7 @@ msgstr "" "Vaše aktuálně provedené změny odstraní všechny uložené změny extruderu " "(nástroje)." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Váš soubor byl opraven." @@ -15306,7 +15311,7 @@ msgstr "Odsazení Z" msgid "Z travel" msgstr "Posun v ose Z" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zig-Zag" @@ -15426,7 +15431,7 @@ msgstr "výchozí tiskový profil" msgid "default value" msgstr "výchozí hodnota" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "smazat" @@ -15504,7 +15509,7 @@ msgid "flow rate is maximized" msgstr "průtok je maximalizován" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -15528,7 +15533,7 @@ msgstr "g" msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" @@ -15545,7 +15550,7 @@ msgid "in" msgstr "in" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -15558,7 +15563,7 @@ msgstr "" "skupiny nastavení na systémové (nebo výchozí) hodnoty." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -15567,7 +15572,7 @@ msgstr "" "aktuální skupinu nastavení" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -15604,11 +15609,11 @@ 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:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "je licencován pod" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" @@ -15632,7 +15637,7 @@ msgstr "max PrusaSlicer verze" msgid "min PrusaSlicer version" msgstr "min PrusaSlicer verze" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" @@ -15672,19 +15677,18 @@ msgstr "ml" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -15698,8 +15702,9 @@ msgstr "mm (nula pro vypnutí)" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm nebo %" @@ -15761,7 +15766,7 @@ msgstr "model" msgid "modified" msgstr "upraveno" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "cena/láhev" @@ -15821,7 +15826,7 @@ msgstr "tiskárna" msgid "printer model" msgstr "model tiskárny" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "odebrat" @@ -15842,11 +15847,11 @@ msgstr "vyžaduje min. %s a max. %s" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -15969,8 +15974,8 @@ msgstr "zpětné volání se nezdařilo" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" diff --git a/resources/localization/de/PrusaSlicer.mo b/resources/localization/de/PrusaSlicer.mo index 88f7804b23..1c5ad93844 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 39157cf866..91fadfbd92 100644 --- a/resources/localization/de/PrusaSlicer_de.po +++ b/resources/localization/de/PrusaSlicer_de.po @@ -7,7 +7,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Prusalator\n" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -36,9 +36,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -127,7 +126,7 @@ msgstr[0] "%1% (%2$d Wand)" msgstr[1] "%1% (%2$d Wände)" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Voreinstellung" @@ -146,7 +145,7 @@ msgstr "" msgid "%1% was substituted with %2%" msgstr "%1% wurde durch %2% ersetzt" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% wurde erfolgreich gesliced." @@ -168,7 +167,7 @@ msgstr "%3.2f mm³/s mit einer Filamentgeschwindigkeit von %3.2f mm/s." msgid "%d lines: %.2f mm" msgstr "%d Linien: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d Voreinstellungen erfolgreich importiert." @@ -343,7 +342,7 @@ msgstr "" msgid "&About %s" msgstr "Ü&ber %s" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "Seitenleiste s&chließen" @@ -355,27 +354,27 @@ msgstr "&Konfiguration" msgid "&Configuration Snapshots" msgstr "Konfi&gurations-Momentaufnahmen" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Kopieren" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Löschen ausgewählte (&D)" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Bearbeiten" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Export" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "&Filamenteinstellungen" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Datei" @@ -383,19 +382,19 @@ msgstr "&Datei" msgid "&Finish" msgstr "&Beenden" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "Vollbild (&F)" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "&G-Code-Vorschau" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Hilfe" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Import" @@ -403,7 +402,7 @@ msgstr "&Import" msgid "&Language" msgstr "Sp&rache" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Neues Projekt" @@ -411,19 +410,19 @@ msgstr "&Neues Projekt" msgid "&Next >" msgstr "&Weiter >" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "Öffne G-C&ode" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "Pr&ojekt öffnen" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "Ei&nfügen" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "Druck&platte" @@ -431,35 +430,35 @@ msgstr "Druck&platte" msgid "&Preferences" msgstr "&Einstellungen" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "&Beenden" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Redo" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "STL-Datei &reparieren" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "Projekt &sichern" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "Alle&s auswählen" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "&Undo" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Anzeige" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Fenster" @@ -468,7 +467,7 @@ msgstr "&Fenster" msgid "(All)" msgstr "(Alles)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)Slice jet&zt" @@ -480,7 +479,7 @@ msgstr "(Re)Slice" msgid "(Some lines not shown)" msgstr "(Einige Zeilen nicht gezeigt)" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Unbekannt)" @@ -492,7 +491,7 @@ msgstr "(einschließlich Spule)" msgid "(minimum)" msgstr "(Minimum)" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") nicht gefunden." @@ -548,7 +547,7 @@ msgstr "2 mm" msgid "3 (heavy)" msgstr "3 (schwer)" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" @@ -637,7 +636,7 @@ 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/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -664,7 +663,7 @@ msgstr "API Key" msgid "Abort" msgstr "Abbruch" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Über %s" @@ -681,7 +680,7 @@ msgstr "Beschleunigungskontrolle (fortgeschritten)" msgid "Access violation" msgstr "Zugriffsverletzung" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Genauigkeit" @@ -721,7 +720,7 @@ msgstr "" "Stütz kubisch verwenden können, um die Druckzeit zu verkürzen und den " "Filamentverbrauch zu senken? Lesen Sie mehr in der Dokumentation." -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Hinzufügen" @@ -786,7 +785,7 @@ msgstr "Form aus Galerie hinzufügen" msgid "Add Shapes from Gallery" msgstr "Formen aus Galerie hinzufügen" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Fügt eine Grundschicht unter das gestützte Modell" @@ -904,7 +903,7 @@ msgid "Add pause print" msgstr "Druckpause hinzufügen" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Physischen Drucker hinzufügen" @@ -1005,22 +1004,16 @@ msgstr "Adresse" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 -msgid "Advanced" -msgstr "Erweiterte Einstellungen" - -#: src/slic3r/GUI/GUI_App.cpp:2239 src/slic3r/GUI/wxExtensions.cpp:710 -msgctxt "Mode" +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Erweitert" @@ -1051,16 +1044,16 @@ msgstr "" "Materialmenge in den Wischturm leiten, um aufeinanderfolgende Füll- oder " "Opferobjekt-Extrusionen zuverlässig herzustellen." -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-Code am Schichtende" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Ausrichten von XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Das Modell auf den angegebenen Punkt ausrichten." @@ -1073,7 +1066,7 @@ msgid "Aligned Rectilinear" msgstr "Ausgerichtet Geradlinig" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Alle" @@ -1275,7 +1268,7 @@ msgstr "Farbwechsel automatisch anwenden" msgid "Apply to all the remaining small objects being loaded." msgstr "Anwenden auf alle verbleibenden kleinen Objekte, die geladen werden." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "Arachne" @@ -1287,7 +1280,7 @@ msgstr "Arachne Umfangsgenerator" msgid "Archimedean Chords" msgstr "Archimedische Bögen" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Sind Sie sicher, dass Sie die gewählte Voreinstellung %1% möchten?" @@ -1304,7 +1297,7 @@ msgstr "" msgid "Are you sure you want to continue?" msgstr "Sind Sie sicher, dass Sie weitermachen wollen?" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -1318,7 +1311,7 @@ msgstr "" msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Sind Sie sicher, dass Sie den Drucker \"%1%\" löschen möchten?" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Sind Sie sicher, dass Sie alle Ersetzungen löschen möchten?" @@ -1326,7 +1319,7 @@ msgstr "Sind Sie sicher, dass Sie alle Ersetzungen löschen möchten?" msgid "Are you sure you want to do it?" msgstr "Sind Sie sicher, dass Sie es tun wollen?" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Bereichsfüllung" @@ -1358,7 +1351,7 @@ msgstr "" "a>klicken können, um die Größe des Abstands zwischen den Objekten anzupassen " "und automatische Drehungen zu ermöglichen?" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -1514,7 +1507,7 @@ msgstr "Stützpunkte automatisch generieren" msgid "Autogeneration will erase all manually edited points." msgstr "Die automatische Generierung löscht alle manuell bearbeiteten Punkte." -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Automatische Erzeugung" @@ -1522,7 +1515,7 @@ msgstr "Automatische Erzeugung" msgid "Automatic updates" msgstr "Automatische Updates" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Repariere automatisch die STL Datei" @@ -1538,11 +1531,11 @@ msgstr "Kreuzen der Kontur vermeiden" msgid "Avoid crossing perimeters - Max detour length" msgstr "Kreuzen von Perimetern Vermeiden - Maximale Umleitungslänge" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "PFEIL ZURÜCK" -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -1554,7 +1547,7 @@ msgstr "" "übereinstimmen. Klicken Sie hier, um alle Einstellungen für die aktuelle " "Optionsgruppe auf das zuletzt gespeicherte Preset zurückzusetzen." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -1569,7 +1562,7 @@ msgstr "" msgid "Background processing" msgstr "Hintergrundberechnung" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Verhalten bei unbekannten Konfigurationswerten" @@ -1577,7 +1570,7 @@ msgstr "Verhalten bei unbekannten Konfigurationswerten" msgid "Balanced" msgstr "Balanziert" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Druckbett" @@ -1626,7 +1619,7 @@ msgstr "" "Wert auf null, um die Befehle zur Steuerung der Betttemperatur im Output zu " "deaktivieren." -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-Code vor dem Schichtwechsel" @@ -1651,7 +1644,7 @@ msgstr "Beste Oberflächenqualität" msgid "Between objects G-code" msgstr "G-Code zwischen Objekten" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-Code zwischen Objekten (Sequentielles Drucken)" @@ -1673,11 +1666,11 @@ msgstr "Stützen blockieren" msgid "Block supports by angle" msgstr "Stützen nach Winkel blockieren" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Flaschenvolumen" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Flaschengewicht" @@ -1694,7 +1687,7 @@ msgstr "Boden" msgid "Bottom" msgstr "Unten" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Ansicht von unten" @@ -1975,8 +1968,8 @@ msgstr "" "Ohne Stützpunkte kann nicht weitergearbeitet werden! Fügen Sie Stützpunkte " "hinzu oder deaktivieren Sie die Stützen-Generierung." -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Fähigkeiten" @@ -1984,7 +1977,7 @@ msgstr "Fähigkeiten" msgid "Capture a configuration snapshot" msgstr "Erfassen einer Konfigurations-Momentaufnahme" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Groß- und Kleinschreibung wird nicht berücksichtigt" @@ -1992,11 +1985,11 @@ msgstr "Groß- und Kleinschreibung wird nicht berücksichtigt" msgid "Category" msgstr "Kategorie" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Mitte" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Zentriert den Druck um den angegebenen Mittelpunkt." @@ -2104,7 +2097,7 @@ msgstr "" "Wählen Sie eine Datei aus, aus der Sie die Druckbetttextur importieren " "möchten (PNG/SVG):" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Wählen Sie eine Datei zum Slicen (STL/OBJ/AMF/3MF/PRUSA):" @@ -2154,7 +2147,7 @@ msgstr "Kreis" msgid "Circular" msgstr "Kreisförmig" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "Klassisch" @@ -2162,11 +2155,14 @@ msgstr "Klassisch" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" -"Der klassische Umfangsgenerator erzeugt Umfänge mit konstanter " -"Extrusionsbreite und für sehr dünne Bereiche wird Lückenfüller verwendet. " -"Die Arachne-Engine erzeugt Umfänge mit variabler Extrusionsbreite." +"Der klassische Perimetergenerator erzeugt Perimeter mit konstanter " +"Extrusionsbreite und für sehr dünne Bereiche wird der Lückenfüller " +"verwendet. Die Arachne-Engine erzeugt Konturen mit variabler " +"Extrusionsbreite. Diese Einstellung wirkt sich auch auf die Konzentrische " +"Füllung aus." #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -2248,7 +2244,7 @@ msgid "Closing PrusaSlicer. Current project is modified." msgstr "PrusaSlicer schließen. Das aktuelle Projekt wurde geändert." #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Schliessabstand" @@ -2256,7 +2252,7 @@ msgstr "Schliessabstand" msgid "Closing radius" msgstr "Schließradius" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Seitenleiste zuklappen" @@ -2264,11 +2260,11 @@ msgstr "Seitenleiste zuklappen" msgid "Collapse/Expand the sidebar" msgstr "Seitenleiste zu-/ausklappen" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Farbe" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-Code für Farbwechsel" @@ -2332,12 +2328,12 @@ msgstr "Befehle" msgid "Comment:" msgstr "Kommentar:" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Voreinstellungen vergleichen" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Voreinstellungen vergleichen" @@ -2345,7 +2341,7 @@ msgstr "Voreinstellungen vergleichen" msgid "Compare this preset with some another" msgstr "Diese Voreinstellung mit einer anderen vergleichen" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Verglichene Voreinstellungen haben unterschiedliche Druckertechnologie" @@ -2516,7 +2512,7 @@ msgstr "" "infill_anchor begrenzt, aber nicht länger als dieser Parameter. Setzen Sie " "diesen Parameter auf Null, um die Verankerung zu deaktivieren." -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Verbindung von Stützstäben und Verbindungen" @@ -2574,7 +2570,7 @@ msgstr "Fortfahren und Konfigurationsupdates installieren?" msgid "Continue to activate a configuration snapshot %1%?" msgstr "Aktivierung eines Konfigurations-Snapshots %1% fortsetzen?" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -2592,7 +2588,7 @@ msgstr "" "Beiträge von Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik und zahlreichen anderen." -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -2610,7 +2606,7 @@ msgstr "Von imperialen Einheiten umrechnen" msgid "Convert from meters" msgstr "Umrechnen von Meter" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Kühlung" @@ -2622,7 +2618,7 @@ msgstr "Kühlbewegungen beschleunigen von dieser Anfangsgeschwindigkeit aus." msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Kühlbewegungen beschleunigen auf diese Geschwindigkeit hin." -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Kühlungsschwellwerte" @@ -2651,7 +2647,7 @@ msgstr "Kopieren" msgid "Copy Version Info" msgstr "Versionsinfo kopieren" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Auswahl in Zwischenablage kopieren" @@ -2716,32 +2712,32 @@ msgstr "" "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:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Urheberrecht" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Korrektur der Ausdehnung" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Korrektur der Ausdehnung in der X-Achse" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Korrektur der Ausdehnung in der Y-Achse" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Korrektur der Ausdehnung in der Z-Achse" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Korrekturen" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Kosten" @@ -2818,7 +2814,7 @@ msgstr "" "endgültige Druckauflösung verringern, daher ist es ratsam, den Wert relativ " "niedrig zu halten." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" "Erstellt eine Grundschicht um das Objekt herum und ignoriert die " @@ -2839,7 +2835,7 @@ msgid "Creating a new project while the current project is modified." msgstr "" "Erstellen eines neuen Projekts, während das aktuelle Projekt geändert wurde." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Kritischer Winkel" @@ -2847,7 +2843,7 @@ msgstr "Kritischer Winkel" msgid "Critical error" msgstr "Kritischer Fehler" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Kreuz" @@ -2894,8 +2890,8 @@ msgstr "" "standardmäßige Zertifikatsverzeichnis der Betriebssystem-" "Zertifizierungsstelle verwendet." -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Benutzerdefinierter G-Code" @@ -2939,7 +2935,7 @@ msgid "Custom template (\"%1%\")" msgstr "Benutzerdefinierte Vorlage (\"%1%\")" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Schneiden" @@ -2947,7 +2943,7 @@ msgstr "Schneiden" msgid "Cut by Plane" msgstr "Schneiden durch Ebene" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Schneidet Modell am gegebenen Z-Wert." @@ -2955,7 +2951,7 @@ msgstr "Schneidet Modell am gegebenen Z-Wert." msgid "Cylinder" msgstr "Zylinder" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "All&es Abwählen" @@ -2963,7 +2959,7 @@ msgstr "All&es Abwählen" msgid "Dark mode (experimental)" msgstr "Dunkler Modus (experimentell)" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Datenverzeichnis" @@ -2989,7 +2985,7 @@ msgstr "Kopien verringern" msgid "Default" msgstr "Standard" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Standard-SLA-Materialprofil" @@ -3028,8 +3024,8 @@ msgstr "" msgid "Default print profile" msgstr "Standard-Druckprofil" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -3042,7 +3038,7 @@ msgstr "" msgid "Define a custom printer profile" msgstr "Benutzerdefiniertes Druckerprofil definieren" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -3060,11 +3056,11 @@ msgstr "Verzögerung nach dem Entladen" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Löschen" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "&Alles löschen" @@ -3118,7 +3114,7 @@ msgid "Delete Subobject" msgstr "Subobjekt löschen" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Alle löschen" @@ -3176,16 +3172,16 @@ msgstr "Häkchen löschen - Linksklick oder Taste \"-\" drücken" msgid "Delete tool change" msgstr "Werkzeugwechsel löschen" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Löscht alle Objekte" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Löscht die aktuelle Auswahl" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Dichte" @@ -3197,9 +3193,9 @@ msgstr "Infilldichte. Als Prozentwert von 0% - 100% ausgedrückt." msgid "Density of the first raft or support layer." msgstr "Dichte des ersten Raft- oder Stützschicht." -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Abhängigkeiten" @@ -3223,7 +3219,7 @@ msgstr "Alles abwählen" msgid "Deselect by rectangle" msgstr "Abwahl über Rechteck" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Alle Objekte abwählen" @@ -3259,7 +3255,7 @@ msgstr "Lösen von der Systemvoreinstellung" msgid "Detach preset" msgstr "Lösen der Voreinstellugen" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Losgelöst" @@ -3283,7 +3279,7 @@ msgstr "" msgid "Detect thin walls" msgstr "Dünne Wände erkennen" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -3307,15 +3303,15 @@ msgstr "Gerät:" msgid "Diameter" msgstr "Durchmesser" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Durchmesser der Pfeilerbasis in mm" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Durchmesser der Stützpfeiler in mm" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Durchmesser der Spitzenseite des Kopfes" @@ -3379,31 +3375,31 @@ msgstr "Alle benutzerdefinierten Änderungen verwerfen" msgid "Discard changes" msgstr "Änderungen verwerfen" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Display" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Displayhöhe" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Zeige horizontale Spiegelung" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Displayausrichtung" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Zeige das Druckhost Warteschlangenfenster" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Zeige vertikale Spiegelung" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Displaybreite" @@ -3422,7 +3418,7 @@ msgstr "" "Abstand zwischen Schürze und Rand (wenn der Windschutz nicht verwendet wird) " "oder Objekten." -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -3462,11 +3458,11 @@ msgstr "Abstand für die automatische Druckplattenbelegung." msgid "Divide by zero" msgstr "Division durch Null" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 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:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -3523,7 +3519,7 @@ msgstr "" 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/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Nicht Anordnen" @@ -3588,11 +3584,11 @@ msgstr "" msgid "Drop to bed" msgstr "Auf das Druckbett fallen lassen" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Duplizieren" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Duplizieren nach Raster" @@ -3609,11 +3605,11 @@ msgstr "Bei den anderen Schichten läuft der Lüfter immer mit %1%%%" msgid "During the other layers, fan will be turned off." msgstr "Bei den anderen Schichten wird der Lüfter ausgeschaltet." -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dynamisch" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "E&xport" @@ -3665,7 +3661,7 @@ msgstr "Benutzerdefinierten G-Code bearbeiten" msgid "Edit pause print message" msgstr "Druckpausen-Mitteilung bearbeiten" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Physischen Drucker bearbeiten" @@ -3689,7 +3685,7 @@ msgstr "Bearbeitung" msgid "Eigen vectorization supported:" msgstr "Eigen Vektorisierung unterstützt:" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "SD-Kar&te/Flash-Laufwerk auswerfen" @@ -3697,7 +3693,7 @@ msgstr "SD-Kar&te/Flash-Laufwerk auswerfen" msgid "Eject SD card / Flash drive" msgstr "SD-Karte/Flash-Laufwerk auswerfen" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 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 " @@ -3716,7 +3712,7 @@ msgstr "Das Auswerfen von Gerät %s(%s) ist fehlgeschlagen." msgid "Elephant foot compensation" msgstr "Elefantenfußkompensation" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Elefantenfuß Mindestbreite" @@ -3749,7 +3745,7 @@ msgstr "In G-Code ausgeben" msgid "Empty layer between %1% and %2%." msgstr "Leere Schicht zwischen %1% und %2%." -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Aktivieren" @@ -3766,11 +3762,11 @@ msgstr "Dunkelmodus aktivieren" msgid "Enable fan if layer print time is below" msgstr "Lüfter einschalten wenn die Schichtdruckzeit geringer ist als" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Aushöhlung aktivieren" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Horizontale Spiegelung der Ausgabebilder aktivieren" @@ -3785,7 +3781,7 @@ msgstr "" "Ermöglicht das Bügeln der oberen Schichten mit dem heißen Druckkopf für eine " "glatte Oberfläche" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -3793,7 +3789,7 @@ msgstr "" "Ermöglicht das Lesen unbekannter Konfigurationswerte, indem sie " "stillschweigend durch Standardwerte ersetzt werden." -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -3845,7 +3841,7 @@ msgstr "" msgid "Enable variable layer height feature" msgstr "Variable Schichthöhen aktivieren" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Vertikale Spiegelung der Ausgabebilder aktivieren" @@ -3861,7 +3857,7 @@ msgstr "" "Ermöglicht das Füllen von Lücken zwischen den Perimetern und zwischen den " "innersten Perimetern und dem Infill." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" @@ -3893,7 +3889,7 @@ msgstr "Stützen erzwingen" msgid "Enqueued" msgstr "In der Warteschlange" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Auf dem Bett sicherstellen" @@ -4009,7 +4005,7 @@ msgstr "" "Fehler: \"%2%\"" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Fehler" @@ -4161,23 +4157,23 @@ msgstr "Expertenmodus" msgid "Export" msgstr "Export" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Export &Konfiguration" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Export &G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Werkzeugwege als OBJ expor&tieren" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Export 3MF" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Exportiere AMF" @@ -4185,11 +4181,11 @@ msgstr "Exportiere AMF" msgid "Export AMF file:" msgstr "Exportiere AMF Datei:" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Konfigurationssa&mlung exportieren" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Konfigurations-Bundle mit physischen Druckern exportieren" @@ -4198,15 +4194,15 @@ msgid "Export G-Code." msgstr "G-Code exportieren." #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Export G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "G-Code auf SD-Karte/Flash-Laufwerk exportieren" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Exportiere OBJ" @@ -4214,19 +4210,19 @@ msgstr "Exportiere OBJ" msgid "Export OBJ file:" msgstr "Exportiere OBJ Datei:" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Exportiere die Plattenbelegung als &STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Exportiere Plattenbelegung als STL einschließlich Stützen" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Exportiere SLA" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Exportiere STL" @@ -4234,13 +4230,13 @@ msgstr "Exportiere STL" msgid "Export STL file:" msgstr "Exportiere STL Datei:" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" "Alle Voreinstellungen einschließlich physischer Drucker in eine Datei " "exportieren" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Exportiere alle Voreinstellungen in eine Datei" @@ -4252,24 +4248,24 @@ msgstr "Exportiere als STL" msgid "Export config" msgstr "Konfiguration exportieren" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Exportiere die aktuelle Konfiguration in eine Datei" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Exportiere die aktuelle Plattenbelegung als G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 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:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Exportiere die aktuelle Plattenbelegung als STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Exportiert die aktuelle Plattenbelegung als STL einschließlich Stützen" @@ -4288,19 +4284,19 @@ msgstr "Export einer temporären 3MF Datei fehlgeschlagen" msgid "Export sources full pathnames to 3mf and amf" msgstr "Vollständige Pfadnamen der Quellen in 3mf und amf exportieren" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Exportiert das/die Modell(e) als 3MF Datei." -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Exportiert das/die Modell(e) als AMF Datei." -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Exportiert das/die Modell(e) als OBJ Datei." -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Exportiert das/die Modell(e) als STL Datei." @@ -4308,7 +4304,7 @@ msgstr "Exportiert das/die Modell(e) als STL Datei." msgid "Export to SD card / Flash drive" msgstr "Export auf SD-Karte/Flash-Laufwerk" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Werkzeugweg als OBJ exportieren" @@ -4320,7 +4316,7 @@ msgstr "Export." msgid "Exporting G-code" msgstr "Exportiere G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Konfigurationsbündel exportieren" @@ -4341,11 +4337,11 @@ msgstr "Exportiere." msgid "Exposition time is out of printer profile bounds." msgstr "Belichtungszeit ist außerhalb der Druckerprofilgrenzen." -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Belichtung" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Belichtungszeit" @@ -4407,7 +4403,7 @@ msgstr "Extruder Farbe" msgid "Extruder changed to" msgstr "Extruder geändert auf" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Extruder Freiraum" @@ -4416,7 +4412,7 @@ msgid "Extruder offset" msgstr "Extruder Offset" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -4424,7 +4420,7 @@ msgid "Extruders" msgstr "Extruder" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Extruder Anzahl" @@ -4464,7 +4460,7 @@ msgstr "FFF Technologie Drucker" msgid "Facets" msgstr "Flächen" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Ausblendende Schichten" @@ -4496,11 +4492,11 @@ msgstr "Das Bohren einiger Löcher in das Modell ist fehlgeschlagen" msgid "Fan Speed (%)" msgstr "Lüftergeschwindigkeit (%)" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Lüfter Einstellungen" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Lüftergeschwindigkeit" @@ -4535,11 +4531,11 @@ msgstr "Der Lüfter läuft immer mit %1%%%" msgid "Fan will be turned off." msgstr "Der Lüfter wird ausgeschaltet." -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Schnell" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Schnelles Kippen" @@ -4563,7 +4559,7 @@ msgstr "Merkmalstypen" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -4575,7 +4571,7 @@ msgstr "Filamentdurchmesser:" msgid "Filament End G-code" msgstr "Filament Ende G-code" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Filament Übersteuerung" @@ -4584,7 +4580,7 @@ msgid "Filament Profiles Selection" msgstr "Filament Profile Auswahl" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Filamenteinstellungen" @@ -4626,7 +4622,7 @@ msgstr "Filament Bemerkungen" msgid "Filament parking position" msgstr "Filament Parkposition" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Filament Eigenschaften" @@ -4643,7 +4639,7 @@ msgstr "Filament Entladezeit" msgid "Filaments" msgstr "Filamente" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Datei nicht gefunden" @@ -4714,7 +4710,7 @@ msgstr "" msgid "Filling bed" msgstr "Bett füllen" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Suchen" @@ -4727,11 +4723,11 @@ msgstr "" msgid "Finished" msgstr "Fertig" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Firmware Einzug" @@ -4942,7 +4938,7 @@ 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:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Grundschicht überall um Objekt erzwingen" @@ -4976,7 +4972,7 @@ msgstr "" "Format der G-Code-Miniaturansichten: PNG für beste Qualität, JPG für " "kleinste Größe, QOI für speicherarme Firmware" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -4984,7 +4980,7 @@ msgstr "" "Vorwärtskompatibilitätsregel beim Laden von Konfigurationen aus " "Konfigurationsdateien und Projektdateien (3MF, AMF)." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Reservierte Schlüsselwörter gefunden in" @@ -4998,11 +4994,11 @@ msgstr "" "Sie können nicht das letzte solide Teil des Objekts von der Objektliste " "löschen." -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Front" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Frontalansicht" @@ -5010,7 +5006,7 @@ msgstr "Frontalansicht" msgid "Full fan speed at layer" msgstr "Volle Lüfterdrehzahl auf Schicht" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Vollbild" @@ -5059,7 +5055,7 @@ msgstr "Fuzzy Skin Stärke" msgid "Fuzzy skin type." msgstr "Fuzzy Skin Typ." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-Code" @@ -5097,11 +5093,11 @@ msgstr "G-code Ersetzungen" msgid "G-code thumbnails" msgstr "G-Code-Miniaturbilder" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "G-Code-Viewer" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, Version 3" @@ -5118,10 +5114,10 @@ msgstr "Gallerie" msgid "Gap fill" msgstr "Lückenfüllung" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Allgemein" @@ -5153,11 +5149,11 @@ msgstr "" "um die Haftung von Objekten mit einem sehr dünnen oder schlechten Standfuß " "auf der Bauplatte zu erhöhen." -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Stützen generieren" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Erzeugt Stützen für die Modelle" @@ -5350,11 +5346,11 @@ msgstr "" msgid "Head diameter" msgstr "Kopfdurchmesser" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Kopfeindringung" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "Die Kopfeindringung sollte nicht größer als die Kopfbreite sein." @@ -5378,7 +5374,7 @@ msgstr "Höhe (mm)" msgid "Height of skirt expressed in layers." msgstr "Höhe der Schürze, ausgedrückt in Schichten." -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Displayhöhe" @@ -5403,15 +5399,15 @@ 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:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Hilfe" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Hilfe (FFF Optionen)" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Hilfe (SLA Optionen)" @@ -5446,7 +5442,7 @@ msgstr "Hoch" msgid "High extruder current on filament swap" msgstr "Hohe Extruderstromstärke beim Filamentwechsel" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Hohe Viskosität" @@ -5480,7 +5476,7 @@ msgstr "Lochdurchmesser" msgid "Hollow and drill" msgstr "Aushöhlen und Bohren" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Ein Modell aushöhlen, um einen leeren Innenraum zu erhalten" @@ -5488,16 +5484,16 @@ msgstr "Ein Modell aushöhlen, um einen leeren Innenraum zu erhalten" msgid "Hollow this object" msgstr "Dieses Objekt aushöhlen" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Aushöhlen" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -5566,20 +5562,20 @@ msgstr "" "zu erhalten,\n" "oder klicken Sie auf diese Schaltfläche." -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 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:3867 +#: src/libslic3r/PrintConfig.cpp:3840 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:3576 +#: src/libslic3r/PrintConfig.cpp:3549 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -5810,7 +5806,7 @@ msgstr "" "Wenn aktiviert, wird die Schaltfläche zum Zusammenklappen der Seitenleiste " "in der oberen rechten Ecke der 3D-Szene angezeigt" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -6090,7 +6086,7 @@ msgstr "" "Verteilungspunkten. Sie können diese Option für selbst signierte Zertifikate " "aktivieren, wenn die Verbindung fehlschlägt." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignoriere fehlende Konfigurationsdateien" @@ -6108,15 +6104,15 @@ msgstr "Unzulässiger Befehl" msgid "Import" msgstr "Importieren" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importiere &Konfiguration" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importiere Konfi&gurationssamlung" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Importiere Konfiguration von &Projekt" @@ -6132,7 +6128,7 @@ msgstr "Objekt importieren" msgid "Import Objects" msgstr "Objekte importieren" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Import SL1 / SL1S Archiv" @@ -6140,11 +6136,11 @@ msgstr "Import SL1 / SL1S Archiv" msgid "Import SLA archive" msgstr "SLA-Archiv importieren" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "STL importieren (imperiale Einheiten)" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importiere STL/OBJ/AM&F/3MF" @@ -6275,11 +6271,11 @@ msgstr "Übernimmt Profil" msgid "Initial exposition time is out of printer profile bounds." msgstr "Anfang-Belichtungszeit ist außerhalb der Druckerprofilgrenzen." -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Anfang-Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Anfangsschichthöhe" @@ -6385,7 +6381,7 @@ msgstr "Interner Fehler: %1%" msgid "Internal infill" msgstr "Internes Infill" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Ungültige Eindringtiefe des Stützkopfes" @@ -6413,7 +6409,7 @@ msgstr "" msgid "Invalid numeric input." msgstr "Ungültige numerische Eingabe." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Ungültiger Nadelkopfdurchmesser" @@ -6449,11 +6445,11 @@ msgstr "Bügeltyp" msgid "Is it safe?" msgstr "Ist das sicher?" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Iso Ansicht" @@ -6482,7 +6478,7 @@ msgstr "" "und den Widerstand beim Laden eines Filaments mit einer ungünstig geformten " "Spitze zu überwinden." -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "" "Es handelt sich um die letzte Voreinstellung für diesen physischen Drucker." @@ -6498,7 +6494,7 @@ msgstr "" "Es ist nicht möglich, die letzte zugehörige Voreinstellung für den Drucker " "zu löschen." -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Ruck-Begrenzungen" @@ -6564,7 +6560,7 @@ msgstr "Die gewählten Einstellungen werden beibehalten." msgid "Keep upper part" msgstr "Oberen Teil behalten" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Tastaturkürzel" @@ -6572,11 +6568,11 @@ msgstr "Tastaturkürzel" msgid "Keyboard shortcuts" msgstr "Tastaturkürzel" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "GESCHLOSSENES SCHLOSS" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -6584,7 +6580,7 @@ msgstr "" "Das Symbol GESCHLOSSENES SCHLOSS zeigt an, dass die Einstellungen mit den " "System- (oder Standard-) Werten für die aktuelle Optionsgruppe übereinstimmen" -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -6596,7 +6592,7 @@ msgstr "" msgid "Label objects" msgstr "Objekte benennen" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Querformat" @@ -6636,7 +6632,7 @@ msgstr "" "\n" "Die Schichthöhe wird auf 0,01 zurückgesetzt." -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Schichthöhen Grenzen" @@ -6644,8 +6640,8 @@ msgstr "Schichthöhen Grenzen" msgid "Layer range Settings to modify" msgstr "Schichtbereicheinstellungen zum Ändern" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Schichten" @@ -6662,7 +6658,7 @@ msgstr "Schichten" msgid "Layers and Perimeters" msgstr "Schichten und Konturen" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Schichten und Umfänge" @@ -6675,15 +6671,15 @@ msgstr "Layout-Optionen" msgid "Leave \"%1%\" enabled" msgstr "\"%1%\" aktiviert lassen" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Links" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Linker voreingestellter Wert" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Anicht von Links" @@ -6722,7 +6718,7 @@ msgid "Length of the infill anchor" msgstr "Länge des Infill-Ankers" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -6734,7 +6730,7 @@ msgstr "" msgid "Lift Z" msgstr "Z Hebung" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -6794,19 +6790,19 @@ msgstr "Teil laden" msgid "Load Project" msgstr "Projekt laden" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Lade ein Modell" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Laden eines SL1 / SL1S Archiv" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Laden eines mit imperialen Einheiten gespeicherten Modells" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -6816,7 +6812,7 @@ msgstr "" "nützlich, um verschiedene Profile zu pflegen oder Konfigurationen aus einem " "Netzwerkspeicher zu übernehmen." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Lade Konfigurationsdatei" @@ -6835,11 +6831,11 @@ msgstr "" "verwenden, mit denen Sie ebenfalls 3D-Modelle aus den Voxel-Daten " "rekonstruieren können." -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Lade Konfiguration aus Projektdatei" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -6847,11 +6843,11 @@ 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:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Laden einer exportierten Konfigurationsdatei" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Lade Voreinstellungen aus einer Sammlung" @@ -6884,11 +6880,11 @@ msgstr "Lade Konfiguration" msgid "Loading file" msgstr "Lade Datei" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Laden eines Konfigurationsbündels" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Laden einer Konfigurationsdatei" @@ -6927,7 +6923,7 @@ msgstr "Lokale Koordinaten" msgid "Lock supports under new islands" msgstr "Fixiere Stützen unter neuen Inseln" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Logging-Level" @@ -6943,7 +6939,7 @@ msgstr "Niedrig" msgid "Lowest Z height" msgstr "Niedrigste Z-Höhe" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -6952,7 +6948,7 @@ msgstr "Niedrigste Z-Höhe" msgid "Machine limits" msgstr "Maschinengrenzen" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -6960,7 +6956,7 @@ msgstr "" "Maschinengrenzen sind nicht gesetzt, daher ist die Schätzung der Druckzeit " "möglicherweise nicht genau." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -6970,7 +6966,7 @@ msgstr "" "Schätzung der Druckzeit verwendet, die daher möglicherweise nicht genau ist, " "da der Drucker möglicherweise eine andere Reihe von Maschinenlimits anwendet." -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" @@ -6997,20 +6993,20 @@ msgstr "Manuelle Bearbeitung" msgid "Masked SLA file exported to %1%" msgstr "Maskierte SLA-Datei exportiert nach %1%" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Einzelne Zeile abgleichen" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Mate&rial Einstellungen" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Material" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Material Einstellungen" @@ -7019,7 +7015,7 @@ msgstr "Material Einstellungen" msgid "Material Settings Tab" msgstr "Materialeinstellungsreiter" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Material Druckprofil" @@ -7027,19 +7023,19 @@ msgstr "Material Druckprofil" msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Max Überbrückungslänge" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Max Brücken auf einem Pfeiler" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Maximaler Zusammenfügeabstand" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Max. Pfeiler Verbindungsabstand" @@ -7135,7 +7131,7 @@ msgstr "Maximale Beschleunigung beim Einzug" msgid "Maximum acceleration when retracting (M204 R)" msgstr "Maximale Beschleunigung beim Einzug (M204 R)" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Maximale Beschleunigungen" @@ -7157,7 +7153,7 @@ msgstr "" "einen Low-Poly-Effekt, und da die G-Code-Reduzierung auf jeder Ebene " "unabhängig durchgeführt wird, können sichtbare Artefakte entstehen." -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Maximale Belichtungszeit" @@ -7193,11 +7189,11 @@ msgstr "Maximaler Vorschub auf der Y-Achse" msgid "Maximum feedrate of the Z axis" msgstr "Maximaler Vorschub auf der Z-Achse" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Maximaler Vorschub" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Maximale Anfang-Belichtungszeit" @@ -7237,7 +7233,7 @@ msgstr "Maximaler Ruck auf der Z-Achse" msgid "Maximum length of the infill anchor" msgstr "Maximale Länge des Infill-Ankers" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -7272,7 +7268,7 @@ msgid "Medium" msgstr "Medium" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Zusammenfügen" @@ -7288,7 +7284,7 @@ msgstr "Objekte zu einem mehrteiligen Objekt zusammenführen" msgid "Merged" msgstr "Zusammengeführt" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -7328,7 +7324,7 @@ msgstr "Min" msgid "Min print speed" msgstr "Minimale Druckgeschwindigkeit" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Minimaler Abstand der Stützpunkte" @@ -7370,11 +7366,11 @@ msgstr "" "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:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Minimale Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Minimum feature size" msgstr "Minimale Merkmalgröße" @@ -7386,15 +7382,15 @@ msgstr "Maximaler Vorschub bei Extrusion" msgid "Minimum feedrate when extruding (M205 S)" msgstr "Minimaler Vorschub beim Extrudieren (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Minimaler Vorschub" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Minimale Anfang-Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Minimale Umfangsbreite" @@ -7419,15 +7415,19 @@ msgstr "" msgid "Minimum thickness of a top / bottom shell" msgstr "Mindeststärke einer Ober-/Bodenschale" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -"Minimale Dicke von dünnen Merkmalen. Modellmerkmale, die dünner sind als " -"dieser Wert, werden nicht gedruckt, während Merkmale, die dicker sind als " -"die Mindestmerkmalgröße, auf die Mindestumfangsbreite verbreitert werden." +"Minimale Dicke von dünnen Features. Modell-Features, die dünner als dieser " +"Wert sind, werden nicht gedruckt, während Features, die dicker als die " +"Mindest-Featuregröße sind, auf die Mindestumfangsbreite verbreitert werden. " +"Wenn der Wert in Prozent angegeben wird (z.B. 25%), wird er auf der " +"Grundlage des Düsendurchmessers berechnet." #: src/libslic3r/PrintConfig.cpp:2899 msgid "Minimum top shell thickness" @@ -7450,11 +7450,11 @@ msgstr "Minimaler Vorschub im Eilgang" msgid "Minimum travel feedrate (M205 T)" msgstr "Minimaler Vorschub im Eilgang (M205 T)" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Mindestwandstärke eines ausgehöhlten Modells." -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" @@ -7480,7 +7480,7 @@ msgstr "" msgid "Mirror Object" msgstr "Objekt spiegeln" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Horizontal spiegeln" @@ -7500,7 +7500,7 @@ msgstr "Ausgewähltes Objekt entlang der Y-Achse spiegeln" msgid "Mirror the selected object along the Z axis" msgstr "Ausgewähltes Objekt entlang der Z-Achse spiegeln" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Vertikal spiegeln" @@ -7676,11 +7676,11 @@ msgstr "" "Soll ich, anstatt sie als mehrere Objekte zu betrachten, \n" "diese Dateien als ein einzelnes Objekt mit mehreren Teilen behandeln?" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Multiple Kopien durch Erstellen eines Rasters." -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Mehrfache Kopien mit diesem Faktor." @@ -7772,7 +7772,7 @@ msgstr "" msgid "New prerelease version %1% is available." msgstr "Die neue Vorabversion %1% ist verfügbar." -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Neue Druckervoreinstellung ausgewählt" @@ -7834,7 +7834,7 @@ msgstr "" "Für dieses Modell kann mit der aktuellen Konfiguration keine Grundschicht " "generiert werden" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Keine vorher gesclicete Datei." @@ -7842,7 +7842,7 @@ msgstr "Keine vorher gesclicete Datei." msgid "No sparse layers (EXPERIMENTAL)" msgstr "Keine spärlichen Schichten (EXPERIMENTELL)" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "Es werden keine Stützpunkte näher als dieser Schwellenwert platziert." @@ -7858,7 +7858,7 @@ msgid "None" msgstr "Kein" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normal" @@ -7874,7 +7874,7 @@ msgstr "Nicht gefunden:" msgid "Note" msgstr "Hinweis" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -7885,7 +7885,7 @@ msgstr[1] "" "Beachten Sie, dass die ausgewählte Voreinstellung auch von diesen Druckern " "gelöscht wird." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -7897,7 +7897,7 @@ msgstr[1] "" "Beachten Sie, dass diese Drucker nach dem Löschen der ausgewählten " "Voreinstellung gelöscht werden." -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -7950,12 +7950,12 @@ msgstr "" "Hinweis: Einige Tastenkombinationen funktionieren nur im " "(Nicht-)Bearbeitungsmodus." -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Anmerkungen" @@ -7969,7 +7969,7 @@ msgstr "Hinweis" msgid "Notify about new releases" msgstr "Über neue Releases benachrichtigen" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Düse" @@ -7981,7 +7981,7 @@ msgstr "Düsendurchmesser:" msgid "Nozzle and Bed Temperatures" msgstr "Düsen- und Bett-Temperaturen" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Düsendurchmesser" @@ -8012,7 +8012,7 @@ msgstr "" msgid "Number of cooling moves" msgstr "Anzahl der Kühlbewegungen" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Anzahl der Extruder des Druckers." @@ -8044,15 +8044,15 @@ msgstr "" "die hier konfigurierte. Setzen Sie diesen Wert auf null, um die Schürze " "komplett zu deaktivieren." -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Anzahl an Pixeln in" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Anzahl an Pixeln in X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Anzahl an Pixeln in Y" @@ -8069,7 +8069,7 @@ msgstr "" msgid "Number of solid layers to generate on top surfaces." msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Oberseite." -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -8085,7 +8085,7 @@ msgstr "Anzahl der Werkzeugwechsel" msgid "Object Settings to modify" msgstr "Abweichende Objekteigenschaften" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Objekt-Hebung" @@ -8203,7 +8203,7 @@ msgstr "Ein/Aus Einschichtmodus des vertikalen Schiebereglers" msgid "One layer mode" msgstr "Eine Schicht Modus" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Eine der Voreinstellungen wird nicht gefunden" @@ -8228,7 +8228,7 @@ msgstr "" "Entfernen Sie entweder alle bis auf das letzte Objekt, oder aktivieren Sie " "den sequenziellen Modus durch \"complete_objects\"." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -8240,7 +8240,7 @@ msgstr "" msgid "Only infill where needed" msgstr "Infill nur wo es notwendig ist drucken" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Nur Z anheben" @@ -8282,7 +8282,7 @@ msgstr "" "Die Sickervermeidung wird derzeit nicht unterstützt, wenn der Wischturm " "aktiviert ist." -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Öffne &PrusaSlicer" @@ -8302,11 +8302,11 @@ msgstr "Öffne Ordner." msgid "Open G-code file:" msgstr "Öffne G-Code-Datei:" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "G-Code-Viewer öffnen" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Neue Instanz öffnen" @@ -8314,20 +8314,20 @@ msgstr "Neue Instanz öffnen" msgid "Open Preferences." msgstr "Einstellungen öffnen." -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "PrusaSlicer öffnen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Öffne eine G-Code-Datei" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Öffne eine neue PrusaSlicer-Instanz" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Öffne eine Projektdatei" @@ -8369,7 +8369,7 @@ msgstr "%s-Website in Ihrem Browser öffnen" 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:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Öffnen Sie den Dialog zum Ändern der Formengalerie" @@ -8387,7 +8387,7 @@ msgstr "" "Öffnen eines neuen Projekts, während einige Voreinstellungen nicht " "gespeichert sind." -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -8463,7 +8463,7 @@ msgstr "Ausrichtungssuche abgebrochen." msgid "Origin" msgstr "Nullpunkt" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Sonstige" @@ -8483,15 +8483,15 @@ msgstr "Äußere und innerer Rand" msgid "Outer brim only" msgstr "Nur äußerer Rand" -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Ausgabedatei" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Ausgabe Modellinformationen" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Ausgabedatei" @@ -8499,7 +8499,7 @@ msgstr "Ausgabedatei" msgid "Output filename format" msgstr "Ausgabe Dateinamen Format" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Ausgabeoptionen" @@ -8524,19 +8524,19 @@ msgstr "Überhangsschwellwert" msgid "Overlap" msgstr "Überlappung" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "D&ruckeinstellungen" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Grundschicht (Pad)" @@ -8544,15 +8544,15 @@ msgstr "Grundschicht (Pad)" msgid "Pad and Support" msgstr "Grundschicht und Stützen" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Grundschicht um Objekt" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Grundschicht überall um Objekt" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Grundschicht Randgröße" @@ -8561,31 +8561,31 @@ 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:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Objektgrundschicht Verbindungseindringtiefe" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Objektgrundschicht Verbindungsschritte" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Objektgrundschicht Verbinderbreite" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Grundschicht Objekt Abstand" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Grundschicht Wandhöhe" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Grundschicht Wandneigung" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Grundschicht Wandstärke" @@ -8718,7 +8718,7 @@ msgstr "Einfügen" msgid "Paste From Clipboard" msgstr "Aus Zwischenablage einfügen" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Aus Zwischenablage einfügen" @@ -8756,7 +8756,7 @@ msgstr "Unterstützungsmaterialmuster." msgid "Pause" msgstr "Pause" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "Druckpausen G-Code" @@ -8791,7 +8791,7 @@ msgstr "" "Desktop-Integration durchführen (stellt diese Binärdatei so ein, dass sie " "vom System durchsucht werden kann)." -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -8835,7 +8835,7 @@ msgstr "" msgid "Perimeter" msgstr "Kontur" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Umfangsverteilung Anzahl" @@ -8847,15 +8847,15 @@ msgstr "Umfang Extruder" msgid "Perimeter generator" msgstr "Umfangsgenerator" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Umfangsübergang Länge" -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Umfangs-Übergang-Filter-Rand" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Umfangsübergang Schwellenwinkel" @@ -8906,28 +8906,28 @@ msgstr "" "Bildgrößen, die in einer .gcode und .sl1 / .sl1s Datei gespeichert werden " "sollen, im folgenden Format: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Pfeiler-Verbindungsmodus" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Pfeiler-Durchmesser" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Pfeilerverbreiterungsfaktor" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" "Der Nadelkopfdurchmesser sollte kleiner sein als der Säulendurchmesser." -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Nadelkopf vorderer Durchmesser" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Nadelkopf Breite" @@ -8976,11 +8976,11 @@ msgstr "" msgid "Please select the file to reload" msgstr "Bitte wählen Sie die neu zu ladende Datei aus" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Teile des Urheberrechts" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Hochformat" @@ -8989,7 +8989,7 @@ msgstr "Hochformat" msgid "Position" msgstr "Position" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Position (für Multi-Extruder-Drucker)" @@ -9005,7 +9005,7 @@ msgstr "Y-Position" msgid "Position of perimeters starting points." msgstr "Position des Startpunktes des Umfangs." -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Nachbearbeitungsskripte sollen die G-Code-Datei an ihrem Speicherort ändern." @@ -9030,11 +9030,11 @@ msgstr "" "Stelle zu ändern, und lesen Sie im Handbuch nach, wie Sie die " "nachbearbeitete G-Code-Datei optional umbenennen können.\n" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Nachbearbeitungs Script" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "&Vorschau" @@ -9107,7 +9107,7 @@ msgstr "" msgid "Preset with name \"%1%\" already exists." msgstr "Eine Voreinstellung mit dem Namen \"%1%\" existiert bereits." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9116,7 +9116,7 @@ msgstr "" "Klicken Sie auf diese Schaltfläche, um dieselbe Voreinstellung für die " "rechte und linke Voreinstellung auszuwählen." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Voreinstellungen sind gleich" @@ -9156,7 +9156,7 @@ msgstr "" msgid "Pressure equalizer (experimental)" msgstr "Druckausgleich (experimentell)" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -9178,7 +9178,7 @@ msgstr "" "Düsendurchmessers berechnet." #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Vorschau" @@ -9186,7 +9186,7 @@ msgstr "Vorschau" msgid "Preview hollowed and drilled model" msgstr "Vorschau des ausgehöhlten und aufgebohrten Modells" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Vorher geslicete Datei (" @@ -9198,7 +9198,7 @@ msgstr "Alle Druckextruder vorfüllen" msgid "Print" msgstr "Druck" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Druck&host Warteschlange" @@ -9206,7 +9206,7 @@ msgstr "Druck&host Warteschlange" msgid "Print Diameters" msgstr "Druckdurchmesser" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Hochladen zum Druckhost" @@ -9245,15 +9245,15 @@ msgstr "Druckpausen" msgid "Print settings" msgstr "Druckeinstellungen" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Druckgeschwindigkeit" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Korrektur der Druckgeschwindigkeit" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Druck&ereinstellungen" @@ -9289,11 +9289,11 @@ msgstr "Druckereinstellungen" msgid "Printer Settings Tab" msgstr "Druckereinstellungsreiter" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Drucker absolute Korrektur" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Drucker Gammakorrektur" @@ -9305,32 +9305,32 @@ msgstr "Drucker Anmerkungen" msgid "Printer preset names" msgstr "Drucker-Voreinstellungsnamen" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Druckerskalierung X-Achsen-Korrektur" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Druckerskalierung Y-Achsen-Korrektur" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Druckerskalierung Z-Achsen-Korrektur" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Drucker skalierte Korrektur" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Korrektur der Druckerskalierung in der X-Achse" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Korrektur der Druckerskalierung in der Y-Achse" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Korrektur der Druckerskalierung in der Z-Achse" @@ -9378,7 +9378,7 @@ msgid "Process %1% / 100" msgstr "Bearbeite %1% / 100" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Berechne %s" @@ -9392,9 +9392,9 @@ msgstr "" "Die Verarbeitung des Modells '%1%' mit mehr als 1M Dreiecken könnte langsam " "sein. Es wird dringend empfohlen, die Anzahl der Dreiecke zu reduzieren." -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Profil Abhängigkeiten" @@ -9489,7 +9489,7 @@ msgstr "" "PrusaSlicer ist beim Erstellen eines Konfigurations-Snapshots auf einen " "Fehler gestoßen." -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -9610,15 +9610,15 @@ msgstr "Schnell" msgid "Quick Add Settings (%s)" msgstr "Schnelles Einstellen (%s)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Quick Slice" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Quick Slice und Speichern unter" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "%s verlassen" @@ -9688,7 +9688,7 @@ msgstr "Breite der Rammlinie" msgid "Ramming parameters" msgstr "Rammparameter" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Einstellungen für das Rammen" @@ -9708,8 +9708,8 @@ msgstr "Bereich" msgid "Rasterizing layers" msgstr "Schichten werden gerastert" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Neu&laden von Festplatte" @@ -9721,15 +9721,15 @@ msgstr "Neu konfigurieren" msgid "Ready" msgstr "Fertig" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Hinten" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Ansicht von Hinten" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "L&etzte Projekte" @@ -9773,7 +9773,7 @@ msgid "Rectilinear grid" msgstr "Rechtwinkliges Gitter" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Redo" @@ -9804,7 +9804,7 @@ msgstr "Drucker aktualisieren" msgid "Regular" msgstr "Normal" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Regulärer Ausdruck" @@ -9854,9 +9854,9 @@ msgstr "Neuladen von:" msgid "Reload plater from disk" msgstr "Druckplatte neu von der Festplatte laden" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Druckplatte neu von der Festplatte laden" @@ -9882,7 +9882,7 @@ msgid "Remember output directory" msgstr "Ausgabeverzeichnis merken" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Entfernen" @@ -10010,11 +10010,11 @@ msgstr "" msgid "Render" msgstr "Render" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Rendern mit einem Software-Renderer" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -10022,7 +10022,7 @@ msgstr "" "Rendern mit einem Software-Renderer. Der mitgelieferte MESA-Software-" "Renderer wird anstelle des standardmäßigen OpenGL-Treibers geladen." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Reparieren" @@ -10054,11 +10054,11 @@ msgstr "Reparieren des Modells durch den Netfabb-Dienst" msgid "Repairing was canceled" msgstr "Reparieren wurde abgebrochen" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Letzten Quick Slice wiederholen" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Letzten Quick Slice wiederholen" @@ -10070,7 +10070,7 @@ msgstr "Ersetzen von:" msgid "Replace the selected volume with new STL" msgstr "Das ausgewählte Volumen durch eine neue STL ersetzen" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Ersetzen mit" @@ -10138,7 +10138,7 @@ msgstr "Skalierung zurücksetzen" msgid "Reset selection" msgstr "Auswahl zurücksetzen" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Zurücksetzen auf Filamentfarbe" @@ -10162,8 +10162,8 @@ msgstr "Einzugslänge vor einer Reinigung" msgid "Retract on layer change" msgstr "Bei Schichtwechsel einziehen" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Einzug" @@ -10186,7 +10186,7 @@ msgstr "" "Der Einzug wird nicht ausgelöst, wenn die Fahrbewegungen kürzer als diese " "Länge sind." -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -10218,15 +10218,15 @@ msgstr "Umrechnung von Metern umkehren" msgid "Review the substitutions and adjust them if needed." msgstr "Überprüfen Sie die Ersetzungen und passen Sie sie bei Bedarf an." -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Rechts" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Rechter voreingestellter Wert" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Ansicht von rechts" @@ -10266,15 +10266,15 @@ msgstr "Rechte Maustaste:" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Drehen" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Rotiere um X" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Rotiere um Y" @@ -10303,15 +10303,15 @@ msgstr "" msgid "Rotation" msgstr "Rotation" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Rotationswinkel um die X-Achse in Grad." -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Rotationswinkel um die Y-Achse in Grad." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Rotationswinkel um die Z-Achse in Grad." @@ -10329,11 +10329,11 @@ msgstr "%s ausführen" msgid "Running post-processing scripts" msgstr "Post-Prozess Scripts werden ausgeführt" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "S&ende G-code" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "Zum Drucken s&enden" @@ -10363,7 +10363,7 @@ msgstr "SLA Gizmo Tastaturkürzel" msgid "SLA material" msgstr "SLA Material" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA Materialtyp" @@ -10375,7 +10375,7 @@ msgstr "SLA Materialien" msgid "SLA print" msgstr "SLA Druck" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA Druckmaterial-Anmerkungen" @@ -10387,7 +10387,7 @@ msgstr "SLA Druckeinstellungen" msgid "SLA supports outside the print area were detected." msgstr "SLA-Stützen außerhalb des Druckbereichs wurden erkannt." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" @@ -10406,7 +10406,7 @@ msgstr "Speichern" msgid "Save %s as:" msgstr "Speichere %s als:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Speichere %s Datei als:" @@ -10415,12 +10415,12 @@ msgstr "Speichere %s Datei als:" msgid "Save G-code file as:" msgstr "Speichere G-Code Datei als:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 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/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Projekt speichern &als" @@ -10428,15 +10428,15 @@ msgstr "Projekt speichern &als" msgid "Save SL1 / SL1S file as:" msgstr "SL1 / SL1S-Datei speichern unter:" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Speichere Konfigurationsdatei" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Konfiguration speichern unter:" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Sichert die Konfiguration in der angegebenen Datei." @@ -10446,11 +10446,11 @@ msgstr "Sichert die Konfiguration in der angegebenen Datei." msgid "Save current %s" msgstr "Speichere aktuelle %s" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Speichere aktuelle Projektdatei" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Speichere aktuelle Projektdatei als" @@ -10463,7 +10463,7 @@ msgstr "Speichere Datei als:" msgid "Save preset" msgstr "Sichern der Voreinstellung" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Sichern der Voreinstellungssammlung unter:" @@ -10492,7 +10492,7 @@ msgstr "Speichern der ausgewählten Optionen unter der Voreinstellung \"%1%\"." msgid "Save the selected options." msgstr "Speichern der ausgewählten Optionen." -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Speichere Zip Datei als:" @@ -10506,7 +10506,7 @@ msgstr "Sichern des Netzes in einen 3MF-Container fehlgeschlagen." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Skalieren" @@ -10523,11 +10523,11 @@ 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:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Passend skalieren" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Auf das gegebene Volumen skalieren." @@ -10535,7 +10535,7 @@ msgstr "Auf das gegebene Volumen skalieren." msgid "Scale to print volume" msgstr "Auf Druckvolumen skalieren" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Skalierungsfaktor oder Prozentsatz." @@ -10566,7 +10566,7 @@ msgstr "Bevorzugte Zitterrichtung für Nähte" msgid "Seams" msgstr "Nähte" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Suc&hen" @@ -10590,7 +10590,7 @@ msgstr "" msgid "Search in English" msgstr "Suche in Englisch" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Suche in Einstellungen" @@ -10679,7 +10679,7 @@ msgstr "Wählen Sie eine Aktion, die auf die Datei angewendet werden soll" msgid "Select by rectangle" msgstr "Auswahl über Rechteck" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Konfiguration zum Laden auswählen:" @@ -10687,7 +10687,7 @@ msgstr "Konfiguration zum Laden auswählen:" 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/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Voreinstellungen zum Vergleichen wählen" @@ -10699,7 +10699,7 @@ msgstr "Form aus der Galerie auswählen" msgid "Select showing settings" msgstr "Wähle Anzeigeeinstellungen" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Geben Sie die STL-Datei an, die repariert werden soll:" @@ -10784,7 +10784,7 @@ msgstr "Auswahl aus Liste entfernen" msgid "Selection-Remove from rectangle" msgstr "Auswahl über Rechteck entfernen" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Alle Objekte auswählen" @@ -10801,7 +10801,7 @@ msgstr "Sende G-code" msgid "Send system info" msgstr "Sende Systeminfo" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Sende die aktuelle Plattenbelegung als G-Code zum Drucken" @@ -10825,7 +10825,7 @@ msgstr "Sende Systeminfo..." msgid "Seq." msgstr "Seq." -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Sequentielles Drucken" @@ -10842,7 +10842,7 @@ msgstr "Serieller Port:" msgid "Service name" msgstr "Name des Dienstes" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Setzen" @@ -10970,7 +10970,7 @@ msgstr "Ausgewählte Elemente als druckbar/ nicht druckbar festlegen" msgid "Set settings tabs as menu items (experimental)" msgstr "Einstellungsregisterkarten als Menüpunkte festlegen (experimentell)" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -11132,7 +11132,7 @@ msgstr "" msgid "Set upper thumb as active" msgstr "Oberen Schieber aktiv setzen" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -11144,7 +11144,7 @@ msgstr "" "Warnstufenmeldungen." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Einstellungen" @@ -11199,7 +11199,7 @@ msgstr "" msgid "Shape" msgstr "Form" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Formen-Galerie" @@ -11250,7 +11250,7 @@ msgstr "Benachrichtigung \"Tipp des Tages\" nach dem Start anzeigen" msgid "Show &Configuration Folder" msgstr "Zeige &Konfigurationsordner" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Anzeigen Beschriftungen (&L)" @@ -11266,7 +11266,7 @@ msgstr "\"Über\"-Dialog anzeigen" msgid "Show advanced settings" msgstr "Ausführliche Einstellungen anzeigen" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Alle Voreinstellungen anzeigen (auch inkompatible)" @@ -11306,7 +11306,7 @@ msgstr "Objekthöhe anzeigen" msgid "Show object height on the ruler" msgstr "Objekthöhe auf dem Lineal anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Objekt-/Kopiebeschriftungen in der 3D-Szene anzeigen" @@ -11334,47 +11334,47 @@ msgstr "Stützen anzeigen" msgid "Show system information" msgstr "Systeminformationen anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Anzeigen des 3D Editiermodus" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Vorschau der 3D-Schnitte anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Filamenteinstellungen anzeigen" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 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/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 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/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Liste der Tastaturkürzel anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Druckplatte anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Druckeinstellungen anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Druckereinstellungen anzeigen" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Diese Hilfe zeigen." @@ -11462,7 +11462,7 @@ msgstr "Modell vereinfachen" msgid "Single Extruder Multi Material" msgstr "Einzelextruder mit Multi-Material" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -11474,15 +11474,15 @@ msgstr "" "Möchten Sie den Durchmesser für alle Extruder auf den Wert des ersten " "Extruderdüsendurchmessers ändern?" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Einzelextruder MM Setup" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Einzelextruder Multimaterial Parameter" -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Einzelinstanz-Modus" @@ -11501,7 +11501,7 @@ msgstr "Größe" msgid "Size" msgstr "Größe" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Größe und Koordinaten" @@ -11574,15 +11574,15 @@ msgstr "" "PrusaSlicer wird die Geschwindigkeit nicht unterhalb dieser Geschwindigkeit " "skalieren." -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Slice" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Datei zu G-Code slicen" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Datei zu G-Code slicen, speichern als" @@ -11599,15 +11599,15 @@ msgstr "Jetzt slicen" msgid "Slice resolution" msgstr "Slice Auflösung" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 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:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Modell slicen und Werkzeugwege als G-Code exportieren." -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -11624,13 +11624,13 @@ msgstr "Slice-Info" msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "Das Objekt \"%1%\" sieht aus wie ein Logo oder ein Schild" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Slice" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Slicing abgeschlossen!" @@ -11665,7 +11665,7 @@ msgstr "Slice das Modell" msgid "Slicing supports" msgstr "Slice Stützen" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Langsam" @@ -11673,7 +11673,7 @@ msgstr "Langsam" msgid "Slow down if layer print time is below" msgstr "Langsamer drucken wenn die Schichtdruckzeit geringer ist als" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Langsames Kippen" @@ -11681,7 +11681,7 @@ msgstr "Langsames Kippen" msgid "Small perimeters" msgstr "Dünne Außenkonturen" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Kleiner Pfeilerdurchmesser in Prozent" @@ -11779,7 +11779,7 @@ msgid "Some SLA materials were uninstalled." msgstr "Einige SLA-Materialien wurden deinstalliert." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -11806,7 +11806,7 @@ msgstr "" "Einige Objekte sind zu hoch und können nicht ohne Zusammenstoß mit dem " "Extruder gedruckt werden." -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -11825,7 +11825,7 @@ msgstr "" "Einige Voreinstellungen werden geändert und die nicht gespeicherten " "Änderungen werden vom Konfigurations-Snapshot nicht erfasst." -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -12016,7 +12016,7 @@ msgid "Spiral vase" msgstr "Spiralvasenmodus" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Trennen" @@ -12083,13 +12083,13 @@ msgstr "Standard" msgid "Stars" msgstr "Sterne" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Start G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Ein neues Projekt beginnen" @@ -12097,7 +12097,7 @@ msgstr "Ein neues Projekt beginnen" msgid "Start at height" msgstr "Starte auf Höhe" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Neuen Slicing-Prozess starten" @@ -12149,7 +12149,7 @@ msgid "Status:" msgstr "Status:" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Stealth" @@ -12208,19 +12208,19 @@ msgstr "Stützverstärker" msgid "Support Generator" msgstr "Stütz-Generator" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Stützfuß Durchmesser" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Stützfuß Höhe" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Sicherheitsabstand der Stützbasis" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Stützkopf" @@ -12274,7 +12274,7 @@ msgid "Support material/raft/skirt extruder" msgstr "Stützmaterial/Raft/Schürzen Extruder" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Stützen nur auf dem Druckbett" @@ -12282,12 +12282,12 @@ msgstr "Stützen nur auf dem Druckbett" msgid "Support parameter change" msgstr "Stützparameter Änderung" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Stützpfeiler" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Stützpunktdichte" @@ -12296,16 +12296,16 @@ msgid "Support points edit" msgstr "Stützpunkte editieren" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Stützen" @@ -12460,7 +12460,7 @@ msgstr "Schnappschuss der Konfiguration erstellen" msgid "Taking a configuration snapshot failed." msgstr "Schnappschuss der Konfiguration erstellen fehlgeschlagen." -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Temperatur" @@ -12486,7 +12486,7 @@ msgstr "Temperaturen" msgid "Temperatures" msgstr "Temperaturen" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Vorlage Benutzerdefinierter G-Code" @@ -12647,7 +12647,7 @@ msgstr "" "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese die " "gleiche Schichthöhe haben" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -12706,7 +12706,7 @@ msgstr "" "Weltkoordinatensystem möglich,\n" "sobald die Drehung in die Objektkoordinaten eingearbeitet wurde." -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "" "Der Standardwinkel für die Verbindung von Stützstäben und Verbindungen." @@ -12815,7 +12815,7 @@ msgstr "" msgid "The file does not exist." msgstr "Die Datei existiert nicht." -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -12849,7 +12849,7 @@ msgstr "" msgid "The following characters are not allowed by a FAT file system:" msgstr "Die folgenden Zeichen sind in einem FAT-Dateisystem nicht zulässig:" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -12907,7 +12907,7 @@ msgstr "" msgid "The following values were substituted:" msgstr "Die folgenden Werte wurden ersetzt:" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -12915,7 +12915,7 @@ msgstr "" "Der Abstand zwischen dem Objektboden und der erzeugten Grundschicht im " "Nullhöhenmodus." -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Die Höhe des Pfeilergrundkegels" @@ -12957,7 +12957,7 @@ msgstr "" "Die letzten Farbwechsel-Daten wurden für einen Einzel-Extruder-Druck " "gespeichert." -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -12965,7 +12965,7 @@ msgstr "" "Der maximale Abstand zwischen 2 Pfeilern, die miteinander verbunden werden. " "Ein Wert von null verhindert die Kaskadierung von Pfeilern." -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "Die maximale Länge einer Überbrückung" @@ -12990,7 +12990,7 @@ msgstr "" "Der maximale Abstand, um den jeder Außenhautpunkt (in beide Richtungen) " "versetzt werden kann, gemessen senkrecht zur Umfangswand." -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -13025,7 +13025,7 @@ 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:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -13068,7 +13068,7 @@ msgstr "" "Das Objekt wird um diese Anzahl von Schichten angehoben, und darunter wird " "Trägermaterial erzeugt." -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -13077,7 +13077,7 @@ msgstr "" "Pfeiler, die in problematischen Bereichen eingesetzt werden, in die ein " "normaler Pfeiler nicht passt." -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13088,7 +13088,7 @@ msgstr "" "wird eine langsame Verkippung verwendet, andernfalls - eine schnelle " "Verkippung" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -13100,7 +13100,7 @@ msgstr[1] "" "Die unten aufgeführten physischen Drucker basieren auf der Voreinstellung, " "die Sie löschen möchten." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -13162,7 +13162,7 @@ msgstr "Der angegebene Dateiname ist ungültig." msgid "The provided name is not valid;" msgstr "Der angegebene Name ist ungültig;" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -13170,7 +13170,7 @@ msgstr "" "Das ausgewählte 3MF enthält Objekte mit bemalten FDM-Stützen, die eine " "neuere Version von PrusaSlicer verwenden und nicht kompatibel sind." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -13178,7 +13178,7 @@ msgstr "" "Das ausgewählte 3MF enthält ein mit Multimaterial Aufmal Objekt, das eine " "neuere Version von PrusaSlicer verwendet und nicht kompatibel ist." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -13186,7 +13186,7 @@ msgstr "" "Das ausgewählte 3MF enthält ein Aufmal-Naht Objekt, das eine neuere Version " "von PrusaSlicer verwendet und nicht kompatibel ist." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -13234,7 +13234,7 @@ msgstr "" "Das ausgewählte Objekt konnte nicht geteilt werden, da es nur ein solides " "Teil enthält." -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -13271,7 +13271,7 @@ msgstr "Die Größe des Objekts kann in Zoll angegeben werden" msgid "The size of the object is zero" msgstr "Die Größe des Objekts ist Null" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -13349,7 +13349,7 @@ msgstr "Der angegebene Name ist ungültig;" msgid "The supplied settings will cause an empty print." msgstr "Die vorgenommenen Einstellungen führen zu einem leeren Druck." -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Die Stärke der Grundschicht und seine optionalen Hohlraumwände." @@ -13753,11 +13753,11 @@ msgstr "" msgid "This is a default preset." msgstr "Dies ist eine Standard-Voreinstellung." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 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:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -13770,7 +13770,7 @@ msgid "This is a system preset." msgstr "Dies ist eine Systemvoreinstellung." #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Dies wird nur als visuelles Hilfsmittel in der PrusaSlicer-" @@ -14101,7 +14101,7 @@ msgstr "" "Konfiguration erstellt, bevor die mit dieser %s-Version kompatiblen Dateien " "installiert werden." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14115,7 +14115,7 @@ msgstr "" "oder einen unbekannten Wert stillschweigend oder interaktiv durch einen " "Standardwert zu ersetzen." -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14139,15 +14139,15 @@ msgstr "" "auszuführen. Die optimale Anzahl beträgt etwas mehr als die Anzahl der " "verfügbaren Kerne/Prozessoren." -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Kippen" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Kippen für hochviskoses Harz" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Kippzeit" @@ -14177,15 +14177,15 @@ msgstr "" "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:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Dauer des schnellen Kippens" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Dauer des langsamen Kippens" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Dauer des super-langsamen Kippens" @@ -14248,7 +14248,7 @@ msgstr "Werkzeug" msgid "Tool #" msgstr "Werkzeug #" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-Code für Werkzeugwechsel" @@ -14270,7 +14270,7 @@ msgstr "Werkzeugposition" msgid "Tool type" msgstr "Werkzeugtyp" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Werkzeugwechsel-Parameter für MM-Drucker mit einem Extruder" @@ -14293,7 +14293,7 @@ msgstr "" "Hinweis zur Ober-/Bodenschalestärke: Nicht verfügbar wegen ungültiger " "Schichthöhe." -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Ansicht von oben" @@ -14389,7 +14389,7 @@ msgstr "Eilgang" msgid "Triangles" msgstr "Dreiecke" -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14411,11 +14411,11 @@ msgstr "Druckertyp." msgid "Type:" msgstr "Typ:" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "OFFENES SCHLOSS" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -14428,7 +14428,7 @@ msgstr "" "Klicken Sie, um alle Einstellungen für die aktuelle Optionsgruppe auf die " "System- (oder Standard-) Werte zurückzusetzen." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -14472,11 +14472,11 @@ msgstr "Kann nicht durch mehr als ein Volumen ersetzt werden" msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Kategorie nicht definieren" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Gruppe nicht definieren" @@ -14490,7 +14490,7 @@ msgstr "Unterlauf" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Undo" @@ -14688,7 +14688,7 @@ msgstr "Benutze freie Kamera" msgid "Use inches" msgstr "Zoll verwenden" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Grundschicht benutzen" @@ -14780,11 +14780,11 @@ msgstr "" "Der Wert wurde geändert und ist nicht gleich wie die Systemeinstellung oder " "die letzte abgespeicherte Voreinstellung" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 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:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Werte in dieser Spalte sind für den Stealth Modus" @@ -14830,7 +14830,7 @@ msgstr "Hersteller:" msgid "Verbose G-code" msgstr "Ausführlicher G-Code" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Version" @@ -14879,7 +14879,7 @@ msgstr "" "Besuchen Sie \"Einstellungen\" und prüfen Sie \"%1%\"\n" "um Ihre Auswahl zu ändern." -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Visualisierung eines bereits gesliceten und gespeicherten G-Codes" @@ -14904,7 +14904,7 @@ msgstr "Volumen in Objekt neu angeordnet" msgid "Volumetric" msgstr "Volumetrisch" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Hinweise zum Volumenstrom nicht verfügbar" @@ -14927,17 +14927,17 @@ msgstr "Volumengeschwindigkeit" msgid "WARNING:" msgstr "WARNUNG:" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "WEISSER PUNKT" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 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:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -14945,7 +14945,7 @@ 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -14953,7 +14953,7 @@ msgstr "" "Das Symbol WEISSER PUNKT zeigt an, dass der Wert identisch ist mit " "demjenigen in der zuletzt gespeicherten Voreinstellung." -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Wandstärke" @@ -15118,7 +15118,7 @@ msgstr "" "Extruder diese zusätzliche Menge an Filament ausgeben. Diese Einstellung " "wird selten benötigt." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -15134,17 +15134,19 @@ msgstr "" "Umfänge, aber es können Lücken entstehen oder die Umfänge werden übermäßig " "ausgedehnt." -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" "Beim Übergang zwischen verschiedenen Anzahlen von Umfängen, wenn das Teil " -"dünner wird, wird eine bestimmte Menge an Platz zugewiesen, um die Umfänge " -"zu teilen oder zu verbinden." +"dünner wird, wird eine bestimmte Menge an Platz zum Teilen oder Verbinden " +"der Umfangssegmente zugewiesen. Wenn er als Prozentsatz ausgedrückt wird (z." +"B. 100%), wird er auf der Grundlage des Düsendurchmessers berechnet." -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Ganzes Wort" @@ -15156,7 +15158,7 @@ msgstr "Breite" msgid "Width (mm)" msgstr "Breite (mm)" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 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" @@ -15165,18 +15167,18 @@ msgstr "" msgid "Width of a wipe tower" msgstr "Breite des Reinigungsturms" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 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:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Displaybreite" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -15190,7 +15192,7 @@ msgstr "" "Merkmal selbst. Wird die Breite als Prozentsatz (z.B. 85%) angegeben, wird " "sie auf der Grundlage des Düsendurchmessers errechnet." -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -15234,7 +15236,7 @@ msgstr "Reinigungsturm - Anpassung des Reinigungsvolumens" msgid "Wipe tower brim width" msgstr "Wischturm Randbreite" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Reinigungsturm Parameter" @@ -15300,7 +15302,7 @@ msgstr "" "\n" "Aktualisierte Konfigurationssammlungen:" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Schreibt Informationen über das Modell auf die Konsole." @@ -15391,7 +15393,7 @@ msgstr "" "Sie können hier Ihre persönlichen Notizen eingeben. Der Text wird dem " "Header vom G-Code hinzugefügt." -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "Sie können Ihre Notizen zum SLA Druckmaterial hier eingeben." @@ -15558,7 +15560,7 @@ msgstr "" "Ihre aktuellen Änderungen löschen alle gespeicherten Extruder-(Werkzeug-) " "Wechsel." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Ihre Datei wurde repariert." @@ -15597,7 +15599,7 @@ msgstr "Z-Abstand" msgid "Z travel" msgstr "Z Eilgang" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zickzack" @@ -15719,7 +15721,7 @@ msgstr "Standard-Druckprofil" msgid "default value" msgstr "Standardwert" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "löschen" @@ -15797,7 +15799,7 @@ msgid "flow rate is maximized" msgstr "die Durchflussmenge ist am Maximum" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -15822,7 +15824,7 @@ msgstr "g" msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" @@ -15839,7 +15841,7 @@ msgid "in" msgstr "in" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -15853,7 +15855,7 @@ msgstr "" "aktuelle Optionsgruppe auf die System- (oder Standard-) Werte zurückzusetzen." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -15862,7 +15864,7 @@ msgstr "" "die aktuelle Optionsgruppe übereinstimmen" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -15899,11 +15901,11 @@ msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "basiert auf Slic3r von Alessandro Ranellucci und der RepRap Community." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "ist unter der Lizenz der" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" @@ -15927,7 +15929,7 @@ msgstr "max PrusaSlicer Version" msgid "min PrusaSlicer version" msgstr "min PrusaSlicer Version" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" @@ -15967,19 +15969,18 @@ msgstr "ml" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -15993,8 +15994,9 @@ msgstr "mm (Null zum Deaktivieren)" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm oder %" @@ -16056,7 +16058,7 @@ msgstr "Modell" msgid "modified" msgstr "geändert" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "Kosten/Flasche" @@ -16114,7 +16116,7 @@ msgstr "Drucker" msgid "printer model" msgstr "Druckermodell" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "Entfernen" @@ -16135,11 +16137,11 @@ msgstr "benötigt min. %s und max. %s" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -16262,8 +16264,8 @@ msgstr "Schreibabruf fehlgeschlagen" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" diff --git a/resources/localization/en/PrusaSlicer_en.po b/resources/localization/en/PrusaSlicer_en.po index 0edd2bb134..e11caac1ad 100644 --- a/resources/localization/en/PrusaSlicer_en.po +++ b/resources/localization/en/PrusaSlicer_en.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,54 +13,54 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.3\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 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/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "" @@ -184,7 +184,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "" @@ -242,19 +242,18 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "" @@ -287,7 +286,7 @@ msgid "Load shape from STL..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "" @@ -300,7 +299,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "" @@ -499,19 +498,19 @@ msgstr "" msgid "Infill" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "" @@ -620,7 +619,7 @@ msgid "Standard" msgstr "" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "" @@ -870,7 +869,7 @@ msgstr "" msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "" @@ -1162,7 +1161,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "" @@ -1765,7 +1764,7 @@ msgstr "" msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1781,7 +1780,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "" @@ -1791,7 +1790,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "" @@ -1972,8 +1971,8 @@ msgstr "" msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "" @@ -2028,7 +2027,7 @@ msgstr "" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "" @@ -2252,7 +2251,7 @@ msgid "Add..." msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "" @@ -2299,7 +2298,7 @@ msgid "Next Undo action: %1%" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "" @@ -2339,7 +2338,7 @@ msgid "Selection-Remove from rectangle" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "" @@ -2594,7 +2593,7 @@ msgid "Quality" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "" @@ -2697,7 +2696,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "" @@ -2714,7 +2713,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "" @@ -2765,7 +2764,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "" @@ -2849,7 +2848,7 @@ msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "" @@ -3614,7 +3613,7 @@ msgid "Speed" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3637,52 +3636,51 @@ msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "" @@ -3824,7 +3822,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "" @@ -3885,7 +3883,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "" @@ -4516,11 +4514,11 @@ msgstr "" msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "" @@ -4801,7 +4799,7 @@ msgstr "" msgid "Attention!" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "" @@ -4838,7 +4836,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "" @@ -5181,13 +5179,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "" @@ -5224,7 +5222,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "" @@ -5302,7 +5300,7 @@ msgid "Keyboard shortcuts" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "" @@ -5310,11 +5308,11 @@ msgstr "" msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "" @@ -5340,13 +5338,13 @@ msgid "Print Settings" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "" @@ -5429,621 +5427,621 @@ msgstr "" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 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:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "" @@ -6265,8 +6263,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "" @@ -6336,7 +6334,7 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "" @@ -6484,7 +6482,7 @@ msgid "Select what kind of support do you need" msgstr "" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "" @@ -6582,7 +6580,7 @@ msgid "(including spool)" msgstr "" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "" @@ -7048,10 +7046,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "" @@ -7480,7 +7478,7 @@ msgid "Add/Remove presets" msgstr "" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "" @@ -7492,7 +7490,7 @@ msgstr "" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "" @@ -7789,11 +7787,11 @@ msgstr "" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "" @@ -7902,12 +7900,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "" @@ -8156,7 +8154,7 @@ msgstr "" msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "" @@ -8244,7 +8242,7 @@ msgstr "" msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "" @@ -8252,52 +8250,52 @@ msgstr "" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8310,82 +8308,82 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Toolchange parameters with single extruder MM printers" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8398,20 +8396,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8419,64 +8417,64 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8485,105 +8483,105 @@ msgstr "" msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 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:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 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:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8591,14 +8589,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8608,7 +8606,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -8616,84 +8614,84 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8701,23 +8699,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8725,13 +8723,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 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:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -8739,17 +8737,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 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:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -8757,68 +8755,68 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 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 "" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format 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:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "" @@ -8901,7 +8899,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -8962,49 +8960,49 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -9598,26 +9596,26 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10301,8 +10299,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "" @@ -10317,9 +10315,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "" @@ -10514,8 +10511,8 @@ msgstr "" msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10649,8 +10646,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "" @@ -10716,7 +10714,7 @@ msgid "Extruder Color" msgstr "" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" @@ -10797,7 +10795,7 @@ msgstr "" msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "" @@ -10953,8 +10951,8 @@ msgid "" "average." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "" @@ -11012,7 +11010,7 @@ msgstr "" msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "" @@ -12516,7 +12514,7 @@ msgid "" "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13046,33 +13044,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13084,11 +13084,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13097,63 +13097,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13162,462 +13134,462 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 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:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 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:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 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:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 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:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 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:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 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:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -13625,19 +13597,19 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -13647,92 +13619,92 @@ msgstr "" "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:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -13741,240 +13713,240 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 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:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -13982,80 +13954,80 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 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:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 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:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 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:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 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:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/es/PrusaSlicer.mo b/resources/localization/es/PrusaSlicer.mo index debeea5caf..c5f301767f 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 150affdaea..4f2f5ef51b 100644 --- a/resources/localization/es/PrusaSlicer_es.po +++ b/resources/localization/es/PrusaSlicer_es.po @@ -7,7 +7,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Prusalator\n" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -35,9 +35,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -126,7 +125,7 @@ msgstr[0] "%1% (%2$d carcasa)" msgstr[1] "%1% (%2$d carcasas)" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Preset" @@ -145,7 +144,7 @@ msgstr "" msgid "%1% was substituted with %2%" msgstr "%1% fue sustituido con %2%" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% fue laminado con éxito." @@ -166,7 +165,7 @@ msgstr "%3.2f mm³/s a una velocidad de filamento de %3.2f mm/s." msgid "%d lines: %.2f mm" msgstr "%d líneas: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d ajustes iniciales importados con éxito." @@ -335,7 +334,7 @@ msgstr "" msgid "&About %s" msgstr "&Acerca de %s" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "&Contraer la barra lateral" @@ -347,27 +346,27 @@ msgstr "&Configuración" msgid "&Configuration Snapshots" msgstr "Instantáneas de la &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Copiar" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "&Eliminar selección" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Editar" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Pestaña de Ajustes de &filamento" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Archivo" @@ -375,19 +374,19 @@ msgstr "&Archivo" msgid "&Finish" msgstr "&Terminar" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "&Pantalla completa" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Previsualización Código &G" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "Ayu&da" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Importar" @@ -395,7 +394,7 @@ msgstr "&Importar" msgid "&Language" msgstr "&Idioma" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Nuevo proyecto" @@ -403,19 +402,19 @@ msgstr "&Nuevo proyecto" msgid "&Next >" msgstr "&Siguiente >" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "Abrir código G (&O)" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "Abrir pr&oyecto" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&Pegar" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&Pestaña Base de impresión" @@ -423,35 +422,35 @@ msgstr "&Pestaña Base de impresión" msgid "&Preferences" msgstr "&Preferencias" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "Sa&lir" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Rehacer" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "&Reparar archivo STL" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "G&uardar proyecto" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "&Seleccionar Todo" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "Des&hacer" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "Ve&r" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Ventana" @@ -460,7 +459,7 @@ msgstr "&Ventana" msgid "(All)" msgstr "(Todo)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)Laminar A&hora" @@ -472,7 +471,7 @@ msgstr "(Re)laminar" msgid "(Some lines not shown)" msgstr "(Algunas líneas no se muestran)" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Desconocido)" @@ -484,7 +483,7 @@ msgstr "(incluyendo la bobina)" msgid "(minimum)" msgstr "(mínimo)" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") no encontrado." @@ -540,7 +539,7 @@ msgstr "2 mm" msgid "3 (heavy)" msgstr "3 (pesado)" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" @@ -629,7 +628,7 @@ 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/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -655,7 +654,7 @@ msgstr "Clave API" msgid "Abort" msgstr "Abortar" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Acerca de %s" @@ -672,7 +671,7 @@ msgstr "Control de aceleración (avanzado)" msgid "Access violation" msgstr "Violación de acceso" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Precisión" @@ -712,7 +711,7 @@ msgstr "" "soporte para reducir el tiempo de impresión y el consumo de filamento? Lee " "más en la documentación." -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Añadir" @@ -777,7 +776,7 @@ msgstr "Añadir Forma desde la Galería" msgid "Add Shapes from Gallery" msgstr "Añadir Formas desde la Galería" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Añade un pad debajo del modelo compatible" @@ -894,7 +893,7 @@ msgid "Add pause print" msgstr "Añadir pausa de impresión" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Añadir impresora física" @@ -994,17 +993,16 @@ msgstr "Dirección" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Avanzado" @@ -1040,16 +1038,16 @@ msgstr "" "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:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "Código G tras un cambio de capa" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Alinear XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Alinear el modelo a un punto dado." @@ -1062,7 +1060,7 @@ msgid "Aligned Rectilinear" msgstr "Rectilíneo Alineado" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Todo" @@ -1264,7 +1262,7 @@ msgstr "Aplicar el cambio de color automáticamente" msgid "Apply to all the remaining small objects being loaded." msgstr "Aplicar a todos los objetos pequeños restantes que se cargan." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "Arachne" @@ -1276,7 +1274,7 @@ msgstr "Generador de perímetros Arachne" msgid "Archimedean Chords" msgstr "Acordes de Arquímedes" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "¿Estás seguro de que deseas %1% el preset seleccionado?" @@ -1293,7 +1291,7 @@ msgstr "" msgid "Are you sure you want to continue?" msgstr "¿Estás seguro de que quieres continuar?" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -1307,7 +1305,7 @@ msgstr "" msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "¿Estás seguro de que quieres borrar la impresora \"%1%\"?" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "¿Está seguro de que quiere eliminar todas las sustituciones?" @@ -1315,7 +1313,7 @@ msgstr "¿Está seguro de que quiere eliminar todas las sustituciones?" msgid "Are you sure you want to do it?" msgstr "¿Estás seguro de que quieres hacerlo?" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Área de relleno" @@ -1347,7 +1345,7 @@ msgstr "" "iconoOrdenar para ajustar el tamaño del espacio entre los objetos y " "permitir las rotaciones automáticas?" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -1501,7 +1499,7 @@ msgstr "Genera los puntos de apoyo automáticamente" msgid "Autogeneration will erase all manually edited points." msgstr "La autogeneración borrará todos los puntos editados manualmente." -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Generación automática" @@ -1509,7 +1507,7 @@ msgstr "Generación automática" msgid "Automatic updates" msgstr "Actualizaciones automáticas" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Archivo STL reparado automáticamente" @@ -1525,11 +1523,11 @@ msgstr "Evita cruzar perímetros" msgid "Avoid crossing perimeters - Max detour length" msgstr "Evitar cruzar perímetros - Longitud máxima del desvío" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "FLECHA HACIA ATRÁS" -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -1540,7 +1538,7 @@ msgstr "" "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:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -1554,7 +1552,7 @@ msgstr "" msgid "Background processing" msgstr "Procesamiento en segundo plano" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Salir en caso de valores de configuración desconocidos" @@ -1562,7 +1560,7 @@ msgstr "Salir en caso de valores de configuración desconocidos" msgid "Balanced" msgstr "Balanceado" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Base" @@ -1611,7 +1609,7 @@ msgstr "" "Ajusta esto a cero para deshabilitar los comandos de control de temperatura " "de la base calefactable en la salida." -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "Código G para antes del cambio de capa" @@ -1636,7 +1634,7 @@ msgstr "La mejor calidad de superficie" msgid "Between objects G-code" msgstr "Código G para entre objetos" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "Código G para entre objetos (para impresión secuencial)" @@ -1658,11 +1656,11 @@ msgstr "Bloquear soportes" msgid "Block supports by angle" msgstr "Bloquear soportes según ángulo" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Volumen de la botella" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Peso botella" @@ -1679,7 +1677,7 @@ msgstr "Inferior" msgid "Bottom" msgstr "Inferior" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Vista inferior" @@ -1960,8 +1958,8 @@ 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:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Capacidades" @@ -1969,7 +1967,7 @@ msgstr "Capacidades" msgid "Capture a configuration snapshot" msgstr "Captura una instantánea de configuración" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "No distingue entre mayúsculas y minúsculas" @@ -1977,11 +1975,11 @@ msgstr "No distingue entre mayúsculas y minúsculas" msgid "Category" msgstr "Categoría" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Centro" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Centrar la impresión alrededor del centro dado." @@ -2088,7 +2086,7 @@ 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:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Elije un archivo para laminar (STL/OBJ/AMF/3MF/PRUSA):" @@ -2134,7 +2132,7 @@ msgstr "Círculo" msgid "Circular" msgstr "Circular" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "Clásico" @@ -2142,11 +2140,13 @@ msgstr "Clásico" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" "El generador de perímetros clásico produce perímetros con una anchura de " "extrusión constante y para las zonas muy finas se utiliza gap-fill. El motor " -"Arachne produce perímetros con un ancho de extrusión variable." +"de Arachne produce perímetros con un ancho de extrusión variable. Este " +"ajuste también afecta al relleno Concéntrico." #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -2224,7 +2224,7 @@ msgid "Closing PrusaSlicer. Current project is modified." msgstr "Cerrando PrusaSlicer. Se modifica el proyecto actual." #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Distancia de cierre" @@ -2232,7 +2232,7 @@ msgstr "Distancia de cierre" msgid "Closing radius" msgstr "Radio de cierre" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Ocultar barra lateral" @@ -2240,11 +2240,11 @@ msgstr "Ocultar barra lateral" msgid "Collapse/Expand the sidebar" msgstr "Ocultar/Expandir barra lateral" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Color" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "Código G Cambio Color" @@ -2308,12 +2308,12 @@ msgstr "Comandos" msgid "Comment:" msgstr "Comentario:" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Comparar Ajustes" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Comparar justes" @@ -2321,7 +2321,7 @@ msgstr "Comparar justes" msgid "Compare this preset with some another" msgstr "Comparar este ajuste con algún otro" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Los ajustes comparados tienen diferentes tecnologías de impresión" @@ -2489,7 +2489,7 @@ msgstr "" "más largo que este parámetro. Establezca este parámetro a cero para " "deshabilitar el anclaje." -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Conexión de las varillas de soporte y uniones" @@ -2545,7 +2545,7 @@ msgstr "¿Continuar e instalar las actualizaciones de configuración?" msgid "Continue to activate a configuration snapshot %1%?" msgstr "¿Continuar activando una instantánea de configuración %1%?" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -2563,7 +2563,7 @@ msgstr "" "Contribuciones de Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, " "Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik y muchos otros." -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -2581,7 +2581,7 @@ msgstr "Convertir de unidades imperiales" msgid "Convert from meters" msgstr "Convertir de metros" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Enfriamiento" @@ -2597,7 +2597,7 @@ msgstr "" "Los movimientos de enfriamiento se están acelerando gradualmente hacia esta " "velocidad." -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Umbrales de enfriamiento" @@ -2618,11 +2618,11 @@ msgctxt "PresetName" msgid "Copy" msgstr "Copiar" -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Copiar Información de Versión" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Copiar selección al portapapeles" @@ -2685,32 +2685,32 @@ msgstr "" "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:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Copyright" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Corrección para la expansión" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Corrección de la expansión en el eje X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Corrección de la expansión en el eje Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Corrección de la expansión en el eje Z" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Correcciones" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Coste" @@ -2786,7 +2786,7 @@ msgstr "" "puede reducir la resolución de la impresión, por lo tanto es aconsejable " "mantener ese valor razonablemente bajo." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Crear pad alrededor del objeto e ignorar la elevación del soporte" @@ -2802,7 +2802,7 @@ msgstr "Creando un nuevo proyecto mientras se modifican algunos ajustes." msgid "Creating a new project while the current project is modified." msgstr "Creando un nuevo proyecto mientras se modifica el proyecto actual." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Ángulo crítico" @@ -2810,7 +2810,7 @@ msgstr "Ángulo crítico" msgid "Critical error" msgstr "Error crítico" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Cruzado" @@ -2856,8 +2856,8 @@ msgstr "" "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:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Código G personalizado" @@ -2901,7 +2901,7 @@ msgid "Custom template (\"%1%\")" msgstr "Plantilla personalizada (\"%1%\")" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Cortar" @@ -2909,7 +2909,7 @@ msgstr "Cortar" msgid "Cut by Plane" msgstr "Cortar por el Plano" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Cortar modelo a una Z dada." @@ -2917,7 +2917,7 @@ msgstr "Cortar modelo a una Z dada." msgid "Cylinder" msgstr "Cilindro" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "D&eseleccionar todo" @@ -2925,7 +2925,7 @@ msgstr "D&eseleccionar todo" msgid "Dark mode (experimental)" msgstr "Modo oscuro (experimental)" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Directorio de datos" @@ -2951,7 +2951,7 @@ msgstr "Reducir Instancias" msgid "Default" msgstr "Por defecto" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Perfil de material de SLA predeterminado" @@ -2992,8 +2992,8 @@ msgstr "" msgid "Default print profile" msgstr "Perfil de impresión por defecto" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -3007,7 +3007,7 @@ msgstr "" msgid "Define a custom printer profile" msgstr "Definir un perfil de impresora personalizado" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -3026,11 +3026,11 @@ msgstr "Retardo tras la descarga" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Borrar" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Borrar &Todo" @@ -3084,7 +3084,7 @@ msgid "Delete Subobject" msgstr "Eliminar Subobjeto" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Eliminar todo" @@ -3143,16 +3143,16 @@ msgstr "" msgid "Delete tool change" msgstr "Eliminar cambio de herramienta" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Borra todos los objetos" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Borrar la selección actual" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Densidad" @@ -3164,9 +3164,9 @@ msgstr "Densidad de relleno interior, expresado en el rango 0% - 100%." msgid "Density of the first raft or support layer." msgstr "Densidad de la primera balsa o capa de soporte." -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Dependencias" @@ -3190,7 +3190,7 @@ msgstr "Deseleccionar todo" msgid "Deselect by rectangle" msgstr "Deseleccionar mediante rectángulo" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Deseleccionar todos los objetos" @@ -3226,7 +3226,7 @@ msgstr "Separar del ajuste del sistema" msgid "Detach preset" msgstr "Separar ajuste" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Separado" @@ -3250,7 +3250,7 @@ msgstr "" msgid "Detect thin walls" msgstr "Detecta paredes delgadas" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -3274,15 +3274,15 @@ msgstr "Dispositivo:" msgid "Diameter" msgstr "Diámetro" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Diámetro en mm del pilar de la base" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Diámetro en mm de los pilares de soporte" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Diámetro de la parte en punta de la cabeza" @@ -3347,31 +3347,31 @@ msgstr "Descartar todos los cambios personalizados" msgid "Discard changes" msgstr "Descartar los cambios" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Pantalla" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Altura de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Espejo horizontal de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Orientación de la pantalla" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 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:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Espejo vertical de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Anchura de la pantalla" @@ -3390,7 +3390,7 @@ msgstr "" "Distancia entre el faldón y el borde (cuando no se utiliza el protector " "contra corrientes de aire) u objetos." -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -3432,11 +3432,11 @@ msgstr "" msgid "Divide by zero" msgstr "Dividir por cero" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 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:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -3496,7 +3496,7 @@ msgstr "" "¿Desea seleccionar filamentos predeterminados para estos modelos de " "impresoras FFF?" -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "No organizar" @@ -3560,11 +3560,11 @@ msgstr "" msgid "Drop to bed" msgstr "Colocar en la Cama" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Duplicar" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Duplicar por cuadrícula" @@ -3581,11 +3581,11 @@ msgstr "Durante el resto de capas, el ventilador siempre funcionará al %1%%%" msgid "During the other layers, fan will be turned off." msgstr "Durante las otras capas, el ventilador se apagará." -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dinámico" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "E&xportar" @@ -3636,7 +3636,7 @@ msgstr "Editar código G personalizado" msgid "Edit pause print message" msgstr "Editar mensaje de pausa de impresión" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Editar impresora física" @@ -3660,7 +3660,7 @@ msgstr "Edición" msgid "Eigen vectorization supported:" msgstr "Se admite la vectorización propia:" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Expul&sar Tarjeta SD / Unidad Flash" @@ -3668,7 +3668,7 @@ msgstr "Expul&sar Tarjeta SD / Unidad Flash" msgid "Eject SD card / Flash drive" msgstr "Expulsa la tarjeta SD / disco USB" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 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." @@ -3686,7 +3686,7 @@ msgstr "La expulsión del dispositivo %s(%s) ha fallado." msgid "Elephant foot compensation" msgstr "Compensación del pie de elefante" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Ancho mínimo del pie de elefante" @@ -3720,7 +3720,7 @@ msgstr "Emitir a código G" msgid "Empty layer between %1% and %2%." msgstr "Capa vacía entre %1% y %2%." -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Habilitar" @@ -3738,11 +3738,11 @@ 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:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Habilitar vaciado" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Activar espejo horizontal de salida de imágenes" @@ -3757,7 +3757,7 @@ msgstr "" "Habilitar el alisado de las capas superiores con el cabezal de impresión " "caliente para obtener una superficie lisa" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -3765,7 +3765,7 @@ msgstr "" "Permite leer valores de configuración desconocidos sustituyéndolos " "silenciosamente por los predeterminados." -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -3816,7 +3816,7 @@ msgstr "" msgid "Enable variable layer height feature" msgstr "Habilitar la función de altura de capa variable" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Activar espejo vertical de salida de imágenes" @@ -3832,7 +3832,7 @@ msgstr "" "Permite rellenar los huecos entre los perímetros y entre los perímetros más " "internos y el relleno." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" @@ -3864,7 +3864,7 @@ msgstr "Imponer soportes" msgid "Enqueued" msgstr "En cola" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Asegurar en la base" @@ -3978,7 +3978,7 @@ msgstr "" "Error: \"%2%\"" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Error" @@ -4129,23 +4129,23 @@ msgstr "Modo experto" msgid "Export" msgstr "Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Exportar &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Exportar código &G" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Exportar &Movimientos como OBJ" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Exportar 3MF" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Exportar AMF" @@ -4153,11 +4153,11 @@ msgstr "Exportar AMF" msgid "Export AMF file:" msgstr "Exportar archivo AMF:" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Exportar Conjunto de A&justes" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Exportar Paquete de Configuración Con Impresoras Físicas" @@ -4166,15 +4166,15 @@ msgid "Export G-Code." msgstr "Exportar Código G." #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Exportar código G" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exportar código G a la Tarjeta SD / Unidad Flash" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Exportar OBJ" @@ -4182,19 +4182,19 @@ msgstr "Exportar OBJ" msgid "Export OBJ file:" msgstr "Exportar archivo OBJ:" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Exportar Plataforma como &STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Exportar plataforma como STL &Incluyendo Soportes" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Exportar SLA" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Exportar STL" @@ -4202,13 +4202,13 @@ msgstr "Exportar STL" msgid "Export STL file:" msgstr "Exportar archivo STL:" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" "Exportar todos los ajustes preestablecidos, incluidas las impresoras " "físicas, al archivo" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Exportar todos los ajustes al archivo" @@ -4220,23 +4220,23 @@ msgstr "Exportar como STL" msgid "Export config" msgstr "Exportar configuración" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Exportar la configuración actual al archivo" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Exportar plataforma actual como código G" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 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:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Exportar plataforma actual como STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Exportar la plataforma actual como STL incluyendo soportes" @@ -4255,19 +4255,19 @@ msgstr "La exportación de un archivo temporal de 3mf falló" 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:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Exportar el(los) objeto(s) como 3MF." -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Exportar el(los) objeto(s) como AMF." -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Exportar el(los) objeto(s) como OBJ." -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Exportar el(los) objeto(s) como STL." @@ -4275,7 +4275,7 @@ msgstr "Exportar el(los) objeto(s) como STL." msgid "Export to SD card / Flash drive" msgstr "Exportar a tarjeta SD / tarjeta Flash" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Exportar trayectorias de herramientas como OBJ" @@ -4287,7 +4287,7 @@ msgstr "Exportar." msgid "Exporting G-code" msgstr "Exportando código G" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Exportando el paquete de configuración" @@ -4309,11 +4309,11 @@ 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:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Exposición" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Tiempo de exposición" @@ -4375,7 +4375,7 @@ msgstr "Color del extrusor" msgid "Extruder changed to" msgstr "El extrusor cambia a" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Separación del extrusor" @@ -4384,7 +4384,7 @@ msgid "Extruder offset" msgstr "Offset del extrusor" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -4392,7 +4392,7 @@ msgid "Extruders" msgstr "Extrusores" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Contador de extrusores" @@ -4432,7 +4432,7 @@ msgstr "Impresoras de Tecnología FFF" msgid "Facets" msgstr "Facetas" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Capas descoloridas" @@ -4462,11 +4462,11 @@ msgstr "Fallo en la perforación de algunos agujeros en el modelo" msgid "Fan Speed (%)" msgstr "Velocidad Ventilador (%)" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Configuración del ventilador" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Velocidad del ventilador" @@ -4500,11 +4500,11 @@ msgstr "El ventilador siempre funcionará al %1%%%" msgid "Fan will be turned off." msgstr "El ventilador se apagará." -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Rápida" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Inclinación rápida" @@ -4528,7 +4528,7 @@ msgstr "Tipos de funciones" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filamento" @@ -4540,7 +4540,7 @@ msgstr "Diámetro del filamento:" msgid "Filament End G-code" msgstr "Código G Final del Filamento" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Anulaciones de filamentos" @@ -4549,7 +4549,7 @@ msgid "Filament Profiles Selection" msgstr "Selección Perfiles de Filamento" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Configuración del filamento" @@ -4591,7 +4591,7 @@ msgstr "Notas del filamento" msgid "Filament parking position" msgstr "Posición de aparcar el filamento" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Propiedades del filamento" @@ -4608,7 +4608,7 @@ msgstr "Tiempo de descarga del filamento" msgid "Filaments" msgstr "Filamentos" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Archivo no encontrado" @@ -4677,7 +4677,7 @@ msgstr "" msgid "Filling bed" msgstr "Rellenando base" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Buscar" @@ -4689,11 +4689,11 @@ msgstr "Buscar / reemplazar patrones en líneas de código G y sustituirlos." msgid "Finished" msgstr "Terminado" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Retracción del firmware" @@ -4904,7 +4904,7 @@ 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:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Forzar el pad alrededor del objeto en todas partes" @@ -4938,7 +4938,7 @@ msgstr "" "Formato de miniaturas de código G: PNG para la mejor calidad, JPG para el " "tamaño más pequeño, QOI para el firmware de baja memoria" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -4946,7 +4946,7 @@ msgstr "" "Regla de compatibilidad al cargar configuraciones desde archivos de " "configuración y archivos de proyecto (3MF, AMF)." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Encontradas palabras clave reservadas en" @@ -4960,11 +4960,11 @@ msgstr "" "Desde la Lista de Objetos no puedes eliminar la última parte sólida del " "objeto." -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Frontal" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Vista frontal" @@ -4972,7 +4972,7 @@ msgstr "Vista frontal" msgid "Full fan speed at layer" msgstr "Velocidad máxima del ventilador en la capa" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Pantalla completa" @@ -5021,7 +5021,7 @@ msgstr "Espesor de la piel difusa" msgid "Fuzzy skin type." msgstr "Tipo de Piel difusa." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "Código G" @@ -5059,11 +5059,11 @@ msgstr "Sustituciones del código G" msgid "G-code thumbnails" msgstr "Miniaturas de código G" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Visor código G" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, versión 3" @@ -5080,10 +5080,10 @@ msgstr "Galería" msgid "Gap fill" msgstr "Relleno del hueco" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "General" @@ -5114,11 +5114,11 @@ msgstr "" "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:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Generar soportes" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Generar soportes para los modelos" @@ -5311,11 +5311,11 @@ msgstr "" msgid "Head diameter" msgstr "Diámetro de la cabeza" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Penetración de la cabeza" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 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." @@ -5341,7 +5341,7 @@ msgstr "Altura (mm)" msgid "Height of skirt expressed in layers." msgstr "Altura de la falda expresada en capas." -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Altura de la pantalla" @@ -5366,15 +5366,15 @@ 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:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Ayuda" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Ayuda (opciones FFF)" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Ayuda (opciones SLA)" @@ -5409,7 +5409,7 @@ msgstr "Alto" msgid "High extruder current on filament swap" msgstr "Alta intensidad en el extrusor durante el cambio de filamento" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Alta viscosidad" @@ -5441,7 +5441,7 @@ msgstr "Diámetro del orificio" msgid "Hollow and drill" msgstr "Vaciado y taladrado" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Vaciado de un modelo para tener un interior vacío" @@ -5449,16 +5449,16 @@ msgstr "Vaciado de un modelo para tener un interior vacío" msgid "Hollow this object" msgstr "Vaciar este objeto" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Vaciando el interior" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -5528,22 +5528,22 @@ msgstr "" "Sitúa el cursos sobre los botones para más información o haz clic en este " "botón." -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 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:3867 +#: src/libslic3r/PrintConfig.cpp:3840 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:3576 +#: src/libslic3r/PrintConfig.cpp:3549 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -5764,7 +5764,7 @@ msgstr "" "Si está habilitado, el botón de la barra lateral ocultable aparecerá en la " "esquina superior derecha de la escena 3D" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -6041,7 +6041,7 @@ msgstr "" "habilitar esta opción para los certificados autofirmados si la conexión " "falla." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignorar archivos de configuración inexistentes" @@ -6059,15 +6059,15 @@ msgstr "Instrucción ilegal" msgid "Import" msgstr "Importar" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importar &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importar &Conjunto de Ajustes" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Importar configuración desde un &Proyecto" @@ -6083,7 +6083,7 @@ msgstr "Importar Objeto" msgid "Import Objects" msgstr "Importar Objetos" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Importar Archivo SL1 / SL1S" @@ -6091,11 +6091,11 @@ msgstr "Importar Archivo SL1 / SL1S" msgid "Import SLA archive" msgstr "Importar archivo SLA" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Importar STL (Unidades Imperiales)" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importar STL/OBJ/AM&F/3MF" @@ -6225,11 +6225,11 @@ msgstr "" "El tiempo de exposición inicial está fuera de los límites del perfil de " "impresión." -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Tiempo de exposición inicial" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Altura de la capa inicial" @@ -6334,7 +6334,7 @@ msgstr "Error interno: %1%" msgid "Internal infill" msgstr "Relleno interno" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Penetración inválida de la cabeza" @@ -6362,7 +6362,7 @@ msgstr "" msgid "Invalid numeric input." msgstr "Entrada numérica no válida." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Diámetro de la cabeza del pin inválido" @@ -6398,11 +6398,11 @@ msgstr "Tipo de alisado" msgid "Is it safe?" msgstr "¿Es seguro?" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Vista Iso" @@ -6430,7 +6430,7 @@ msgstr "" "alimentación de rampa rápidas y superar la resistencia cuando se carga un " "filamento con una punta de forma fea." -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "Es un último valor predeterminado para esta impresora." @@ -6444,7 +6444,7 @@ msgstr "" "No es posible borrar el último ajuste preestablecido relacionado con la " "impresora." -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Límites del jerk" @@ -6510,7 +6510,7 @@ msgstr "Mantener los ajustes seleccionados." msgid "Keep upper part" msgstr "Mantener la parte superior" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Atajos de teclado" @@ -6518,11 +6518,11 @@ msgstr "Atajos de teclado" msgid "Keyboard shortcuts" msgstr "Atajos de teclado" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "CANDADO CERRADO" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -6530,7 +6530,7 @@ 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:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -6542,7 +6542,7 @@ msgstr "" msgid "Label objects" msgstr "Etiquetar objetos" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Paisaje" @@ -6582,7 +6582,7 @@ msgstr "" "\n" "La altura de capa se restablecerá a 0.01." -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Límites de altura de la capa" @@ -6590,8 +6590,8 @@ msgstr "Límites de altura de la capa" msgid "Layer range Settings to modify" msgstr "Ajustes del Rango de capas a modificar" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Capas" @@ -6608,7 +6608,7 @@ msgstr "Capas" msgid "Layers and Perimeters" msgstr "Capas y Perímetros" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Capas y perímetros" @@ -6621,15 +6621,15 @@ msgstr "Opciones de diseño" msgid "Leave \"%1%\" enabled" msgstr "Dejar \"%1%\" activado" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Izquierda" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Valor del Ajuste Izquierdo" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Vista izquierda" @@ -6668,7 +6668,7 @@ msgid "Length of the infill anchor" msgstr "Longitud del relleno del anclaje" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -6680,7 +6680,7 @@ msgstr "" msgid "Lift Z" msgstr "Levantar Z" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -6740,19 +6740,19 @@ msgstr "Cargar pieza" msgid "Load Project" msgstr "Cargar Proyecto" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Cargar un modelo" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Cargar un archivo SL1 / SL1S" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Cargar un modelo guardado con unidades imperiales" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -6762,7 +6762,7 @@ msgstr "" "mantener diferentes perfiles o incluir configuraciones desde un " "almacenamiento de red." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Cargar archivo de configuración" @@ -6780,11 +6780,11 @@ msgstr "" "mismo modo, puedes utilizar Archivo-Importar-Importar archivo SL1 / SL1S, " "que también te permite reconstruir modelos 3D a partir de los datos de voxel." -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Cargar configuración desde archivo de proyecto" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -6792,11 +6792,11 @@ 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:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Cargar archivo de configuración exportado" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Cargar ajustes de un paquete" @@ -6828,11 +6828,11 @@ msgstr "Cargando configuración" msgid "Loading file" msgstr "Cargando archivo" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Cargando un paquete de configuración" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Cargando un archivo de configuración" @@ -6871,7 +6871,7 @@ msgstr "Coordenadas locales" msgid "Lock supports under new islands" msgstr "Bloquear soportes bajo nuevas islas" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Nivel de registro" @@ -6887,7 +6887,7 @@ msgstr "Bajo" msgid "Lowest Z height" msgstr "Altura Z más baja" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -6896,7 +6896,7 @@ msgstr "Altura Z más baja" msgid "Machine limits" msgstr "Límites de la máquina" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -6904,7 +6904,7 @@ msgstr "" "Los límites de la máquina no están establecidos, por lo tanto, el tiempo " "estimado de impresión puede no ser exacto." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -6915,7 +6915,7 @@ msgstr "" "que la impresora puede aplicar un conjunto diferente de límites de la " "máquina." -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" @@ -6941,20 +6941,20 @@ msgstr "Edición manual" msgid "Masked SLA file exported to %1%" msgstr "Archivo SLA enmascarado exportado a %1%" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Coincidir con una sola línea" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Pestaña Ajustes de Mate&rial" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Material" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Configuraciones del material" @@ -6963,7 +6963,7 @@ msgstr "Configuraciones del material" msgid "Material Settings Tab" msgstr "Pestaña Ajustes de Material" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Perfil de impresión del material" @@ -6971,19 +6971,19 @@ msgstr "Perfil de impresión del material" msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Distancia máxima de puentes" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Puentes maximos en un pilar" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Distancia máxima de combinación" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Distancia máxima de enlace del pilar" @@ -7079,7 +7079,7 @@ msgstr "Aceleración máxima al retraer" msgid "Maximum acceleration when retracting (M204 R)" msgstr "Aceleración máxima al retraer (M204 R)" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Aceleraciones máximas" @@ -7102,7 +7102,7 @@ msgstr "" "reducción del código G se realiza en cada capa de forma independiente, " "pueden producirse artefactos visibles." -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Tiempo de exposición máximo" @@ -7138,11 +7138,11 @@ msgstr "Máximo avance del eje Y" msgid "Maximum feedrate of the Z axis" msgstr "Máximo avance del eje Z" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Avance máximo" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Tiempo de exposición inicial máximo" @@ -7182,7 +7182,7 @@ msgstr "Maximo jerk del eje Z" msgid "Maximum length of the infill anchor" msgstr "Máxima longitud del relleno del anclaje" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -7215,7 +7215,7 @@ msgid "Medium" msgstr "Medio" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Combinar" @@ -7231,7 +7231,7 @@ msgstr "Juntar objeto en un objeto multipieza" msgid "Merged" msgstr "Juntar" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -7271,7 +7271,7 @@ msgstr "Min" msgid "Min print speed" msgstr "Velocidad de impresión mínima" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Distancia mínima de los puntos de apoyo" @@ -7313,11 +7313,11 @@ msgstr "" "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:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Tiempo de exposición mínimo" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Minimum feature size" msgstr "Tamaño mínimo de la característica" @@ -7329,15 +7329,15 @@ msgstr "Avance mínimo al extruir" msgid "Minimum feedrate when extruding (M205 S)" msgstr "Avance mínimo al extruir (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Avances míninos" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Tiempo de exposición inicial mínimo" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Ancho mínimo del perímetro" @@ -7362,16 +7362,19 @@ msgstr "" msgid "Minimum thickness of a top / bottom shell" msgstr "Espesor mínimo de una carcasa superior / inferior" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" "Espesor mínimo de las características delgadas. Las características del " -"modelo que sean más delgadas que este valor no se imprimirán, mientras que " -"las características más gruesas que el tamaño mínimo de la característica se " -"ensancharán hasta el ancho mínimo del perímetro." +"modelo que sean más finas que este valor no se imprimirán, mientras que las " +"características más gruesas que el tamaño mínimo de la característica se " +"ensancharán hasta el ancho mínimo del perímetro. Si se expresa en porcentaje " +"(por ejemplo 25%), se calculará en función del diámetro de la boquilla." #: src/libslic3r/PrintConfig.cpp:2899 msgid "Minimum top shell thickness" @@ -7394,11 +7397,11 @@ msgstr "Avance mínimo de movimiento" msgid "Minimum travel feedrate (M205 T)" msgstr "Velocidad mínima sin extrusión (M205 T)" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Mínimo de espesor de la pared de un modelo vaciado." -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" @@ -7423,7 +7426,7 @@ msgstr "" msgid "Mirror Object" msgstr "Reflejar objeto" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Reflejar horizontalmente" @@ -7443,7 +7446,7 @@ msgstr "Duplicar el objeto seleccionado a lo largo del eje Y" msgid "Mirror the selected object along the Z axis" msgstr "Duplicar el objeto seleccionado a lo largo del eje Z" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Reflejar verticalmente" @@ -7624,11 +7627,11 @@ msgstr "" "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:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Multiplicar copias creando una rejilla." -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Multiplicar las copias por este factor." @@ -7719,7 +7722,7 @@ msgstr "" msgid "New prerelease version %1% is available." msgstr "La nueva versión prelanzamiento %1% está disponible." -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Se ha seleccionado un nuevo ajuste de la impresora" @@ -7780,7 +7783,7 @@ 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:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Ningún archivo previamente laminado." @@ -7788,7 +7791,7 @@ msgstr "Ningún archivo previamente laminado." msgid "No sparse layers (EXPERIMENTAL)" msgstr "Sin capas dispersas (EXPERIMENTAL)" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 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." @@ -7804,7 +7807,7 @@ msgid "None" msgstr "Ninguno" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normal" @@ -7820,7 +7823,7 @@ msgstr "No encontrado:" msgid "Note" msgstr "Nota" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -7831,7 +7834,7 @@ msgstr[1] "" "Ten en cuenta que el ajuste seleccionado se eliminará también de estas " "impresoras." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -7843,7 +7846,7 @@ msgstr[1] "" "Ten en cuenta que estas impresoras se eliminarán después de borrar el ajuste " "seleccionado." -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -7894,12 +7897,12 @@ msgstr "Nota: Este ajuste se reemplazará tras guardar" 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:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Notas" @@ -7913,7 +7916,7 @@ msgstr "Date cuenta" msgid "Notify about new releases" msgstr "Notificar sobre nuevos lanzamientos" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Boquilla" @@ -7925,7 +7928,7 @@ msgstr "Diámetro de la boquilla:" msgid "Nozzle and Bed Temperatures" msgstr "Temperaturas de la Base y la Boquilla" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Diámetro de la boquilla" @@ -7957,7 +7960,7 @@ msgstr "" msgid "Number of cooling moves" msgstr "Número de movimientos de enfriamiento" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Número de extrusores de la impresora." @@ -7987,15 +7990,15 @@ msgstr "" "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:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Número de píxeles en" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Número de píxeles en X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Número de píxeles en Y" @@ -8012,7 +8015,7 @@ msgstr "" 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:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -8028,7 +8031,7 @@ msgstr "Número de cambios de herramienta" msgid "Object Settings to modify" msgstr "Configuraciones de objetos para modificar" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Elevación del objeto" @@ -8147,7 +8150,7 @@ msgstr "Activar/Desactivar el modo de una capa del control deslizante vertical" msgid "One layer mode" msgstr "Modo de capa única" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Uno de los ajustes no se encuentra" @@ -8170,7 +8173,7 @@ msgstr "" "Elimina todos menos el último objeto o habilita el modo secuencial en " "\"complete_objects\"." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -8182,7 +8185,7 @@ msgstr "" msgid "Only infill where needed" msgstr "Solo rellenar cuando sea necesario" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Solo levantar Z" @@ -8224,7 +8227,7 @@ msgstr "" "La prevención de goteo actualmente no es compatible con la torre de limpieza " "activa." -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Abrir &PrusaSlicer" @@ -8244,11 +8247,11 @@ msgstr "Abrir carpeta." msgid "Open G-code file:" msgstr "Abrir archivo código G:" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Abrir visor código G" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Abrir Nueva Instancia" @@ -8256,20 +8259,20 @@ msgstr "Abrir Nueva Instancia" msgid "Open Preferences." msgstr "Abrir Preferencias." -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Abrir PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Abrir un archivo código G" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Abrir instancia nueva de PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Abrir un archivo de proyecto" @@ -8312,7 +8315,7 @@ 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:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Abre el diálogo para modificar la galería de formas" @@ -8328,7 +8331,7 @@ msgstr "Abriendo Asistente de Configuración" msgid "Opening new project while some presets are unsaved." msgstr "Abre un nuevo proyecto mientras algunos ajustes están sin guardar." -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -8405,7 +8408,7 @@ msgstr "Búsqueda de orientación cancelada." msgid "Origin" msgstr "Origen" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Otro" @@ -8425,15 +8428,15 @@ msgstr "Borde interior y exterior" msgid "Outer brim only" msgstr "Sólo el borde exterior" -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Archivo de salida" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Información del modelo de salida" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Archivo de salida" @@ -8441,7 +8444,7 @@ msgstr "Archivo de salida" msgid "Output filename format" msgstr "Formato de nombre de salida" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Opciones de salida" @@ -8466,19 +8469,19 @@ msgstr "Umbral de voladizos" msgid "Overlap" msgstr "Superposición" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Configu&ración de Impresión" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Pad" @@ -8486,15 +8489,15 @@ msgstr "Pad" msgid "Pad and Support" msgstr "Pad y soportes" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Pad alrededor del objeto" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Pad alrededor del objeto en todos lados" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Tamaño del borde del pad" @@ -8504,31 +8507,31 @@ msgstr "" "El tamaño del borde del pad es demasiado pequeño para la configuración " "actual." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Penetración del conector del objeto al Pad" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Paso del conector del objeto al Pad" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Anchura del conector del pad al objeto" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Espacio del pad con el objeto" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Altura de la pared del pad" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Pendiente de la pared del pad" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Espesor de la pared del pad" @@ -8660,7 +8663,7 @@ msgstr "Pegar" msgid "Paste From Clipboard" msgstr "Pegar Desde Portapapeles" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Pegar portapapeles" @@ -8698,7 +8701,7 @@ msgstr "Patrón utilizado para generar material de soporte." msgid "Pause" msgstr "Pausa" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "Pausar Código G de Impresión" @@ -8734,7 +8737,7 @@ msgstr "" "Realiza la integración del escritorio (Establece este binario para que pueda " "ser buscado por el sistema)." -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -8777,7 +8780,7 @@ msgstr "" msgid "Perimeter" msgstr "Perímetro" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Recuento de la distribución del perímetro" @@ -8789,15 +8792,15 @@ msgstr "Extrusor para perímetros" msgid "Perimeter generator" msgstr "Generador de perímetros" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Longitud de transición del perímetro" -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Margen del filtro de transición del perímetro" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Ángulo del umbral de transición del perímetro" @@ -8849,28 +8852,28 @@ msgstr "" "Tamaños de imagen que se almacenarán en archivos .gcode y .sl1 / .sl1s, en " "el siguiente formato: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Modo de conexión del pilar" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Diámetro del pilar" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Factor de ensanchamiento del pilar" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 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/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Diámetro frontal de la cabeza" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Ancho de la cabeza" @@ -8920,11 +8923,11 @@ msgstr "" msgid "Please select the file to reload" msgstr "Por favor selecciona el archivo a volver a cargar" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Porciones del copyright" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Retrato" @@ -8933,7 +8936,7 @@ msgstr "Retrato" msgid "Position" msgstr "Posición" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Posición (para impresoras con múltiples extrusores )" @@ -8949,7 +8952,7 @@ msgstr "Posición Y" msgid "Position of perimeters starting points." msgstr "Posición de los puntos de inicio del perímetro." -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Los scripts de postprocesamiento modificarán el archivo de código G en su " @@ -8975,11 +8978,11 @@ msgstr "" "en su lugar y consulta el manual sobre cómo renombrar opcionalmente el " "archivo de código G post-procesado.\n" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Scripts de postprocesamiento" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Pre&visualizar" @@ -9052,7 +9055,7 @@ msgstr "" msgid "Preset with name \"%1%\" already exists." msgstr "Ya existe un preset con el nombre \"%1%\"." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9061,7 +9064,7 @@ msgstr "" "Haz clic en este botón para seleccionar el mismo ajuste para el ajuste " "derecho e izquierdo." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Los ajustes son los mismos" @@ -9101,7 +9104,7 @@ msgstr "" msgid "Pressure equalizer (experimental)" msgstr "Ecualizador de presión (experimental)" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -9122,7 +9125,7 @@ msgstr "" "diámetro de la boquilla." #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Previsualización" @@ -9130,7 +9133,7 @@ msgstr "Previsualización" msgid "Preview hollowed and drilled model" msgstr "Vista preliminar del modelo con su interior vaciado y taladrado" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Archivo anterior laminado (" @@ -9142,7 +9145,7 @@ msgstr "Cebar todos los extrusores de impresión" msgid "Print" msgstr "Imprimir" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Cola de subida al &host de impresión" @@ -9150,7 +9153,7 @@ msgstr "Cola de subida al &host de impresión" msgid "Print Diameters" msgstr "Diámetros de impresión" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Subida al host de impresión" @@ -9189,15 +9192,15 @@ msgstr "Pausas de impresión" msgid "Print settings" msgstr "Configuración de impresión" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Velocidad de impresión" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Anular la velocidad de impresión" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Configuración de Impr&esión" @@ -9232,11 +9235,11 @@ msgstr "Configuración de la Impresora" msgid "Printer Settings Tab" msgstr "Pestaña Ajustes Impresora" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Corrección absoluta de la impresora" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Corrección gamma de la impresora" @@ -9248,32 +9251,32 @@ msgstr "Notas de la impresora" msgid "Printer preset names" msgstr "Nombres de ajustes de la impresora" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Corrección del escalado de la impresora en el eje X" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Corrección del escalado de la impresora en el eje Y" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Corrección del escalado de la impresora en el eje Z" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Corrección de escala de la impresora" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Corrección del escalado de la impresora en el eje X" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Corrección del escalado de la impresora en el eje Y" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Corrección del escalado de la impresora en el eje Z" @@ -9320,7 +9323,7 @@ msgid "Process %1% / 100" msgstr "Proceso %1% / 100" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Procesando %s" @@ -9334,9 +9337,9 @@ msgstr "" "El procesamiento del modelo '%1%' con más de 1M de triángulos podría ser " "lento. Es muy recomendable reducir la cantidad de triángulos." -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Dependencias de perfil" @@ -9432,7 +9435,7 @@ msgstr "" "PrusaSlicer ha encontrado un error al tomar una instantánea de la " "configuración." -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -9554,15 +9557,15 @@ msgstr "Rápido" msgid "Quick Add Settings (%s)" msgstr "Añadir ajustes rápidos (%s)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Laminado rápido" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Laminado rápido y Guardar como" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Cerrar %s" @@ -9630,7 +9633,7 @@ msgstr "Ancho de la linea de empuje" msgid "Ramming parameters" msgstr "Parámetros de empuje" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Ajustes de empuje" @@ -9650,8 +9653,8 @@ msgstr "Rango" msgid "Rasterizing layers" msgstr "Rastrerizando capas" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Re&cargar desde el Disco" @@ -9663,15 +9666,15 @@ msgstr "Reconfigurar" msgid "Ready" msgstr "Listo" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Trasera" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Vista trasera" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Proy&ectos recientes" @@ -9716,7 +9719,7 @@ msgid "Rectilinear grid" msgstr "Rejilla rectilínea" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Rehacer" @@ -9747,7 +9750,7 @@ msgstr "Actualizar lista de impresoras" msgid "Regular" msgstr "Habitual" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Expresión regular" @@ -9797,9 +9800,9 @@ msgstr "Recargar desde:" msgid "Reload plater from disk" msgstr "Recargar la base desde el disco" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Cargar la base del disco" @@ -9825,7 +9828,7 @@ msgid "Remember output directory" msgstr "Recordar el directorio de salida" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Eliminar" @@ -9953,11 +9956,11 @@ msgstr "" msgid "Render" msgstr "Renderizar" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Renderizar con un software renderizador" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -9965,7 +9968,7 @@ 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:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Reparar" @@ -9997,11 +10000,11 @@ msgstr "Reparar el modelo mediante el servicio de Netfabb" msgid "Repairing was canceled" msgstr "La reparación fue cancelada" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Repetir el último laminado rápido" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Repetir el último laminado rápido" @@ -10013,7 +10016,7 @@ msgstr "Reemplazar de:" msgid "Replace the selected volume with new STL" msgstr "Sustituir el volumen seleccionado por un nuevo STL" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Reemplazar con" @@ -10081,7 +10084,7 @@ msgstr "Reiniciar escala" msgid "Reset selection" msgstr "Reiniciar selección" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Reiniciar Filament Color" @@ -10105,8 +10108,8 @@ msgstr "Retracta cantidad antes de limpiar" msgid "Retract on layer change" msgstr "Retraer en el cambio de capa" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Retracción" @@ -10129,7 +10132,7 @@ msgstr "" "La retracción no se activa cuando los movimientos de desplazamiento son más " "cortos que esta longitud." -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -10161,15 +10164,15 @@ msgstr "Revertir la conversión a metros" msgid "Review the substitutions and adjust them if needed." msgstr "Revisalas sustituciones y ajústalas si es necesario." -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Derecha" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Valor del Ajuste Derecho" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Vista derecha" @@ -10206,15 +10209,15 @@ msgstr "Botón derecho del ratón:" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Girar" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Rotar alrededor del eje X" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Rotar alrededor del eje Y" @@ -10243,15 +10246,15 @@ msgstr "" msgid "Rotation" msgstr "Rotación" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Ángulo de rotación alrededor del eje X en grados." -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Ángulo de rotación alrededor del eje Y en grados." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Ángulo de rotación alrededor del eje Z en grados." @@ -10269,11 +10272,11 @@ msgstr "Ejecutar %s" msgid "Running post-processing scripts" msgstr "Ejecutando scripts de post-procesamiento" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "&Enviar código G" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "E&nviar para imprimir" @@ -10303,7 +10306,7 @@ msgstr "Herramienta de atajos de teclado SLA" msgid "SLA material" msgstr "Material SLA" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Tipo Material SLA" @@ -10315,7 +10318,7 @@ msgstr "Materiales SLA" msgid "SLA print" msgstr "Impresión SLA" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Notas del material de impresión de SLA" @@ -10327,7 +10330,7 @@ msgstr "Ajustes de impresión SLA" msgid "SLA supports outside the print area were detected." msgstr "Se detectaron soportes SLA fuera del área de impresión." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" @@ -10346,7 +10349,7 @@ msgstr "Guardar" msgid "Save %s as:" msgstr "Guardar %s como:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Guardar archivo %s como:" @@ -10355,12 +10358,12 @@ msgstr "Guardar archivo %s como:" msgid "Save G-code file as:" msgstr "Guardar archivo Código G como:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 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/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Guardar Proyecto &como" @@ -10368,15 +10371,15 @@ msgstr "Guardar Proyecto &como" msgid "Save SL1 / SL1S file as:" msgstr "Guardar archivo SL1 / SL1S como:" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Guardar archivo de configuración" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Guardar la configuración como:" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Guarda la configuración al archivo especificado." @@ -10386,11 +10389,11 @@ msgstr "Guarda la configuración al archivo especificado." msgid "Save current %s" msgstr "Guardar lo actual %s" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Guardar el proyecto actual como" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Guardar archivo de proyecto actual como" @@ -10403,7 +10406,7 @@ msgstr "Guardar archivo como:" msgid "Save preset" msgstr "Guardar ajuste inicial" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Guarde el conjunto de ajustes iniciales como:" @@ -10432,7 +10435,7 @@ msgstr "Guardar las opciones seleccionadas al ajuste \"%1%\"." msgid "Save the selected options." msgstr "Guardar las opciones seleccionadas." -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Guardar archivo zip como:" @@ -10446,7 +10449,7 @@ msgstr "Error al guardar la malla en el contenedor 3MF." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Escalar" @@ -10463,11 +10466,11 @@ 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:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Escalar para Adaptarse" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Escalar para ajustarse al volumen dado." @@ -10475,7 +10478,7 @@ msgstr "Escalar para ajustarse al volumen dado." msgid "Scale to print volume" msgstr "Escalar al volumen de impresión" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Factor de escalado o porcentaje." @@ -10506,7 +10509,7 @@ msgstr "Dirección preferida de unión jitter" msgid "Seams" msgstr "Costuras" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Busca&r" @@ -10530,7 +10533,7 @@ msgstr "" msgid "Search in English" msgstr "Buscar en Inglés" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Buscar en los ajustes" @@ -10617,7 +10620,7 @@ msgstr "Selecciona una acción para aplicar al archivo" msgid "Select by rectangle" msgstr "Seleccionar mediante rectángulo" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Seleccione la configuración para cargar:" @@ -10626,7 +10629,7 @@ 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/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Selecciona los ajustes para comparar" @@ -10638,7 +10641,7 @@ msgstr "Seleccionar la forma en la galería" msgid "Select showing settings" msgstr "Seleccionar los ajustes mostrados" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Seleccione el archivo STL para reparar:" @@ -10725,7 +10728,7 @@ msgstr "Selección-Retirar de la lista" msgid "Selection-Remove from rectangle" msgstr "Selección-Retirar del rectángulo" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Seleccionar todos los objetos" @@ -10742,7 +10745,7 @@ msgstr "Enviar código G" msgid "Send system info" msgstr "Enviar info del sistema" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Enviar para imprimir la plataforma actual como código G" @@ -10766,7 +10769,7 @@ msgstr "Enviando info del sistema..." msgid "Seq." msgstr "Sec." -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Impresión secuencial" @@ -10782,7 +10785,7 @@ msgstr "Puerto serie:" msgid "Service name" msgstr "Nombre del servicio" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Ajuste" @@ -10910,7 +10913,7 @@ msgid "Set settings tabs as menu items (experimental)" msgstr "" "Establecer pestañas de configuración como elementos de menú (experimental)" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -11072,7 +11075,7 @@ msgstr "" msgid "Set upper thumb as active" msgstr "Establecer el pulgar superior como activo" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -11083,7 +11086,7 @@ msgstr "" "Por ejemplo. loglevel=2 registrará mensajes de fallo, error y peligro." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Ajustes" @@ -11134,7 +11137,7 @@ msgstr "" msgid "Shape" msgstr "Aspecto" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Galería de Formas" @@ -11185,7 +11188,7 @@ msgstr "Mostrar la notificación de \"Consejo del día\" tras el inicio" msgid "Show &Configuration Folder" msgstr "Mostrar carpeta &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Mostrar &Etiquetas" @@ -11201,7 +11204,7 @@ msgstr "Mostrar Acerca de" msgid "Show advanced settings" msgstr "Mostrar ajustes avanzados" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Mostrar todos los ajustes (incluidos los incompatibles)" @@ -11241,7 +11244,7 @@ msgstr "Mostrar altura del objeto" msgid "Show object height on the ruler" msgstr "Mostrar altura del objeto en la regla" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Muestra etiquetas de pieza/repetición en vista 3D" @@ -11269,45 +11272,45 @@ msgstr "Muestra soportes" msgid "Show system information" msgstr "Mostrar la información del sistema" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Muestra la vista de edición 3D" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Muestra la vista 3D preliminar del laminado" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Mostrar los ajustes de filamento" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 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/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 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/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Mostrar la lista de los atajos de teclado" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Mostrar la base" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Mostrar los ajustes de impresión" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Mostrar la configuración de la impresora" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Mostrar esta ayuda." @@ -11394,7 +11397,7 @@ msgstr "Simplificar el modelo" msgid "Single Extruder Multi Material" msgstr "Extrusor único Multi Material" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -11406,15 +11409,15 @@ msgstr "" "¿Deseas cambiar el diámetro de todos los extrusores al valor del diámetro " "del nozzle del primer extrusor?" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Ajuste para MM con un solo extrusor" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Parámetros multimaterial para un sólo extrusor" -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Modo de instancia única" @@ -11427,7 +11430,7 @@ msgctxt "OfFile" msgid "Size" msgstr "Tamaño" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Tamaño y coordenadas" @@ -11497,15 +11500,15 @@ msgstr "" 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:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Laminar" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Laminar un archivo en un código G" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Laminar un archivo en un código G, guárdar como" @@ -11522,15 +11525,15 @@ msgstr "Laminar ahora" msgid "Slice resolution" msgstr "Resolución del laminado" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 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:4417 +#: src/libslic3r/PrintConfig.cpp:4392 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:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -11547,13 +11550,13 @@ msgstr "Información del laminado" msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "El objeto laminado \"%1%\" parece un logotipo o un cartel" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Laminado" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "¡Laminado realizado!" @@ -11589,7 +11592,7 @@ msgstr "Laminando modelo" msgid "Slicing supports" msgstr "Soportes para el laminado" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Lenta" @@ -11598,7 +11601,7 @@ msgid "Slow down if layer print time is below" msgstr "" "Disminuir la velocidad si el tiempo de impresión de la capa está por debajo" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Inclinación lenta" @@ -11606,7 +11609,7 @@ msgstr "Inclinación lenta" msgid "Small perimeters" msgstr "Perímetros pequeños" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Porcentaje de diámetro de pilar pequeño" @@ -11703,7 +11706,7 @@ msgid "Some SLA materials were uninstalled." msgstr "Se han desinstalado algunos materiales SLA." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -11730,7 +11733,7 @@ msgstr "" "Algunos objetos son demasiado altos y no se pueden imprimir sin que " "colisione el extrusor." -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -11749,7 +11752,7 @@ msgstr "" "Algunos ajustes están modificados y los cambios no guardados no serán " "capturados por la instantánea de configuración." -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -11939,7 +11942,7 @@ msgid "Spiral vase" msgstr "Modo vaso" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Dividir" @@ -12008,13 +12011,13 @@ msgstr "Estándar" msgid "Stars" msgstr "Estrellas" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Código G inicial" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Empezar un nuevo proyecto" @@ -12022,7 +12025,7 @@ msgstr "Empezar un nuevo proyecto" msgid "Start at height" msgstr "Comenzar en altura" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Comenzar un nuevo proceso de laminado" @@ -12074,7 +12077,7 @@ msgid "Status:" msgstr "Estado:" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Silencio" @@ -12133,19 +12136,19 @@ msgstr "Forzado de Soporte" msgid "Support Generator" msgstr "Generador de Soportes" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Diámetro de la base del soporte" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Altura de la base del soporte" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Distancia de seguridad de la base de soportes" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Cabeza del soporte" @@ -12199,7 +12202,7 @@ msgid "Support material/raft/skirt extruder" msgstr "Extrusor para el material de soporte/falda/balsa" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Soporte en la base solamente" @@ -12207,12 +12210,12 @@ msgstr "Soporte en la base solamente" msgid "Support parameter change" msgstr "Cambio de parámetros de soporte" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Pilares de soporte" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Densidad de los puntos de soporte" @@ -12221,16 +12224,16 @@ msgid "Support points edit" msgstr "Edición de puntos de soporte" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Soportes" @@ -12387,7 +12390,7 @@ msgstr "Tomando una instantánea de la configuración" msgid "Taking a configuration snapshot failed." msgstr "La toma de una instantánea de la configuración ha fallado." -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Temperatura" @@ -12413,7 +12416,7 @@ msgstr "Variación de temperatura" msgid "Temperatures" msgstr "Temperaturas" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Plantilla Código G Personalizado" @@ -12574,7 +12577,7 @@ msgstr "" "La torre de limpieza sólo es compatible con varios objetos si tienen alturas " "de capas iguales" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -12629,7 +12632,7 @@ msgstr "" "posible en sistema de coordenadas Mundo, una vez que la rotación se ha " "aplicado a las coordenadas del objeto." -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 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." @@ -12732,7 +12735,7 @@ msgstr "El tipo de material de filamento para uso en códigos G personalizados." msgid "The file does not exist." msgstr "El archivo no existe." -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -12768,7 +12771,7 @@ msgid "The following characters are not allowed by a FAT file system:" msgstr "" "Los siguientes caracteres no están permitidos por un sistema de archivos FAT:" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -12827,7 +12830,7 @@ msgstr "" msgid "The following values were substituted:" msgstr "Se sustituyeron los siguientes valores:" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -12835,7 +12838,7 @@ 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:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "La altura del cono de la base de un pilar" @@ -12877,7 +12880,7 @@ msgstr "" "La información del último cambio de color se ha guardado para impresión con " "un solo extrusor." -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -12885,7 +12888,7 @@ 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:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "La longitud máxima de un puente" @@ -12909,7 +12912,7 @@ msgstr "" "La distancia máxima a la que puede desplazarse cada punto de piel (en ambos " "sentidos), medida perpendicularmente al muro perimetral." -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -12944,7 +12947,7 @@ msgstr "" "bottom_solid_layers si es necesario para asegurar un espesor mínimo en la " "pared de inferior." -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -12987,7 +12990,7 @@ msgstr "" "El objeto será elevado por este número de capas y se generará material de " "soporte debajo de él." -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -12996,7 +12999,7 @@ msgstr "" "pilar normal que se utilizan en áreas problemáticas donde no cabe un pilar " "normal." -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13007,7 +13010,7 @@ msgstr "" "entonces se utilizará una inclinación lenta, de lo contrario - una " "inclinación rápida" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -13019,7 +13022,7 @@ msgstr[1] "" "Las impresoras físicas que se muestran a continuación se basan en el ajuste, " "que se va a eliminar." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -13081,7 +13084,7 @@ msgstr "El nombre proporcionado no es válido." msgid "The provided name is not valid;" msgstr "El nombre proporcionado no es válido;" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -13089,7 +13092,7 @@ msgstr "" "El 3MF seleccionado contiene un objeto pintado compatible con FDM que " "utiliza una versión más reciente de PrusaSlicer y no es compatible." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -13097,7 +13100,7 @@ msgstr "" "El 3MF seleccionado contiene un objeto pintado multimaterial que utiliza una " "versión más reciente de PrusaSlicer y no es compatible." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -13105,7 +13108,7 @@ msgstr "" "El 3MF seleccionado contiene un objeto pintado con una versión más reciente " "de PrusaSlicer y no es compatible." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -13152,7 +13155,7 @@ msgstr "" "El objeto seleccionado no ha podido ser dividido porque sólo contiene una " "parte sólida." -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -13189,7 +13192,7 @@ msgstr "El tamaño del objeto puede ser especificado en pulgadas" msgid "The size of the object is zero" msgstr "El tamaño del objeto es cero" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -13267,7 +13270,7 @@ msgstr "El nombre proporcionado no es válido;" msgid "The supplied settings will cause an empty print." msgstr "Los ajustes proporcionados causarán una impresión vacía." -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "El grosor de las pads y sus paredes de cavidad opcionales." @@ -13666,11 +13669,11 @@ msgstr "" msgid "This is a default preset." msgstr "Este es un ajuste por defecto." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 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:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -13683,7 +13686,7 @@ msgid "This is a system preset." msgstr "Este es un ajuste del sistema." #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 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." @@ -14008,7 +14011,7 @@ msgstr "" "copia de respaldo de la configuración existente antes de instalar la nueva " "compatible con esta versión de %s." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14021,7 +14024,7 @@ msgstr "" "decidir abandonar o sustituir un valor desconocido con un valor por defecto " "silenciosamente o verbosamente." -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14043,15 +14046,15 @@ 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:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Inclinación" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Inclinación para resina de alta viscosidad" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Tiempo de inclinación" @@ -14082,15 +14085,15 @@ msgstr "" "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:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Tiempo de la inclinación rápida" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Tiempo de la inclinación lenta" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Tiempo de la inclinación super lenta" @@ -14152,7 +14155,7 @@ msgstr "Herramienta" msgid "Tool #" msgstr "Herramienta nº" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "Código G de cambio de herramienta" @@ -14174,7 +14177,7 @@ msgstr "Posición de herramienta" msgid "Tool type" msgstr "Tipo de herramienta" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Parámetros del cambio de herramienta para impresoras de un único extrusor MM" @@ -14198,7 +14201,7 @@ msgstr "" "Sugerencia de grosor de la carcasa superior / inferior: no disponible debido " "a una altura de capa inválida." -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Vista superior" @@ -14293,7 +14296,7 @@ msgstr "Recorrido" msgid "Triangles" msgstr "Triángulos" -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14315,11 +14318,11 @@ msgstr "Tipo de impresora." msgid "Type:" msgstr "Tipo:" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "CANDADO ABIERTO" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -14332,7 +14335,7 @@ msgstr "" "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:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -14374,11 +14377,11 @@ msgstr "No se puede sustituir con más de un volumen" msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Categoría sin definir" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Grupo sin definir" @@ -14392,7 +14395,7 @@ msgstr "Subflujo" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Deshacer" @@ -14590,7 +14593,7 @@ msgstr "Usar la cámara libre" msgid "Use inches" msgstr "Usar pulgadas" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Usar pad" @@ -14681,11 +14684,11 @@ msgstr "" "El valor ha cambiado y ya no es igual al valor del sistema o al último valor " "guardado" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 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:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Los valores en esta columna son para el modo Silencioso" @@ -14731,7 +14734,7 @@ msgstr "Vendedor:" msgid "Verbose G-code" msgstr "Código G detallado" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Versión" @@ -14780,7 +14783,7 @@ msgstr "" "Visita \"Preferencias\" y marca\"%1%\"\n" "para cambiar tu elección." -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Visualizar un código G ya laminado y guardado" @@ -14805,7 +14808,7 @@ msgstr "Volúmenes en Objetos reordenados" msgid "Volumetric" msgstr "Volumétrico" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Sugerencias de flujo volumétrico no disponibles" @@ -14828,15 +14831,15 @@ msgstr "Velocidad volumétrica" msgid "WARNING:" msgstr "AVISO:" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "VIÑETA BLANCA" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 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:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -14844,7 +14847,7 @@ 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -14852,7 +14855,7 @@ 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/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Espesor de pared" @@ -15014,7 +15017,7 @@ 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/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -15028,17 +15031,19 @@ msgstr "" "restante. Reduciendo este ajuste se reduce el número y la longitud de estos " "perímetros centrales, pero puede dejar huecos o sobresalir." -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" "Cuando se pasa de un número de perímetros a otro a medida que la pieza se " -"hace más fina, se asigna una cierta cantidad de espacio para dividir o unir " -"los segmentos del perímetro." +"vuelve más fina, se asigna una cierta cantidad de espacio para dividir o " +"unir los segmentos del perímetro. Si se expresa como un porcentaje (por " +"ejemplo, 100%), se calculará en función del diámetro de la boquilla." -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Palabra completa" @@ -15050,7 +15055,7 @@ msgstr "Ancho" msgid "Width (mm)" msgstr "Ancho (mm)" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 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" @@ -15059,17 +15064,17 @@ msgstr "" msgid "Width of a wipe tower" msgstr "Ancho de la torre de limpieza" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 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:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Ancho de la pantalla" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -15083,7 +15088,7 @@ msgstr "" "grueso como la propia característica. Si se expresa en porcentaje (por " "ejemplo, 85%), se calculará en función del diámetro de la boquilla." -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -15127,7 +15132,7 @@ msgstr "Torre de limpieza - Ajuste del volumen de purga" msgid "Wipe tower brim width" msgstr "Ancho de la balsa de la torre de limpieza" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Parámetros de la torre de limpieza" @@ -15192,7 +15197,7 @@ msgstr "" "problema con la nueva versión.\n" "Updated configuration bundles:" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Escribir información sobre el modelo en la consola." @@ -15283,7 +15288,7 @@ msgstr "" "Puede poner sus notas personales aquí. Este texto se añadirá al código G " "como comentarios." -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 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í." @@ -15444,7 +15449,7 @@ msgstr "" "Tus cambios actuales eliminarán todos los cambios guardados del extrusor " "(herramienta)." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Tu fichero fue reparado." @@ -15483,7 +15488,7 @@ msgstr "Ajuste en altura Z" msgid "Z travel" msgstr "Recorrido en Z" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zig-Zag" @@ -15605,7 +15610,7 @@ msgstr "perfil de impresión por defecto" msgid "default value" msgstr "valor por defecto" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "borra" @@ -15683,7 +15688,7 @@ msgid "flow rate is maximized" msgstr "se maximiza el flujo de material" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -15708,7 +15713,7 @@ msgstr "g" msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" @@ -15725,7 +15730,7 @@ msgid "in" msgstr "en" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -15738,7 +15743,7 @@ msgstr "" "del grupo de opciones actual a los valores del sistema (o predeterminados)." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -15747,7 +15752,7 @@ msgstr "" "defecto) para el grupo de opciones actual" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -15784,11 +15789,11 @@ msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "está basado en Slic3r de Alessandro Ranellucci y la comunidad RepRap." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "está licenciado bajo el/los" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" @@ -15812,7 +15817,7 @@ msgstr "máxima versión PrusaSlicer" msgid "min PrusaSlicer version" msgstr "mínima versión PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" @@ -15852,19 +15857,18 @@ msgstr "ml" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -15878,8 +15882,9 @@ msgstr "mm (cero para deshabilitar)" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm o %" @@ -15941,7 +15946,7 @@ msgstr "modelo" msgid "modified" msgstr "modificado" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "dinero/botella" @@ -15999,7 +16004,7 @@ msgstr "impresora" msgid "printer model" msgstr "modelo de impresora" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "eliminar" @@ -16020,11 +16025,11 @@ msgstr "requiere un min. %s y un max. %s" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "$" @@ -16147,8 +16152,8 @@ msgstr "fallo write calledback" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" diff --git a/resources/localization/fr/PrusaSlicer.mo b/resources/localization/fr/PrusaSlicer.mo index bfccc56a69..f87b6c2de0 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 e1c42e90a9..78d805e80d 100644 --- a/resources/localization/fr/PrusaSlicer_fr.po +++ b/resources/localization/fr/PrusaSlicer_fr.po @@ -7,7 +7,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Prusalator\n" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -35,9 +35,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -126,7 +125,7 @@ msgstr[0] "%1% (%2$d coque)" msgstr[1] "%1% (%2$d coques)" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Préréglage" @@ -145,7 +144,7 @@ msgstr "" msgid "%1% was substituted with %2%" msgstr "%1% a été substitué avec %2%" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% a été découpé avec succès." @@ -167,7 +166,7 @@ msgstr "%3.2f mm³/s à une vitesse de filament de %3.2f mm/s." msgid "%d lines: %.2f mm" msgstr "%d lignes : %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d préréglages importés avec succès." @@ -339,7 +338,7 @@ msgstr "" msgid "&About %s" msgstr "&Au sujet de %s" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "&Réduire la barre latérale" @@ -351,27 +350,27 @@ msgstr "&Configuration" msgid "&Configuration Snapshots" msgstr "Instantanés de &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Copier" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Supprimer la sélection" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Editer" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Exporter" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Onglet des Réglages du &Filament" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Fichier" @@ -379,19 +378,19 @@ msgstr "&Fichier" msgid "&Finish" msgstr "&Fin" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "&Plein écran" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "&Aperçu du G-code" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Aide" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Importer" @@ -399,7 +398,7 @@ msgstr "&Importer" msgid "&Language" msgstr "&Langue" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Nouveau Projet" @@ -407,19 +406,19 @@ msgstr "&Nouveau Projet" msgid "&Next >" msgstr "&Suivant >" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&Ouvrir le G-code" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&Ouvrir Projet" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "C&oller" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "Onglet du &Plateau" @@ -427,35 +426,35 @@ msgstr "Onglet du &Plateau" msgid "&Preferences" msgstr "&Préférences" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "&Quitter" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Rétablir" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "&Réparer le fichier STL" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "&Enregistrer le Projet" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "&Tout sélectionner" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "Ann&uler" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Vue" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "Fenê&tre" @@ -464,7 +463,7 @@ msgstr "Fenê&tre" msgid "(All)" msgstr "(Tout)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)Découper Main&tenant" @@ -476,7 +475,7 @@ msgstr "(Re)découper" msgid "(Some lines not shown)" msgstr "(Certaines lignes ne sont pas représentées)" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Inconnu)" @@ -488,7 +487,7 @@ msgstr "(bobine incluse)" msgid "(minimum)" msgstr "(minimum)" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") non trouvé." @@ -544,7 +543,7 @@ msgstr "2 mm" msgid "3 (heavy)" msgstr "3 (important)" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" @@ -635,7 +634,7 @@ 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/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -662,7 +661,7 @@ msgstr "Clé API" msgid "Abort" msgstr "Annuler" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Au sujet de %s" @@ -679,7 +678,7 @@ msgstr "Contrôle de l'accélération (avancé)" msgid "Access violation" msgstr "Violation d'accès" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Précision" @@ -719,7 +718,7 @@ msgstr "" "cubique de support pour réduire le temps d'impression et la consommation de " "filament ? Lire la suite dans la documentation." -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Ajouter" @@ -783,7 +782,7 @@ msgstr "Ajouter une Forme depuis la Galerie" msgid "Add Shapes from Gallery" msgstr "Ajouter des formes à partir de la Galerie" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Ajouter une base sous le modèle supporté" @@ -901,7 +900,7 @@ msgid "Add pause print" msgstr "Ajouter une pause d'impression" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Ajouter une imprimante physique" @@ -1002,17 +1001,16 @@ msgstr "Adresse" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Avancé" @@ -1048,16 +1046,16 @@ msgstr "" "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:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-Code après changement de couche" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Aligner XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Aligner le modèle sur le point défini." @@ -1070,7 +1068,7 @@ msgid "Aligned Rectilinear" msgstr "Rectiligne Aligné" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Tous" @@ -1279,7 +1277,7 @@ msgstr "Appliquer le changement de couleur automatiquement" msgid "Apply to all the remaining small objects being loaded." msgstr "Appliquer à tous les petits objets restants en cours de chargement." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "Arachne" @@ -1291,7 +1289,7 @@ msgstr "Générateur de périmètre Arachne" msgid "Archimedean Chords" msgstr "Accords d'Archimède" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format 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é ?" @@ -1308,7 +1306,7 @@ msgstr "" msgid "Are you sure you want to continue?" msgstr "Êtes-vous sûr de vouloir continuer ?" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -1322,7 +1320,7 @@ msgstr "" msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Voulez-vous vraiment supprimer l'imprimante \"%1%\" ?" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Voulez-vous vraiment supprimer toutes les substitutions ?" @@ -1330,7 +1328,7 @@ msgstr "Voulez-vous vraiment supprimer toutes les substitutions ?" msgid "Are you sure you want to do it?" msgstr "Êtes-vous certain de vouloir le faire ?" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Remplissage de zone" @@ -1362,7 +1360,7 @@ msgstr "" "d'agencement pour ajuster la taille de l'espace entre les objets et " "autoriser les rotations automatiques ?" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -1519,7 +1517,7 @@ msgstr "Autogénérer les points de support" 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:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Génération automatique" @@ -1527,7 +1525,7 @@ msgstr "Génération automatique" msgid "Automatic updates" msgstr "Mises à jour automatiques" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Réparer automatiquement un fichier STL" @@ -1543,11 +1541,11 @@ msgstr "Éviter de traverser les périmètres" msgid "Avoid crossing perimeters - Max detour length" msgstr "Éviter de croiser les périmètres - Longueur de détour maximum" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "FLÈCHE ARRIÈRE" -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -1560,7 +1558,7 @@ msgstr "" "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:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -1574,7 +1572,7 @@ msgstr "" msgid "Background processing" msgstr "Tâche en arrière plan" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Purger les valeurs de configuration inconnues" @@ -1582,7 +1580,7 @@ msgstr "Purger les valeurs de configuration inconnues" msgid "Balanced" msgstr "Équilibré" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Plateau" @@ -1631,7 +1629,7 @@ msgstr "" "zéro pour désactiver les commandes de contrôle de température du plateau " "dans la sortie." -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-Code avant changement de couche" @@ -1656,7 +1654,7 @@ msgstr "Meilleure qualité de surface" msgid "Between objects G-code" msgstr "Entre le G-code des objets" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "Entre le G-code des objets (pour une impression séquentielle)" @@ -1678,11 +1676,11 @@ msgstr "Bloquer les supports" msgid "Block supports by angle" msgstr "Bloquer les supports par angle" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Volume de la bouteille" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Poids de la bouteille" @@ -1699,7 +1697,7 @@ msgstr "Bas" msgid "Bottom" msgstr "Dessous" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Vue du Dessous" @@ -1981,8 +1979,8 @@ 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:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Fonctionnalités" @@ -1990,7 +1988,7 @@ msgstr "Fonctionnalités" msgid "Capture a configuration snapshot" msgstr "Capturer un instantané de la configuration" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Insensible à la casse" @@ -1998,11 +1996,11 @@ msgstr "Insensible à la casse" msgid "Category" msgstr "Catégorie" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Centrer" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Centrer l'impression autour d'un point donné." @@ -2111,7 +2109,7 @@ 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:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Choisir un fichier à découper (STL/OBJ/AMF/3MF/PRUSA) :" @@ -2158,7 +2156,7 @@ msgstr "Cercle" msgid "Circular" msgstr "Circulaire" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "Classique" @@ -2166,12 +2164,14 @@ msgstr "Classique" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" "Le générateur de périmètre classique produit des périmètres avec une largeur " "d'extrusion constante et pour les zones très minces, le remplissage des " "trous est utilisé. Le moteur Arachne produit des périmètres avec une largeur " -"d'extrusion variable." +"d'extrusion variable. Ce paramètre affecte également le remplissage " +"concentrique." #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -2250,7 +2250,7 @@ msgid "Closing PrusaSlicer. Current project is modified." msgstr "Fermeture de PrusaSlicer. Le projet en cours est modifié." #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Intervalle d'espacement" @@ -2258,7 +2258,7 @@ msgstr "Intervalle d'espacement" msgid "Closing radius" msgstr "Rayon de fermeture" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Réduire la barre latérale" @@ -2266,11 +2266,11 @@ msgstr "Réduire la barre latérale" msgid "Collapse/Expand the sidebar" msgstr "Réduire/développer la barre latérale" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Couleur" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-code de changement de couleur" @@ -2335,12 +2335,12 @@ msgstr "Commandes" msgid "Comment:" msgstr "Commentaire :" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Comparer les préréglages" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Comparer les Préréglages" @@ -2348,7 +2348,7 @@ msgstr "Comparer les Préréglages" msgid "Compare this preset with some another" msgstr "Comparez ce préréglage avec un autre" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Les préréglages comparés ont une technologie d'imprimante différente" @@ -2517,7 +2517,7 @@ msgstr "" "limitée à infill_anchor, mais pas plus longue que ce paramètre. Réglez ce " "paramètre sur zéro pour désactiver l'ancrage." -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Connexion des tiges de support et jonctions" @@ -2574,7 +2574,7 @@ msgstr "Continuer et installer les mises à jour de configuration ?" msgid "Continue to activate a configuration snapshot %1%?" msgstr "Continuer à activer un instantané de configuration %1% ?" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -2592,7 +2592,7 @@ msgstr "" "Contributions de Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik et bien d'autres." -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -2611,7 +2611,7 @@ msgstr "Convertir à partir des unités impériales" msgid "Convert from meters" msgstr "Convertir à partir de mètres" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Refroidissement" @@ -2627,7 +2627,7 @@ msgstr "" "Les mouvements de refroidissement accélèrent progressivement jusqu'à cette " "vitesse." -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Seuils de refroidissement" @@ -2656,7 +2656,7 @@ msgstr "Copier" msgid "Copy Version Info" msgstr "Copier les Infos de Version" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Copier la sélection dans le presse-papier" @@ -2720,32 +2720,32 @@ msgstr "" "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:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Droits d'auteur" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Correction avant expansion" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Correction pour l'expansion selon l'axe X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Correction pour l'expansion selon l'axe Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Correction pour l'expansion selon l'axe Z" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Corrections" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Coût" @@ -2821,7 +2821,7 @@ msgstr "" "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/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 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" @@ -2838,7 +2838,7 @@ msgstr "" msgid "Creating a new project while the current project is modified." msgstr "Création d'un nouveau projet alors que le projet en cours est modifié." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Angle critique" @@ -2846,7 +2846,7 @@ msgstr "Angle critique" msgid "Critical error" msgstr "Erreur critique" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Croiser" @@ -2892,8 +2892,8 @@ msgstr "" "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:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "G-code personnalisé" @@ -2937,7 +2937,7 @@ msgid "Custom template (\"%1%\")" msgstr "Modèle personnalisé (\"%1%\")" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Couper" @@ -2945,7 +2945,7 @@ msgstr "Couper" msgid "Cut by Plane" msgstr "Couper selon un Plan" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Couper le modèle au Z donné." @@ -2953,7 +2953,7 @@ msgstr "Couper le modèle au Z donné." msgid "Cylinder" msgstr "Cylindre" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "Tout &Déselectionner" @@ -2961,7 +2961,7 @@ msgstr "Tout &Déselectionner" msgid "Dark mode (experimental)" msgstr "Mode sombre (expérimental)" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Répertoire de données" @@ -2987,7 +2987,7 @@ msgstr "Diminuer les Instances" msgid "Default" msgstr "Défaut" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Profil par défaut du matériau SLA" @@ -3027,8 +3027,8 @@ msgstr "" msgid "Default print profile" msgstr "Profil de filament par défaut" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -3042,7 +3042,7 @@ msgstr "" msgid "Define a custom printer profile" msgstr "Définissez un profil d'imprimante personnalisée" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -3060,11 +3060,11 @@ msgstr "Délai après le déchargement" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Supprimer" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Tout &Supprimer" @@ -3118,7 +3118,7 @@ msgid "Delete Subobject" msgstr "Supprimer le sous-objet" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Tout Supprimer" @@ -3177,16 +3177,16 @@ msgstr "" msgid "Delete tool change" msgstr "Supprimer le changement d'outil" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Supprimer tous les objets" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Supprime la sélection en cours" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Densité" @@ -3198,9 +3198,9 @@ msgstr "Densité du remplissage interne, exprimée en pourcentage de 0% à 100%. msgid "Density of the first raft or support layer." msgstr "Densité de la premières couche de raft ou de support." -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Dépendances" @@ -3224,7 +3224,7 @@ msgstr "Désélectionner tout" msgid "Deselect by rectangle" msgstr "Désélectionner par rectangle" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Désélectionner tous les objets" @@ -3259,7 +3259,7 @@ msgstr "Détacher du préréglage système" msgid "Detach preset" msgstr "Détacher le préréglage" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Détaché" @@ -3283,7 +3283,7 @@ msgstr "" msgid "Detect thin walls" msgstr "Détecter les parois fines" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -3307,15 +3307,15 @@ msgstr "Appareil :" msgid "Diameter" msgstr "Diamètre" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Diamètre en mm de la base du pilier" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Diamètre en mm des piliers de support" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Diamètre du côté de pointage de la tête" @@ -3380,33 +3380,33 @@ msgstr "Éliminer toutes les modifications personnalisées" msgid "Discard changes" msgstr "Annuler les modifications" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Afficher" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Hauteur de l'affichage" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Afficher la symétrie horizontale" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Orientation de l'affichage" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 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:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Afficher la symétrie verticale" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Largeur de l'affichage" @@ -3425,7 +3425,7 @@ msgstr "" "Distance entre la jupe et la bordure (lorsque le bouclier contre les flux " "d'air n'est pas utilisé) ou les objets." -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -3468,12 +3468,12 @@ msgstr "Distance utilisée par la fonction d'agencement automatique du plateau." msgid "Divide by zero" msgstr "Diviser par zéro" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 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:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -3533,7 +3533,7 @@ msgstr "" "Voulez-vous sélectionner les filaments par défaut pour ces modèles " "d'imprimantes FFF ?" -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Ne pas agencer" @@ -3597,11 +3597,11 @@ msgstr "" msgid "Drop to bed" msgstr "Déposer sur le plateau" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Dupliquer" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Dupliquer par grille" @@ -3619,11 +3619,11 @@ msgstr "" msgid "During the other layers, fan will be turned off." msgstr "Pour les autres couches, le ventilateur sera désactivé." -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dynamique" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "E&xporter" @@ -3677,7 +3677,7 @@ msgstr "Éditer un G-code personnalisé" msgid "Edit pause print message" msgstr "Modifier le message de pause d'impression" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Modifier l'imprimante physique" @@ -3701,7 +3701,7 @@ msgstr "Édition" msgid "Eigen vectorization supported:" msgstr "Vectorisation d'Eigen prise en charge :" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Éje&cter la carte SD / la clé USB" @@ -3709,7 +3709,7 @@ msgstr "Éje&cter la carte SD / la clé USB" msgid "Eject SD card / Flash drive" msgstr "Éjecter la carte SD / la clef USB" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 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é." @@ -3727,7 +3727,7 @@ msgstr "L'éjection de l'appareil %s(%s) a échoué." msgid "Elephant foot compensation" msgstr "Compensation de l'effet patte d'éléphant" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Largeur minimum du pied d'éléphant" @@ -3761,7 +3761,7 @@ msgstr "Émettre en G-code" msgid "Empty layer between %1% and %2%." msgstr "Couche vide entre %1% et %2%." -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Activer" @@ -3779,11 +3779,11 @@ 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:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Activer l'évidement" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Active la symétrie horizontale des images de sortie" @@ -3798,7 +3798,7 @@ msgstr "" "Activer le lissage des couches supérieures avec la tête d'impression chaude " "pour une surface lisse" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -3806,7 +3806,7 @@ msgstr "" "Activer la lecture des valeurs de configuration inconnues en les remplaçant " "silencieusement par les valeurs par défaut." -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -3858,7 +3858,7 @@ msgstr "" msgid "Enable variable layer height feature" msgstr "Activer la fonction de hauteur de couche variable" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Activer la symétrie verticale des images de sortie" @@ -3874,7 +3874,7 @@ msgstr "" "Permet de combler les espaces entre les périmètres et entre les périmètres " "et remplissage les plus intérieurs." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" @@ -3906,7 +3906,7 @@ msgstr "Forcer les supports" msgid "Enqueued" msgstr "Placé dans la file d'attente" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Assurer le contact avec le plateau" @@ -4022,7 +4022,7 @@ msgstr "" "Erreur : \"%2%\"" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Erreur" @@ -4172,23 +4172,23 @@ msgstr "Mode expert" msgid "Export" msgstr "Exporter" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Exporter la &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Exporter le &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Exporter les &Parcours d'outils en OBJ" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Exporter 3MF" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Exporter AMF" @@ -4196,11 +4196,11 @@ msgstr "Exporter AMF" msgid "Export AMF file:" msgstr "Exporter le fichier AMF :" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Exporter le &Lot de Configuration" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Exporter le Lot de Configurations Avec les Imprimantes Physiques" @@ -4209,15 +4209,15 @@ msgid "Export G-Code." msgstr "Exporter le G-code." #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Exporter le G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exporter le G-code vers la carte SD / la clé USB" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Exporter OBJ" @@ -4225,19 +4225,19 @@ msgstr "Exporter OBJ" msgid "Export OBJ file:" msgstr "Exporter le fichier OBJ :" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Exporter le plateau en &STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Exporter la plateau en STL &avec les Supports" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Exporter SLA" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Exporter STL" @@ -4245,13 +4245,13 @@ msgstr "Exporter STL" msgid "Export STL file:" msgstr "Exporter le fichier STL :" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" "Exporter tous les préréglage y compris les imprimantes physiques vers un " "fichier" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Exporter tous les préréglage vers un fichier" @@ -4263,24 +4263,24 @@ msgstr "Exporter en tant que STL" msgid "Export config" msgstr "Exporter la configuration" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Exporter la configuration actuelle vers un fichier" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Exporter le plateau courant en G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 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:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Exporter le plateau courant en STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Exporter le contenu du plateau en STL, supports inclus" @@ -4299,19 +4299,19 @@ msgstr "Exporter un fichier temporaire 3mf qui a échoué" 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:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Exporter le(s) modèle(s) en tant que 3MF." -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Exporter le(s) modèle(s) en tant que AMF." -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Exporter le(s) modèle(s) en tant que OBJ." -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Exporter le(s) modèle(s) en tant que STL." @@ -4319,7 +4319,7 @@ msgstr "Exporter le(s) modèle(s) en tant que STL." msgid "Export to SD card / Flash drive" msgstr "Exporter vers une carte SD / une clé USB" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Exporter le parcours en tant que OBJ" @@ -4331,7 +4331,7 @@ msgstr "Exporter." msgid "Exporting G-code" msgstr "Exportation du G-code" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Exportation du lot de configuration" @@ -4352,11 +4352,11 @@ msgstr "Exportation." 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:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Exposition" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Temps d'exposition" @@ -4418,7 +4418,7 @@ msgstr "Couleur de l'extrudeur" msgid "Extruder changed to" msgstr "Extrudeur changé à" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Dégagement de l'extrudeur" @@ -4427,7 +4427,7 @@ msgid "Extruder offset" msgstr "Décalage de l'extrudeur" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -4435,7 +4435,7 @@ msgid "Extruders" msgstr "Extrudeurs" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Nombre d'extrudeurs" @@ -4475,7 +4475,7 @@ msgstr "Imprimantes Technologie FFF" msgid "Facets" msgstr "Faces" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Couches estompées" @@ -4506,11 +4506,11 @@ msgstr "Échec du perçage de certains trous dans le modèle" msgid "Fan Speed (%)" msgstr "Vitesse du ventilateur (%)" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Réglages du ventilateur" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Vitesse du ventilateur" @@ -4545,11 +4545,11 @@ msgstr "Le ventilateur fonctionnera toujours à %1%%%" msgid "Fan will be turned off." msgstr "Le ventilateur sera désactivé." -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Rapide" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Inclinaison rapide" @@ -4573,7 +4573,7 @@ msgstr "Types de fonctionnalité" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -4585,7 +4585,7 @@ msgstr "Diamètre du Filament :" msgid "Filament End G-code" msgstr "G-code de fin du filament" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Réglages dérogatoires du Filament" @@ -4594,7 +4594,7 @@ msgid "Filament Profiles Selection" msgstr "Sélection des Profils de Filament" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Réglages du filament" @@ -4636,7 +4636,7 @@ msgstr "Notes du filament" msgid "Filament parking position" msgstr "Position d'attente du filament" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Propriétés du filament" @@ -4653,7 +4653,7 @@ msgstr "Temps de déchargement du filament" msgid "Filaments" msgstr "Filaments" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Fichier non trouvé" @@ -4724,7 +4724,7 @@ msgstr "" msgid "Filling bed" msgstr "Remplissage du plateau" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Rechercher" @@ -4737,11 +4737,11 @@ msgstr "" msgid "Finished" msgstr "Terminé" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Rétraction du Firmware" @@ -4956,7 +4956,7 @@ msgstr "" "couches de support\n" "doivent être synchronisées avec les couches de l'objet." -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Forcer le socle partout autour de l'objet" @@ -4990,7 +4990,7 @@ msgstr "" "Format des vignettes du G-code : PNG pour une meilleure qualité, JPG pour la " "plus petite taille, QOI pour un firmware à faible mémoire" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -4998,7 +4998,7 @@ msgstr "" "Règle de compatibilité ascendante lors du chargement des configurations à " "partir des fichiers de configuration et des fichiers de projet (3MF, AMF)." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Mots-clés réservés trouvés dans" @@ -5012,11 +5012,11 @@ msgstr "" "Depuis la Liste d'Objet Vous ne pouvez pas supprimer la dernière partie " "solide de l'objet." -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Avant" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Vue Avant" @@ -5024,7 +5024,7 @@ msgstr "Vue Avant" msgid "Full fan speed at layer" msgstr "Ventilateur à pleine vitesse pour la couche" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Plein écran" @@ -5073,7 +5073,7 @@ msgstr "Épaisseur de la surface irrégulière" msgid "Fuzzy skin type." msgstr "Type de surface irrégulière." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-code" @@ -5111,11 +5111,11 @@ msgstr "Substitutions de G-code" msgid "G-code thumbnails" msgstr "Vignettes G-code" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Visionneuse de G-code" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero Licence Publique Générale, version 3" @@ -5132,10 +5132,10 @@ msgstr "Galerie" msgid "Gap fill" msgstr "Remplissage des trous" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Général" @@ -5165,11 +5165,11 @@ msgstr "" "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:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Générer des supports" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Générer des supports pour les modèles" @@ -5365,11 +5365,11 @@ msgstr "" msgid "Head diameter" msgstr "Diamètre de la tête" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Pénétration de la tête" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 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 " @@ -5396,7 +5396,7 @@ msgstr "Hauteur (mm)" msgid "Height of skirt expressed in layers." msgstr "Hauteur de la jupe exprimée en couches." -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Hauteur de l'affichage" @@ -5422,15 +5422,15 @@ msgstr "" "configuration initiale ; juste quelques paramètres et vous serez prêt à " "imprimer." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Aide" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Aide (options FFF)" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Aide (options SLA)" @@ -5465,7 +5465,7 @@ msgstr "Élevé" msgid "High extruder current on filament swap" msgstr "Courant de l'extrudeur élevé lors du changement de filament" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Haute viscosité" @@ -5499,7 +5499,7 @@ msgstr "Diamètre du trou" msgid "Hollow and drill" msgstr "Évider et percer" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Évider un modèle pour avoir un intérieur vide" @@ -5507,16 +5507,16 @@ msgstr "Évider un modèle pour avoir un intérieur vide" msgid "Hollow this object" msgstr "Évider cet objet" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Évidement" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -5586,21 +5586,21 @@ msgstr "" "Passez le curseur au dessus des boutons pour obtenir plus d'informations\n" "ou cliquez sur ce bouton." -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 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:3867 +#: src/libslic3r/PrintConfig.cpp:3840 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:3576 +#: src/libslic3r/PrintConfig.cpp:3549 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -5823,7 +5823,7 @@ msgstr "" "Si activé, le bouton de réduction de la barre latérale apparaîtra dans le " "coin supérieur droit de la scène 3D" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -6100,7 +6100,7 @@ msgstr "" "de distribution manquants ou hors ligne. On peut vouloir activer cette " "option pour les certificats auto-signés si la connexion échoue." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignorer les fichiers de configuration non-existants" @@ -6118,15 +6118,15 @@ msgstr "Instruction illégale" msgid "Import" msgstr "Importer" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importer la &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importer le &Lot de Configuration" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Importer la Configuration à partir du &Projet" @@ -6142,7 +6142,7 @@ msgstr "Importer l'Objet" msgid "Import Objects" msgstr "Importer les Objets" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Importer l'archive SL1 / SL1S" @@ -6150,11 +6150,11 @@ msgstr "Importer l'archive SL1 / SL1S" msgid "Import SLA archive" msgstr "Importer l'archive SLA" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Importer le STL (unités impériales)" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importer STL/OBJ/AM&F/3MF" @@ -6284,11 +6284,11 @@ msgstr "" "Le temps d'exposition initial est en dehors des limites du profil " "d'imprimante." -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Temps d'exposition initial" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Hauteur de couche initiale" @@ -6395,7 +6395,7 @@ msgstr "Erreur interne : %1%" msgid "Internal infill" msgstr "Remplissage interne" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Pénétration de Tête invalide" @@ -6423,7 +6423,7 @@ msgstr "" msgid "Invalid numeric input." msgstr "Entrée numérique non valide." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Diamètre de tête d'épingle non valide" @@ -6459,11 +6459,11 @@ msgstr "Type de lissage" msgid "Is it safe?" msgstr "Is it safe?" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Isométrique" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Vue Isométrique" @@ -6492,7 +6492,7 @@ msgstr "" "d'expulsion rapide et pour compenser la résistance lors du chargement d'un " "filament avec une pointe mal taillée." -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "C'est le dernier préréglage pour cette imprimante physique." @@ -6508,7 +6508,7 @@ msgstr "" "Il n'est pas possible de supprimer le dernier préréglage associé pour " "l'imprimante." -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Limites de mouvements brusques" @@ -6574,7 +6574,7 @@ msgstr "Conserver les paramètres sélectionnés." msgid "Keep upper part" msgstr "Garder la partie du haut" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Raccourcis Clavier" @@ -6582,11 +6582,11 @@ msgstr "Raccourcis Clavier" msgid "Keyboard shortcuts" msgstr "Raccourcis clavier" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "CADENAS FERMÉ" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -6594,7 +6594,7 @@ 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:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -6606,7 +6606,7 @@ msgstr "" msgid "Label objects" msgstr "Marquer les objets" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Paysage" @@ -6647,7 +6647,7 @@ msgstr "" "\n" "La hauteur de la couche sera réinitialisée à 0,01." -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Limites de hauteur de couche" @@ -6655,8 +6655,8 @@ msgstr "Limites de hauteur de couche" msgid "Layer range Settings to modify" msgstr "Réglages de zone de Couche à modifier" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Couches" @@ -6673,7 +6673,7 @@ msgstr "Couches" msgid "Layers and Perimeters" msgstr "Couches et Périmètres" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Couches et périmètres" @@ -6686,15 +6686,15 @@ msgstr "Options de disposition" msgid "Leave \"%1%\" enabled" msgstr "Conserver \"%1%\" activé" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Gauche" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Valeur du Préréglage gauche" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Vue Gauche" @@ -6733,7 +6733,7 @@ msgid "Length of the infill anchor" msgstr "Longueur de l'ancre de remplissage" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -6745,7 +6745,7 @@ msgstr "" msgid "Lift Z" msgstr "Levage de l'axe Z" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -6806,19 +6806,19 @@ msgstr "Charger une Partie" msgid "Load Project" msgstr "Charger le Projet" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Charger un modèle" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Charger une archive SL1 / SL1S" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Charger un modèle enregistré avec des unités impériales" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -6828,7 +6828,7 @@ msgstr "" "pour conserver différents profils ou inclure des configurations depuis un " "stockage réseau." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Charger le fichier de configuration" @@ -6847,11 +6847,11 @@ msgstr "" "Importer-Importer archive SL1 / SL1S, qui vous permet également de " "reconstruire des modèles 3D à partir des données voxel." -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Charger la configuration depuis le fichier du projet" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -6859,11 +6859,11 @@ 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:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Charger le fichier de configuration exporté" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Charger les préréglages à partir d'un lot" @@ -6896,11 +6896,11 @@ msgstr "Chargement de la configuration" msgid "Loading file" msgstr "Chargement du fichier" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Chargement d'un lot de configuration" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Chargement d'un fichier de configuration" @@ -6939,7 +6939,7 @@ msgstr "Coordonnées locaux" msgid "Lock supports under new islands" msgstr "Verrouiller les supports sous de nouveaux îlots" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Niveau d'enregistrement" @@ -6955,7 +6955,7 @@ msgstr "Faible" msgid "Lowest Z height" msgstr "Hauteur en Z la plus basse" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -6964,7 +6964,7 @@ msgstr "Hauteur en Z la plus basse" msgid "Machine limits" msgstr "Limites de la machine" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -6972,7 +6972,7 @@ msgstr "" "Les limites de la machine ne sont pas définies, par conséquent l'estimation " "du temps d'impression peut ne pas être précise." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -6983,7 +6983,7 @@ msgstr "" "être précis car l'imprimante peut appliquer un ensemble différent de limites " "de la machine." -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" @@ -7009,20 +7009,20 @@ msgstr "Édition manuelle" msgid "Masked SLA file exported to %1%" msgstr "Fichier SLA masqué exporté vers %1%" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Correspondance d'une seule ligne" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Onglet Réglage&s Matériau" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Matériau" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Réglages Matériau" @@ -7031,7 +7031,7 @@ msgstr "Réglages Matériau" msgid "Material Settings Tab" msgstr "Onglet de réglages du matériau" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Profil d'impression du matériau" @@ -7039,19 +7039,19 @@ msgstr "Profil d'impression du matériau" msgid "Max" msgstr "Maximum" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Longueur maximum de pont" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Nombre de ponts maximum par pilier" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Distance maximum de fusion" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Distance maximum de jonction de pilier" @@ -7148,7 +7148,7 @@ msgstr "Accélération maximum lors de la rétraction" msgid "Maximum acceleration when retracting (M204 R)" msgstr "Accélération maximale lors de la rétraction (M204 R)" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Accélérations maximum" @@ -7171,7 +7171,7 @@ msgstr "" "effectuée à chaque couche indépendamment, des artefacts visibles peuvent " "être produits." -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Temps d'exposition maximum" @@ -7207,11 +7207,11 @@ msgstr "Vitesse d'avance maximum de l'axe Y" msgid "Maximum feedrate of the Z axis" msgstr "Vitesse d'avance maximum de l'axe Z" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Vitesses d'avance maximum" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Temps d'exposition initiale Maximum" @@ -7251,7 +7251,7 @@ msgstr "Mouvement brusque maximum de l'axe Z" msgid "Maximum length of the infill anchor" msgstr "Longueur maximum de l'ancre de remplissage" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -7284,7 +7284,7 @@ msgid "Medium" msgstr "Moyen" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Fusionner" @@ -7300,7 +7300,7 @@ msgstr "Fusionner des objets en un seul objet multi-pièces" msgid "Merged" msgstr "Fusionné" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -7342,7 +7342,7 @@ msgstr "Minimum" msgid "Min print speed" msgstr "Vitesse d'impression minimale" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Distance minimale des points de support" @@ -7384,11 +7384,11 @@ msgstr "" "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:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Temps d'exposition minimum" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Minimum feature size" msgstr "Taille minimale d'élément" @@ -7400,15 +7400,15 @@ msgstr "Vitesse d'avance minimum lors de l'extrusion" msgid "Minimum feedrate when extruding (M205 S)" msgstr "Vitesse d'avance minimum lors de l'extrusion (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Vitesses d'avance minimum" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Temps d'exposition initiale minimum" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Largeur minimale du périmètre" @@ -7433,16 +7433,19 @@ msgstr "" msgid "Minimum thickness of a top / bottom shell" msgstr "Épaisseur minimale d'une coque supérieure/inférieure" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" "Épaisseur minimale des éléments fins. Les éléments du modèle qui sont plus " "fins que cette valeur ne seront pas imprimés, tandis que les éléments plus " "épais que la taille minimale d'élément seront élargis à la largeur minimale " -"du périmètre." +"du périmètre. Si elle est exprimée en pourcentage (par exemple 25%), elle " +"sera calculée en fonction du diamètre de la buse." #: src/libslic3r/PrintConfig.cpp:2899 msgid "Minimum top shell thickness" @@ -7465,11 +7468,11 @@ msgstr "Vitesse d'avance minimum en déplacement" msgid "Minimum travel feedrate (M205 T)" msgstr "Vitesse d'avance minimum en déplacement (M205 T)" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Épaisseur de paroi minimale d'un modèle évidé." -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" @@ -7495,7 +7498,7 @@ msgstr "" msgid "Mirror Object" msgstr "Symétriser l'Objet" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Symétriser horizontalement" @@ -7515,7 +7518,7 @@ msgstr "Symétriser l'objet sélectionné selon l'axe Y" msgid "Mirror the selected object along the Z axis" msgstr "Symétriser l'objet sélectionné selon l'axe Z" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Symétriser verticalement" @@ -7692,11 +7695,11 @@ msgstr "" "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:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Multiplier les copies en créant une grille." -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Multiplier les copies par ce facteur." @@ -7787,7 +7790,7 @@ msgstr "" msgid "New prerelease version %1% is available." msgstr "La nouvelle version préliminaire %1% est disponible." -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Nouveau préréglage d'imprimante sélectionné" @@ -7848,7 +7851,7 @@ 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:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Aucun fichier précédemment découpé." @@ -7856,7 +7859,7 @@ msgstr "Aucun fichier précédemment découpé." msgid "No sparse layers (EXPERIMENTAL)" msgstr "Sans couches dispersées (EXPERIMENTAL)" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 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." @@ -7872,7 +7875,7 @@ msgid "None" msgstr "Aucun" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normal" @@ -7888,7 +7891,7 @@ msgstr "Introuvable:" msgid "Note" msgstr "Remarque" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -7899,7 +7902,7 @@ msgstr[1] "" "Notez que les préréglages sélectionnés seront également supprimés de cette " "imprimante." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -7911,7 +7914,7 @@ msgstr[1] "" "Notez que ces imprimantes seront supprimées après la suppression du " "préréglage sélectionné." -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -7964,12 +7967,12 @@ 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:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Notes" @@ -7983,7 +7986,7 @@ msgstr "Remarque" msgid "Notify about new releases" msgstr "Avertir des nouvelles versions" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Buse" @@ -7995,7 +7998,7 @@ msgstr "Diamètre de la Buse :" msgid "Nozzle and Bed Temperatures" msgstr "Températures de la buse et du plateau" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Diamètre de la buse" @@ -8028,7 +8031,7 @@ msgstr "" msgid "Number of cooling moves" msgstr "Nombres de mouvements de refroidissement" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Nombre d'extrudeurs de l'imprimante." @@ -8057,15 +8060,15 @@ msgstr "" "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:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Nombre de pixels présents" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Nombre de pixels présents dans X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Nombre de pixels présents dans Y" @@ -8083,7 +8086,7 @@ msgstr "" 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:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -8099,7 +8102,7 @@ msgstr "Nombre de changements d'outil" msgid "Object Settings to modify" msgstr "Réglages de l'Objet à modifier" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Élévation de l'objet" @@ -8218,7 +8221,7 @@ msgstr "On/Off mode couche unique de la barre de défilement verticale" msgid "One layer mode" msgstr "Mode couche unique" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "L'un des préréglages est introuvable" @@ -8243,7 +8246,7 @@ msgstr "" "Vous devez soit retirer tous les objets sauf le dernier, soit activer le " "mode séquentiel avec \"complete_objects\"." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -8255,7 +8258,7 @@ msgstr "" msgid "Only infill where needed" msgstr "Faire remplissage seulement où cela est nécessaire" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Lever Z seulement" @@ -8297,7 +8300,7 @@ 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:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Ouvrir &PrusaSlicer" @@ -8317,11 +8320,11 @@ msgstr "Ouvrir un répertoire." msgid "Open G-code file:" msgstr "Ouvrir un fichier G-code :" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Ouvrir la visionneuse de G-code" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Ouvrir une Nouvelle Instance" @@ -8329,20 +8332,20 @@ msgstr "Ouvrir une Nouvelle Instance" msgid "Open Preferences." msgstr "Ouvrir les Préférences." -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Ouvrir PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Ouvrir un fichier G-code" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Ouvrir une nouvelle instance de PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Ouvrir un fichier de projet" @@ -8386,7 +8389,7 @@ 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:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Ouvrir la boîte de dialogue pour modifier la galerie de formes" @@ -8404,7 +8407,7 @@ msgstr "" "Ouverture d'un nouveau projet alors que certains préréglages ne sont pas " "enregistrés." -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -8480,7 +8483,7 @@ msgstr "Recherche de l'orientation annulée." msgid "Origin" msgstr "Origine" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Autre" @@ -8500,15 +8503,15 @@ msgstr "Bordure extérieure et intérieure" msgid "Outer brim only" msgstr "Bordure extérieure uniquement" -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Fichier de Sortie" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Information du Modèle de Sortie" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Fichier de sortie" @@ -8516,7 +8519,7 @@ msgstr "Fichier de sortie" msgid "Output filename format" msgstr "Format du nom de fichier de sortie" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Options de sortie" @@ -8541,19 +8544,19 @@ msgstr "Seuil de surplomb" msgid "Overlap" msgstr "Chevauchement" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Onglet des &Réglages d'Impression" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Socle" @@ -8561,15 +8564,15 @@ msgstr "Socle" msgid "Pad and Support" msgstr "Socle et Support" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Socle autour de l'objet" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Socle partout autour de l'objet" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Taille du bord de socle" @@ -8578,31 +8581,31 @@ 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:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Pénétration du connecteur de l'objet socle" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Pas du connecteur de l'objet socle" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Largeur du connecteur de l'objet socle" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Espace entre l'objet et le socle" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Hauteur de la paroi du socle" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Inclinaison de la paroi du socle" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Épaisseur de la paroi du socle" @@ -8736,7 +8739,7 @@ msgstr "Coller" msgid "Paste From Clipboard" msgstr "Coller Depuis le Presse-Papier" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Coller le presse-papier" @@ -8774,7 +8777,7 @@ msgstr "Motif utilisé pour générer les supports." msgid "Pause" msgstr "Pause" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G-code de pause de l'impression" @@ -8810,7 +8813,7 @@ msgstr "" "Exécuter l'intégration au bureau (définit ce binaire pour qu'il soit " "consultable par le système)." -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -8852,7 +8855,7 @@ msgstr "" msgid "Perimeter" msgstr "Périmètre" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Nombre de distributions des périmètres" @@ -8864,15 +8867,15 @@ msgstr "Extrudeur pour les périmètres" msgid "Perimeter generator" msgstr "Générateur des périmètres" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Longueur de transition des périmètres" -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Marge du filtre de transition des périmètres" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Angle de seuil de transition des périmètres" @@ -8924,29 +8927,29 @@ msgstr "" "Tailles des images à stocker dans un fichier .gcode et .sl1 / .sl1s, au " "format suivant : \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Mode de connexion par pilier" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Diamètre du pilier" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Facteur d'élargissement du pilier" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 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/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Diamètre avant de la tête d'épingle" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Largeur de la tête d'épingle" @@ -8995,11 +8998,11 @@ msgstr "" msgid "Please select the file to reload" msgstr "Veuillez sélectionner le fichier à recharger" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Copyright des sections" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Portrait" @@ -9008,7 +9011,7 @@ msgstr "Portrait" msgid "Position" msgstr "Position" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Position (pour les imprimantes multi-extrudeurs)" @@ -9024,7 +9027,7 @@ msgstr "Position Y" msgid "Position of perimeters starting points." msgstr "Position des points de départ des périmètres." -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Les scripts de post-traitement doivent modifier le fichier de G-code sur " @@ -9050,11 +9053,11 @@ msgstr "" "place et consultez le manuel sur la façon de renommer éventuellement le " "fichier de G-code post-traité.\n" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Scripts de post-traitement" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Pré&visualisation" @@ -9127,7 +9130,7 @@ msgstr "" msgid "Preset with name \"%1%\" already exists." msgstr "Un préréglage avec le nom \"%1%\" existe déjà." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9136,7 +9139,7 @@ msgstr "" "Cliquez sur ce bouton pour sélectionner le même préréglage pour les " "préréglages droit et gauche." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Les préréglages sont les mêmes" @@ -9177,7 +9180,7 @@ msgstr "" msgid "Pressure equalizer (experimental)" msgstr "Égaliseur de pression (expérimental)" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -9199,7 +9202,7 @@ msgstr "" "la buse." #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Aperçu" @@ -9207,7 +9210,7 @@ msgstr "Aperçu" msgid "Preview hollowed and drilled model" msgstr "Aperçu du modèle évidé et percé" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Fichier précédemment découpé (" @@ -9219,7 +9222,7 @@ msgstr "Préparer tous les extrudeurs d'impression" msgid "Print" msgstr "Imprimer" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "File d'Attente de Téléchargement de l'&Hôte d'Impression" @@ -9227,7 +9230,7 @@ msgstr "File d'Attente de Téléchargement de l'&Hôte d'Impression" msgid "Print Diameters" msgstr "Diamètres d'Impression" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Téléchargement de l'Hôte d'Impression" @@ -9266,15 +9269,15 @@ msgstr "Pauses d'impression" msgid "Print settings" msgstr "Réglages d'impression" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Vitesse d'impression" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Contournement de la vitesse d'impression" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Onglet des Réglages de l'Imprimant&e" @@ -9309,11 +9312,11 @@ msgstr "Réglages de l'Imprimante" msgid "Printer Settings Tab" msgstr "Onglet Réglages de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Correction absolue de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Correction gamma de l'imprimante" @@ -9325,32 +9328,32 @@ msgstr "Notes de l'imprimante" msgid "Printer preset names" msgstr "Noms des préréglages de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Correction de la mise à l'échelle de l'imprimante sur l'axe X" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Correction de la mise à l'échelle de l'imprimante sur l'axe Y" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Correction de la mise à l'échelle de l'imprimante sur l'axe Z" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Correction de redimensionnement de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Correction de la mise à l'échelle de l'imprimante sur l'axe Y" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Correction de la mise à l'échelle de l'imprimante sur l'axe Y" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Correction de la mise à l'échelle de l'imprimante sur l'axe Z" @@ -9397,7 +9400,7 @@ msgid "Process %1% / 100" msgstr "Processus %1% / 100" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Traitement %s" @@ -9411,9 +9414,9 @@ msgstr "" "Le traitement du modèle '%1%' avec plus de 1 million de triangles peut être " "lent. Il est fortement recommandé de réduire la quantité de triangles." -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Dépendances du profil" @@ -9508,7 +9511,7 @@ msgstr "" "PrusaSlicer a rencontré une erreur lors de la prise d'un instantané de " "configuration." -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -9630,15 +9633,15 @@ msgstr "Rapide" msgid "Quick Add Settings (%s)" msgstr "Ajout de Réglages Rapide (%s)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Découpage Rapide" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Découpage Rapide et Enregistrer Sous" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Quitter %s" @@ -9707,7 +9710,7 @@ msgstr "Largeur de la ligne d'expulsion" msgid "Ramming parameters" msgstr "Paramètres de l'expulsion" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Réglages de l'expulsion" @@ -9727,8 +9730,8 @@ msgstr "Zone" msgid "Rasterizing layers" msgstr "Tramage des couches" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Re&charger à partir du disque" @@ -9740,15 +9743,15 @@ msgstr "Reconfigurer" msgid "Ready" msgstr "Prêt" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Arrière" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Vue Arrière" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Proj&ets récents" @@ -9793,7 +9796,7 @@ msgid "Rectilinear grid" msgstr "Grille rectiligne" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Rétablir" @@ -9824,7 +9827,7 @@ msgstr "Actualiser les imprimantes" msgid "Regular" msgstr "Ordinaire" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Expression régulière" @@ -9874,9 +9877,9 @@ msgstr "Recharger depuis :" msgid "Reload plater from disk" msgstr "Recharger le plateau depuis le disque" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Recharger le plateau à partir du disque" @@ -9902,7 +9905,7 @@ msgid "Remember output directory" msgstr "Se souvenir du répertoire de sortie" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Retirer" @@ -10031,11 +10034,11 @@ msgstr "" msgid "Render" msgstr "Rendre" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Rendu avec avec un logiciel de rendu" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -10043,7 +10046,7 @@ 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:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Réparer" @@ -10075,11 +10078,11 @@ msgstr "Réparation d'un modèle par le service Netfabb" msgid "Repairing was canceled" msgstr "La réparation a été annulée" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Répéter le Dernier Découpage Rapide" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Répéter le dernier découpage rapide" @@ -10091,7 +10094,7 @@ msgstr "Remplacer par :" msgid "Replace the selected volume with new STL" msgstr "Remplacer le volume sélectionné par le nouveau STL" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Remplacer avec" @@ -10159,7 +10162,7 @@ msgstr "Réinitialiser l'échelle" msgid "Reset selection" msgstr "Réinitialiser la sélection" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Réinitialiser la Couleur du Filament" @@ -10183,8 +10186,8 @@ msgstr "Quantité de rétractation avant essuyage" msgid "Retract on layer change" msgstr "Rétracter lors des changements de couche" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Rétraction" @@ -10207,7 +10210,7 @@ msgstr "" "La rétraction n'est pas déclenchée lorsque les déplacements sont plus courts " "que cette distance." -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -10239,15 +10242,15 @@ msgstr "Rétablir la conversion des mètres" msgid "Review the substitutions and adjust them if needed." msgstr "Passez en revue les substitutions et ajustez-les si nécessaire." -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Droite" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Valeur du Préréglage droit" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Vue Droite" @@ -10282,15 +10285,15 @@ msgstr "Clic droit souris :" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Pivoter" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Pivoter autour de X" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Pivoter autour de Y" @@ -10323,15 +10326,15 @@ msgstr "" msgid "Rotation" msgstr "Rotation" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 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:4536 +#: src/libslic3r/PrintConfig.cpp:4511 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:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Angle de rotation autour de l'axe Z en degrés." @@ -10349,11 +10352,11 @@ msgstr "Run %s" msgid "Running post-processing scripts" msgstr "Exécuter des scripts de post-traitement" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "&Envoyer le G-code" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "Envoyer pour imprimer" @@ -10383,7 +10386,7 @@ msgstr "Raccourcis clavier pour le gizmo SLA" msgid "SLA material" msgstr "Matériau SLA" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Type de matériau SLA" @@ -10395,7 +10398,7 @@ msgstr "Matériaux SLA" msgid "SLA print" msgstr "Impression SLA" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Notes concernant le matériau d'impression SLA" @@ -10407,7 +10410,7 @@ msgstr "Réglages d'impression SLA" msgid "SLA supports outside the print area were detected." msgstr "Des supports SLA en dehors de la zone d'impression ont été détectés." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" @@ -10426,7 +10429,7 @@ msgstr "Enregistrer" msgid "Save %s as:" msgstr "Enregistrer %s sous :" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Enregistrer le fichier %s sous :" @@ -10435,13 +10438,13 @@ msgstr "Enregistrer le fichier %s sous :" msgid "Save G-code file as:" msgstr "Enregistrer le fichier G-code sous :" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 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/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Enregistrer le Projet &sous" @@ -10449,15 +10452,15 @@ msgstr "Enregistrer le Projet &sous" msgid "Save SL1 / SL1S file as:" msgstr "Enregistrer le fichier SL1 / SL1S sous :" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Enregistrer le fichier de configuration" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Enregistrer la configuration sous :" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Enregistrer la configuration dans le fichier spécifié." @@ -10467,11 +10470,11 @@ msgstr "Enregistrer la configuration dans le fichier spécifié." msgid "Save current %s" msgstr "Enregistrer l'état actuel %s" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Enregistrer le fichier du projet en cours" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Enregistrer le fichier du projet en cours sous" @@ -10484,7 +10487,7 @@ msgstr "Enregistrer le fichier sous :" msgid "Save preset" msgstr "Enregistrer le préréglage" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Enregistrer le lot de préréglages sous :" @@ -10513,7 +10516,7 @@ msgstr "Enregistrer les options sélectionnées dans le préréglage \"%1%\"." msgid "Save the selected options." msgstr "Enregistrer les options sélectionnées." -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Enregistrer le fichier zip sous :" @@ -10527,7 +10530,7 @@ msgstr "Échec de la sauvegarde du maillage dans le contenant 3MF." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Redimensionner" @@ -10544,11 +10547,11 @@ 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:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Redimensionner pour Ajuster" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Redimensionner pour ajuster à un volume donné." @@ -10556,7 +10559,7 @@ msgstr "Redimensionner pour ajuster à un volume donné." msgid "Scale to print volume" msgstr "Redimensionner pour ajuster au volume d'impression" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Facteur ou pourcentage de redimensionnement." @@ -10587,7 +10590,7 @@ msgstr "Gigue de la direction préférée de la jointure" msgid "Seams" msgstr "Jointures" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Recherc&her" @@ -10611,7 +10614,7 @@ msgstr "" msgid "Search in English" msgstr "Rechercher en anglais" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Rechercher dans les réglages" @@ -10700,7 +10703,7 @@ msgstr "Sélectionnez une action à appliquer au fichier" msgid "Select by rectangle" msgstr "Sélectionner par rectangle" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Sélectionner la configuration à charger :" @@ -10710,7 +10713,7 @@ msgstr "" "Sélectionnez un espace de coordonnées dans lequel la transformation sera " "effectuée." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Sélectionner les préréglages à comparer" @@ -10722,7 +10725,7 @@ msgstr "Sélectionner la forme dans la galerie" msgid "Select showing settings" msgstr "Sélectionner les réglages d'affichage" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Sélectionner le fichier STL à réparer :" @@ -10809,7 +10812,7 @@ msgstr "Sélection-Retirer de la liste" msgid "Selection-Remove from rectangle" msgstr "Sélection-Retirer du rectangle" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Sélectionner tous les objets" @@ -10826,7 +10829,7 @@ msgstr "Envoyer le G-code" msgid "Send system info" msgstr "Envoyer les informations système" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Envoyer pour imprimer le plateau actuel en tant que G-code" @@ -10850,7 +10853,7 @@ msgstr "Envoi des informations système..." msgid "Seq." msgstr "Seq." -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Impression séquentielle" @@ -10867,7 +10870,7 @@ msgstr "Port série :" msgid "Service name" msgstr "Nom du service" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Appliquer" @@ -10995,7 +10998,7 @@ msgstr "Définir les éléments sélectionnés comme Imprimables/Non Imprimables msgid "Set settings tabs as menu items (experimental)" msgstr "Définir les onglets de réglages comme éléments du menu (expérimental)" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -11164,7 +11167,7 @@ msgstr "" msgid "Set upper thumb as active" msgstr "Définir le curseur du haut comme actif" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -11176,7 +11179,7 @@ msgstr "" "d'avertissement de niveau fatal." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Réglages" @@ -11228,7 +11231,7 @@ msgstr "" msgid "Shape" msgstr "Forme" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Galerie de Formes" @@ -11279,7 +11282,7 @@ msgstr "Afficher la notification \"Astuce du jour\" après le démarrage" msgid "Show &Configuration Folder" msgstr "Afficher le Répertoire de &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Afficher les &Labels" @@ -11295,7 +11298,7 @@ msgstr "Afficher la boîte de dialogue à propos" msgid "Show advanced settings" msgstr "Afficher les réglages avancés" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Afficher tous les préréglages (y compris incompatibles)" @@ -11335,7 +11338,7 @@ msgstr "Afficher la hauteur de l'objet" msgid "Show object height on the ruler" msgstr "Afficher la hauteur de l'objet sur la règle" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Afficher les labels de l'objet /instance dans la scène 3D" @@ -11363,45 +11366,45 @@ msgstr "Afficher les supports" msgid "Show system information" msgstr "Afficher les informations système" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Afficher la vue d'édition 3D" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Afficher la prévisualisation des tranches 3D" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Afficher les réglages de filament" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "" "Afficher la liste complète des options de configuration d'impression SLA." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 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/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Afficher la liste des raccourcis clavier" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Afficher le plateau" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Afficher les réglages d'impression" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Afficher les réglages de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Afficher cette aide." @@ -11490,7 +11493,7 @@ msgstr "Simplifier le modèle" msgid "Single Extruder Multi Material" msgstr "Multi Material à extrudeur unique" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -11502,15 +11505,15 @@ msgstr "" "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:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Réglage MM pour extrudeur unique" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Paramètres multimatériaux pour extrudeur unique" -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Mode d'instance unique" @@ -11529,7 +11532,7 @@ msgstr "Taille" msgid "Size" msgstr "Taille" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Taille et coordonnées" @@ -11599,15 +11602,15 @@ msgstr "" msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r ne descendra pas en-dessous de cette vitesse." -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Découper" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Découper un fichier en G-code" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Découper un fichier en G-code, enregistrer sous" @@ -11624,16 +11627,16 @@ msgstr "Découper maintenant" msgid "Slice resolution" msgstr "Résolution de découpage" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 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:4417 +#: src/libslic3r/PrintConfig.cpp:4392 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:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -11650,13 +11653,13 @@ msgstr "Informations de découpage" msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "L'objet découpe \"%1%\" ressemble à un logo ou à un signe" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Découpe" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Découpe Effectuée !" @@ -11692,7 +11695,7 @@ msgstr "Découpe du modèle" msgid "Slicing supports" msgstr "Découpe des supports" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Lent" @@ -11700,7 +11703,7 @@ msgstr "Lent" 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:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Inclinaison lente" @@ -11708,7 +11711,7 @@ msgstr "Inclinaison lente" msgid "Small perimeters" msgstr "Périmètres courts" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Pourcentage de pilier petit diamètre" @@ -11808,7 +11811,7 @@ msgid "Some SLA materials were uninstalled." msgstr "Certains matériaux SLA ont été désinstallés." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -11836,7 +11839,7 @@ msgstr "" "Certains objets sont trop grands et ne peuvent pas être imprimés sans " "collision avec l'extrudeur." -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -11855,7 +11858,7 @@ msgstr "" "Certains préréglages sont modifiés et les modifications non enregistrées ne " "seront pas capturées par l'instantané de configuration." -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -12050,7 +12053,7 @@ msgid "Spiral vase" msgstr "Vase spirale" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Scinder" @@ -12119,13 +12122,13 @@ msgstr "Standard" msgid "Stars" msgstr "Étoiles" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "G-code de début" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Démarrer un nouveau projet" @@ -12133,7 +12136,7 @@ msgstr "Démarrer un nouveau projet" msgid "Start at height" msgstr "Hauteur de début" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Démarrer un nouveau processus de découpe" @@ -12184,7 +12187,7 @@ msgid "Status:" msgstr "État :" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Mode silencieux" @@ -12244,19 +12247,19 @@ msgstr "Générateur de Support" msgid "Support Generator" msgstr "Générateur de support" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Diamètre de la base du support" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Hauteur de la base du support" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Distance de sécurité de la base du support" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Tête du support" @@ -12310,7 +12313,7 @@ msgid "Support material/raft/skirt extruder" msgstr "Extrudeur pour support/raft/jupe" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Supports sur le plateau uniquement" @@ -12318,12 +12321,12 @@ msgstr "Supports sur le plateau uniquement" msgid "Support parameter change" msgstr "Changement des paramètres de support" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Pilier de support" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Densité des points de support" @@ -12332,16 +12335,16 @@ msgid "Support points edit" msgstr "Éditer les points de support" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Supports" @@ -12498,7 +12501,7 @@ msgstr "Prise d'un instantané de configuration" msgid "Taking a configuration snapshot failed." msgstr "Échec de la prise d'un instantané de configuration." -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Température" @@ -12524,7 +12527,7 @@ msgstr "Variation de température" msgid "Temperatures" msgstr "Températures" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "G-code de modèle personnalisé" @@ -12687,7 +12690,7 @@ msgstr "" "La tour de nettoyage est uniquement supportée pour plusieurs objets s'ils " "ont une même hauteur de couche" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -12744,7 +12747,7 @@ msgstr "" "dans le système de coordonnées seulement quand la rotation est incorporée " "aux coordonnées de l'objet." -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 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." @@ -12849,7 +12852,7 @@ msgstr "" msgid "The file does not exist." msgstr "Le fichier n'existe pas." -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -12886,7 +12889,7 @@ msgstr "" "Les caractères suivants ne sont pas autorisés par un système de fichiers " "FAT :" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -12943,14 +12946,14 @@ msgstr "" msgid "The following values were substituted:" msgstr "Les valeurs suivantes ont été remplacées :" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 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:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "La hauteur du cône de la base du pilier" @@ -12993,7 +12996,7 @@ 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:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -13001,7 +13004,7 @@ 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:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "La longueur maximum d'un pont" @@ -13026,7 +13029,7 @@ msgstr "" "La distance maximale à laquelle chaque point de la surface peut être décalé " "(dans les deux sens), mesurée perpendiculairement à la paroi de périmètre." -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -13061,7 +13064,7 @@ msgstr "" "bottom_solid_layers si nécessaire pour satisfaire l'épaisseur minimale de la " "coque inférieure." -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -13104,7 +13107,7 @@ msgstr "" "L'objet sera surélevé de ce nombre de couches, et du support sera généré en " "dessous." -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -13113,7 +13116,7 @@ msgstr "" "normal qui sont utilisés dans les zones problématiques où un pilier normal " "ne peut pas rentrer." -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13123,7 +13126,7 @@ msgstr "" "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/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -13135,7 +13138,7 @@ msgstr[1] "" "Les imprimantes physiques ci-dessous sont basées uniquement sur le " "préréglage que vous allez supprimer." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -13197,7 +13200,7 @@ msgstr "Le nom de fichier fourni n'est pas valide." msgid "The provided name is not valid;" msgstr "Le nom fourni n'est pas valide ;" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -13205,7 +13208,7 @@ msgstr "" "Le 3MF sélectionné contient un objet avec des supports FDM peints utilisant " "une version plus récente de PrusaSlicer et n'est pas compatible." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -13213,7 +13216,7 @@ msgstr "" "Le 3MF sélectionné contient un objet avec de la peinture multi-matériaux " "utilisant une version plus récente de PrusaSlicer et n'est pas compatible." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -13221,7 +13224,7 @@ msgstr "" "Le 3MF sélectionné contient un objet avec une jointure peinte utilisant une " "version plus récente de PrusaSlicer et n'est pas compatible." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -13268,7 +13271,7 @@ msgstr "" "L'objet sélectionné n'a pas pu être divisé car il ne contient qu'une seule " "partie solide." -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -13305,7 +13308,7 @@ msgstr "La taille de l'objet peut être spécifiée en pouces" msgid "The size of the object is zero" msgstr "La taille de l'objet est nulle" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -13385,7 +13388,7 @@ msgstr "Le nom fourni n'est pas valide ;" msgid "The supplied settings will cause an empty print." msgstr "Les réglages fournis vont entraîner une impression vide." -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "L'épaisseur du socle et de ses parois de cavité optionnelles." @@ -13788,11 +13791,11 @@ msgstr "" msgid "This is a default preset." msgstr "Ceci est un préréglage par défaut." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 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:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -13806,7 +13809,7 @@ msgid "This is a system preset." msgstr "Ceci est un préréglage système." #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 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 " @@ -14135,7 +14138,7 @@ msgstr "" "permettra de créer une sauvegarde de la configuration existante avant " "d'installer les fichiers compatibles avec ce %s." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14148,7 +14151,7 @@ msgstr "" "On peut décider de renflouer ou de substituer une valeur inconnue par une " "valeur par défaut de manière silencieuse ou verbeuse." -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14171,15 +14174,15 @@ msgstr "" "optimal de threads est légèrement supérieur au nombre de coeurs/processeurs " "disponibles." -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Incliner" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Inclinaison pour résine à haute viscosité" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Durée de l'inclinaison" @@ -14210,15 +14213,15 @@ msgstr "" "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:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Durée de l'inclinaison rapide" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Durée de l'inclinaison lente" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Temps de l'inclinaison super lente" @@ -14280,7 +14283,7 @@ msgstr "Outil" msgid "Tool #" msgstr "Outil #" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-code de changement d'outil" @@ -14302,7 +14305,7 @@ msgstr "Position de l'outil" msgid "Tool type" msgstr "Type d'outil" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Paramètres de changement d'outil pour les imprimantes multi-matériaux mono-" @@ -14327,7 +14330,7 @@ msgstr "" "Indice d'épaisseur de coque supérieure / inférieure : non disponible en " "raison de la hauteur de couche non valide." -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Vue du Dessus" @@ -14424,7 +14427,7 @@ msgstr "Déplacement" msgid "Triangles" msgstr "Triangles" -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14446,11 +14449,11 @@ msgstr "Type d'imprimante." msgid "Type:" msgstr "Type :" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "CADENAS OUVERT" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -14463,7 +14466,7 @@ msgstr "" "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:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -14506,11 +14509,11 @@ msgstr "Impossible de remplacer par plus d'un volume" msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Catégorie non définie" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Groupe non défini" @@ -14524,7 +14527,7 @@ msgstr "Soupassement" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Annuler" @@ -14725,7 +14728,7 @@ msgstr "Utiliser la caméra libre" msgid "Use inches" msgstr "Utiliser les pouces" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Utiliser un socle" @@ -14815,11 +14818,11 @@ 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:2644 +#: src/slic3r/GUI/Tab.cpp:2642 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:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Les valeurs de cette colonne sont pour le mode Silencieux" @@ -14865,7 +14868,7 @@ msgstr "Fournisseur :" msgid "Verbose G-code" msgstr "G-code commenté" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Version" @@ -14914,7 +14917,7 @@ msgstr "" "Accédez aux \"Préférences\" et cochez \"%1%\"\n" "pour modifier votre choix." -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Visualisez un G-code déjà découpé et enregistré" @@ -14939,7 +14942,7 @@ msgstr "Volumes dans l'Objet réorganisés" msgid "Volumetric" msgstr "Volumétrique" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Indications du débit volumétrique non disponible" @@ -14962,17 +14965,17 @@ msgstr "Vitesse volumétrique" msgid "WARNING:" msgstr "ATTENTION :" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "PUCE BLANCHE" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 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:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -14980,7 +14983,7 @@ 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -14988,7 +14991,7 @@ msgstr "" "L'icône PUCE BLANCHE indique que la valeur est la même que pour le dernier " "préréglage sauvegardé." -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Épaisseur de la paroi" @@ -15155,7 +15158,7 @@ msgstr "" "exprimera cette quantité de filament en plus. Ce réglage est rarement " "nécessaire." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -15170,17 +15173,19 @@ msgstr "" "longueur de ces périmètres centraux, mais peut laisser des trous ou " "entraîner une sur-extrusion." -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" "Lors de la transition entre différents nombres de périmètres à mesure que la " "pièce s'amincit, un certain espace est alloué pour diviser ou joindre les " -"segments de périmètre." +"segments de périmètre. Si elle est exprimée en pourcentage (par exemple " +"100%), elle sera calculée en fonction du diamètre de la buse." -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Mot entier" @@ -15192,7 +15197,7 @@ msgstr "Largeur" msgid "Width (mm)" msgstr "Largeur (mm)" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 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 " @@ -15202,17 +15207,17 @@ msgstr "" msgid "Width of a wipe tower" msgstr "Largeur d'une tour de nettoyage" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 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:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Largeur de l'affichage" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -15226,7 +15231,7 @@ msgstr "" "épais que l'élément lui-même. Si elle est exprimée en pourcentage (par " "exemple 85%), elle sera calculée en fonction du diamètre de la buse." -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -15270,7 +15275,7 @@ msgstr "Tour de nettoyage - Ajustement du volume de purge" msgid "Wipe tower brim width" msgstr "Largeur de la bordure de la tour de nettoyage" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Paramètres de la tour de nettoyage" @@ -15336,7 +15341,7 @@ msgstr "" "\n" "Ensembles de configuration mis à jour :" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "" "Rédiger des informations au sujet du modèle en direction de la console." @@ -15429,7 +15434,7 @@ msgstr "" "Vous pouvez inscrire ici vos commentaires personnels. Ce texte sera ajouté " "au commentaire en entête du G-Code." -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 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 " @@ -15603,7 +15608,7 @@ msgstr "" "Vos changements actuels supprimeront toutes les changement enregistrés de " "l'extrudeur (outil)." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Votre fichier a été réparé." @@ -15642,7 +15647,7 @@ msgstr "Décalage Z" msgid "Z travel" msgstr "Déplacement Z" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zig-Zag" @@ -15764,7 +15769,7 @@ msgstr "profil d'impression par défaut" msgid "default value" msgstr "valeur par défaut" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "supprimer" @@ -15842,7 +15847,7 @@ msgid "flow rate is maximized" msgstr "le débit est maximisé" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -15867,7 +15872,7 @@ msgstr "g" msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" @@ -15884,7 +15889,7 @@ msgid "in" msgstr "in" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -15897,7 +15902,7 @@ msgstr "" "groupe d'options actuel sur les valeurs du système (ou par défaut)." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -15906,7 +15911,7 @@ msgstr "" "défaut) pour le groupe d'options en cours" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -15943,11 +15948,11 @@ msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "est basé sur Slic3r par Alessandro Ranellucci et la communauté RepRap." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "est sous licence" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" @@ -15971,7 +15976,7 @@ msgstr "Version maximum de PrusaSlicer" msgid "min PrusaSlicer version" msgstr "Version minimum de PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" @@ -16011,19 +16016,18 @@ msgstr "ml" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -16037,8 +16041,9 @@ msgstr "mm (zéro pour désactiver)" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm ou %" @@ -16100,7 +16105,7 @@ msgstr "modèle" msgid "modified" msgstr "modifié" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "prix/bouteille" @@ -16158,7 +16163,7 @@ msgstr "imprimer" msgid "printer model" msgstr "modèle de l'imprimante" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "retirer" @@ -16179,11 +16184,11 @@ msgstr "nécessite min. %s et max. %s" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -16306,8 +16311,8 @@ msgstr "échec de l'écriture du rappel" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" diff --git a/resources/localization/hu/PrusaSlicer_hu.po b/resources/localization/hu/PrusaSlicer_hu.po index 3c14607f24..6d256cec85 100644 --- a/resources/localization/hu/PrusaSlicer_hu.po +++ b/resources/localization/hu/PrusaSlicer_hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Az összetevők szerzői joga" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Szerzői jog" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,33 +35,33 @@ msgstr "" "A következő programok (könyvtárak) licencszerződései az alkalmazás " "licencszerződésének részét képezik" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Szerző: %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Verzió" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "engedélyezve van a következő szerint" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, 3-as verzió" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" "A PrusaSlicer alapja Alessandro Ranellucci és a RepRap közösség Slic3r-je." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -71,7 +71,7 @@ msgstr "" "Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik és még sokan mások " "közreműködésével." -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Verzióinformáció Másolása" @@ -214,7 +214,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "Méret" @@ -272,19 +272,18 @@ msgstr "A 0,0 G-kód koordináta távolsága a téglalap bal elülső sarkától #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -319,7 +318,7 @@ msgid "Load shape from STL..." msgstr "Alakzat betöltése STL-ből..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Beállítások" @@ -332,7 +331,7 @@ msgid "Load..." msgstr "Betöltés..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Eltávolítás" @@ -558,19 +557,19 @@ msgstr "Váltsak egyenes vonalú kitöltési mintára?" msgid "Infill" msgstr "Kitöltés" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "A fej benyúlása nem lehet nagyobb, mint a fej szélessége." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Érvénytelen Fej benyúlás" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "A tűfej átmérőjének kisebbnek kell lennie, az oszlop átmérőjénél." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Érvénytelen tűfej átmérő" @@ -679,7 +678,7 @@ msgid "Standard" msgstr "Standard" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Összes" @@ -952,7 +951,7 @@ msgstr "A %s által támogatott egyéb gyártó kiválasztása" msgid "Firmware Type" msgstr "Firmware Típus" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" @@ -1270,7 +1269,7 @@ msgstr "Végrahajtás" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Visszavonás" @@ -1936,7 +1935,7 @@ msgstr "Megerősítés" msgid "Cancelling..." msgstr "Visszavonás..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Alakzat Galéria" @@ -1952,7 +1951,7 @@ msgstr "Hozzáadás a tárgyasztalhoz" msgid "Add selected shape(s) to the bed" msgstr "Kijelölt alakzat(ok) hozzáadása a tárgyasztalhoz" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Hozzáadás" @@ -1962,7 +1961,7 @@ msgstr "Egy vagy több egyedi alakzat hozzáadása" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Törlés" @@ -2146,8 +2145,8 @@ msgstr "Mozgás" msgid "Extrusion" msgstr "Extrudálás" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Visszahúzás" @@ -2202,7 +2201,7 @@ msgstr "Nyomtatási beállítások" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -2426,7 +2425,7 @@ msgid "Add..." msgstr "Hozzáadás..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Összes törlése" @@ -2474,7 +2473,7 @@ msgid "Next Undo action: %1%" msgstr "Következő visszavonás művelet: %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Mégis" @@ -2516,7 +2515,7 @@ msgid "Selection-Remove from rectangle" msgstr "Kijelölés – Eltávolítás a téglalapból" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Vágás" @@ -2777,7 +2776,7 @@ msgid "Quality" msgstr "Minőség" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Zárótávolság" @@ -2882,7 +2881,7 @@ msgstr "Mozgatás" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Forgatás" @@ -2899,7 +2898,7 @@ msgstr "Alkalmaz" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Skálázás" @@ -2954,7 +2953,7 @@ msgstr "" "engedélyezett" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Hiba" @@ -3040,7 +3039,7 @@ msgid "Minimal points distance" msgstr "Pontok minimális távolsága" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Támadztó pontok sűrűsége" @@ -3894,7 +3893,7 @@ msgid "Speed" msgstr "Sebesség" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3917,52 +3916,51 @@ msgstr "Szoknya és karima" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Haladó" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Támasztékok" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Párna" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Üregesítés" @@ -4105,7 +4103,7 @@ msgid "Revert conversion from meters" msgstr "Konvertálás visszavonása (metrikus mértékegységről)" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Összevonás" @@ -4166,7 +4164,7 @@ msgid "Split the selected object into individual parts" msgstr "A kijelölt objektum különálló alkatrészekre bontása" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Felbontás" @@ -4827,11 +4825,11 @@ msgstr "Magasság" msgid "Width" msgstr "Szélesség" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Ventilátor sebesség" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Hőmérséklet" @@ -5132,7 +5130,7 @@ msgstr "" msgid "Attention!" msgstr "Figyelem!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Gyorsbillentyűk" @@ -5171,7 +5169,7 @@ msgstr "" "Konfiguráció betöltése ini/amf/3mf/gcode fájlból, és hozzáadás a meglévőhöz" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "G-kód exportálása" @@ -5527,13 +5525,13 @@ msgstr "Extruder számának beállítása a kiválasztott elemekhez" msgid "Objects List" msgstr "Objektumok Listája" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "G-kód fájl megnyitása" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Tárgyasztal újratöltése lemezről" @@ -5570,7 +5568,7 @@ msgid "Show/Hide G-code window" msgstr "G-kód ablak megjelenítése/elrejtése" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Előnézet" @@ -5654,7 +5652,7 @@ msgid "Keyboard shortcuts" msgstr "Gyorsbillentyűk" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Új PrusaSlicer példány megnyitása" @@ -5662,11 +5660,11 @@ msgstr "Új PrusaSlicer példány megnyitása" msgid "G-code preview" msgstr "G-kód előnézet" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "G-kód nézegető megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "PrusaSlicer megnyitása" @@ -5692,13 +5690,13 @@ msgid "Print Settings" msgstr "Nyomtatási Beállítások" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Alapanyag Beállítások" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Filament Beállítások" @@ -5781,7 +5779,7 @@ msgstr "A Szerzőről szóló párbeszédpanel megnyitása" msgid "Show Tip of the Day" msgstr "Nap Tippje Mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5789,94 +5787,94 @@ msgstr "" "Megnyitja a nap tippje értesítést a jobb alsó sarokban, vagy egy másik " "tippet jelenít meg, ha már nyitva van." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "A billentyűparancsok listájának megjelenítése" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Izometrikus" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Izometrikus nézet" #. 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "Felül" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Felülnézet" #. 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:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "Alul" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Alulnézet" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Elöl" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Elölnézet" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Hátul" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Hátulnézet" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Bal" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Balnézet" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Jobb" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Jobbnézet" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "Új Projekt" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Új projekt elkezdése" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "Projekt megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Projekt fájl megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Legutóbbi projektek" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5884,510 +5882,510 @@ msgstr "" "A kiválasztott projekt már nem elérhető.\n" "El szeretné távolítani a legutóbbi projektek listájáról?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "Projekt mentése" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Aktuális projekt fájl mentése" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Projekt mentése másként" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Aktuális projekt fájl mentése másként" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "STL/OBJ/AM&F/3MF Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Modell betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "STL (Angolszász mértékegységek) Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Angolszász mértékegységekkel mentett modell importálása" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "SL1 / SL1S Archív Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "SL1 / Sl1S archív betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Konfiguráció Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Korábban exportált konfigurációs fájl betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Konfiguráció Importálása Projektből" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Konfiguráció betöltése projekt fájlból" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Konfigurációs Csomag Importálása" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Előbeállítások betöltése konfigurációs csomagból" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "Importálás" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "G-kód Exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Az aktuális tárgyasztal exportálása G-kódként" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "G-kód Küldése" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Az aktuális tárgyasztal küldése nyomtatóra G-kódként" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "G-kód Exportálása SD Kártyára / Flash memóriára" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Tárgyasztal Exportálása G-kódként SD Kártyára / Flash memóriára" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Tárgyasztal Exportálása STL-ként" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Tárgyasztal Exportálása STL-ként" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Tárgyasztal Exportálása STL-ként támasztékokkal együtt" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Tárgyasztal Exportálása STL-ként támasztékokkal együtt" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Szerszámpálya Exportálása OBJ-ként" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Szerszámpálya Exportálása OBJ-ként" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Beállítások Exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Aktuális beállítások exportálása fájlba" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Konfigurációs Csomag Exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Az összes előbeállítás exportálása fájlba" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Konfigurációs Csomag Exportálása Fizikai Nyomtatókkal együtt" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "Konfigurációs csomag exportálása a fizikai nyomtatókkal együtt" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "Exportlálás" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "SD Kártya / Flash meghajtó eltávolítása" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "SD-kártyát / Flash meghajtót eltávolítása a G-kódot exportálása után." -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Gyors Szeletelés" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Fájl szeletelése G-kódba" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Gyors Szeletelés és Mentés Másként" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Fájl szeletelése G-kódba, mentés másként" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Az Előző Gyors Szeletetelés Megismétlése" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Az előző gyors szeletetelés megismétlése" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Újra)Szeletelés Most" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Új szeletelés indítása" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "STL fájl javítása" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "STL fájl automatikus javítása" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "G-Kód Előnézet" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "Bezárás" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Kilépés %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "Összes kijelőlése" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Az összes objektum kijelölése" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "Összes Kijelölés Megszüntetése" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Az összes objektum kijelölésének megszüntetése" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Kijelöltek törlése" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Az összes kijelölt objektum törlése" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Összes törlése" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Az összes objektum törlése" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "Visszavonás" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "Mégis" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "Másolás" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Kijelöltek másolása a vágólapra" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&Beillesztés" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Beillesztés a vágólapról" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Újratöltés lemezről" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Keresés" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Keresés a beállításokban" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "Tárgyasztal Fül" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Tárgyasztal mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Nyomtatási Beállítások Fül" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Nyomtatási beállítások mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Filament Beállítások Fül" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Filament beállítások mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Nyomtató Beállítások Fül" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Nyomtató beállítások mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "3D szerkesztő nézet mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Előnézet" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "3D szeletek nézet mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Dialógusablak megnyitása az Alakzat Galéria szerkesztéséhez" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Nyomtató-feltöltési várakozási sor" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "A Nyomtató-feltöltési várakozási sor ablak megjelenítése" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Új Példány Megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Előbeállítások Összehasonlítása" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Előbeállítások összehasonlítása" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Címkék Mutatása" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Objektum/példánycímkék megjelenítése 3D-s jelenetben" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "Oldalsáv Összecsukása" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "&Az oldalsáv összecsukása" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "Teljes Képernyő" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Teljes képernyő" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Fájl" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Szerkesztés" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Ablak" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Nézet" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Segítség" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&G-kód megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "PrusaSlicer Megnyitása" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "Exportálás" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "Nyomtatásra küldés" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Anyagbeállítások Lap" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Válasszon egy fájlt a szeleteléshez (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Nincs korábban szeletelt fájl." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "A korábban szeletelt fájl (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") nem található." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Fájl Nem Található" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s fájl mentése másként:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-kód" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Zip fájl mentése másként:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Szeletelés" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Feldolgozás %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% szeletelése sikeresen megtörtént." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Szeletelés Kész!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Válassza ki a javítandó STL fájlt:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" "OBJ fájl mentése (kevésbé hajlamos a koordinációs hibákra, mint az STL) a " "másként:" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "A fájlja javításra került." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Javítás" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Konfiguráció mentése a következőként:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Konfigurációs fájl betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "A Betöltendő konfiguráció kiválasztása:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Konfigurációs csomag exportálása" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6395,15 +6393,15 @@ msgstr "" "Egyes előre beállított értékek módosultak, és a nem mentett módosítások nem " "kerülnek exportálásra a konfigurációs csomagba." -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Előbeállítási csomag mentése a következőként:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Konfigurációs csomag betöltése" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d előbeállítás sikeresen importálva." @@ -6630,8 +6628,8 @@ msgstr "Példányok" msgid "Instance %d" msgstr "Példány %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Rétegek" @@ -6710,7 +6708,7 @@ msgstr "A nyomtató leíró elnevezése" msgid "Add preset for this printer device" msgstr "Előbeállítás hozzáadása ehhez a nyomtatóeszközhöz" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Nyomtató feltöltés" @@ -6872,7 +6870,7 @@ msgid "Select what kind of support do you need" msgstr "Válassza ki, milyen támaszra van szüksége" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Támaszték csak tárgyasztalról" @@ -6972,7 +6970,7 @@ msgid "(including spool)" msgstr "(beleértve a spulnit)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Költség" @@ -7495,10 +7493,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "Beillesztés Vágólapról" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Általános" @@ -8022,7 +8020,7 @@ msgid "Add/Remove presets" msgstr "Előbeállítás Hozzáadása/Eltávolítása" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Fizikai nyomtató hozzáadása" @@ -8034,7 +8032,7 @@ msgstr "Előbeállítás szerkesztése" msgid "Change extruder color" msgstr "Az Extruder színének változtatása" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Fizikai nyomtató szerkesztése" @@ -8348,11 +8346,11 @@ msgstr "EGYÁLTALÁN NINCS TÖMÖRÍTÉS" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -8466,12 +8464,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "Csak váltson a(z) \"%1%\" előbeállításra" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Lopakodó" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normál" @@ -8739,7 +8737,7 @@ msgstr "teljes profil név" msgid "symbolic profile name" msgstr "szimbolikus profil név" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Rétegek és kerületek" @@ -8827,7 +8825,7 @@ msgstr "Átfedés" msgid "Flow" msgstr "Áramlás" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Egyéb" @@ -8835,52 +8833,52 @@ msgstr "Egyéb" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Kimeneti lehetőségek" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Szekvenciális nyomtatás" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Extruder körüli szabad tér" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Kimeneti fájl" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Utófeldolgozó szkriptek" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Megjegyzések" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Függőségek" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Profilfüggőségek" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "Az utófeldolgozási szkriptek a G-kód fájlt helyben módosítják." -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8899,83 +8897,83 @@ msgstr[1] "" "Kérjük, távolítsa el ezeket, mivel problémákat okozhat a G-kód " "megjelenítésében és a nyomtatási idő becslésében." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Fenntartott kulcsszavakat találtam az" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Filament Felülbírálások" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Fúvóka" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Tárgyasztal" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Hűtés" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Engedélyezés" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Ventilátor Beállítások" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Hűtési küszöbök" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Filament tulajdonságok" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Nyomtatási sebesség felülbírálás" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Törlőtorony paraméterek" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Szerszámváltási paraméterek egy extruderes Több Anyagos (MM) nyomtatónál" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Tömörítési beállítások" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Egyéni G-kód" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "G-kód kezdete" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "G-kód vége" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Térfogatáramlási tippek nem állnak rendelkezésre" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8997,20 +8995,20 @@ msgstr "" "beállításai lapon a \"fogaskerék\" ikonra kattint. A fizikai nyomtató " "profilok a PrusaSlicer/physical_printer könyvtárban kerülnek tárolásra." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Méret és koordináták" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Képességek" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "A nyomtató Extrudereinek száma." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -9021,64 +9019,64 @@ msgstr "" "ezért minden extruder átmérőjének azonosnak kell lennie.\n" "Szeretné az összes extruder fúvókaátmérőjét az első extruderéhez igazítani?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Fúvóka Átmérő" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-kód Rétegváltás Előtt" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-kód Rétegváltás Után" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-kód Szerszám Váltás" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-kód Objektumok Között (egymás utáni nyomtatáshoz)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-kód Színváltás" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G-kód Nyomtatás Szüneteltetése" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "G-kód Egyedi Minta" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Kijelző" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Billentés" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Billentési idő" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Korrekciók" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Expozíció" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -9087,39 +9085,39 @@ msgstr "Expozíció" msgid "Machine limits" msgstr "Gépi limitek" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Ez az oszlop a Normál módra vonatkozik" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Ez az oszlop a Lopakodó módra vonatkozik" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Maximum előtolások" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Maximum gyorsulások" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Rántás korlátok" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Minimum előtolások" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Egy extruders MM beállítása" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Egyetlen extruder többanyagú paraméterei" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9127,19 +9125,19 @@ msgstr "" "Ez egy egy-extruderes, többféle anyagot használó nyomtató, az összes " "extruder átmérője az új értékre lesz beállítva. Szeretné folytatni?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Rétegmagasság korlátok" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Pozíció (több extruderes nyomtatók esetében)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Csak a Z tengely emelése" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9147,11 +9145,11 @@ msgstr "" "Visszahúzás, ha a szerszám ki van kapcsolva (több extruderes beállítások " "speciális beállításai)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Filament színének visszaállítása" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9161,31 +9159,31 @@ msgstr "" "\n" "Kikapcsolja a Törlést, hogy engedélyezze a Firmware visszahúzást?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Firmware visszahúzás" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Új nyomtató előbeállítás kiválasztva" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Független_" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "eltávolít" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "törlés" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "Ez az utolsó előbeállítás ehhez a fizikai nyomtatóhoz." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9194,7 +9192,7 @@ msgstr "" "Biztos, hogy törölni szeretné a \"%1%\" előbeállítást a \"%2%\" fizikai " "nyomtatóról?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9206,7 +9204,7 @@ msgstr[1] "" "Az alábbi fizikai nyomtatók azon az előbeállításon alapulnak, amelyet " "törölni készül." -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9217,7 +9215,7 @@ msgstr[1] "" "Vegye figyelembe, hogy a kiválasztott előbeállítás törlődik ezekről a " "nyomtatókról is." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9231,7 +9229,7 @@ msgstr[1] "" "Az alábbi fizikai nyomtatók csak azon az előbeállításon alapulnak, amelyet " "törölni készül." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9243,57 +9241,57 @@ msgstr[1] "" "Vegye figyelembe, hogy ezek a nyomtatók is törlődnek a kiválasztott " "előbeállítás törlése után." -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Biztos, hogy a kiválasztott előbeállítást %1% szeretné?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Előbeállítás" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Beállítás" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Keresés" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Csere erre" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Reguláris kifejezés" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Nagy- és kisbetű érzékeny" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Teljes szó" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Egysoros egyeztetés" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "A gépi korlátok a G-kódba kerülnek, és a nyomtatási idő becslésére " "szolgálnak." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -9303,7 +9301,7 @@ msgstr "" "felhasználásra kerülnek. A nyomtató más gépi korlátokat alkalmazhat, ezért a " "nyomtatási idő becslése pontatlan lehet." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9311,12 +9309,12 @@ msgstr "" "A gépi korlátok nincsenek beállítva, ezért a nyomtatási idő becslése " "pontatlan lehet." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "ZÁRT LAKAT" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9324,12 +9322,12 @@ msgstr "" "azt jelzi, hogy a beállítások megegyeznek az aktuális opciócsoport rendszer- " "(vagy alapértelmezett) értékeivel" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "NYITOTT LAKAT" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9341,12 +9339,12 @@ msgstr "" "Kattintson a NYITOTT LAKAT ikonra az aktuális opciócsoport összes " "beállításának visszaállításához a rendszer (vagy az alapértelmezett) értékre." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "SZÜRKE PÖTTY" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -9355,12 +9353,12 @@ msgstr "" "értéket jelez,\n" "jobb gomb esetén: azt jelzi, hogy a beállításokat nem módosították." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "VISSZA NYÍL" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9372,7 +9370,7 @@ msgstr "" "Kattintson a VISSZA NYÍL ikonra az aktuális opciócsoport összes " "beállításának visszaállításához az utoljára mentett állapotra." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9380,7 +9378,7 @@ msgstr "" "ZÁRT LAKAT ikon azt jelzi, hogy a beállítások megegyeznek az aktuális " "opciócsoport rendszer- (vagy alapértelmezett) értékeivel" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9393,13 +9391,13 @@ msgstr "" "Kattintson az aktuális opciócsoport összes beállításának visszaállításához a " "rendszer (vagy az alapértelmezett) értékre." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "A SZÜRKE PÖTTY ikon a rendszeren kívüli (vagy nem alapértelmezett) " "előbeállítást jelzi." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9407,7 +9405,7 @@ msgstr "" "A SZÜRKE PÖTTY ikon azt jelzi, hogy a beállítások megegyeznek az aktuális " "opciócsoport utoljára mentett előbeállításával." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9419,7 +9417,7 @@ msgstr "" "Kattintson az aktuális opciócsoport összes beállításának visszaállításához " "az utoljára mentett állapotra." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9427,7 +9425,7 @@ msgstr "" "ZÁRT LAKAT ikon azt jelzi, hogy az érték megegyezik a rendszer (vagy " "alapértelmezett) értékével." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9438,7 +9436,7 @@ msgstr "" "Kattintson az aktuális érték visszaállításához a rendszer (vagy " "alapértelmezett) értékre." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9446,7 +9444,7 @@ msgstr "" "A SZÜRKE PÖTTY azt jelzi, hogy az érték megegyezik az utoljára mentett " "előbeállítással." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9457,31 +9455,31 @@ msgstr "" "Kattintson az aktuális érték visszaállításához az utoljára mentett " "beállításra." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Anyag" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Anyag nyomtatási profil" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Támasztó fej" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Támasztó pillér" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "A tartópálcák és a csomópontok csatlakoztatása" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Automatikus generálás" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9491,11 +9489,11 @@ msgstr "" "kategóriában. \n" "\"%1%\" engedélyezéséhez kapcsolja ki a \"%2%\"-ot." -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Objektum magassága" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Párna az objektum körül" @@ -9589,7 +9587,7 @@ msgstr "" "hogy újra rákérdezzen a nem mentett módosításokra." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9660,41 +9658,41 @@ msgstr "" "következő el nem mentett változtatásokat tartalmazza:" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Extruderek száma" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Előbeállítások kiválasztása az összehasonlításhoz" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Minden előbeállítás megjelenítése (beleértve az inkompatibiliseket is)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Bal Előbeállítás Értéke" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Jobb Előbeállítás Értéke" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Az egyik előbeállítás nem található" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" "Az összehasonlított előbeállítások különböző nyomtatási technológiával " "rendelkeznek" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Az előbeállítások megyegyeznek" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9703,11 +9701,11 @@ msgstr "" "Erre a gombra kattintva ugyanazt az előbeállítást választhatja ki a jobb és " "a bal előbeállításhoz." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Nem definiált kategória" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Nem definiált csoport" @@ -10394,7 +10392,7 @@ msgstr "" "Nem lehet kiszámítani a %1% extrudálási szélességet: %2%\" változó nem " "elérhető." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10403,7 +10401,7 @@ msgstr "" "A kiválasztott 3mf fájl a %1% egy újabb verziójával lett mentve, és nem " "kompatibilis." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10411,7 +10409,7 @@ msgstr "" "A kiválasztott 3MF a PrusaSlicer újabb verziójával készült FDM támaszték " "festett objektumot tartalmaz, és nem kompatibilis." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10419,7 +10417,7 @@ msgstr "" "A kiválasztott 3MF a PrusaSlicer egy újabb verziójával készült varrat " "festett objektumot tartalmaz, és nem kompatibilis." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -11230,8 +11228,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -11246,9 +11244,8 @@ msgstr "Ez a ventilátorsebesség minden híd és túlnyúlás során érvényes #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -11469,8 +11466,8 @@ msgstr "" msgid "Default print profile" msgstr "Alapértelmezett nyomtatási profil" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11623,8 +11620,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm vagy %" @@ -11710,7 +11708,7 @@ msgid "Extruder Color" msgstr "Extruder színe" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Ezt csak a Slic3r felületén használjuk vizuális segítségként." @@ -11809,7 +11807,7 @@ msgstr "" msgid "approximate seconds" msgstr "becsült másodperc" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Szín" @@ -11988,8 +11986,8 @@ msgstr "" "tolómérőt, és végezzen többszöri mérést az izzószál mentén, majd számítsa ki " "az átlagot." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Sűrűség" @@ -12056,7 +12054,7 @@ msgstr "" msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Ismeretlen)" @@ -13860,7 +13858,7 @@ msgstr "" "Ezzel a beállítással elforgathatja a támaszanyag mintázatát a vízszintes " "síkon." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -14511,33 +14509,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14549,11 +14549,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14562,63 +14562,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14627,63 +14599,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Kijelző szélesség" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Kijelző szélessége" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Kijelző magasság" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Kijelző magassága" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Pixelek száma" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Pixelek száma X irányban" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Pixelek száma Y irányban" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Kijelző vízszintes tükrözése" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Tükrözés vízszintesen" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "A kimeneti képek vízszintes tükrözése" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Kijelző függőleges tükrözése" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Tükrözés függőlegesen" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "A kimeneti képe függőleges tükrözése" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Kijelző tájolás" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -14693,55 +14665,55 @@ msgstr "" "mód megfordítja a kijelző szélességi és magassági paramétereinek jelentését, " "és a kimeneti képek 90 fokkal el lesznek forgatva." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Tájkép" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Portré" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Gyors" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Gyors billentés" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "A gyors billenés időtartama" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Lassú" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Lassú billentés" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "A lassú billentés időtartama" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Felület kitöltés" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14752,40 +14724,40 @@ msgstr "" "meghaladja a megadott értéket, \n" "akkor lassú billenés, ellenkező esetben gyors billenés fog történni" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Nyomtató méretkorrekciója" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Nyomtató méretkorrekciója az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Nyomtató méretkorrekciója az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Nyomtató méretkorrekciója az Y tengelyen" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Printer scaling correction in Y axis" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Nyomtató méretkorrekciója a Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Nyomtató méretkorrekciója a Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Nyomtató abszolút korrekció" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14793,21 +14765,21 @@ msgstr "" "A szeletelt 2D poligonokat megnöveli vagy összezsugorítja a korrekció " "előjelének megfelelően." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Elefántláb minimális szélesség" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Az elefántláb-kompenzáció során megőrzendő jellemzők minimális szélessége." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Nyomtató Gamma korrekció" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14818,43 +14790,43 @@ msgstr "" "viselkedés megszünteti az élsimítást anélkül, hogy a sokszögek lyukai " "elvesznének." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA anyag típus" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Első réteg magasság" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Flakon térfogata" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "A flakon súlya" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "pénz/flakon" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Áttűnő rétegek" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14862,103 +14834,103 @@ msgstr "" "A szükséges rétegek száma a kezdeti expozíciós időről az expozíciós időre " "való átmenethez" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Minimális expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Maximum expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Minimális kezdeti expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Maximum kezdeti expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Kezdeti expozíciós idő" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Terjeszkedés miatti korrekció" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Terjeszkedés miatti korrekció az X tengelyen" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Terjeszkedés miatti korrekció az Y tengelyen" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Terjeszkedés miatti korrekció az Z tengelyen" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA anyag megjegyzések" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "Az SLA anyaggal kapcsolatos jegyzeteit ide írhatja." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Alapértelmezett SLA anyagprofil" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Támasztók generálása" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Támasztók generálása a modellekhez" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Tűfej elülső átmérője" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "A fej mutató oldalának átmérője" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Fej benyúlás" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "Mennyire kell a tűhegynek benyúlnia a modell felületébe" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Tűfej szélessége" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "Szélesség a hátsó gömb középpontjától az első gömb középpontjáig" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Pillér átmérője" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "A támasztó pillérek átmérője mm-ben" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Kis pillér átmérője százalék" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -14966,11 +14938,11 @@ msgstr "" "A kisebb pillérek normál pillérek átmérőjéhez viszonyított aránya, amelyeket " "olyan problémás helyeken használnak, ahol egy normál pillér nem fér el." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Max hidak egy pilléren" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -14978,11 +14950,11 @@ msgstr "" "Az egy pilléren elhelyezhető hidak maximális száma. A hidak tartják a " "támasztópont tűfejeit, és kis ágakként csatlakoznak a pillérekhez." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Pillér összekötési mód" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14992,23 +14964,23 @@ msgstr "" "kereszt (dupla cikk-cakk) vagy dinamikus, amely automatikusan vált az első " "kettő között a két pillér távolságától függően." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Cikk-Cakk" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Kereszt" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dinamikus" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Pillérszélesítési tényező" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -15017,27 +14989,27 @@ msgstr "" "sugarat. A nulla azt jelenti, hogy nincs növelés, az egy pedig teljes " "növelést jelent." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "A támasztó alapjának átmérője" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "A pillér alapjának átmérője mm-ben" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "A támasztó alapjának magassága" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "A pillér alapkúpjának magassága" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "A támasztó alapjának biztonsági távolsága" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -15047,28 +15019,28 @@ msgstr "" "nulla magasságú módban van értelme, ahol a modell és a pillér közé egy ennek " "a paraméternek megfelelő rés kerül beillesztésre." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Kritikus szög" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "" "Az alapértelmezett szög a támasztópálcák és csomópontok összekötéséhez." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Híd max. hossza" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "A híd maximális hossza" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Maximális oszlop áthidalási távolság" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -15076,7 +15048,7 @@ msgstr "" "Két oszlop maximális távolsága, amelyeket még össze lehet kötni egymással. A " "nulla érték tiltja az oszlopok kaszkádosítását." -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -15084,40 +15056,40 @@ msgstr "" "Mennyire emeljék fel a támasztók a megtámasztott objektumot. Ha a \"Párna az " "objektum körül\" opció engedélyezve van, ez az érték nem számít." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Ez a támasztási pontok sűrűségének relatív mérőszáma." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "A támasztási pontok minimális távolsága" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "" "Nem kerülnek támasztási pontok ennél a küszöbértéknél közelebb egymáshoz." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Párna használata" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Párna hozzáadása a támasztott modell alá" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Párna falvastagság" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "A párna és az opcionális üreg falainak vastagsága." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Párna fal magassága" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -15129,19 +15101,19 @@ msgstr "" "szívóhatást fejthetnek ki az üregben, ami megnehezíti a nyomtatás lehúzását " "a kádfóliáról." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Párna karima mérete" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "Milyen messzire terjedjen ki a párna az körbevett geometria körül" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Maximális összeolvadási távolság" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -15152,11 +15124,11 @@ msgstr "" "milyen messze legyen egymástól. Ha ennél közelebb vannak egymáshoz, akkor " "egy párnává olvadnak össze." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Párnafal meredekség" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15164,80 +15136,80 @@ msgstr "" "A párnafal meredeksége a tárgyasztal síkjához képest. A 90 fok egyenes falat " "jelent." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" "Hozzon létre párnát az objektum körül és hagyja figyelmen kívül a támasztók " "magasságát" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Párna az objektum körül mindenhol" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Párna kényszerítése az objektum körül mindenhol" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Párna objektum hézag" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" "Az objektum alja és a generált párna közötti hézag nulla magasságú módban." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Párna objektum összekötő lépésköz" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "Az objektumot és a generált párnát összekötő pálcák közötti távolság." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Párna objektum összekötő szélessége" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" "Az objektumot és a generált párnát összekötő csatlakozó pálcák szélessége." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Párna objektum összekötő benyúlása" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Az apró összekötőknek mennyire kell benyúlniuk a modell testébe." -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Üregesítés engedélyezése" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Üregesítse a modellt, hogy üres legyen a belseje" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Falvastagság" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Az üreges modell minimális falvastagsága." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Pontosság" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15245,7 +15217,7 @@ msgstr "" "Teljesítmény kontra számítási pontosság. Az alacsonyabb értékek nemkívánatos " "műtermékeket okozhatnak." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -15259,11 +15231,11 @@ msgstr "" "lekerekíti a belső teret. Nulla értéknél a belső tér leginkább a külsőhöz " "fog hasonlítani." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Nyomtatási sebesség" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15273,65 +15245,65 @@ msgstr "" "nyomtatási profilra lehet szükség. Lelassítja a billenőmozgást, és " "késleltetést ad hozzá az expozíció előtt." -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "OBJ exportálása" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Modell(ek) exportálása OBJ formátumban." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "SLA exportálása" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" "Szeletelje fel a modellt és exportálja az SLA nyomtatási rétegeket PNG " "formátumban." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "3MF exportálása" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Modell(ek) exportálása 3MF formátumban." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "AMF exportálása" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Modell(ek) exportálása AMF formátumban." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "STL exportálása" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Modell(ek) exportálása STL formátumban." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Szeletelje a modellt és exportálja a szerszámpályákat G-kódként." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "G-kód nézegető" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Egy már felszeletelt és elmentett G-kód megjelenítése" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Szeletelés_" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15339,73 +15311,73 @@ msgstr "" "A modell szeletelése FFF-, vagy SLA-ként a printer_technology konfigurációs " "érték alapján." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Súgó" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Ennek a súgónak a megjelenítése." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Súgó (FFF lehetőségek)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "" "A nyomtatási/G-kód konfigurációs lehetőségek teljes listájának megjelenítése." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Súgó (SLA lehetőségek)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "" "Az SLA nyomtatási konfigurációs beállítások teljes listájának megjelenítése." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Modell Információ Kimenet" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "A modellre vonatkozó információk írása a konzolra." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Konfigurációs fájl mentése" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "A konfiguráció mentése a megadott fájlba." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "XY igazítása" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "A modell igazítása egy megadott ponthoz." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "A modellt elvágása egy megadott Z-nél." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Középre igazítás_" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "A nyomtatás középre igazítása a megadott középpont körül." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Ne rendezzen" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15413,11 +15385,11 @@ msgstr "" "Az egyesítés előtt ne rendezze át az adott modelleket, és tartsa meg az " "eredeti XY-koordinátákat." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Ágyra igazítás" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15426,23 +15398,23 @@ msgstr "" "Alapértelmezés szerint engedélyezve van, kikapcsolásához használja a --no-" "ensure-on-bed opciót." -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Megkettőzés" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Másolatok sokszorozása ezzel a tényezővel." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Megkettőzés rács szerint" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Másolatok sokszorozása rács létrehozásával." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15450,7 +15422,7 @@ msgstr "" "A megadott modellek elredezése és egyetlen modellé való összevonása a " "tárgyasztalon, hogy egyszerre lehessen végrehajtani a műveleteket." -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -15459,31 +15431,31 @@ msgstr "" "hozzáadódik, ha a modellt fel kell szeletelnünk a kért művelet " "végrehajtásához)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Az Z tengely körüli forgatási szög fokban." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Forgatás X körül" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Az X tengely körüli forgatási szög fokban." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Forgatás Y körül" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Az Y tengely körüli forgatási szög fokban." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Skálázási tényező vagy százalék." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15491,23 +15463,23 @@ msgstr "" "Az összekapcsolatlan részek felismerése és különálló objektumokra való " "bontása az adott modell(ek)ben." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Skálázás Mérethez Igazítva" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "A megadott térfogatra való skálázás." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Nem létező konfigurációs fájlok figyelmen kívül hagyása" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Ne hibázzon, ha a --betöltéshez megadott fájl nem létezik." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15515,7 +15487,7 @@ msgstr "" "Előre kompatibilitási szabály konfigurációs és projektfájlokból (3MF, AMF) " "történő konfiguráció betöltéskor." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15528,11 +15500,11 @@ msgstr "" "hogy kilép, vagy az ismeretlen értéket egy alapértelmezett értékkel " "helyettesíti csendben vagy megjegyzéssel." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Kilépés ismeretlen konfigurációs értékek esetén" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15540,7 +15512,7 @@ msgstr "" "Ismeretlen konfigurációs értékek olvasásának engedélyezése. Az " "alapértelmezett értékek helyettesítése megjegyzéssel." -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15548,11 +15520,11 @@ msgstr "" "Ismeretlen konfigurációs értékek olvasásának engedélyezése. Az " "alapértelmezett értékek helyettesítése csendben." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Konfigurációs fájl betöltése" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15560,11 +15532,11 @@ msgstr "" "Konfiguráció betöltése a megadott fájlból. Többször is használható " "beállítások több fájlból történő betöltéséhez." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Kimeneti Fájl" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15572,11 +15544,11 @@ msgstr "" "Az a fájl, ahová a kimenet kiírásra kerül (ha nincs megadva, akkor a " "bemeneti fájlon alapul)." -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Egypéldányos mód" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15587,11 +15559,11 @@ msgstr "" "alkalmazás beállításai közül felülírja a \"single_instance\" konfigurációs " "értéket." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Adatkönyvtár" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15601,11 +15573,11 @@ msgstr "" "különböző profilok karbantartásához vagy a hálózaton tárolt konfigurációk " "beviteléhez." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Naplózási szint" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15616,11 +15588,11 @@ msgstr "" "Például: loglevel=2 a végzetes, hiba és figyelmeztetés szintű üzeneteket " "naplózza." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Renderelés szoftveres renderelővel" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/it/PrusaSlicer.mo b/resources/localization/it/PrusaSlicer.mo index dfcf41b65e..1b37877863 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 a5f6cc278e..f6f6c39374 100644 --- a/resources/localization/it/PrusaSlicer_it.po +++ b/resources/localization/it/PrusaSlicer_it.po @@ -7,7 +7,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Prusalator\n" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -35,9 +35,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -126,7 +125,7 @@ msgstr[0] "%1% (%2$d guscio)" msgstr[1] "%1% (%2$d gusci)" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Preset" @@ -145,7 +144,7 @@ msgstr "" msgid "%1% was substituted with %2%" msgstr "%1% è stato sostituito con %2%" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% slice generato correttamente." @@ -166,7 +165,7 @@ msgstr "%3.2f mm³/s alla velocità del filamento di %3.2f mm/s." msgid "%d lines: %.2f mm" msgstr "%d linee: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d preset importati correttamente." @@ -337,7 +336,7 @@ msgstr "" msgid "&About %s" msgstr "Inform&azioni su %s" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "Ridu&ci barra laterale" @@ -349,27 +348,27 @@ msgstr "&Configurazione" msgid "&Configuration Snapshots" msgstr "Istantanee di &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Copia" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Eli&mina selezionati" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Modifiche" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Esporta" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Impostazioni &Filamento" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&File" @@ -377,19 +376,19 @@ msgstr "&File" msgid "&Finish" msgstr "&Completa" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "Schermo intero (&F)" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Anteprima &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Aiuto" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Importa" @@ -397,7 +396,7 @@ msgstr "&Importa" msgid "&Language" msgstr "&Lingua" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Nuovo progetto" @@ -405,19 +404,19 @@ msgstr "&Nuovo progetto" msgid "&Next >" msgstr "&Successivo>" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "Apri G-code" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "Apri Pr&ogetto" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "I&ncolla" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&Piano" @@ -425,35 +424,35 @@ msgstr "&Piano" msgid "&Preferences" msgstr "&Preferenze" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "Es&ci" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Ripeti" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "&Ripara file STL" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "&Salva Progetto" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "&Seleziona tutto" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "Ann&ulla" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Vista" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "Fines&tra" @@ -462,7 +461,7 @@ msgstr "Fines&tra" msgid "(All)" msgstr "(Tutto)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)Sli&ce Ora" @@ -474,7 +473,7 @@ msgstr "(Ri)processa" msgid "(Some lines not shown)" msgstr "(Alcune linee non mostrate)" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Sconosciuto)" @@ -486,7 +485,7 @@ msgstr "(bobina inclusa)" msgid "(minimum)" msgstr "(minimo)" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") non trovato." @@ -542,7 +541,7 @@ msgstr "2 mm" msgid "3 (heavy)" msgstr "3 (pesante)" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" @@ -633,7 +632,7 @@ 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/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -659,7 +658,7 @@ msgstr "Chiave API" msgid "Abort" msgstr "Annulla" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Informazioni su %s" @@ -676,7 +675,7 @@ msgstr "Controllo Accelerazione (avanzato)" msgid "Access violation" msgstr "Violazione di accesso" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Precisione" @@ -716,7 +715,7 @@ msgstr "" "diminuire il tempo di stampa e per ridurre il consumo di filamento? Leggi di " "più nella documentazione." -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Aggiungi" @@ -779,7 +778,7 @@ msgstr "Aggiungi forma da Galleria" msgid "Add Shapes from Gallery" msgstr "Aggiungere forme dalla galleria" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Aggiungi un pad sotto il modello supportato" @@ -897,7 +896,7 @@ msgid "Add pause print" msgstr "Aggiungi pausa di stampa" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Aggiungi stampante fisica" @@ -997,17 +996,16 @@ msgstr "Indirizzo" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Avanzate" @@ -1043,16 +1041,16 @@ msgstr "" "questo materiale in una torre di pulitura al fine di ottenere una successiva " "estrusione affidabile su oggetto sacrificale o riempimento." -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-code dopo il cambio layer" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Allinea XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Allinea il modello al punto dato." @@ -1065,7 +1063,7 @@ msgid "Aligned Rectilinear" msgstr "Allineato Rettilineo " #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Tutto" @@ -1267,7 +1265,7 @@ msgstr "Applica automaticamente il cambio di colore" msgid "Apply to all the remaining small objects being loaded." msgstr "Applicare a tutti i piccoli oggetti rimanenti che vengono caricati." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "Arachne" @@ -1279,7 +1277,7 @@ msgstr "Generatore perimetri Arachne" msgid "Archimedean Chords" msgstr "Corde di Archimede" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Sei sicuro di voler %1% il preset selezionato?" @@ -1296,7 +1294,7 @@ msgstr "" msgid "Are you sure you want to continue?" msgstr "Sei sicuro di voler continuare?" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -1310,7 +1308,7 @@ msgstr "" msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Sicuro di voler eliminare la stampante \"%1%\"?" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Sei sicuro di voler cancellare tutte le sostituzioni?" @@ -1318,7 +1316,7 @@ msgstr "Sei sicuro di voler cancellare tutte le sostituzioni?" msgid "Are you sure you want to do it?" msgstr "Sei sicuro di voler procedere?" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Riempimento area" @@ -1350,7 +1348,7 @@ msgstr "" "regolare la dimensione dello spazio tra gli oggetti e per permettere " "rotazioni automatiche?" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -1506,7 +1504,7 @@ msgid "Autogeneration will erase all manually edited points." msgstr "" "La generazione automatica cancellerà tutti i punti editati manualmente." -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Generazione automatica" @@ -1514,7 +1512,7 @@ msgstr "Generazione automatica" msgid "Automatic updates" msgstr "Aggiornamenti automatici" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Ripara automaticamente un file STL" @@ -1530,11 +1528,11 @@ msgstr "Evita incrocio perimetri" msgid "Avoid crossing perimeters - Max detour length" msgstr "Evita incrocio perimetri - Lunghezza massima della deviazione" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "FRECCIA INDIETRO" -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -1547,7 +1545,7 @@ msgstr "" "Clicca per reimpostare all'ultimo preset salvato tutte le impostazioni per " "il seguente gruppo di opzioni." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -1561,7 +1559,7 @@ msgstr "" msgid "Background processing" msgstr "Elaborazione in background" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Abbandona su valori di configurazione sconosciuti" @@ -1569,7 +1567,7 @@ msgstr "Abbandona su valori di configurazione sconosciuti" msgid "Balanced" msgstr "Bilanciato" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Piano" @@ -1617,7 +1615,7 @@ 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/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-code prima del cambio layer" @@ -1642,7 +1640,7 @@ msgstr "Migliore qualità superfice" msgid "Between objects G-code" msgstr "G-code tra gli oggetti" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-code tra gli oggetti (per stampa sequenziale)" @@ -1664,11 +1662,11 @@ msgstr "Blocca supporti" msgid "Block supports by angle" msgstr "Blocca supporti all'angolo" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Volume bottiglia" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Peso bottiglia" @@ -1685,7 +1683,7 @@ msgstr "Inferiore" msgid "Bottom" msgstr "Inferiore" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Vista inferiore" @@ -1964,8 +1962,8 @@ msgstr "" "Impossibile procedere senza punti di supporto! Aggiungi i punti di supporto " "o disattiva la generazione supporti." -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Caratteristiche" @@ -1973,7 +1971,7 @@ msgstr "Caratteristiche" msgid "Capture a configuration snapshot" msgstr "Cattura un'istantanea della configurazione" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Insensibile alle maiuscole e alle minuscole" @@ -1981,11 +1979,11 @@ msgstr "Insensibile alle maiuscole e alle minuscole" msgid "Category" msgstr "Categoria" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Centro" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Centra la stampa sul centro dato." @@ -2092,7 +2090,7 @@ 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:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Scegli un file da processare (STL/OBJ/AMF/3MF/PRUSA):" @@ -2138,7 +2136,7 @@ msgstr "Cerchio" msgid "Circular" msgstr "Circolare" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "Classico" @@ -2146,12 +2144,13 @@ msgstr "Classico" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" -"Il generatore di perimetri classico produce perimetri con larghezza di " -"estrusione costante e per le aree molto sottili viene utilizzato il " -"riempimento di spazi. Il motore Arachne produce perimetri con larghezza di " -"estrusione variabile." +"Il generatore di perimetri classico realizza perimetri con larghezza di " +"estrusione costante e per aree molto sottili viene utilizzato il riempimento " +"di spazi. Il motore Arachne produce perimetri con larghezza di estrusione " +"variabile. Questa impostazione influisce anche sul riempimento concentrico." #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -2232,7 +2231,7 @@ msgid "Closing PrusaSlicer. Current project is modified." msgstr "Chiusura di PrusaSlicer. Il progetto corrente è modificato." #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Distanza di chiusura" @@ -2240,7 +2239,7 @@ msgstr "Distanza di chiusura" msgid "Closing radius" msgstr "Raggio di chiusura" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Riduci barra laterale" @@ -2248,11 +2247,11 @@ msgstr "Riduci barra laterale" msgid "Collapse/Expand the sidebar" msgstr "Riduci/Espandi barra laterale" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Colore" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-code cambio colore" @@ -2316,12 +2315,12 @@ msgstr "Comandi" msgid "Comment:" msgstr "Commento:" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Confronta Preset" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Confronta i preset" @@ -2329,7 +2328,7 @@ msgstr "Confronta i preset" msgid "Compare this preset with some another" msgstr "Confronta questo preset con un altro" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "I preset confrontati hanno diverse tecnologie di stampa" @@ -2497,7 +2496,7 @@ msgstr "" "considerato è limitata a infill_anchor, ma non più lunga di questo " "parametro. Impostare questo parametro a zero per disabilitare l'ancoraggio." -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Connessione delle barre di supporto e giunzioni" @@ -2553,7 +2552,7 @@ msgstr "Continuare e installare gli aggiornamenti della configurazione?" msgid "Continue to activate a configuration snapshot %1%?" msgstr "Continuare ad attivare un'istantanea di configurazione %1%?" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -2571,7 +2570,7 @@ msgstr "" "Contributi di Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik e molti altri." -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -2589,7 +2588,7 @@ msgstr "Convertire da unità imperiali" msgid "Convert from meters" msgstr "Convertire da metri" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Raffreddamento" @@ -2604,7 +2603,7 @@ msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" "I movimenti di raffreddamento accelerano gradualmente verso questa velocità." -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Soglie di raffreddamento" @@ -2633,7 +2632,7 @@ msgstr "Copia" msgid "Copy Version Info" msgstr "Copia info versione" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Copia selezione negli appunti" @@ -2697,32 +2696,32 @@ msgstr "" "esportazione con un dispositivo diverso. Il file G-code corrotto è su %1%." "tmp." -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Copyright" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Correzione dell'espansione" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Correzione per l'espansione nell'asse X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Correzione per l'espansione nell'asse Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Correzione per l'espansione nell'asse Z" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Correzioni" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Costo" @@ -2798,7 +2797,7 @@ msgstr "" "risoluzione finale di stampa, dunque è preferibile settare il valore " "ragionevolmente basso." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Genera Pad intorno all'oggetto ed ignora l'elevazione del supporto" @@ -2814,7 +2813,7 @@ msgstr "Creare un nuovo progetto mentre alcuni preset vengono modificati." msgid "Creating a new project while the current project is modified." msgstr "Creare un nuovo progetto mentre il progetto corrente viene modificato." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Angolo critico" @@ -2822,7 +2821,7 @@ msgstr "Angolo critico" msgid "Critical error" msgstr "Errore critico" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Croce" @@ -2868,8 +2867,8 @@ msgstr "" "connessioni OctoPrint HTTPS, in formato crt/pem. Se lasciato in bianco, " "verrà utilizzato lo OS CA certificate repository predefinito." -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "G-code personalizzato" @@ -2913,7 +2912,7 @@ msgid "Custom template (\"%1%\")" msgstr "Modello personalizzato (\"%1%\")" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Taglia" @@ -2921,7 +2920,7 @@ msgstr "Taglia" msgid "Cut by Plane" msgstr "Taglia sul Piano" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Taglia il modello al dato Z." @@ -2929,7 +2928,7 @@ msgstr "Taglia il modello al dato Z." msgid "Cylinder" msgstr "Cilindro" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "D&eseleziona tutto" @@ -2937,7 +2936,7 @@ msgstr "D&eseleziona tutto" msgid "Dark mode (experimental)" msgstr "Modalità scura (sperimentale)" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Directory dati" @@ -2963,7 +2962,7 @@ msgstr "Diminuisci Istanze" msgid "Default" msgstr "Predefinito" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Profilo materiale SLA predefinito" @@ -3004,8 +3003,8 @@ msgstr "" msgid "Default print profile" msgstr "Profilo di stampa predefinito" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -3019,7 +3018,7 @@ msgstr "" msgid "Define a custom printer profile" msgstr "Inserisci un profilo stampante personalizzato" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -3037,11 +3036,11 @@ msgstr "Ritardo dopo lo scarico" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Elimina" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Elimin&a tutto" @@ -3095,7 +3094,7 @@ msgid "Delete Subobject" msgstr "Elimina Sotto-oggetto" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Elimina tutto" @@ -3153,16 +3152,16 @@ msgstr "Elimina il segno di spunta - Clic sinistro o premi il tasto \"-\"" msgid "Delete tool change" msgstr "Elimina cambio strumento" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Elimina tutti gli oggetti" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Elimina la selezione corrente" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Densità" @@ -3174,9 +3173,9 @@ msgstr "Densità del riempimento interno, espresso nell'intervallo 0% - 100%." msgid "Density of the first raft or support layer." msgstr "Densità del primo layer del raft o del supporto." -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Dipendenze" @@ -3200,7 +3199,7 @@ msgstr "Deseleziona tutto" msgid "Deselect by rectangle" msgstr "Deseleziona con rettangolo" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Deseleziona tutti gli oggetti" @@ -3236,7 +3235,7 @@ msgstr "Distacco dal preset di sistema" msgid "Detach preset" msgstr "Preset distacco" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Distaccato" @@ -3260,7 +3259,7 @@ msgstr "" msgid "Detect thin walls" msgstr "Rileva pareti sottili" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -3284,15 +3283,15 @@ msgstr "Dispositivo:" msgid "Diameter" msgstr "Diametro" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Diametro in mm della base del pilastro" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Diametro in mm dei pilastri di supporto" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Diametro del lato di puntamento della testa" @@ -3357,31 +3356,31 @@ msgstr "Elimina tutte le modifiche personalizzate" msgid "Discard changes" msgstr "Annulla modifiche" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Display" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Altezza display" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Mostra mirroring orizzontale" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Orientamento display" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Mostra la finestra della fila di caricamento all'host di stampa" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Mostra mirroring verticale" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Larghezza display" @@ -3400,7 +3399,7 @@ msgstr "" "Distanza tra skirt e brim (quando non si usa uno scudo di protezione) o gli " "oggetti." -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -3442,11 +3441,11 @@ msgstr "Distanza usata per la funzione disposizione automatica del piano." msgid "Divide by zero" msgstr "Dividi per zero" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 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:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -3504,7 +3503,7 @@ 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/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Non disporre" @@ -3568,11 +3567,11 @@ msgstr "" msgid "Drop to bed" msgstr "Poggia sul piano" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Duplica" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Duplica per griglia" @@ -3589,11 +3588,11 @@ msgstr "Durante gli altri layer, la ventola lavorerà sempre a %1%%%" msgid "During the other layers, fan will be turned off." msgstr "Durante gli altri layer, la ventola sarà spenta." -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dinamico" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "Esporta" @@ -3646,7 +3645,7 @@ msgstr "Modifica G-code personalizzato" msgid "Edit pause print message" msgstr "Modifica messaggio pausa di stampa" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Modifica stampante fisica" @@ -3670,7 +3669,7 @@ msgstr "Modifica" msgid "Eigen vectorization supported:" msgstr "Vettorizzazione Eigen supportata:" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Espelli Scheda SD / Memoria flash (&t)" @@ -3678,7 +3677,7 @@ msgstr "Espelli Scheda SD / Memoria flash (&t)" msgid "Eject SD card / Flash drive" msgstr "Espelli scheda SD / Memoria flash" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 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." @@ -3696,7 +3695,7 @@ msgstr "Espulsione del dispositivo %s(%s) non riuscita." msgid "Elephant foot compensation" msgstr "Compensazione zampa d'elefante" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Larghezza minima zampa d'elefante" @@ -3730,7 +3729,7 @@ msgstr "Invia a G-code" msgid "Empty layer between %1% and %2%." msgstr "Layer vuoto tra %1% e %2%." -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Abilita" @@ -3747,11 +3746,11 @@ msgstr "Abilità modalità scura" msgid "Enable fan if layer print time is below" msgstr "Attiva ventola se il tempo di stampa del layer è inferiore a" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Attiva svuotamento" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Attiva il mirroring orizzontale per le immagini di output" @@ -3766,7 +3765,7 @@ msgstr "" "Abilitare la stiratura degli strati superiori con la testina di stampa a " "caldo per una superficie liscia" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -3774,7 +3773,7 @@ msgstr "" "Abilita la lettura di valori di configurazione sconosciuti sostituendoli " "silenziosamente con quelli predefiniti." -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -3824,7 +3823,7 @@ msgstr "" msgid "Enable variable layer height feature" msgstr "Abilita layer ad altezza variabile" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Attiva mirroring verticale per le immagini di output" @@ -3840,7 +3839,7 @@ msgstr "" "Permette di riempire gli spazi tra i perimetri e tra i perimetri più interni " "e il riempimento." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" @@ -3872,7 +3871,7 @@ msgstr "Esecutore supporti" msgid "Enqueued" msgstr "Messo in coda" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Accerta che sia sul piano" @@ -3986,7 +3985,7 @@ msgstr "" "Errore: \"%2%\"" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Errore" @@ -4136,23 +4135,23 @@ msgstr "Modalità Esperto" msgid "Export" msgstr "Esporta" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Esporta &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Esporta &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Esporta percorso strumen&to come OBJ" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Esporta 3MF" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Esporta AMF" @@ -4160,11 +4159,11 @@ msgstr "Esporta AMF" msgid "Export AMF file:" msgstr "Esporta file AMF:" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Esporta Configurazione in &Bundle" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Esportazione Config Bundle con stampanti fisiche" @@ -4173,15 +4172,15 @@ msgid "Export G-Code." msgstr "Esporta G-code." #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Esporta G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Esporta G-code su Scheda SD / Memoria flash" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Esporta OBJ" @@ -4189,19 +4188,19 @@ msgstr "Esporta OBJ" msgid "Export OBJ file:" msgstr "Esporta file OBJ:" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Esporta piano come &STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Esporta piano come STL &includendo i supporti" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Esporta SLA" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Esporta STL" @@ -4209,11 +4208,11 @@ msgstr "Esporta STL" msgid "Export STL file:" msgstr "Esporta file STL:" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "Esportazione di tutti i preset, incluse le stampanti fisiche, su file" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Esporta tutti i preset su file" @@ -4225,23 +4224,23 @@ msgstr "Esporta come STL" msgid "Export config" msgstr "Esporta config" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Esporta la configurazione corrente su file" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Esporta il piano corrente come G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 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:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Esporta il piano corrente come STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Esporta piano corrente come STL includendo i supporti" @@ -4260,19 +4259,19 @@ msgstr "L'esportazione di un file 3mf non è riuscita" msgid "Export sources full pathnames to 3mf and amf" msgstr "Esporta il percorso completo delle fonti su 3mf e amf" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Esporta modello/i come 3MF." -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Esporta il modello(i) come AMF." -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Esporta il modello(i) come OBJ." -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Esporta il modello(i) come STL." @@ -4280,7 +4279,7 @@ msgstr "Esporta il modello(i) come STL." msgid "Export to SD card / Flash drive" msgstr "Esporta su scheda SD / memoria Flash" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Esporta percorso strumento come OBJ" @@ -4292,7 +4291,7 @@ msgstr "Esporta." msgid "Exporting G-code" msgstr "Esportando il G-code" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Esportazione del bundle di configurazione" @@ -4313,11 +4312,11 @@ msgstr "Esportazione." 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:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Esposizione" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Tempo di esposizione" @@ -4379,7 +4378,7 @@ msgstr "Colore estrusore" msgid "Extruder changed to" msgstr "Cambia estrusore a" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Margine estrusore" @@ -4388,7 +4387,7 @@ msgid "Extruder offset" msgstr "Offset estrusore" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -4396,7 +4395,7 @@ msgid "Extruders" msgstr "Estrusori" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Conteggio estrusori" @@ -4436,7 +4435,7 @@ msgstr "Stampanti con tecnologia FFF" msgid "Facets" msgstr "Facet" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Layer sfumati" @@ -4467,11 +4466,11 @@ msgstr "Mancata esecuzione di alcuni fori nel modello" msgid "Fan Speed (%)" msgstr "Velocità ventola (%)" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Impostazioni ventola" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Velocità ventola" @@ -4506,11 +4505,11 @@ msgstr "La ventola lavorerà sempre a %1%%%" msgid "Fan will be turned off." msgstr "La ventola verrà spenta." -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Veloce" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Tilt veloce" @@ -4534,7 +4533,7 @@ msgstr "Tipi di caratteristica" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filamento" @@ -4546,7 +4545,7 @@ msgstr "Diametro del filamento:" msgid "Filament End G-code" msgstr "G-code Finale Filamento" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Sovrascrittura filamento" @@ -4555,7 +4554,7 @@ msgid "Filament Profiles Selection" msgstr "Selezione Profili Filamento" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Impostazioni Filamento" @@ -4597,7 +4596,7 @@ msgstr "Note filamento" msgid "Filament parking position" msgstr "Posizione di parcheggio del filamento" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Proprietà filamento" @@ -4614,7 +4613,7 @@ msgstr "Durata scaricamento filamento" msgid "Filaments" msgstr "Filamenti" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "file non trovato" @@ -4683,7 +4682,7 @@ msgstr "" msgid "Filling bed" msgstr "Riempimento piano" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Trova" @@ -4695,11 +4694,11 @@ msgstr "Trova / sostituisce pattern nelle linee del G-code e le rimpiazza." msgid "Finished" msgstr "Finito" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Retrazione Firmware" @@ -4909,7 +4908,7 @@ msgstr "" "Per far sì che la torre di pulitura funzioni con i supporti solubili, i " "layer dei supporti devono essere sincronizzati con quelli del modello." -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Forza il Pad ovunque intorno all'oggetto" @@ -4943,7 +4942,7 @@ msgstr "" "Formato delle miniature del G-code: PNG per la migliore qualità, JPG per la " "dimensione più piccola, QOI per il firmware con poca memoria" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -4951,7 +4950,7 @@ msgstr "" "Regola di compatibilità in avanti quando si caricano configurazioni da file " "di configurazione e file di progetto (3MF, AMF)." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Trovate parole chiave riservate in" @@ -4965,11 +4964,11 @@ msgstr "" "Non è possibile eliminare l'ultima parte solida dall'oggetto nell'elenco " "Oggetti." -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Frontale" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Vista anteriore" @@ -4977,7 +4976,7 @@ msgstr "Vista anteriore" msgid "Full fan speed at layer" msgstr "Massima velocità della ventola al layer" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Schermo intero" @@ -5026,7 +5025,7 @@ msgstr "Spessore superficie crespa" msgid "Fuzzy skin type." msgstr "Tipo superficie crespa." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-code" @@ -5064,11 +5063,11 @@ msgstr "Sostituzioni G-code" msgid "G-code thumbnails" msgstr "Miniature G-code" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Visualizzatore G-code" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, versione 3" @@ -5085,10 +5084,10 @@ msgstr "Galleria" msgid "Gap fill" msgstr "Riempimento spazi" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Generale" @@ -5118,11 +5117,11 @@ msgstr "" "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:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Genera supporti" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Genera supporti per i modelli" @@ -5315,11 +5314,11 @@ msgstr "" msgid "Head diameter" msgstr "Diametro testa" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Penetrazione testa" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "" "L'inserimento della testa non deve essere più grande della sua larghezza." @@ -5344,7 +5343,7 @@ msgstr "Altezza (mm)" msgid "Height of skirt expressed in layers." msgstr "Altezza dello skirt espressa in layer." -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Altezza del display" @@ -5369,15 +5368,15 @@ 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:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Aiuto" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Aiuto (opzioni FFF)" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Aiuto (opzioni SLA)" @@ -5412,7 +5411,7 @@ msgstr "Alto" msgid "High extruder current on filament swap" msgstr "Alta corrente estrusore al cambio filamento" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Alta viscosità" @@ -5444,7 +5443,7 @@ msgstr "Diametro foro" msgid "Hollow and drill" msgstr "Svuota e perfora" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Svuota un modello per avere l'interno vuoto" @@ -5452,16 +5451,16 @@ msgstr "Svuota un modello per avere l'interno vuoto" msgid "Hollow this object" msgstr "Svuota questo oggetto" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Svuotamento" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -5530,19 +5529,19 @@ msgstr "" "Scorri il cursore sui bottoni per ottenere maggiori informazioni o clicca su " "questo bottone." -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 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:3867 +#: src/libslic3r/PrintConfig.cpp:3840 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:3576 +#: src/libslic3r/PrintConfig.cpp:3549 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -5763,7 +5762,7 @@ msgstr "" "Se abilitato, il pulsante per ridurre la barra di scorrimento laterale " "apparirà nell'angolo in alto a destra della scena 3D" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -6037,7 +6036,7 @@ msgstr "" "distribuzione mancanti o offline. Si potrebbe voler abilitare questa opzione " "per i certificati autofirmati se la connessione non riesce." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignora file di configurazione non esistenti" @@ -6055,15 +6054,15 @@ msgstr "Istruzione illegale" msgid "Import" msgstr "Importa" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importa &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importa Configurazione in &Bundle" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Importa Configurazione da &progetto" @@ -6079,7 +6078,7 @@ msgstr "Importa Oggetto" msgid "Import Objects" msgstr "Importa Oggetti" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Importa archivio SL1 / SL1S" @@ -6087,11 +6086,11 @@ msgstr "Importa archivio SL1 / SL1S" msgid "Import SLA archive" msgstr "Importa archivio SLA" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Importa STL (unità imperiali)" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importa STL/OBJ/AM&F/3MF" @@ -6220,11 +6219,11 @@ 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:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Tempo di esposizione iniziale" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Altezza layer iniziale" @@ -6329,7 +6328,7 @@ msgstr "Errore interno: %1%" msgid "Internal infill" msgstr "Riempimento interno" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Penetrazione della testa non valida" @@ -6357,7 +6356,7 @@ msgstr "" msgid "Invalid numeric input." msgstr "Input numerico non valido." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Diametro apice non valido" @@ -6393,11 +6392,11 @@ msgstr "Tipo di stiratura" msgid "Is it safe?" msgstr "È sicuro?" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Vista isometrica" @@ -6425,7 +6424,7 @@ msgstr "" "ramming e per superare la resistenza durante il caricamento di un filamento " "con una punta deformata." -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "È l'ultimo preset per questa stampante fisica." @@ -6437,7 +6436,7 @@ msgstr "Non è possibile stampare oggetti multi-parte con tecnologia SLA." msgid "It's not possible to delete the last related preset for the printer." msgstr "Non è possibile cancellare l'ultimo preset relativo alla stampante." -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Limiti Jerk" @@ -6503,7 +6502,7 @@ msgstr "Mantieni le impostazioni selezionate." msgid "Keep upper part" msgstr "Mantieni parte superiore" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Scorciatoie Tastiera" @@ -6511,11 +6510,11 @@ msgstr "Scorciatoie Tastiera" msgid "Keyboard shortcuts" msgstr "Scorciatoie tastiera" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "LUCCHETTO CHIUSO" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -6523,7 +6522,7 @@ 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:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -6535,7 +6534,7 @@ msgstr "" msgid "Label objects" msgstr "Etichetta oggetti" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Landscape" @@ -6575,7 +6574,7 @@ msgstr "" "\n" "L'altezza del layer sarà resettata a 0,01." -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Limiti altezza layer" @@ -6583,8 +6582,8 @@ msgstr "Limiti altezza layer" msgid "Layer range Settings to modify" msgstr "Impostazioni da modificare in Intervallo Layer" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Layer" @@ -6601,7 +6600,7 @@ msgstr "Layer" msgid "Layers and Perimeters" msgstr "Layer e Perimetri" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Layer e perimetri" @@ -6614,15 +6613,15 @@ msgstr "Opzioni di layout" msgid "Leave \"%1%\" enabled" msgstr "Lascia \"%1%\" abilitato" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Sinistra" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Valore di preset sinistro" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Vista sinistra" @@ -6661,7 +6660,7 @@ msgid "Length of the infill anchor" msgstr "Lunghezza dell'ancoraggio del riempimento" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -6673,7 +6672,7 @@ msgstr "" msgid "Lift Z" msgstr "Solleva Z" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -6733,19 +6732,19 @@ msgstr "Carica Parte" msgid "Load Project" msgstr "Carica Progetto" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Carica modello" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Carica un archivio SL1 / SL1S" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Carica un modello salvato con unità imperiali" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -6754,7 +6753,7 @@ 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:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Carica file di configurazione" @@ -6772,11 +6771,11 @@ msgstr "" "stesso modo, puoi usare File-Importa-Importa archivio SL1 / SL1S, che ti " "permette anche di ricostruire modelli 3D dai dati voxel." -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Carica configurazione dal file di progetto" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -6784,11 +6783,11 @@ msgstr "" "Carica configurazione dal file specificato. Può essere usato più di una " "volta per caricare opzioni da vari file." -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Carica un file di configurazione esportato" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Carica i preset da un gruppo" @@ -6822,11 +6821,11 @@ msgstr "Caricamento configurazione" msgid "Loading file" msgstr "Caricamento file" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Caricamento bundle di configurazione" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Caricamento di un file di configurazione" @@ -6865,7 +6864,7 @@ msgstr "Coordinate locali" msgid "Lock supports under new islands" msgstr "Fissa i supporti sotto le nuove isole" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Livello di logging" @@ -6881,7 +6880,7 @@ msgstr "Basso" msgid "Lowest Z height" msgstr "Minore altezza Z" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -6890,7 +6889,7 @@ msgstr "Minore altezza Z" msgid "Machine limits" msgstr "Limiti macchina" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -6898,7 +6897,7 @@ msgstr "" "I limiti della macchina non sono impostati, quindi la stima del tempo di " "stampa potrebbe non essere accurata." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -6909,7 +6908,7 @@ msgstr "" "accurato in quanto la stampante potrebbe applicare un diverso set di limiti " "della macchina." -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" @@ -6935,20 +6934,20 @@ msgstr "Modifica manuale" msgid "Masked SLA file exported to %1%" msgstr "File SLA mascherato esportato su %1%" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Corrisponde a una linea singola" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Scheda Impostazioni Mate&riale" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Materiale" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Impostazioni Materiali" @@ -6957,7 +6956,7 @@ msgstr "Impostazioni Materiali" msgid "Material Settings Tab" msgstr "Scheda Impostazioni Materiali" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Profilo del materiale di stampa" @@ -6965,19 +6964,19 @@ msgstr "Profilo del materiale di stampa" msgid "Max" msgstr "Massimo" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Lunghezza massima Bridge" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Ponteggi massimi su un pilastro" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Massima distanza di unione" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Distanza massima collegamento pilastri" @@ -7073,7 +7072,7 @@ msgstr "Accelerazione massima durante la retrazione" msgid "Maximum acceleration when retracting (M204 R)" msgstr "Accelerazione massima durante la retrazione (M204 R)" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Accelerazioni massime" @@ -7096,7 +7095,7 @@ msgstr "" "su ogni strato in modo indipendente, possono essere prodotti artefatti " "visibili." -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Tempo massimo di esposizione" @@ -7132,11 +7131,11 @@ msgstr "Avanzamento massimo dell'asse Y" msgid "Maximum feedrate of the Z axis" msgstr "Avanzamento massimo dell'asse Z" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Avanzamenti massimi" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Tempo massimo di esposizione iniziale" @@ -7176,7 +7175,7 @@ msgstr "Jerk massimo dell'asse Z" msgid "Maximum length of the infill anchor" msgstr "Lunghezza massima dell'ancoraggio del riempimento" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -7210,7 +7209,7 @@ msgid "Medium" msgstr "Medio" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Unisci" @@ -7226,7 +7225,7 @@ msgstr "Unisci oggetti in un unico oggetto multiparte" msgid "Merged" msgstr "Unito" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -7265,7 +7264,7 @@ msgstr "Minimo" msgid "Min print speed" msgstr "Velocità minima di stampa" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Distanza minima dei punti di supporto" @@ -7307,11 +7306,11 @@ msgstr "" "generare. Impostate a zero per disabilitare la semplificazione e utilizzare " "la risoluzione completa." -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Tempo minimo di esposizione" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Minimum feature size" msgstr "Dimensione minima della caratteristica" @@ -7323,15 +7322,15 @@ msgstr "Avanzamento minimo durante estrusione" msgid "Minimum feedrate when extruding (M205 S)" msgstr "Avanzamento minimo durante estrusione (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Avanzamento minimo" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Tempo minimo di esposizione iniziale" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Larghezza minima perimetri" @@ -7356,16 +7355,19 @@ msgstr "" msgid "Minimum thickness of a top / bottom shell" msgstr "Spessore minimo guscio superiore / inferiore" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -"Spessore minimo delle caratteristiche sottili. Le caratteristiche del " -"modello più sottili di questo valore non verranno stampate, mentre quelle " -"più spesse della dimensione minima della caratteristica verranno allargate " -"alla larghezza minima del perimetro." +"Spessore minimo delle geometrie sottili. Le geometrie del modello più " +"sottili di questo valore non verranno stampate, mentre quelle più spesse " +"della dimensione minima della geometria verranno allargate alla larghezza " +"minima del perimetro. Se espresso in percentuale (ad esempio 25%), verrà " +"calcolato in base al diametro dell'ugello." #: src/libslic3r/PrintConfig.cpp:2899 msgid "Minimum top shell thickness" @@ -7388,11 +7390,11 @@ msgstr "Avanzamento minimo di spostamento" msgid "Minimum travel feedrate (M205 T)" msgstr "Avanzamento minimo di spostamento (M205 T)" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Spessore minimo parete di un modello svuotato." -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" @@ -7418,7 +7420,7 @@ msgstr "" msgid "Mirror Object" msgstr "Specchia Oggetto" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Specchia orizzontalmente" @@ -7438,7 +7440,7 @@ msgstr "Specchia l'oggetto selezionato sull'asse y" msgid "Mirror the selected object along the Z axis" msgstr "Specchia l'oggetto selezionato sull'asse Z" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Specchia verticalmente" @@ -7615,11 +7617,11 @@ msgstr "" "Invece di considerarli come oggetti multipli, devo considerarli come parte " "di un singolo oggetto avente parti multiple?" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Moltiplica le copie creando una griglia." -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Moltiplica le copie per questo valore." @@ -7709,7 +7711,7 @@ msgstr "Nuovo layout, accesso tramite pulsante impostazioni dal menù superiore" msgid "New prerelease version %1% is available." msgstr "È disponibile la nuova versione prerelease %1%." -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Nuovo preset stampante selezionato" @@ -7771,7 +7773,7 @@ msgstr "" "Non può essere generato nessun Pad per questo modello con la configurazione " "corrente" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "File non processato precedentemente." @@ -7779,7 +7781,7 @@ msgstr "File non processato precedentemente." msgid "No sparse layers (EXPERIMENTAL)" msgstr "Nessun layer sparso (SPERIMENTALE)" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "" "Non verranno posizionati punti di supporto più vicini di questa soglia." @@ -7796,7 +7798,7 @@ msgid "None" msgstr "Nessuno" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normale" @@ -7812,7 +7814,7 @@ msgstr "Non trovato:" msgid "Note" msgstr "Nota" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -7821,7 +7823,7 @@ msgstr[0] "" msgstr[1] "" "Si noti che il preset selezionato sarà cancellato anche da queste stampanti." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -7833,7 +7835,7 @@ msgstr[1] "" "Nota, queste stampanti saranno cancellate dopo aver cancellato il preset " "selezionato." -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -7884,12 +7886,12 @@ msgstr "Nota: Questo preset sarà sostituito dopo il salvataggio" msgid "Note: some shortcuts work in (non)editing mode only." msgstr "Nota: alcune scorciatoie funzionano solo in modalità (non)modifica." -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Note" @@ -7903,7 +7905,7 @@ msgstr "Avvertenza" msgid "Notify about new releases" msgstr "Notificare le nuove uscite" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Ugello" @@ -7915,7 +7917,7 @@ msgstr "Diametro ugello:" msgid "Nozzle and Bed Temperatures" msgstr "Temperatura ugello e piano" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Diametro ugello" @@ -7946,7 +7948,7 @@ msgstr "" msgid "Number of cooling moves" msgstr "Numero di movimenti di raffreddamento" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Numero estrusori della stampante." @@ -7978,15 +7980,15 @@ msgstr "" "quello configurato qui. Imposta questo valore a zero per disattivare " "completamente lo skirt." -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Numero di pixel su" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Numero di pixel su X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Numero di pixel su Y" @@ -8003,7 +8005,7 @@ msgstr "" msgid "Number of solid layers to generate on top surfaces." msgstr "Numero di layer solidi da generare sulle superfici superiori." -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -8019,7 +8021,7 @@ msgstr "Numero di cambi strumento" msgid "Object Settings to modify" msgstr "Impostazioni Oggetto da modificare" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Elevazione oggetto" @@ -8138,7 +8140,7 @@ msgstr "On/Off modalità un layer del cursore di scorrimento verticale" msgid "One layer mode" msgstr "Modalità Un Layer" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Uno dei preset non trovato" @@ -8163,7 +8165,7 @@ msgstr "" "Rimuovere tutti gli oggetti tranne l'ultimo, oppure abilitare la modalità " "sequenziale con \"complete_objects\"." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -8175,7 +8177,7 @@ msgstr "" msgid "Only infill where needed" msgstr "Riempimento solo quando necessario" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Solleva Z solamente" @@ -8217,7 +8219,7 @@ msgstr "" "Prevenzione sgocciolamento non è al momento supportata con la torre di " "pulitura attiva." -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Apri &PrusaSlicer" @@ -8237,11 +8239,11 @@ msgstr "Apri Cartella." msgid "Open G-code file:" msgstr "Apri un file G-code:" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Apri visualizzatore G-code" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Apri una nuova istanza" @@ -8249,20 +8251,20 @@ msgstr "Apri una nuova istanza" msgid "Open Preferences." msgstr "Apri le preferenze." -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Apri PrusaSlicer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Apri un file G-code" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Apri una nuova istanza PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Apri un file progetto" @@ -8304,7 +8306,7 @@ msgstr "Apri il sito web di %s nel browser" 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:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Aprire la finestra di dialogo per modificare la galleria delle forme" @@ -8320,7 +8322,7 @@ msgstr "Apertura Configurazione Guidata" msgid "Opening new project while some presets are unsaved." msgstr "Apertura di un nuovo progetto mentre alcuni preset non sono salvati." -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -8397,7 +8399,7 @@ msgstr "Ricerca orientamento annullata." msgid "Origin" msgstr "Origine" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Altro" @@ -8417,15 +8419,15 @@ msgstr "Brim esterno e interno" msgid "Outer brim only" msgstr "Solo brim esterno" -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "File di output" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Info Modello di output" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "File di output" @@ -8433,7 +8435,7 @@ msgstr "File di output" msgid "Output filename format" msgstr "Formato del file di output" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Opzioni output" @@ -8458,19 +8460,19 @@ msgstr "Soglia sporgenza" msgid "Overlap" msgstr "Sovrapposizione" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Impos&tazioni Stampa" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Pad" @@ -8478,15 +8480,15 @@ msgstr "Pad" msgid "Pad and Support" msgstr "Pad e Supporto" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Pad Intorno all'oggetto" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Pad ovunque intorno all'oggetto" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Dimensioni brim del Pad" @@ -8496,31 +8498,31 @@ msgstr "" "La dimensione del brim del Pad è troppo piccola per la configurazione " "attuale." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Inserimento connettore Pad dell'oggetto" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Passo del connettore del pad dell'oggetto" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Larghezza connettore Pad dell'oggetto" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Spazio Pad oggetto" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Altezza parete Pad" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Inclinazione della parete del pad" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Spessore parete Pad" @@ -8652,7 +8654,7 @@ msgstr "Incolla" msgid "Paste From Clipboard" msgstr "Incolla dagli appunti" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Incolla appunti" @@ -8690,7 +8692,7 @@ msgstr "Trama usata per generare il materiale di supporto." msgid "Pause" msgstr "Pausa" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G-code Pausa Stampa" @@ -8727,7 +8729,7 @@ msgstr "" "Esegui l'integrazione desktop (Imposta questo binario per essere ricercabile " "dal sistema)." -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -8771,7 +8773,7 @@ msgstr "" msgid "Perimeter" msgstr "Perimetro" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Conteggio della distribuzione dei perimetri" @@ -8783,15 +8785,15 @@ msgstr "Estrusore perimetro" msgid "Perimeter generator" msgstr "Generatore di perimetri" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Lunghezza transizione perimetro" -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Margine del filtro di transizione del perimetro" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Angolo di soglia di transizione del perimetro" @@ -8842,29 +8844,29 @@ msgstr "" "Dimensioni delle immagini da memorizzare in un file .gcode e .sl1 / .sl1s, " "nel seguente formato: \"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Modo di collegamento al pilastro" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Diametro pilastro" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Fattore di espansione pilastro" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 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/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Diametro anteriore apice" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Larghezza apice" @@ -8913,11 +8915,11 @@ msgstr "" msgid "Please select the file to reload" msgstr "Seleziona il file da ricaricare" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Porzioni di copyright" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Ritratto" @@ -8926,7 +8928,7 @@ msgstr "Ritratto" msgid "Position" msgstr "Posizione" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Posizione (per stampanti multi-estrusore)" @@ -8942,7 +8944,7 @@ msgstr "Posizione Y" msgid "Position of perimeters starting points." msgstr "Posizione dei punti iniziali dei perimetri." -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Gli script di post-elaborazione cambiano il file G-code nella sua posizione." @@ -8967,11 +8969,11 @@ msgstr "" "suo posto e consulta il manuale su come rinominare opzionalmente il file G-" "code post-elaborato.\n" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Script di post-elaborazione" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "&Visualizza anteprima" @@ -9043,7 +9045,7 @@ msgstr "" msgid "Preset with name \"%1%\" already exists." msgstr "Preset con il nome \"%1%\" già esistente." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9052,7 +9054,7 @@ msgstr "" "Fai clic su questo pulsante per selezionare lo stesso preset per il preset " "di destra e quello di sinistra." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "I preset sono uguali" @@ -9092,7 +9094,7 @@ msgstr "" msgid "Pressure equalizer (experimental)" msgstr "Equalizzatore di pressione (sperimentale)" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -9114,7 +9116,7 @@ msgstr "" "base al diametro dell'ugello." #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Anteprima" @@ -9122,7 +9124,7 @@ msgstr "Anteprima" msgid "Preview hollowed and drilled model" msgstr "Anteprima del modello svuotato e forato" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "File precedentemente processato (" @@ -9134,7 +9136,7 @@ msgstr "Prepara tutti gli estrusori di stampa" msgid "Print" msgstr "Stampa" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Coda di caricamento &Host di stampa" @@ -9142,7 +9144,7 @@ msgstr "Coda di caricamento &Host di stampa" msgid "Print Diameters" msgstr "Diametro di stampa" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Caricamento Host di stampa" @@ -9181,15 +9183,15 @@ msgstr "Pause di stampa" msgid "Print settings" msgstr "Impostazioni di stampa" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Velocità di stampa" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Scavalca velocità di stampa" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Impostazioni Stampant&e" @@ -9224,11 +9226,11 @@ msgstr "Impostazioni stampante" msgid "Printer Settings Tab" msgstr "Scheda Impostazioni Stampante" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Correzione assoluta stampante" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Correzione gamma della stampante" @@ -9240,32 +9242,32 @@ msgstr "Note stampante" msgid "Printer preset names" msgstr "Nomi dei preset della stampante" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Correzione del ridimensionamento della stampante nell'asse X" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Correzione del fattore di scala della stampante sull'asse Y" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Correzione del ridimensionamento della stampante nell'asse Z" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Correzione di scala stampante" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Correzione del ridimensionamento della stampante nell'asse X" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Correzione del ridimensionamento della stampante sull'asse Y" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Correzione del ridimensionamento della stampante sull'asse Z" @@ -9312,7 +9314,7 @@ msgid "Process %1% / 100" msgstr "Processo %1% / 100" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Elaborando %s" @@ -9326,9 +9328,9 @@ msgstr "" "L'elaborazione del modello '%1%' con più di 1M di triangoli potrebbe essere " "lenta. Si consiglia vivamente di ridurre la quantità di triangoli." -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Dipendenze profilo" @@ -9423,7 +9425,7 @@ msgstr "" "PrusaSlicer ha riscontrato un errore durante l'acquisizione di un'istantanea " "di configurazione." -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -9543,15 +9545,15 @@ msgstr "Veloce" msgid "Quick Add Settings (%s)" msgstr "Aggiungere Impostazioni Rapide (%s)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Slice veloce" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Slice veloce e Salva Come" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Chiudi %s" @@ -9620,7 +9622,7 @@ msgstr "Larghezza della linea di Ramming" msgid "Ramming parameters" msgstr "Parametri del ramming" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Impostazioni del ramming" @@ -9640,8 +9642,8 @@ msgstr "Intervallo" msgid "Rasterizing layers" msgstr "Rasterizzazione dei layer" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "R&icarica da disco" @@ -9653,15 +9655,15 @@ msgstr "Ri-configura" msgid "Ready" msgstr "Pronto" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Posteriore" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Vista posteriore" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Prog&etti recenti" @@ -9706,7 +9708,7 @@ msgid "Rectilinear grid" msgstr "Griglia rettilinea" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Ripeti" @@ -9737,7 +9739,7 @@ msgstr "Aggiorna Stampanti" msgid "Regular" msgstr "Regolare" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Espressione regolare" @@ -9786,9 +9788,9 @@ msgstr "Ricarica da:" msgid "Reload plater from disk" msgstr "Ricarica piano da disco" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Ricarica piano da disco" @@ -9814,7 +9816,7 @@ msgid "Remember output directory" msgstr "Ricorda la directory di output" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Rimuovi" @@ -9944,11 +9946,11 @@ msgstr "" msgid "Render" msgstr "Render" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Eseguire il rendering con un software redender" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -9956,7 +9958,7 @@ 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:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Ripara" @@ -9988,11 +9990,11 @@ msgstr "Riparare modello tramite servizio Netfabb" msgid "Repairing was canceled" msgstr "La riparazione è stata annullata" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Ripeti l'ultimo slice veloce" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Ripeti l'ultimo slice veloce" @@ -10004,7 +10006,7 @@ msgstr "Sostituisci da:" msgid "Replace the selected volume with new STL" msgstr "Sostituisci il volume selezionato con un nuovo STL" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Sostituisci con" @@ -10072,7 +10074,7 @@ msgstr "Reimposta scala" msgid "Reset selection" msgstr "Reset selezione" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Ripristina colore Filamento" @@ -10096,8 +10098,8 @@ msgstr "Retrai la quantità prima di pulire" msgid "Retract on layer change" msgstr "Retrai al cambio layer" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Retrazione" @@ -10120,7 +10122,7 @@ msgstr "" "La retrazione non è attivata quando i movimenti di spostamento sono più " "brevi di questa lunghezza." -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -10152,15 +10154,15 @@ msgstr "Annulla la conversione da metri" msgid "Review the substitutions and adjust them if needed." msgstr "Rivedere le sostituzioni e regolarle se necessario." -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Destra" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Valore di preset destro" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Vista destra" @@ -10196,15 +10198,15 @@ msgstr "Tasto destro mouse:" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Ruota" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Ruota attorno ad X" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Ruota attorno ad Y" @@ -10233,15 +10235,15 @@ msgstr "" msgid "Rotation" msgstr "Rotazione" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Angolo di rotazione attorno all'asse X in gradi." -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Angolo di rotazione sull'asse Y in gradi." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Angolo di rotazione attorno all'asse Z in gradi." @@ -10259,11 +10261,11 @@ msgstr "Run %s" msgid "Running post-processing scripts" msgstr "Esecuzione script di post-elaborazione" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "Invia G-cod&e" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "Manda in stampa" @@ -10293,7 +10295,7 @@ msgstr "Scorciatoie di tastiera gizmo SLA" msgid "SLA material" msgstr "Materiale SLA" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Tipo materiale SLA" @@ -10305,7 +10307,7 @@ msgstr "Materiali SLA" msgid "SLA print" msgstr "Stampa SLA" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Note sul materiale di stampa SLA" @@ -10317,7 +10319,7 @@ msgstr "Impostazioni di stampa SLA" 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/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" @@ -10336,7 +10338,7 @@ msgstr "Salva" msgid "Save %s as:" msgstr "Salva %s come:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Salva file %s come:" @@ -10345,12 +10347,12 @@ msgstr "Salva file %s come:" msgid "Save G-code file as:" msgstr "Salva il file G-code come:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 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/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "S&alva progetto come" @@ -10358,15 +10360,15 @@ msgstr "S&alva progetto come" msgid "Save SL1 / SL1S file as:" msgstr "Salva file SL1 / SL1S come:" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Salva file config" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Salva configurazione come:" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Salva configurazione nel file specificato." @@ -10376,11 +10378,11 @@ msgstr "Salva configurazione nel file specificato." msgid "Save current %s" msgstr "Salva le %s attuali" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Salva progetto corrente" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Salvare il file del progetto corrente come" @@ -10393,7 +10395,7 @@ msgstr "Salva come:" msgid "Save preset" msgstr "Salva preset" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Salva il gruppo di preset come:" @@ -10422,7 +10424,7 @@ msgstr "Salva le opzioni selezionate nel preset \"%1%\"." msgid "Save the selected options." msgstr "Salvare le opzioni selezionate." -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Salva file zip come:" @@ -10436,7 +10438,7 @@ msgstr "Il salvataggio della rete nel contenitore 3MF non è riuscito." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Ridimensiona" @@ -10452,11 +10454,11 @@ msgstr "Fattore di scala" 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:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Ridimensiona per riempire" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Ridimensiona per adattare al volume dato." @@ -10464,7 +10466,7 @@ msgstr "Ridimensiona per adattare al volume dato." msgid "Scale to print volume" msgstr "Ridimensiona a volume di stampa" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Fattore di scala o percentuale." @@ -10495,7 +10497,7 @@ msgstr "Direzione preferita giunzione jitter" msgid "Seams" msgstr "Giunzioni" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Cerca" @@ -10519,7 +10521,7 @@ msgstr "" msgid "Search in English" msgstr "Cerca in inglese" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Cerca nelle impostazioni" @@ -10606,7 +10608,7 @@ msgstr "Seleziona un'azione da applicare al file" msgid "Select by rectangle" msgstr "Seleziona con rettangolo" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Seleziona configurazione da caricare:" @@ -10615,7 +10617,7 @@ 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/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Seleziona i preset da confrontare" @@ -10627,7 +10629,7 @@ msgstr "Seleziona la forma dalla galleria" msgid "Select showing settings" msgstr "Seleziona le impostazioni mostrate" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Seleziona il file STL da riparare:" @@ -10713,7 +10715,7 @@ msgstr "Rimozione Selezione dall'elenco" msgid "Selection-Remove from rectangle" msgstr "Rimuovi selezione da rettangolo" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Seleziona tutti gli oggetti" @@ -10730,7 +10732,7 @@ msgstr "Invia G-code" msgid "Send system info" msgstr "Invia informazioni di sistema" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Manda alla stampante il piano corrente come G-Code" @@ -10754,7 +10756,7 @@ msgstr "Invio di informazioni sul sistema..." msgid "Seq." msgstr "Seq." -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Stampa sequenziale" @@ -10770,7 +10772,7 @@ msgstr "Porta seriale:" msgid "Service name" msgstr "Nome servizio" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Imposta" @@ -10898,7 +10900,7 @@ msgstr "Imposta gli elementi selezionati come stampabili/non stampabili" msgid "Set settings tabs as menu items (experimental)" msgstr "Imposta le schede delle impostazioni come voci di menu (sperimentale)" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -11060,7 +11062,7 @@ msgstr "" msgid "Set upper thumb as active" msgstr "Imposta cursore superiore come attivo" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -11071,7 +11073,7 @@ msgstr "" "Per esempio. loglevel=2 registra messaggi fatali, di errore e di avviso." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Impostazioni" @@ -11126,7 +11128,7 @@ msgstr "" msgid "Shape" msgstr "Forma" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Galleria delle forme" @@ -11177,7 +11179,7 @@ msgstr "Mostra la notifica \"Suggerimento del giorno\" dopo l'avvio" msgid "Show &Configuration Folder" msgstr "Mostra Cartella &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Mostra etichette (&L)" @@ -11193,7 +11195,7 @@ msgstr "Mostra la finestra di informazioni" msgid "Show advanced settings" msgstr "Mostra impostazioni avanzate" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Mostra tutti i preset (incluso quelli non compatibili)" @@ -11233,7 +11235,7 @@ msgstr "Mostra l'altezza dell'oggetto" msgid "Show object height on the ruler" msgstr "Mostra l'altezza dell'oggetto sul righello" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Mostra nella scena 3D le etichette dell'oggetto/istanza" @@ -11261,45 +11263,45 @@ msgstr "Mostra supporti" msgid "Show system information" msgstr "Mostra informazioni di sistema" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Mostra la Vista modifica 3D" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Mostra anteprima slice 3D" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Mostra impostazioni filamento" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "" "Mostra la lista completa delle opzioni di configurazione di stampa SLA." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "" "Mostra l'elenco completo delle opzioni di configurazione stampa/G-code." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Mostra l'elenco delle scorciatoie di tastiera" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Mostra il piano" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Mostra impostazioni di stampa" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Mostra impostazioni della stampante" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Mostra questo aiuto." @@ -11387,7 +11389,7 @@ msgstr "Semplifica modello" msgid "Single Extruder Multi Material" msgstr "Estrusore singolo Multi Material" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -11399,15 +11401,15 @@ msgstr "" "Vuoi modificare il diametro di tutti gli estrusori al valore del diametro " "dell'ugello del primo estrusore?" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Setup Estrusore singolo MM" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Parametri estrusore singolo materiale multiplo" -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Modalità a istanza singola" @@ -11420,7 +11422,7 @@ msgctxt "OfFile" msgid "Size" msgstr "Dimensioni" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Dimensione e coordinate" @@ -11489,15 +11491,15 @@ msgstr "" 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:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Processa" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Processa un file in G-code" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Processa un file in G-code, salva come" @@ -11514,16 +11516,16 @@ msgstr "Processa ora" msgid "Slice resolution" msgstr "Risoluzione slice" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 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:4417 +#: src/libslic3r/PrintConfig.cpp:4392 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:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -11540,13 +11542,13 @@ msgstr "Informazioni processo" msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "L'oggetto processato \"%1%\" sembra un logo o un segno" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Slicing" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Slicing Completato!" @@ -11582,7 +11584,7 @@ msgstr "Slicing del modello" msgid "Slicing supports" msgstr "Supporti di Slicing" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Lento" @@ -11590,7 +11592,7 @@ msgstr "Lento" msgid "Slow down if layer print time is below" msgstr "Rallenta se il tempo di stampa del layer è inferiore a" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Inclinazione lenta" @@ -11598,7 +11600,7 @@ msgstr "Inclinazione lenta" msgid "Small perimeters" msgstr "Perimetri piccoli" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Percentuale di diametro del pilastro piccolo" @@ -11696,7 +11698,7 @@ msgid "Some SLA materials were uninstalled." msgstr "Alcuni materiali SLA sono stati disinstallati." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -11722,7 +11724,7 @@ msgstr "" "Alcuni oggetti sono troppo alti e non possono essere stampati senza essere " "colpiti dall'estrusore." -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -11740,7 +11742,7 @@ msgstr "" "Alcuni preset vengono modificati e le modifiche non salvate non saranno " "catturate dallo snapshot di configurazione." -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -11932,7 +11934,7 @@ msgid "Spiral vase" msgstr "Vaso a spirale" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Dividi" @@ -12001,13 +12003,13 @@ msgstr "Standard" msgid "Stars" msgstr "Stelle" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "G-code iniziale" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Inizia un nuovo progetto" @@ -12015,7 +12017,7 @@ msgstr "Inizia un nuovo progetto" msgid "Start at height" msgstr "Inizia all'altezza" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Avvia un nuovo processo di slicing" @@ -12068,7 +12070,7 @@ msgid "Status:" msgstr "Stato:" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Silenzioso" @@ -12127,19 +12129,19 @@ msgstr "Esecutore Supporto" msgid "Support Generator" msgstr "Generatore Supporti" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Diametro della base del supporto" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Altezza della base del supporto" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Distanza di sicurezza base supporto" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Testa supporto" @@ -12193,7 +12195,7 @@ msgid "Support material/raft/skirt extruder" msgstr "Estrusore materiale di supporto/raft/skirt" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Supporti solo dal piano di stampa" @@ -12201,12 +12203,12 @@ msgstr "Supporti solo dal piano di stampa" msgid "Support parameter change" msgstr "Modifica parametro del Supporto" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Pilastro di supporto" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Densità punti di supporto" @@ -12215,16 +12217,16 @@ msgid "Support points edit" msgstr "Edita punti di supporto" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Supporti" @@ -12378,7 +12380,7 @@ msgstr "Acquisizione istantanea di configurazione" msgid "Taking a configuration snapshot failed." msgstr "Cattura dell'istantanea di configurazione non riuscita." -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Temperatura" @@ -12404,7 +12406,7 @@ msgstr "Variazione di temperatura" msgid "Temperatures" msgstr "Temperature" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Template G-code personalizzato" @@ -12564,7 +12566,7 @@ msgstr "" "La Torre di pulitura è supportata con oggetti multipli solo se questi hanno " "la stessa altezza layer" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -12622,7 +12624,7 @@ msgstr "" "solamente su un sistema di coordinate reali, non appena la rotazione è " "inclusa nelle coordinate dell'oggetto." -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "" "Angolo predefinito per la connessione delle barre di supporto e le giunzioni." @@ -12727,7 +12729,7 @@ msgstr "Tipo di materiale da usare nei G-code personalizzati." msgid "The file does not exist." msgstr "Il file non esiste." -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -12762,7 +12764,7 @@ msgstr "" msgid "The following characters are not allowed by a FAT file system:" msgstr "I seguenti caratteri non sono permessi da un file system FAT:" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -12822,7 +12824,7 @@ msgstr "" msgid "The following values were substituted:" msgstr "I seguenti valori sono stati sostituiti:" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -12830,7 +12832,7 @@ msgstr "" "Lo spazio tra la parte inferiore dell'oggetto e il pad generato nella " "modalità ad elevazione zero." -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Altezza del cono alla base del pilastro" @@ -12872,7 +12874,7 @@ msgstr "" "I dati dell'ultimo cambio colore sono stati salvati per la stampa ad " "estrusore singolo." -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -12880,7 +12882,7 @@ 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:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "La lunghezza massima di un bridge" @@ -12905,7 +12907,7 @@ msgstr "" "La distanza massima che ogni punto della pelle può essere spostato (in " "entrambi i versi), misurata perpendicolarmente al muro perimetrale." -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -12940,7 +12942,7 @@ msgstr "" "bottom_solid_layers se necessario per soddisfare lo spessore minimo del " "guscio inferiore." -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -12983,7 +12985,7 @@ 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:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -12992,7 +12994,7 @@ msgstr "" "pilastri che vengono utilizzati in aree problematiche in cui un normale " "pilastro non può adattarsi." -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13003,7 +13005,7 @@ msgstr "" "verrà utilizzata l'inclinazione lenta, in caso contrario - l'inclinazione " "veloce" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -13014,7 +13016,7 @@ msgstr[1] "" "Le stampanti fisiche qui sotto sono basate sul preset che stai per " "cancellare." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -13075,7 +13077,7 @@ msgstr "Il nome del file fornito non è valido." msgid "The provided name is not valid;" msgstr "Il nome fornito non è valido;" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -13083,7 +13085,7 @@ msgstr "" "Il file 3MF selezionato contiene dei supporti FDM dipinti utilizzando una " "versione più recente di PrusaSlicer e non è compatibile." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -13091,7 +13093,7 @@ msgstr "" "Il 3MF selezionato contiene un oggetto multi-materiale dipinto utilizzando " "una versione più recente di PrusaSlicer e non è compatibile." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -13099,7 +13101,7 @@ msgstr "" "Il 3MF selezionato contiene un oggetto con giunzione dipinta che utilizza " "una versione più recente di PrusaSlicer e non è compatibile." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -13145,7 +13147,7 @@ msgstr "" "L'oggetto selezionato non può essere diviso perché contiene solo una parte " "solida." -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -13182,7 +13184,7 @@ msgstr "La dimensione dell'oggetto può essere specificata in pollici" msgid "The size of the object is zero" msgstr "La dimensione dell'oggetto è zero" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -13261,7 +13263,7 @@ msgstr "Il nome fornito non è valido;" msgid "The supplied settings will cause an empty print." msgstr "Le configurazioni fornite causeranno una stampa vuota." -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Lo spessore del pad e delle intercapedini opzionali." @@ -13661,11 +13663,11 @@ msgstr "" msgid "This is a default preset." msgstr "Questo è un preset predefinito." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 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:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -13678,7 +13680,7 @@ msgid "This is a system preset." msgstr "Questo è un preset di sistema." #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Utilizzato solo nell'interfaccia di Slic3r come aiuto visivo." @@ -14006,7 +14008,7 @@ msgstr "" "un'istantanea di backup della configurazione esistente prima di istallare i " "file compatibili con questo %s." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14019,7 +14021,7 @@ msgstr "" "supportati. Si può decidere di abbandonare o di sostituire un valore " "sconosciuto con un valore predefinito in modo silenzioso o verboso." -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14042,15 +14044,15 @@ msgstr "" "numero di thread ottimali è leggermente superiore al numero di core / " "processori disponibili." -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Inclina" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Inclinazione per resina ad alta viscosità" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Tempo di tilt" @@ -14081,15 +14083,15 @@ msgstr "" "viene eseguito il T code). Questa durata viene aggiunta alla stima del tempo " "totale di stampa del G-code." -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Tempo di inclinazione veloce" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Tempo di inclinazione lenta" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Tempo di inclinazione molto lenta" @@ -14152,7 +14154,7 @@ msgstr "Strumento" msgid "Tool #" msgstr "Strumento #" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-code cambio strumento" @@ -14174,7 +14176,7 @@ msgstr "Posizione strumento" msgid "Tool type" msgstr "Tipo di strumento" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Parametri di cambio strumento per stampanti MM con estrusore singolo" @@ -14197,7 +14199,7 @@ msgstr "" "Suggerimento per lo spessore del guscio Superiore / Inferiore: non " "disponibile a causa di un'altezza dello strato non valida." -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Vista superiore" @@ -14291,7 +14293,7 @@ msgstr "Spostamento" msgid "Triangles" msgstr "Triangoli" -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14313,11 +14315,11 @@ msgstr "Tipologia stampante." msgid "Type:" msgstr "Tipo:" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "LUCCHETTO APERTO" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -14330,7 +14332,7 @@ msgstr "" "Clicca qui per reimpostare tutte le impostazioni del gruppo corrente ai " "valori di sistema (o predefiniti)." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -14371,11 +14373,11 @@ msgstr "Impossibile sostituire con più di un volume" msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Categoria indefinita" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Gruppo non definito" @@ -14389,7 +14391,7 @@ msgstr "Underflow" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Annulla" @@ -14587,7 +14589,7 @@ msgstr "Usa l'inquadratura libera" msgid "Use inches" msgstr "Usa pollici" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Utilizza pad" @@ -14679,11 +14681,11 @@ msgstr "" "Il valore è stato modificato e non è uguale al valore di sistema o " "all'ultimo preset salvato" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 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:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "I valori in questa colonna sono per la modalità Silenziosa" @@ -14729,7 +14731,7 @@ msgstr "Fornitore:" msgid "Verbose G-code" msgstr "G-code verboso" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Versione" @@ -14778,7 +14780,7 @@ msgstr "" "Visita le \"Preferenze\" e controlla \"%1%\"\n" "per modificare la tua scelta." -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Visualizza un G-code già processato e salvato" @@ -14803,7 +14805,7 @@ msgstr "Volumi in Oggetto riordinati" msgid "Volumetric" msgstr "Volumetrico" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Suggerimenti sul flusso volumetrico non disponibili" @@ -14826,17 +14828,17 @@ msgstr "Velocità volumetrica" msgid "WARNING:" msgstr "ATTENZIONE:" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "PALLINO BIANCO" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 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:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -14844,7 +14846,7 @@ 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -14852,7 +14854,7 @@ msgstr "" "L'icona a forma di PALLINO BIANCO indica che il valore è lo stesso " "dell'ultimo preset salvato." -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Spessore parete" @@ -15015,7 +15017,7 @@ msgstr "" "l'estrusore spingerà questa quantità addizionale di filamento. Questa " "impostazione è raramente necessaria." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -15030,17 +15032,19 @@ msgstr "" "perimetri centrali, ma potrebbero rimanere degli spazi vuoti o un'eccessiva " "estrusione." -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" -"Quando si passa da un certo numero di perimetri all'altro, man mano che il " -"pezzo si assottiglia, viene assegnata una certa quantità di spazio per " -"dividere o unire i segmenti del perimetro." +"Quando si passa da un numero di perimetri all'altro, man mano che la parte " +"diventa più sottile, viene assegnata una certa quantità di spazio per " +"dividere o unire i segmenti del perimetro. Se espressa in percentuale (ad " +"esempio 100%), viene calcolata in base al diametro dell'ugello." -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Parola intera" @@ -15052,7 +15056,7 @@ msgstr "Larghezza" msgid "Width (mm)" msgstr "Larghezza (mm)" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "" "Spessore dal centro della sfera posteriore al centro della sfera anteriore" @@ -15061,18 +15065,18 @@ msgstr "" msgid "Width of a wipe tower" msgstr "Larghezza della torre di pulitura" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 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:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Larghezza del display" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -15087,7 +15091,7 @@ msgstr "" "percentuale (ad esempio 85%), verrà calcolata in base al diametro " "dell'ugello." -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -15131,7 +15135,7 @@ msgstr "Torre di pulitura - Regolazione volume di spurgo" msgid "Wipe tower brim width" msgstr "Larghezza brim torre di pulitura" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Parametri torre di pulitura" @@ -15197,7 +15201,7 @@ msgstr "" "\n" "Gruppo di configurazioni aggiornate:" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Scrivi informazioni sul modello alla console." @@ -15286,7 +15290,7 @@ msgstr "" "È possibile inserire qui le note personali. Questo testo verrà aggiunto nei " "commenti iniziali del G-code." -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 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." @@ -15449,7 +15453,7 @@ msgstr "" "Le modifiche attuali cancelleranno tutti i cambi estrusore (strumento) " "salvati." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Il file è stato riparato." @@ -15488,7 +15492,7 @@ msgstr "Offset Z" msgid "Z travel" msgstr "Spostamento Z" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zig-Zag" @@ -15610,7 +15614,7 @@ msgstr "profilo di stampa predefinito" msgid "default value" msgstr "valore predefinito" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "elimina" @@ -15688,7 +15692,7 @@ msgid "flow rate is maximized" msgstr "il flusso viene massimizzato" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -15712,7 +15716,7 @@ msgstr "g" msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" @@ -15729,7 +15733,7 @@ msgid "in" msgstr "in" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -15742,7 +15746,7 @@ msgstr "" "corrente gruppo di opzioni ai valori di sistema (o predefiniti)." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -15751,7 +15755,7 @@ msgstr "" "per l'attuale gruppo di opzioni" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -15788,11 +15792,11 @@ msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community." msgstr "è basato su Slic3r di Alessandro Ranellucci e la comunità RepRap." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "è concesso in licenza ai sensi" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" @@ -15816,7 +15820,7 @@ msgstr "versione PrusaSlicer massima" msgid "min PrusaSlicer version" msgstr "versione PrusaSlicer minima" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" @@ -15856,19 +15860,18 @@ msgstr "ml" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -15882,8 +15885,9 @@ msgstr "mm (imposta a zero per disabilitare)" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm o %" @@ -15945,7 +15949,7 @@ msgstr "modello" msgid "modified" msgstr "modificato" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "soldi/bottiglia" @@ -16003,7 +16007,7 @@ msgstr "stampante" msgid "printer model" msgstr "modello stampante" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "rimuovi" @@ -16024,11 +16028,11 @@ msgstr "richiede min. %s e max. %s" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -16151,8 +16155,8 @@ msgstr "scrittura richiamo non riuscita" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" diff --git a/resources/localization/ja/PrusaSlicer.mo b/resources/localization/ja/PrusaSlicer.mo index d6b1a975d9..bca1e1cd07 100644 Binary files a/resources/localization/ja/PrusaSlicer.mo and b/resources/localization/ja/PrusaSlicer.mo differ diff --git a/resources/localization/ja/PrusaSlicer_ja.po b/resources/localization/ja/PrusaSlicer_ja.po index 2f1b1257e5..0427cb3b17 100644 --- a/resources/localization/ja/PrusaSlicer_ja.po +++ b/resources/localization/ja/PrusaSlicer_ja.po @@ -7,7 +7,7 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Prusalator\n" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -36,9 +36,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -125,7 +124,7 @@ msgid_plural "%1% (%2$d shells)" msgstr[0] "%1% (%2$d シェル)" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "プリセット%1%" @@ -144,7 +143,7 @@ msgstr "" msgid "%1% was substituted with %2%" msgstr "%1%は%2%に置き換えられました" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1%は正常にスライスされました。" @@ -164,7 +163,7 @@ msgstr "フィラメント速度%3.2f mm/sで%3.2f mm³/ s。" msgid "%d lines: %.2f mm" msgstr "%dライン:%.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d プリセットを正常にインポートしました。" @@ -328,7 +327,7 @@ msgstr "" msgid "&About %s" msgstr "%sについて(&A)" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "サイドバーを折りたたむ&C" @@ -340,27 +339,27 @@ msgstr "構成(&C)" msgid "&Configuration Snapshots" msgstr "構成スナップショット(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "コピー(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "選択を削除&D" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "編集(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "エクスポート(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "フィラメント設定タブ(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "ファイル(&F)" @@ -368,19 +367,19 @@ msgstr "ファイル(&F)" msgid "&Finish" msgstr "終了(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "フルスクリーン&F" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Gコードプレビュー&G" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "ヘルプ(&H)" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "インポート(&I)" @@ -388,7 +387,7 @@ msgstr "インポート(&I)" msgid "&Language" msgstr "言語(&L)" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "新しいプロジェクト(&N)" @@ -396,19 +395,19 @@ msgstr "新しいプロジェクト(&N)" msgid "&Next >" msgstr "次 >(&N)" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "Gコードのオープン(&O)" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "プロジェクトのオープン(&O)" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "貼り付け(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "プレートタブ(&P)" @@ -416,35 +415,35 @@ msgstr "プレートタブ(&P)" msgid "&Preferences" msgstr "環境設定(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "中止(&Q)" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "再実行(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "STLファイルの修復(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "プロジェクトを保存(&S)" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "全て選択&S" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "元に戻す(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "ビュー(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "ウィンドウ(&W)" @@ -453,7 +452,7 @@ msgstr "ウィンドウ(&W)" msgid "(All)" msgstr "(全て)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(再)スライス実行(&w)" @@ -465,7 +464,7 @@ msgstr "スライス" msgid "(Some lines not shown)" msgstr "(一部のラインは表示されていません)" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(不明)" @@ -477,7 +476,7 @@ msgstr "(スプールを含む)" msgid "(minimum)" msgstr "(最小)" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ")見つかりません。" @@ -533,7 +532,7 @@ msgstr "2mm" msgid "3 (heavy)" msgstr "3(重い)" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" @@ -620,7 +619,7 @@ msgstr "" "一般的には、PLAでは60℃、ABSでは110℃です。 ヒートベッドがないプリンタではゼロ" "を入力します。" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -646,7 +645,7 @@ msgstr "APIキー" msgid "Abort" msgstr "中止" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "%sについて" @@ -663,7 +662,7 @@ msgstr "加速度コントロール (上級者向け)" msgid "Access violation" msgstr "アクセス違反" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "精度" @@ -703,7 +702,7 @@ msgstr "" "て、プリント時間を短縮し、フィラメントの消費量を減らすことができることをご存" "知ですか? 詳細については、ドキュメントをご覧ください。" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "追加" @@ -766,7 +765,7 @@ msgstr "ギャラリーからシェイプを追加" msgid "Add Shapes from Gallery" msgstr "ギャラリーからシェイプを追加" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "サポートされているモデルの下にパッドを追加します" @@ -883,7 +882,7 @@ msgid "Add pause print" msgstr "プリントの一時停止を追加" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "物理プリンターを追加する" @@ -983,17 +982,16 @@ msgstr "アドレス" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "上級者向け" @@ -1023,16 +1021,16 @@ msgstr "" "にこの量の材料をワイプタワーに試し出しすることで、インフィルまたは犠牲オブ" "ジェクトを確実に形成します。" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "レイヤーチェンジ後のGコード" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "XYで整列" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "モデルを指定されたポイントに合わせます。" @@ -1045,7 +1043,7 @@ msgid "Aligned Rectilinear" msgstr "整列された直線" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "全て" @@ -1243,7 +1241,7 @@ msgstr "カラーの変更を自動的に適用する" msgid "Apply to all the remaining small objects being loaded." msgstr "ロードされている残りのすべての小さなオブジェクトに適用します。" -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "アラクネ" @@ -1255,7 +1253,7 @@ msgstr "アラクネ境界線生成" msgid "Archimedean Chords" msgstr "アルキメデスコード" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "%1%のプリセットを選択してよろしいですか?" @@ -1272,7 +1270,7 @@ msgstr "" msgid "Are you sure you want to continue?" msgstr "続行しますか?" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -1284,7 +1282,7 @@ msgstr "物理プリンタ\"%2%\"から\"%1%\"プリセットを削除しても msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "\"%1%\"プリンタを削除してもよろしいですか?" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "本当にすべての置換を削除しますか?" @@ -1292,7 +1290,7 @@ msgstr "本当にすべての置換を削除しますか?" msgid "Are you sure you want to do it?" msgstr "実行してもよろしいですか?" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "領域塗りつぶし" @@ -1323,7 +1321,7 @@ msgstr "" "アレンジアイコンを右クリックして、オブジェクト間のギャップのサイズを調" "整したり、自動回転を許可したりできることをご存知ですか?" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -1473,7 +1471,7 @@ msgstr "サポートポイントの自動生成" msgid "Autogeneration will erase all manually edited points." msgstr "自動生成は、マニュアルで編集されたすべてのポイントを消去します。" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "自動生成" @@ -1481,7 +1479,7 @@ msgstr "自動生成" msgid "Automatic updates" msgstr "自動アップデート" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "STLファイルの自動修復" @@ -1497,11 +1495,11 @@ msgstr "外周をまたがないようにする" msgid "Avoid crossing perimeters - Max detour length" msgstr "境界線をまたがないようにする-最大迂回長" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "戻る矢印" -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -1513,7 +1511,7 @@ msgstr "" "クリックすると、現在の設定グループのすべての設定が最後に保存されたプリセット" "に戻されます。" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -1527,7 +1525,7 @@ msgstr "" msgid "Background processing" msgstr "バックグラウンドで実行中" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "不明な構成値を回避する" @@ -1535,7 +1533,7 @@ msgstr "不明な構成値を回避する" msgid "Balanced" msgstr "バランスのとれた" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "ベッド" @@ -1583,7 +1581,7 @@ msgstr "" "最初のレイヤー以降のレイヤーのベッド温度。 ベッド温度制御コマンドを無効にする" "には、これをゼロに設定します。" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "レイヤー変更前のGコード" @@ -1608,7 +1606,7 @@ msgstr "ベストな表面仕上がり" msgid "Between objects G-code" msgstr "オブジェクト間のGコード" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "オブジェクト間のGコード(シーケンシャルプリントの場合)" @@ -1631,11 +1629,11 @@ msgstr "ブロックサポート" msgid "Block supports by angle" msgstr "角度によるブロックサポート" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "ボトル容量" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "ボトル重量" @@ -1652,7 +1650,7 @@ msgstr "最下層" msgid "Bottom" msgstr "ボトム" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "下面表示" @@ -1927,8 +1925,8 @@ msgstr "" "サポートポイントなしでは続行できません! サポートポイントを追加するか、サポー" "ト生成を無効にします。" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "オプション" @@ -1936,7 +1934,7 @@ msgstr "オプション" msgid "Capture a configuration snapshot" msgstr "構成スナップショットをキャプチャーする" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "大文字・小文字の区別なし" @@ -1944,11 +1942,11 @@ msgstr "大文字・小文字の区別なし" msgid "Category" msgstr "カテゴリー" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "中心" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "指定されたポイントを中心にプリントを配置します。" @@ -2054,7 +2052,7 @@ msgstr "SLAアーカイブを選択します:" msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "ベッドのイメージファイルを選択(PNG/SVG):" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "スライスするファイルを選択(STL/OBJ/AMF/3MF/PRUSA):" @@ -2100,7 +2098,7 @@ msgstr "円" msgid "Circular" msgstr "円形" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "クラシック" @@ -2108,11 +2106,12 @@ msgstr "クラシック" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" "クラシックの境界線生成は、一定の押し出し幅の境界線を生成し、非常に薄い領域に" "はギャップフィルが使用されます。アラクネ・エンジンは、押し出し幅が変化する境" -"界線を生成します。" +"界線を生成します。この設定は、Concentric infillにも影響します。" #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -2191,7 +2190,7 @@ msgid "Closing PrusaSlicer. Current project is modified." msgstr "PrusaSlicerを閉じます。 現在のプロジェクトが変更されました。" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "閉鎖距離" @@ -2199,7 +2198,7 @@ msgstr "閉鎖距離" msgid "Closing radius" msgstr "閉半径" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "サイドバーを折りたたむ" @@ -2207,11 +2206,11 @@ msgstr "サイドバーを折りたたむ" msgid "Collapse/Expand the sidebar" msgstr "サイドバーを折りたたむ/展開する" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "色" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "カラーチェンジGコード" @@ -2275,12 +2274,12 @@ msgstr "コマンド" msgid "Comment:" msgstr "コメント:" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "プリセットの比較" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "プリセットを比較する" @@ -2288,7 +2287,7 @@ msgstr "プリセットを比較する" msgid "Compare this preset with some another" msgstr "このプリセットを別のプリセットと比較する" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "比較されたプリセットには異なるプリンターテクノロジーがあります" @@ -2450,7 +2449,7 @@ msgstr "" "長くはなりません。 アンカーを無効にするには、このパラメーターをゼロに設定しま" "す。" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "サポートスティックとジャンクションの接続" @@ -2504,7 +2503,7 @@ msgstr "続行して構成の更新をインストールしますか?" msgid "Continue to activate a configuration snapshot %1%?" msgstr "構成スナップショット%1%のアクティブ化を続行しますか?" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -2522,7 +2521,7 @@ msgstr "" "Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas " "Matena, Vojtech Kral, David Kocik 他、多くの方々による貢献。" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -2540,7 +2539,7 @@ msgstr "インチ単位から変換する " msgid "Convert from meters" msgstr "メートルから換算" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "クーリング" @@ -2552,7 +2551,7 @@ msgstr "クーリング動作はこのスピードから徐々に加速します msgid "Cooling moves are gradually accelerating towards this speed." msgstr "冷却動作は、この速度に向かって徐々に加速しています。" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "クーリングしきい値" @@ -2581,7 +2580,7 @@ msgstr "コピー" msgid "Copy Version Info" msgstr "バージョン情報のコピー" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "選択をクリップボードにコピー" @@ -2642,32 +2641,32 @@ msgstr "" "ある可能性があります。もう一度エクスポートするか、別のデバイスを使用してみて" "ください。 破損した出力Gコードは%1%.tmpにあります。" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "コピーライト" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "膨張補正" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "X軸膨張の補正" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Y軸膨張の補正" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Z軸膨張の補正" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "補正" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "費用" @@ -2740,7 +2739,7 @@ msgstr "" "埋められます。 ギャップを閉じることで、最終的なプリント解像度が低下する可能性" "があるため、この値は適度に小さくすることをお勧めします。" -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" "オブジェクトの周りにパッドを作成し、サポートでオブジェクトを上げることを無視" @@ -2758,7 +2757,7 @@ msgstr "一部のプリセットを変更しながら、新しいプロジェク msgid "Creating a new project while the current project is modified." msgstr "現在のプロジェクトを変更しながら、新しいプロジェクトを作成します。" -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "限界角" @@ -2766,7 +2765,7 @@ msgstr "限界角" msgid "Critical error" msgstr "重大なエラー" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "クロス" @@ -2811,8 +2810,8 @@ msgstr "" "HTTPS OctoPrint接続用にカスタムCA証明書ファイルをcrt/pem形式で指定できます。 " "空白のままにすると、デフォルトのOS CA証明書リポジトリが使用されます。" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "カスタムGコード" @@ -2856,7 +2855,7 @@ msgid "Custom template (\"%1%\")" msgstr "カスタムテンプレート(\"%1%\")" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "カット" @@ -2864,7 +2863,7 @@ msgstr "カット" msgid "Cut by Plane" msgstr "面でカット" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "指定されたZでモデルをカットします。" @@ -2872,7 +2871,7 @@ msgstr "指定されたZでモデルをカットします。" msgid "Cylinder" msgstr "シリンダー" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "選択を全てクリア&e" @@ -2880,7 +2879,7 @@ msgstr "選択を全てクリア&e" msgid "Dark mode (experimental)" msgstr "ダークモード(実験的)" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "データディレクトリー" @@ -2906,7 +2905,7 @@ msgstr "インスタンスを減らす" msgid "Default" msgstr "デフォルト" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "デフォルトのSLA材料プロファイル" @@ -2946,8 +2945,8 @@ msgstr "" msgid "Default print profile" msgstr "デフォルトプリントプロファイル" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -2961,7 +2960,7 @@ msgstr "" msgid "Define a custom printer profile" msgstr "カスタムプリンタープロファイルを定義する" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -2979,11 +2978,11 @@ msgstr "アンロードした後の待ち時間" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "削除" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "全て削除&A" @@ -3037,7 +3036,7 @@ msgid "Delete Subobject" msgstr "サブオブジェクト削除" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "全て削除" @@ -3094,16 +3093,16 @@ msgstr "マーカーの削除-マウスの左ボタンまたは「-」キー" msgid "Delete tool change" msgstr "ツールチェンジを削除" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "全てのオブジェクトを削除" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "現在の選択を削除します" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "密度" @@ -3115,9 +3114,9 @@ msgstr "0%-100%の範囲で表される内部インフィルの密度。" msgid "Density of the first raft or support layer." msgstr "1層目のラフトもしくはサポート層の密度" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "依存関係" @@ -3141,7 +3140,7 @@ msgstr "全ての選択解除" msgid "Deselect by rectangle" msgstr "方形で選択解除" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "全てのオブジェクトの選択解除" @@ -3176,7 +3175,7 @@ msgstr "システムプリセットから取り外す" msgid "Detach preset" msgstr "プリセットを切り離す" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "取り外しました" @@ -3200,7 +3199,7 @@ msgstr "" msgid "Detect thin walls" msgstr "薄壁を検知" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -3224,15 +3223,15 @@ msgstr "デバイス:" msgid "Diameter" msgstr "直径" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "ピラーベースの直径(mm)" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "サポートピラーの直径(mm)" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "サポート先端の直径" @@ -3293,31 +3292,31 @@ msgstr "すべてのカスタム変更を破棄" msgid "Discard changes" msgstr "変更取りやめ" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "ディスプレイ" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "ディスプレイの高さ" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "水平ディスプレイミラーリング" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "ディスプレイの向き" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "プリントサーバーのアップロードキュー画面を表示する" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "垂直ミラーリングを表示する" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "画面の幅" @@ -3336,7 +3335,7 @@ msgstr "" "スカートとブリム(ドラフトシールドを使用しない場合)またはオブジェクトの間の距" "離。" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -3373,11 +3372,11 @@ msgstr "プレートの自動配置機能で使用される距離。" msgid "Divide by zero" msgstr "#DIV/0!" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "存在しない読込みが行われても提供されたファイルは失敗させない。" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -3430,7 +3429,7 @@ msgstr "これらのプリンターモデルにデフォルトのSLAマテリア msgid "Do you want to select default filaments for these FFF printer models?" msgstr "これらのFFFプリンターモデルのデフォルトフィラメントを選択しますか?" -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "整列させない" @@ -3494,11 +3493,11 @@ msgstr "" msgid "Drop to bed" msgstr "ベッドに落とす" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "複製" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "グリッドで複製" @@ -3515,11 +3514,11 @@ msgstr "他のレイヤーの間、ファンは常に%1%%%で動作します " msgid "During the other layers, fan will be turned off." msgstr "他のレイヤーでは、ファンはオフになります。" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "動的" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "エクスポート(&x)" @@ -3570,7 +3569,7 @@ msgstr "カスタムG-コードの編集" msgid "Edit pause print message" msgstr "一時停止メッセージを編集" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "物理プリンターの編集" @@ -3594,7 +3593,7 @@ msgstr "編集中" msgid "Eigen vectorization supported:" msgstr "固有値ベクトル化に対応:" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "SDカード/USBメモリーの取り出し&t" @@ -3602,7 +3601,7 @@ msgstr "SDカード/USBメモリーの取り出し&t" msgid "Eject SD card / Flash drive" msgstr "SDカード/USBメモリーを取り出す" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "Gコードをエクスポートした後に、SDカード/USBメモリーを取り出します。" @@ -3619,7 +3618,7 @@ msgstr "デバイス %s(%s) の取り出しに失敗しました。" msgid "Elephant foot compensation" msgstr "最初の層の広がり補正" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "エレファントフット(最下層がちょっと太る)の最小幅" @@ -3652,7 +3651,7 @@ msgstr "Gコードに送信 " msgid "Empty layer between %1% and %2%." msgstr "%1%と%2%.の間の空レイヤー。" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "有効" @@ -3669,11 +3668,11 @@ msgstr "ダークモードを有効にする" msgid "Enable fan if layer print time is below" msgstr "レイヤーのプリント時間がこれ以下の場合にファンをオンにします" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "くり抜きを有効にする" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "出力画像の水平ミラーリングを有効にします" @@ -3688,7 +3687,7 @@ msgstr "" "表面を滑らかにするために、プリントヘッドを使ったトップ表面のアイロンがけを有" "効にする " -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -3696,7 +3695,7 @@ msgstr "" "不明な構成値をデフォルトでサイレントに置き換えることにより、それらの値の読み" "取りを有効にします。" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -3747,7 +3746,7 @@ msgstr "" msgid "Enable variable layer height feature" msgstr "可変レイヤー高さ機能を有効にする" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "出力イメージの垂直ミラーリングをオンにします" @@ -3763,7 +3762,7 @@ msgstr "" "境界線と境界線の間、および最内境界線とインフィルの間の隙間を埋めることが可能" "です。" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" @@ -3795,7 +3794,7 @@ msgstr "強制サポート" msgid "Enqueued" msgstr "キュー追加済み" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "ベッド上で確認" @@ -3907,7 +3906,7 @@ msgstr "" "エラー: \"%2%\"" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "エラー" @@ -4053,23 +4052,23 @@ msgstr "エキスパートモード" msgid "Export" msgstr "エクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "設定のエクスポート(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Gコードのエクスポート(&G)" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "ツールパスをOBJとしてエクスポート&T" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "3MFのエクスポート" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "AMFのエクスポート" @@ -4077,11 +4076,11 @@ msgstr "AMFのエクスポート" msgid "Export AMF file:" msgstr "AMFファイルのエクスポート:" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "設定とバンドルのエクスポート(&B)" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "物理プリンター情報を含んだ構成セットのエクスポート " @@ -4090,15 +4089,15 @@ msgid "Export G-Code." msgstr "Gコードのエクスポート。" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Gコードのエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "GコードをSDカード/USBメモリーにエクスポートする" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "OBJのエクスポート" @@ -4106,19 +4105,19 @@ msgstr "OBJのエクスポート" msgid "Export OBJ file:" msgstr "OBJファイルのエクスポート :" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "プレートを&STLとしてエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "サポートを含むSTLとしてプレートをエクスポート&I" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "SLAのエクスポート" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "STLのエクスポート" @@ -4126,11 +4125,11 @@ msgstr "STLのエクスポート" msgid "Export STL file:" msgstr "STLファイルのエクスポート :" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "物理プリンターを含むすべてのプリセットをファイルにエクスポートする" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "すべてのプリセットをファイルにエクスポートします" @@ -4142,23 +4141,23 @@ msgstr "STLとしてエクスポート" msgid "Export config" msgstr "構成のエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "現在の構成をファイルにエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "現在のプレートをGコードとしてエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "現在のプレートをGコードとしてSDカード/USBメモリーにエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "現在のプレートをSTLとしてエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "サポートを含むSTLとして現在のプレートをエクスポート" @@ -4176,19 +4175,19 @@ msgstr "3MFの一時ファイルのエクスポートに失敗しました" msgid "Export sources full pathnames to 3mf and amf" msgstr "ソースのフルパス名を3mfおよびamfにエクスポートする" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "モデルを3MFとしてエクスポートします。" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "モデルをAMF形式でエクスポート。" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "モデルをOBJとしてエクスポート。" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "STLとしてモデルをエクスポート。" @@ -4196,7 +4195,7 @@ msgstr "STLとしてモデルをエクスポート。" msgid "Export to SD card / Flash drive" msgstr "SDカード/Flashドライブにエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "ツールパスをOBJとしてエクスポート" @@ -4208,7 +4207,7 @@ msgstr "エクスポート。" msgid "Exporting G-code" msgstr "Gコードのエクスポート" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "構成バンドルのエクスポート" @@ -4229,11 +4228,11 @@ msgstr "エクスポート中。" msgid "Exposition time is out of printer profile bounds." msgstr "露光時間がプリンタープロファイルの範囲外です。" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "露光" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "露光時間" @@ -4295,7 +4294,7 @@ msgstr "エクストルーダーカラー" msgid "Extruder changed to" msgstr "エクストルーダーを変更" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "エクストルーダーのクリアランス" @@ -4304,7 +4303,7 @@ msgid "Extruder offset" msgstr "エクストルーダーのオフセット" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -4312,7 +4311,7 @@ msgid "Extruders" msgstr "エクストルーダー" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "エクストルーダーの数" @@ -4352,7 +4351,7 @@ msgstr "FFF型プリンター" msgid "Facets" msgstr "面" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "初期露出レイヤー" @@ -4381,11 +4380,11 @@ msgstr "モデルへの穴あけに失敗しました" msgid "Fan Speed (%)" msgstr "ファンスピード(%)" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "ファン設定" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "ファンスピード" @@ -4418,11 +4417,11 @@ msgstr "ファンは常に%1%%%で動作します " msgid "Fan will be turned off." msgstr "ファンがオフになります。" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "早い" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "早いチルト" @@ -4446,7 +4445,7 @@ msgstr "射出の種類" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "フィラメント" @@ -4458,7 +4457,7 @@ msgstr "フィラメント径:" msgid "Filament End G-code" msgstr "フィラメントエンドG-Code" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "フィラメント上書き" @@ -4467,7 +4466,7 @@ msgid "Filament Profiles Selection" msgstr "フィラメントプロファイルの選択" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "フィラメント設定" @@ -4509,7 +4508,7 @@ msgstr "フィラメントメモ" msgid "Filament parking position" msgstr "フィラメント待避ポジション" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "フィラメント特性" @@ -4526,7 +4525,7 @@ msgstr "フィラメントアンロード時間" msgid "Filaments" msgstr "フィラメント" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "ファイルが見つかりません" @@ -4594,7 +4593,7 @@ msgstr "ベッドの残りの領域を、選択したオブジェクトのイン msgid "Filling bed" msgstr "ベッドフィリング" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "探す" @@ -4606,11 +4605,11 @@ msgstr "Gコード行のパターンを検索して置換します。" msgid "Finished" msgstr "完了" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "ファームウェア" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "ファームウェア引き込み" @@ -4814,7 +4813,7 @@ msgstr "" "ワイプタワーを可溶性のサポートと連携させるには、サポートレイヤーをオブジェク" "トレイヤーと同期させる必要があります。" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "オブジェクト全体にパッドを強制" @@ -4848,7 +4847,7 @@ msgstr "" "Gコードサムネイルのフォーマット。PNGは最高の品質、JPGは最小のサイズ、QOIは低" "メモリのファームウェアのため" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -4856,7 +4855,7 @@ msgstr "" "構成ファイルおよびプロジェクトファイル (3MF, AMF)から構成をロードする場合の上" "位互換性ルール。" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "予約キーワードが見つかりました" @@ -4869,11 +4868,11 @@ msgid "From Object List You can't delete the last solid part from object." msgstr "" "オブジェクトリストからオブジェクトの最後のパートを削除することはできません。" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "正面" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "正面" @@ -4881,7 +4880,7 @@ msgstr "正面" msgid "Full fan speed at layer" msgstr "レイヤーでのフルファン速度" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "フルスクリーン" @@ -4929,7 +4928,7 @@ msgstr "ファジースキン厚さ" msgid "Fuzzy skin type." msgstr "ファジースキンタイプ。" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "Gコード" @@ -4967,11 +4966,11 @@ msgstr "Gコード置換" msgid "G-code thumbnails" msgstr "Gコードのサムネイル" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Gコードビュワー" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, version 3 (AGPL v3)" @@ -4988,10 +4987,10 @@ msgstr "ギャラリー" msgid "Gap fill" msgstr "ギャップフィル" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "全般" @@ -5021,11 +5020,11 @@ msgstr "" "ト(ベッド)上のプリント領域(フットプリント)が非常に薄い/不十分なオブジェクトの" "密着力を高めるのに役立ちます。" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "サポート生成" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "モデルのサポートを生成する" @@ -5214,11 +5213,11 @@ msgstr "" msgid "Head diameter" msgstr "先端径" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "サポートチップの貫通" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "" "サポートチップの貫通は、サポートチップの厚さを超えないようにしてください。" @@ -5243,7 +5242,7 @@ msgstr "高さ(mm)" msgid "Height of skirt expressed in layers." msgstr "スカートの高さをレイヤーで表現。" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "ディスプレイの高さ" @@ -5268,15 +5267,15 @@ msgstr "" "こんにちは、%sへようこそ! この%sは初期設定に役立ちます。 いくつかの設定を行" "うだけで、プリントの準備ができます。" -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "ヘルプ" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "ヘルプ(FFFオプション)" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "ヘルプ(SLAオプション)" @@ -5308,7 +5307,7 @@ msgstr "高い" msgid "High extruder current on filament swap" msgstr "フィラメント交換時の高いエクストルーダー電流" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "高粘度" @@ -5340,7 +5339,7 @@ msgstr "穴径" msgid "Hollow and drill" msgstr "くり抜きと穴開け" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "内部を空にするためにモデルをくり抜く" @@ -5348,16 +5347,16 @@ msgstr "内部を空にするためにモデルをくり抜く" msgid "Hollow this object" msgstr "このオブジェクトのくり抜き" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "くり抜き" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -5424,19 +5423,19 @@ msgstr "" "カーソルをボタンの上に置くと、詳細情報が表示されます。またはこのボタンをク" "リックします。" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "パッドの形状の周りの幅" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "小さなコネクターをモデルにどの程度深く入れるか。" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "サポートの先端がモデルの表面をどの程度貫通しているか" -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -5649,7 +5648,7 @@ msgid "" msgstr "" "有効にすると、折りたたみサイドバーのボタンが3Dシーンの右上隅に表示されます" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -5909,7 +5908,7 @@ msgstr "" "接続に失敗した場合は、自己署名証明書に対してこのオプションを有効にすることを" "お勧めします。" -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "存在しない設定ファイルを無視する" @@ -5927,15 +5926,15 @@ msgstr "違法な指示" msgid "Import" msgstr "インポート" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "設定のインポート(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "構成バンドルのインポート(&B)" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "プロジェクトから構成をインポート&P" @@ -5951,7 +5950,7 @@ msgstr "オブジェクトをインポート" msgid "Import Objects" msgstr "オブジェクトのインポート" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "SL1/SL1Sアーカイブのインポート" @@ -5959,11 +5958,11 @@ msgstr "SL1/SL1Sアーカイブのインポート" msgid "Import SLA archive" msgstr "SLAアーカイブをインポート" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "STLのインポート(インチ)" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "STL/OBJ/AMF/3MFのインポート(&F)" @@ -6091,11 +6090,11 @@ msgstr "プロファイルを継承" msgid "Initial exposition time is out of printer profile bounds." msgstr "初期露出時間は、プリンタプロファイルの範囲外です。" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "初期露出時間" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "初期レイヤー高さ" @@ -6198,7 +6197,7 @@ msgstr "内部エラー:%1%" msgid "Internal infill" msgstr "内部のインフィル" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "モデルへの無効なサポートの貫通" @@ -6224,7 +6223,7 @@ msgstr "入力形式が無効です。 次の形式の次元の予想される msgid "Invalid numeric input." msgstr "無効な数値入力。" -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "無効なピンヘッド径" @@ -6259,11 +6258,11 @@ msgstr "アイロンタイプ" msgid "Is it safe?" msgstr "安全ですか?" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "アイソメ" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "アイソメ表示" @@ -6290,7 +6289,7 @@ msgstr "" "メント押出し力を高められます。フィラメントの先端シェイプによりロード時の負荷" "抵抗が増加してしまう場合に有効な機能です。" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "これは、この物理プリンターの最後のプリセットです。" @@ -6302,7 +6301,7 @@ msgstr "SLAではマルチパートオブジェクトのプリントはできま msgid "It's not possible to delete the last related preset for the printer." msgstr "プリンタの最後の関連プリセットを削除することはできません。" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "ジャーク(加加速度)限界" @@ -6368,7 +6367,7 @@ msgstr "選択した設定を保持します。" msgid "Keep upper part" msgstr "上側パーツを保持" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "キーボードショートカット" @@ -6376,11 +6375,11 @@ msgstr "キーボードショートカット" msgid "Keyboard shortcuts" msgstr "キーボードショートカット" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "ロックしたカギ" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -6388,7 +6387,7 @@ msgstr "" "ロックされたカギアイコンは、設定が現在のオプショングループのシステム(または" "デフォルト)値と同じであることを示します" -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -6400,7 +6399,7 @@ msgstr "" msgid "Label objects" msgstr "オブジェクトにラベルを付ける" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "横方向" @@ -6440,7 +6439,7 @@ msgstr "" "\n" "レイヤーの高さは0.01にリセットされます。" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "レイヤー高さ限度" @@ -6448,8 +6447,8 @@ msgstr "レイヤー高さ限度" msgid "Layer range Settings to modify" msgstr "修正するレイヤー範囲の設定" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "レイヤー" @@ -6466,7 +6465,7 @@ msgstr "レイヤー" msgid "Layers and Perimeters" msgstr "積層ピッチと外壁の設定" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "レイヤーと外周" @@ -6479,15 +6478,15 @@ msgstr "レイアウトオプション" msgid "Leave \"%1%\" enabled" msgstr "\"%1%\" を有効のままにする" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "左" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "左プリセット値" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "左面" @@ -6526,7 +6525,7 @@ msgid "Length of the infill anchor" msgstr "インフィルアンカー長" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -6538,7 +6537,7 @@ msgstr "" msgid "Lift Z" msgstr "リフトZ" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -6598,19 +6597,19 @@ msgstr "パーツの読込み" msgid "Load Project" msgstr "プロジェクト読込み" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "モデルを読込む" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "SL1 / SL1Sアーカイブをロードする" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "インチで保存されたモデルをロードします " -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -6619,7 +6618,7 @@ msgstr "" "指定されたディレクトリで設定を読込み/保存します。 これは、異なるプロファイル" "を維持したり、ネットワークストレージからの構成を含めたりするのに役立ちます。" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "設定ファイルの読込み" @@ -6638,11 +6637,11 @@ msgstr "" "ブ]を使用できます。これにより、ボクセルデータから3Dモデルを再構築することもで" "きます。" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "プロジェクトファイルから設定を読み込む" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -6650,11 +6649,11 @@ msgstr "" "指定されたファイルから構成をロードします。 複数のファイルからオプションをロー" "ドするために複数回使用できます。" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "エクスポートされた構成ファイルを読込む" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "プリセットをバンドルから読込む" @@ -6686,11 +6685,11 @@ msgstr "構成のロード" msgid "Loading file" msgstr "ファイル読込み中" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "構成バンドルのロード" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "構成ファイルのロード" @@ -6729,7 +6728,7 @@ msgstr "ローカル座標" msgid "Lock supports under new islands" msgstr "新しい台座でのサポートロック" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "ログレベル" @@ -6745,7 +6744,7 @@ msgstr "低い" msgid "Lowest Z height" msgstr "最小Z高さ" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -6754,7 +6753,7 @@ msgstr "最小Z高さ" msgid "Machine limits" msgstr "機体の限界" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -6762,7 +6761,7 @@ msgstr "" "機械の制限が設定されていないため、プリント時間の見積もりが不正確な場合があり" "ます。 " -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -6772,7 +6771,7 @@ msgstr "" "す。したがって、プリンターが異なるマシン制限のセットを使った場合、不正確な予" "測時間になります。" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" @@ -6797,20 +6796,20 @@ msgstr "マニュアル編集" msgid "Masked SLA file exported to %1%" msgstr "マスクされたSLAファイルが%1%にエクスポートされました" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "1行にマッチする" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "材料設定タブ(&r)" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "材料" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "材料設定" @@ -6819,7 +6818,7 @@ msgstr "材料設定" msgid "Material Settings Tab" msgstr "材料設定タブ" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "材料プリントプロファイル" @@ -6827,19 +6826,19 @@ msgstr "材料プリントプロファイル" msgid "Max" msgstr "最大" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "最長ブリッジ長さ" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "ピラー上の最大ブリッジ数" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "最大結合距離" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "ピラーがリンクする最大距離" @@ -6935,7 +6934,7 @@ msgstr "吸込み中の最大加速度" msgid "Maximum acceleration when retracting (M204 R)" msgstr "リトラクト時の最大加速度(M204 R)" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "最大加速度" @@ -6956,7 +6955,7 @@ msgstr "" "ヤーで個別に実行されるため、目に見えるアーティファクトが生成される可能性があ" "ります。" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "最長露光時間" @@ -6992,11 +6991,11 @@ msgstr "Y軸の最大送り速度" msgid "Maximum feedrate of the Z axis" msgstr "Z軸最大送り量" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "最大送り速度" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "最大初期露光時間" @@ -7036,7 +7035,7 @@ msgstr "Z軸最大ジャーク" msgid "Maximum length of the infill anchor" msgstr "最長インフィルアンカー" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -7067,7 +7066,7 @@ msgid "Medium" msgstr "中間" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "マージ" @@ -7083,7 +7082,7 @@ msgstr "オブジェクトを1つのマルチパートオブジェクトにマ msgid "Merged" msgstr "マージ" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -7121,7 +7120,7 @@ msgstr "最小" msgid "Min print speed" msgstr "最低プリント速度" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "サポートポイントの最小距離" @@ -7162,11 +7161,11 @@ msgstr "" "力以上の情報があります。 単純化しないでファイルの完全な解像度で処理するには、" "ゼロに設定します。" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "最短露光時間" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Minimum feature size" msgstr "最小フィーチャーサイズ" @@ -7178,15 +7177,15 @@ msgstr "射出中の最小速度" msgid "Minimum feedrate when extruding (M205 S)" msgstr "射出時の最小送り速度(M205 S)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "最小送り速度" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "最小初期露光時間" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "最小境界線幅" @@ -7210,14 +7209,17 @@ msgstr "" msgid "Minimum thickness of a top / bottom shell" msgstr "上部/下部シェルの最小厚" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" "薄いフィーチャーの最小厚み。この値より薄いモデルフィーチャーはプリントされ" -"ず、最小フィーチャーサイズより厚いフィーチャーは最小境界線幅に広げられます。" +"ず、最小フィーチャーサイズより厚いフィーチャーは最小外周幅に広げられます。" +"パーセントで表現される場合(例えば25%)、ノズル径を基に計算されます。" #: src/libslic3r/PrintConfig.cpp:2899 msgid "Minimum top shell thickness" @@ -7240,11 +7242,11 @@ msgstr "最小移動速度" msgid "Minimum travel feedrate (M205 T)" msgstr "最小移動速度 (M205 T)" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "くり抜きモデルの最小壁厚" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "エレファントフットの補正を行うときに維持する外観の最小幅。" @@ -7267,7 +7269,7 @@ msgstr "" msgid "Mirror Object" msgstr "オブジェクトのミラーリング" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "水平にミラーリング" @@ -7287,7 +7289,7 @@ msgstr "選択オブジェクトをY軸に沿ってミラーリング" msgid "Mirror the selected object along the Z axis" msgstr "選択したオブジェクトをZ軸に沿ってミラーリングします" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "垂直にミラーリング" @@ -7468,11 +7470,11 @@ msgstr "" "これらは複数のオブジェクトではなく、\n" "複数のパーツからなる単一のオブジェクトとしますか?" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "グリッドを作成して複数コピーします。" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "この係数で複数コピーします。" @@ -7562,7 +7564,7 @@ msgstr "新しいレイアウト、トップメニューの設定ボタンから msgid "New prerelease version %1% is available." msgstr "新しいプレリリースバージョン%1%が利用可能です。" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "新しいプリンタプリセットが選択されました" @@ -7622,7 +7624,7 @@ msgstr "オブジェクトのツールパスが生成されませんでした。 msgid "No pad can be generated for this model with the current configuration" msgstr "現在の構成では、このモデルのパッドを生成できません" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "以前にスライスされたファイルはありません。" @@ -7630,7 +7632,7 @@ msgstr "以前にスライスされたファイルはありません。" msgid "No sparse layers (EXPERIMENTAL)" msgstr "スパースレイヤーなし(試用的)" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "このしきい値よりも近くにサポートポイントは配置されません。" @@ -7646,7 +7648,7 @@ msgid "None" msgstr "なし" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "ノーマル" @@ -7662,7 +7664,7 @@ msgstr "見つかりません:" msgid "Note" msgstr "注意" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -7670,7 +7672,7 @@ msgstr[0] "" "選択したプリセットはこれらのプリンターからも削除されることに注意してくださ" "い。" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -7679,7 +7681,7 @@ msgstr[0] "" "選択したプリセットを削除すると、これらのプリンターは削除されることに注意して" "ください。" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -7728,12 +7730,12 @@ msgstr "注:このプリセットは保存後に置き換えられます" msgid "Note: some shortcuts work in (non)editing mode only." msgstr "注:一部のショートカットは編集モードでは使えません。" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "メモ" @@ -7747,7 +7749,7 @@ msgstr "通知" msgid "Notify about new releases" msgstr "新しいリリースについて通知する" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "ノズル" @@ -7759,7 +7761,7 @@ msgstr "ノズル径:" msgid "Nozzle and Bed Temperatures" msgstr "ノズルとベッド温度" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "ノズル径" @@ -7789,7 +7791,7 @@ msgstr "" msgid "Number of cooling moves" msgstr "冷却移動回数" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "プリンターのエクストルーダー数。" @@ -7817,15 +7819,15 @@ msgstr "" "されている場合、ループ数はここで設定された値よりも大きくなる場合があります。 " "スカートを完全に無効にするには、これをゼロに設定します。" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "ピクセル数" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Xのピクセル数" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Yのピクセル数" @@ -7841,7 +7843,7 @@ msgstr "上部と底部のソリッドレイヤー(塗りつぶし)数。" msgid "Number of solid layers to generate on top surfaces." msgstr "上部に生成するソリッドレイヤー(塗りつぶし)数。" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -7855,7 +7857,7 @@ msgstr "ツールチェンジ回数" msgid "Object Settings to modify" msgstr "オブジェクト設定を変更" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "オブジェクトの持ち上げ高" @@ -7969,7 +7971,7 @@ msgstr "垂直スライダーの1レイヤーモードOn/Off" msgid "One layer mode" msgstr "1レイヤーモード" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "プリセットの1つが見つかりません" @@ -7994,7 +7996,7 @@ msgstr "" "す。 最後のオブジェクトを除くすべてを削除するか、「complete_objects」でシーケ" "ンシャルモードを有効にします。 " -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -8006,7 +8008,7 @@ msgstr "" msgid "Only infill where needed" msgstr "必要な場合のみインフィルを付ける" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Zをリフト" @@ -8047,7 +8049,7 @@ msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" "垂れ防止機能は、現在のところ、ワイプタワーを有効にした状態では使えません。" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "&Prusaスライサーのオープン" @@ -8067,11 +8069,11 @@ msgstr "フォルダーを開きます。" msgid "Open G-code file:" msgstr "開くGコードファイル:" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Gコードビューワーを開く" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "新しいインスタンスを開く" @@ -8079,20 +8081,20 @@ msgstr "新しいインスタンスを開く" msgid "Open Preferences." msgstr "設定を開く。" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "PrusaSlicerを開く" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "G-コードファイルを開く" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "新しいPrusaSlicerインスタンスを開く" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "プロジェクトファイルを開く" @@ -8134,7 +8136,7 @@ msgstr "ブラウザで%sウェブサイトを開きます" msgid "Open the Prusa3D drivers download page in your browser" msgstr "ブラウザーでPrusa3Dドライバのダウンロードページを開きます" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "シェイプギャラリーの編集ダイヤログを開く" @@ -8150,7 +8152,7 @@ msgstr "構成ウィザードを開く" msgid "Opening new project while some presets are unsaved." msgstr "一部のプリセットが保存されていないときに新しいプロジェクトを開きます。" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -8225,7 +8227,7 @@ msgstr "オリエンテーション検索がキャンセルされました。" msgid "Origin" msgstr "原点" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "その他" @@ -8245,15 +8247,15 @@ msgstr "アウターとインナーブリム" msgid "Outer brim only" msgstr "外側のブリムのみ" -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "ファイル出力" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "モデル情報のアウトプット" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "出力ファイル" @@ -8261,7 +8263,7 @@ msgstr "出力ファイル" msgid "Output filename format" msgstr "出力ファイル名の形式" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "出力オプション" @@ -8286,19 +8288,19 @@ msgstr "オーバハングのしきい値" msgid "Overlap" msgstr "オーバーラップ" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "プリント設定タブ(&r)" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "パッド" @@ -8306,15 +8308,15 @@ msgstr "パッド" msgid "Pad and Support" msgstr "パッドとサポート" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "オブジェクト周りにパッド" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "オブジェクト周り全体にパッドを配置" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "パッドブリムサイズ" @@ -8322,31 +8324,31 @@ msgstr "パッドブリムサイズ" msgid "Pad brim size is too small for the current configuration." msgstr "パッドのブリム(縁)サイズは、現在の構成には小さすぎます。" -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "パッドオブジェクトコネクタの貫通" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "パッドオブジェクトコネクタのピッチ" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "パッドオブジェクトの接続幅" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "パッドオブジェクトのギャップ" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "パッド壁の高さ" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "側壁の傾斜" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "台座の壁の厚さ" @@ -8475,7 +8477,7 @@ msgstr "ペースト" msgid "Paste From Clipboard" msgstr "クリップボードからの貼り付け" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "クリップボードからペースト" @@ -8513,7 +8515,7 @@ msgstr "サポートの生成用のパターン。" msgid "Pause" msgstr "停止" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "プリント停止Gコード" @@ -8548,7 +8550,7 @@ msgstr "" "デスクトップ統合を実行します(このバイナリをシステムで検索できるように設定し" "ます)。" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -8591,7 +8593,7 @@ msgstr "" msgid "Perimeter" msgstr "外周" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "境界線分布カウント" @@ -8603,15 +8605,15 @@ msgstr "境界線エクストルーダー" msgid "Perimeter generator" msgstr "境界線の生成" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "境界線移行長さ" -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "境界線移行フィルタマージン" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "境界線移行しきい値角" @@ -8662,27 +8664,27 @@ msgstr "" "次の形式で.gcodeおよび.sl1 / .sl1sファイルに保存される画像サイズ:\"XxY, " "XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "ピラー接続モード" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "ピラー径" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "ピラーの太さ係数" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "サポートチップの直径は、ピラー径より小さくする必要があります。" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "ピンヘッド前面径" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "ピンヘッド幅" @@ -8730,11 +8732,11 @@ msgstr "" msgid "Please select the file to reload" msgstr "リロードするファイルを選択してください" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "一部の著作権" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "ポートレート" @@ -8743,7 +8745,7 @@ msgstr "ポートレート" msgid "Position" msgstr "位置" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "ポジション(マルチエクストルーダーの場合)" @@ -8759,7 +8761,7 @@ msgstr "Yポジション" msgid "Position of perimeters starting points." msgstr "境界線プリントの開始点。" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "後処理スクリプトは、Gコードファイルを適切に変更する必要があります。" @@ -8781,11 +8783,11 @@ msgstr "" "後処理スクリプトを調整してGコードを変更し、オプションで後処理されたGコード" "ファイルの名前を変更する方法についてマニュアルを参照してください。\n" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "ポストプロセス・スクリプト" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "プレビュー(&v)" @@ -8857,7 +8859,7 @@ msgstr "" msgid "Preset with name \"%1%\" already exists." msgstr "\"%1%\"というプリセット名は既に存在します。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -8865,7 +8867,7 @@ msgstr "" "プリセットは異なります。\n" "このボタンをクリックして、左右のプリセットに同じプリセットを選択します。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "プリセットは同じです" @@ -8905,7 +8907,7 @@ msgstr "" msgid "Pressure equalizer (experimental)" msgstr "圧力均一化(試行的)" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -8924,7 +8926,7 @@ msgstr "" "す。パーセントで表すと(例えば25%)、ノズル径を基準に計算されます。" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "プレビュー" @@ -8932,7 +8934,7 @@ msgstr "プレビュー" msgid "Preview hollowed and drilled model" msgstr "くり抜き穴開けモデルのプレビュー" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "以前のスライスファイル(" @@ -8944,7 +8946,7 @@ msgstr "全てのエクストルーダーでプライムを実施" msgid "Print" msgstr "プリント" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "プリントサーバーアップロードキュー(&H)" @@ -8952,7 +8954,7 @@ msgstr "プリントサーバーアップロードキュー(&H)" msgid "Print Diameters" msgstr "各種直径" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "プリントサーバーアップロード" @@ -8989,15 +8991,15 @@ msgstr "プリント停止" msgid "Print settings" msgstr "プリント設定" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "プリントスピード" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "プリント速度上書き" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "プリンター設定タブ(&e)" @@ -9032,11 +9034,11 @@ msgstr "プリンター設定" msgid "Printer Settings Tab" msgstr "プリンター設定タブ" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "絶対的なプリンター補正" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "プリンタガンマ補正" @@ -9048,32 +9050,32 @@ msgstr "プリンターメモ" msgid "Printer preset names" msgstr "プリンタのプリセット名" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "プリンター寸法X軸補正" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "プリンター寸法Y軸補正" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "プリンター寸法Z軸補正" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "プリンター寸法補正" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "X軸のプリンター寸法補正" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Y軸のプリンター寸法補正" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Z軸のプリンター寸法補正" @@ -9120,7 +9122,7 @@ msgid "Process %1% / 100" msgstr "プロセス%1%/ 100" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "%s実行中" @@ -9134,9 +9136,9 @@ msgstr "" "100万ポリゴンを超えるモデル'%1%'の処理は遅くなる可能性があります。 ポリゴン数" "を減らすことを強くお勧めします。" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "プロファイルの依存関係" @@ -9226,7 +9228,7 @@ msgid "" "PrusaSlicer has encountered an error while taking a configuration snapshot." msgstr "PrusaSlicerは、構成スナップショットの作成中にエラーが発生しました。" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -9346,15 +9348,15 @@ msgstr "クイック" msgid "Quick Add Settings (%s)" msgstr "クイック追加設定(%s)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "高速スライス" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "クイックスライスと名前を付けて保存" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "%sを終了" @@ -9421,7 +9423,7 @@ msgstr "ラミング線幅" msgid "Ramming parameters" msgstr "ラミングパラメーター" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "ラミング設定" @@ -9441,8 +9443,8 @@ msgstr "範囲" msgid "Rasterizing layers" msgstr "レイヤーのラスタライズ" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "ディスクからの再読み込み&l" @@ -9454,15 +9456,15 @@ msgstr "再構成" msgid "Ready" msgstr "準備完了" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "背面" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "背面" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "最近のプロジェクト" @@ -9505,7 +9507,7 @@ msgid "Rectilinear grid" msgstr "直線グリッド" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "再実行" @@ -9536,7 +9538,7 @@ msgstr "プリンターの更新" msgid "Regular" msgstr "通常" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "正規表現" @@ -9585,9 +9587,9 @@ msgstr "リロード元:" msgid "Reload plater from disk" msgstr "ディスクからプレートをリロードします" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "プレートをリロードします" @@ -9613,7 +9615,7 @@ msgid "Remember output directory" msgstr "出力ディレクトリを記憶する" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "除去" @@ -9741,11 +9743,11 @@ msgstr "" msgid "Render" msgstr "レンダー" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "ソフトウェアでレンダリングする" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -9753,7 +9755,7 @@ msgstr "" "ソフトウェアレンダラーでレンダリングします。 デフォルトのOpenGLドライバーの代" "わりに、バンドルされたMESAソフトウェアレンダラーがロードされます。" -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "修復" @@ -9785,11 +9787,11 @@ msgstr "Netfabbでモデルを修復中" msgid "Repairing was canceled" msgstr "リペアはキャンセルされました" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "最後のクイックスライスを繰り返す" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "最後のクイックスライスを繰り返す" @@ -9801,7 +9803,7 @@ msgstr "置換元:" msgid "Replace the selected volume with new STL" msgstr "選択したボリュームを新しいSTLに置き換えます" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "で置き換える" @@ -9869,7 +9871,7 @@ msgstr "縮尺をリセット" msgid "Reset selection" msgstr "選択のリセット" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "フィラメントの色をリセット" @@ -9893,8 +9895,8 @@ msgstr "ワイプ前に引き込む" msgid "Retract on layer change" msgstr "レイヤーチェンジ時の待避" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "リトラクション" @@ -9915,7 +9917,7 @@ msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "移動がこの長さより短い場合、吸込み動作を行いません。" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9947,15 +9949,15 @@ msgstr "メーターからの変換を元に戻す" msgid "Review the substitutions and adjust them if needed." msgstr "置換を確認し、必要に応じて調整します。" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "右" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "正しいプリセット値" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "右側" @@ -9990,15 +9992,15 @@ msgstr "右マウスボタン:" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "回転" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "X軸周りで回転" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Y軸周りの回転" @@ -10026,15 +10028,15 @@ msgstr "" msgid "Rotation" msgstr "回転" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "X軸の周りの回転角度(度)。" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Y軸を中心とした回転角(度単位)。" -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Z軸周りの回転角度(度)。" @@ -10052,11 +10054,11 @@ msgstr "%s実行" msgid "Running post-processing scripts" msgstr "ポストプロセス スクリプト実行中" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "Gコードを送信(&e)" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "プリントする(&e)" @@ -10086,7 +10088,7 @@ msgstr "SLAギズモのキーボードショートカット" msgid "SLA material" msgstr "SLA材料" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA材料のタイプ" @@ -10098,7 +10100,7 @@ msgstr "SLAマテリアル" msgid "SLA print" msgstr "SLAプリント" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLAプリント材料メモ" @@ -10110,7 +10112,7 @@ msgstr "SLAプリント設定" msgid "SLA supports outside the print area were detected." msgstr "プリント領域外のSLAサポートが検出されました。" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" @@ -10129,7 +10131,7 @@ msgstr "保存" msgid "Save %s as:" msgstr "形式を変更して%sを保存:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "%sファイルを別の名前で保存:" @@ -10138,11 +10140,11 @@ msgstr "%sファイルを別の名前で保存:" msgid "Save G-code file as:" msgstr "Gコードを別名で保存:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJファイルを保存します(STLよりも調整エラーが少ない):" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "名前を付けてプロジェクトを保存&a" @@ -10150,15 +10152,15 @@ msgstr "名前を付けてプロジェクトを保存&a" msgid "Save SL1 / SL1S file as:" msgstr "別名でSL1/SL1Sファイルを保存:" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "設定ファイルを保存" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "構成ファイルを別名で保存:" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "指定したファイルに構成を保存します。" @@ -10168,11 +10170,11 @@ msgstr "指定したファイルに構成を保存します。" msgid "Save current %s" msgstr "現在の%sを保存" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "現在のプロジェクトファイルの保存" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "現在のプロジェクトに名前を付けて保存" @@ -10185,7 +10187,7 @@ msgstr "別名で保存 :" msgid "Save preset" msgstr "プリセット保存" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "プリセットパッケージを別の名前で保存:" @@ -10214,7 +10216,7 @@ msgstr "選択したオプションを保存して、\"%1%\"をプリセット msgid "Save the selected options." msgstr "選択したオプションを保存します。" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "ZIPファイルを保存:" @@ -10228,7 +10230,7 @@ msgstr "3MFコンテナへのメッシュの保存に失敗しました。" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "スケール" @@ -10244,11 +10246,11 @@ msgstr "寸法係数" msgid "Scale the selected object to fit the print volume" msgstr "選択したオブジェクトをプリントボリュームに合わせて拡大縮小します" -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "フィットするように縮尺" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "指定したプリントスペースに合わせてサイズを変更します。" @@ -10256,7 +10258,7 @@ msgstr "指定したプリントスペースに合わせてサイズを変更し msgid "Scale to print volume" msgstr "プリントエリアに合わせて縮尺する" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "スケーリング係数または割合。" @@ -10287,7 +10289,7 @@ msgstr "シーム優先方向ジッター" msgid "Seams" msgstr "シーム" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "検索(%h)" @@ -10310,7 +10312,7 @@ msgstr "" msgid "Search in English" msgstr "英語で検索" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "設定で検索" @@ -10397,7 +10399,7 @@ msgstr "ファイルに適用するアクションを選択します" msgid "Select by rectangle" msgstr "四角形で選択" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "読み込む構成を選択します:" @@ -10405,7 +10407,7 @@ msgstr "読み込む構成を選択します:" msgid "Select coordinate space, in which the transformation will be performed." msgstr "変換する座標空間を選択します。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "比較するプリセットを選択" @@ -10417,7 +10419,7 @@ msgstr "ギャラリーからシェイプを選択" msgid "Select showing settings" msgstr "表示設定を選択" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "修復するSTLファイルを選択 :" @@ -10501,7 +10503,7 @@ msgstr "リストの選択-削除" msgid "Selection-Remove from rectangle" msgstr "選択-四角形から削除" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "全てのオブジェクトを選択" @@ -10518,7 +10520,7 @@ msgstr "Gコード送信" msgid "Send system info" msgstr "システム情報を送信する" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "現在のプレートをプリントするためにGコードとして送信" @@ -10542,7 +10544,7 @@ msgstr "システム情報を送信しています..." msgid "Seq." msgstr "シーケンス" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "順次プリンティング" @@ -10558,7 +10560,7 @@ msgstr "シリアルポート:" msgid "Service name" msgstr "サービス名" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "設定" @@ -10685,7 +10687,7 @@ msgstr "選択したアイテムをプリント可/プリント不可に設定 msgid "Set settings tabs as menu items (experimental)" msgstr "設定タブをメニュー項目として設定(実験的)" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -10835,7 +10837,7 @@ msgstr "" msgid "Set upper thumb as active" msgstr "上側の範囲をアクティブに設定" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -10847,7 +10849,7 @@ msgstr "" "します。" #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "設定" @@ -10898,7 +10900,7 @@ msgstr "" msgid "Shape" msgstr "シェイプ" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "シェイプギャラリー" @@ -10949,7 +10951,7 @@ msgstr "開始後に「今日のティップス」を表示する" msgid "Show &Configuration Folder" msgstr "設定フォルダーの表示(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "ラベルを表示&L" @@ -10965,7 +10967,7 @@ msgstr "アバウトダイヤログを表示" msgid "Show advanced settings" msgstr "高度な設定を表示" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "すべてのプリセットを表示(互換性のないものを含む)" @@ -11005,7 +11007,7 @@ msgstr "オブジェクトの高さを表示" msgid "Show object height on the ruler" msgstr "ルーラーにオブジェクトの高さを表示する" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "3Dシーンにオブジェクト/インスタンスラベルを表示する" @@ -11033,43 +11035,43 @@ msgstr "サポート表示" msgid "Show system information" msgstr "システム情報を表示" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "3D編集画面の表示" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "3Dスライスのプレビューを表示" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "フィラメントの設定を表示" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "SLAプリント構成オプションの完全なリストを表示します。" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "プリント/ Gコード構成オプションの完全なリストを表示します。" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "キーボードショートカットのリストを表示する" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "プレート表示" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "プリント設定を表示する" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "プリンター設定を表示する" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "このヘルプを表示します。" @@ -11152,7 +11154,7 @@ msgstr "簡略化モデル" msgid "Single Extruder Multi Material" msgstr "シングルエクストルーダー・マルチマテリアル" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -11163,15 +11165,15 @@ msgstr "" "のエクストルーダーの直径が同じでなければなりません。最初のエクストルーダーの" "直径で、すべてのエクストルーダーノズルの直径を設定しますか?" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "シングルエクストルーダーのMM設定" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "単一エクストルーダーのマルチマテリアルパラメーター" -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "シングルインスタンスモード" @@ -11260,15 +11262,15 @@ msgstr "" msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3rはこの速度以下にしません。" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "スライス" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "ファイルをスライスしてGコードに入れる" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "ファイルをスライスしGコードにして、名前を付けて保存" @@ -11285,15 +11287,15 @@ msgstr "スライス実行" msgid "Slice resolution" msgstr "スライス解像度" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "モデルをスライスし、SLAプリントレイヤーをPNGとしてエクスポートします。" -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "モデルをスライスし、ツールパスをGコードでエクスポートします。" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -11310,13 +11312,13 @@ msgstr "スライス情報" msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "スライスされたオブジェクト\"%1%\"はロゴまたはサインのように見えます" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "スライス中" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "スライス完了!" @@ -11351,7 +11353,7 @@ msgstr "モデルをスライス" msgid "Slicing supports" msgstr "サポートのスライス" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "スロー" @@ -11359,7 +11361,7 @@ msgstr "スロー" msgid "Slow down if layer print time is below" msgstr "スローダウンさせるレイヤーのプリント時間" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "スローチルト" @@ -11367,7 +11369,7 @@ msgstr "スローチルト" msgid "Small perimeters" msgstr "短い境界線" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "小さいピラー径パーセント" @@ -11464,7 +11466,7 @@ msgid "Some SLA materials were uninstalled." msgstr "一部のSLAマテリアルがアンインストールされました。" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -11490,7 +11492,7 @@ msgstr "" "一部のオブジェクトが高すぎて、エクストルーダーの衝突なしでプリントできませ" "ん。" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -11508,7 +11510,7 @@ msgstr "" "一部のプリセットが変更され、保存されていない変更が設定スナップショットに取り" "込まれません。" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -11690,7 +11692,7 @@ msgid "Spiral vase" msgstr "スパイラル花瓶" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "分割" @@ -11759,13 +11761,13 @@ msgstr "標準" msgid "Stars" msgstr "スター型" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Gコードの最初" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "新しいプロジェクトを開始" @@ -11773,7 +11775,7 @@ msgstr "新しいプロジェクトを開始" msgid "Start at height" msgstr "開始高さ" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "新しいスライスプロセスを開始する" @@ -11825,7 +11827,7 @@ msgid "Status:" msgstr "状況:" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "静音" @@ -11884,19 +11886,19 @@ msgstr "サポート強制" msgid "Support Generator" msgstr "サポートジェネレーター" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "サポートベースの直径" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "サポートベースの高さ" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "サポートベースの安全距離" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "サポート先端" @@ -11948,7 +11950,7 @@ msgid "Support material/raft/skirt extruder" msgstr "サポート材/ラフト/スカート用エクストルーダー" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "サポートをビルドプレート(ベッド)のみに限定する" @@ -11956,12 +11958,12 @@ msgstr "サポートをビルドプレート(ベッド)のみに限定する" msgid "Support parameter change" msgstr "サポートパラメータの変更" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "サポートピラー" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "サポートポイント密度" @@ -11970,16 +11972,16 @@ msgid "Support points edit" msgstr "サポートポイントの編集" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "サポート" @@ -12132,7 +12134,7 @@ msgstr "構成スナップショットの作成" msgid "Taking a configuration snapshot failed." msgstr "構成スナップショットの作成に失敗しました" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "温度" @@ -12157,7 +12159,7 @@ msgstr "温度変化" msgid "Temperatures" msgstr "温度" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "カスタムGコードのテンプレート" @@ -12315,7 +12317,7 @@ msgid "" msgstr "" "ワイプタワーは、複数のオブジェクトのレイヤーの高さが等しい場合に利用できます" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -12368,7 +12370,7 @@ msgstr "" "回転がオブジェクト座標に埋め込まれると、傾斜オブジェクトの不均一なスケーリン" "グはワールド座標系でのみ可能になります。" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "サポートスティックとジャンクションを接続するためのデフォルトの角度。" @@ -12463,7 +12465,7 @@ msgstr "カスタムGコードで使用するフィラメント材料タイプ msgid "The file does not exist." msgstr "ファイルがありません。" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -12495,7 +12497,7 @@ msgstr "次のSLAプリンターモデルには材料が選択されていませ msgid "The following characters are not allowed by a FAT file system:" msgstr "次の文字はFATファイルシステムでは許可されていません。" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -12546,13 +12548,13 @@ msgstr "" msgid "The following values were substituted:" msgstr "次の値に置き換えられました。" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "ゼロリフトモードでのオブジェクトの底面と生成されたパッド間のギャップ。" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "ピラーのベースコーンの高さ" @@ -12593,7 +12595,7 @@ msgstr "" "最後の色変更データは、シングルエクストルーダーでのプリント用に保存されまし" "た。" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -12601,7 +12603,7 @@ msgstr "" "相互接続のための2つのピラー間の最大距離。 値がゼロの場合、ピラーのカスケード" "が無効になります。" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "最長ブリッジ長さ" @@ -12624,7 +12626,7 @@ msgstr "" "境界線の壁に垂直に測定された、各スキンポイントをオフセットできる最大距離(双" "方向)。" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -12657,7 +12659,7 @@ msgstr "" "ボトムシェルの最小厚さを確保するために、必要に応じてボトムソリッドレイヤーの" "数をbottom_solid_layersよりも増やします。" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -12697,7 +12699,7 @@ msgstr "" "オブジェクトは、このレイヤー数だけ持ち上げられ、その下にサポート材が生成され" "ます。" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -12705,7 +12707,7 @@ msgstr "" "通常のピラーが収まらない問題のある領域で使用される、通常のピラー径と比較した" "小さいピラーの割合。" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -12715,14 +12717,14 @@ msgstr "" "プリント領域が指定された値を超える場合、ティルト動作を遅くします。それ以外で" "は-速いティルトとなります" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "以下の物理プリンタはプリセットに基づいているため、削除します。" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -12774,7 +12776,7 @@ msgstr "指定されたファイル名が無効です。" msgid "The provided name is not valid;" msgstr "指定された名前は無効です;" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -12782,7 +12784,7 @@ msgstr "" "選択した3MFには、新しいバージョンのPrusaSlicerを使用してペイントされたオブ" "ジェクトをサポートするFDMが含まれており、互換性がありません。" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -12790,7 +12792,7 @@ msgstr "" "選択した3MFには、新しいバージョンのPrusaSlicerを使用したマルチマテリアルペイ" "ントオブジェクトが含まれており、互換性がありません。" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -12798,7 +12800,7 @@ msgstr "" "選択した3MFには、新しいバージョンのPrusaSlicerを使用したシームペイントされた" "オブジェクトが含まれており、互換性がありません。" -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -12845,7 +12847,7 @@ msgstr "" "選択したオブジェクトにはソリッドパーツが1つしかないため、分割できませんでし" "た。" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -12882,7 +12884,7 @@ msgstr "オブジェクトのサイズはインチで指定できます" msgid "The size of the object is zero" msgstr "オブジェクトのサイズはゼロです" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -12954,7 +12956,7 @@ msgstr "指定された名前は無効です;" msgid "The supplied settings will cause an empty print." msgstr "指定された設定では、何もプリントされません。" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "パッドとそのオプションのキャビティ壁の厚さ。" @@ -13334,11 +13336,11 @@ msgstr "" msgid "This is a default preset." msgstr "これはデフォルトのプリセットです。" -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "サポートポイント密度の相対値です。" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -13351,7 +13353,7 @@ msgid "This is a system preset." msgstr "これはシステムプリセットです。" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "これはSlic3rのみで使用されるイラストです。" @@ -13650,7 +13652,7 @@ msgstr "" "してください。 このバージョン%sと互換性のある設定をインストールする前に、現在" "の構成のバックアップが作成されます。" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -13663,7 +13665,7 @@ msgstr "" "たは冗長的に、修正するか、未知の値をデフォルトに置き換えるかを決めることがで" "きます。" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -13685,15 +13687,15 @@ msgstr "" "スレッドは、長時間実行されるタスクを並列化するために使用されます。スレッド数" "は、使用可能なコア/プロセッサーの数をわずかに超えたところが最適となります。" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "チルト" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "高粘度樹脂用ティルト" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "チルト時間" @@ -13722,15 +13724,15 @@ msgstr "" "Material Unit 2.0)がフィラメントをアンロードする時間。 この時間は、Gコード時" "間予測プログラムによって合計プリント予測時間に追加されます。" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "高速チルトの時間" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "スローチルトの時間" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "超低速ティルト時間" @@ -13791,7 +13793,7 @@ msgstr "ツール" msgid "Tool #" msgstr "ツール#" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "ツールチェンジ用のGコード" @@ -13813,7 +13815,7 @@ msgstr "ツール位置" msgid "Tool type" msgstr "ツールタイプ" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "単一エクストルーダーMMプリンターのツールチェンジパラメーター" @@ -13835,7 +13837,7 @@ msgid "" msgstr "" "上部/下部シェルの厚さのヒント:レイヤーの高さが無効なため使用できません。" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "上面" @@ -13928,7 +13930,7 @@ msgstr "移動" msgid "Triangles" msgstr "三角形" -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -13949,11 +13951,11 @@ msgstr "プリンターのタイプ。" msgid "Type:" msgstr "タイプ:" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "開いたカギ" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -13965,7 +13967,7 @@ msgstr "" "クリックすると、現在のオプショングループのすべての設定がシステム(またはデ" "フォルト)値にリセットされます。" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -14006,11 +14008,11 @@ msgstr "複数のボリュームに置き換えることはできません" msgid "Undef" msgstr "未定義" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Undefカテゴリ" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "未定義グループ" @@ -14024,7 +14026,7 @@ msgstr "アンダーフロー" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "元に戻す" @@ -14221,7 +14223,7 @@ msgstr "フリーカメラを使用" msgid "Use inches" msgstr "インチを使用" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "台座を使用" @@ -14310,11 +14312,11 @@ msgstr "" "値が変更されており、システム値または最後に保存されたプリセットとは異なってい" "ます" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "この列の値は通常モード用です" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "この列の値はサイレントモード用です" @@ -14359,7 +14361,7 @@ msgstr "ベンダー:" msgid "Verbose G-code" msgstr "コメント付きGコード" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "バージョン" @@ -14408,7 +14410,7 @@ msgstr "" "「設定」にアクセスして\"%1%\"を確認してください\n" "選択を変更します。" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "すでにスライスされ保存されたGコードを視覚化する" @@ -14433,7 +14435,7 @@ msgstr "オブジェクトのボリュームが並べ替えられました" msgid "Volumetric" msgstr "体積押出し" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "体積押出し流量のヒントは利用できません" @@ -14456,16 +14458,16 @@ msgstr "体積押出し速度" msgid "WARNING:" msgstr "警告:" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "白丸" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "白丸アイコンは、システム(またはデフォルト)プリセットでないことを示します。" -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -14473,14 +14475,14 @@ msgstr "" "白丸アイコンは、現在のオプショングループに最後に保存されたプリセットと同じ設" "定であることを示します。" -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" "白丸アイコンは、値が最後に保存されたプリセットと同じであることを示します。" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "壁の厚さ" @@ -14632,7 +14634,7 @@ msgstr "" "移動後に引込みが補償されると、エクストルーダーはこの追加量のフィラメントを押" "し出します。 この設定はほとんど必要ありません。" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14645,16 +14647,18 @@ msgstr "" "リントされません。この設定を小さくすると、中央の境界線の数と長さが減ります" "が、隙間ができたりはみ出したりすることがあります。" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" "パーツが薄くなるにつれて、異なる数の境界線の間を移行する場合、境界線のセグメ" -"ントを分割または結合するために一定のスペースが割り当てられます。" +"ントを分割または結合するために一定のスペースが割り当てられます。パーセントで" +"表すと(例えば100%)、ノズルの直径に基づいて計算されます。" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "全文" @@ -14666,7 +14670,7 @@ msgstr "幅" msgid "Width (mm)" msgstr "幅(mm)" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "後部ボールの中心から前部ボールの中心までの幅" @@ -14674,16 +14678,16 @@ msgstr "後部ボールの中心から前部ボールの中心までの幅" msgid "Width of a wipe tower" msgstr "ワイプタワーの幅" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "オブジェクトと生成されたパッドを接続するコネクタスティックの幅。" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "ディスプレイの幅" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14696,7 +14700,7 @@ msgstr "" "の厚みと同じになります。パーセントで表すと(例えば85%)、ノズルの直径に基づ" "いて計算されます。" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14738,7 +14742,7 @@ msgstr "ワイプタワー-パージ量調整" msgid "Wipe tower brim width" msgstr "ワイプタワーのブリム幅" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "ワイプタワーのパラメータ" @@ -14800,7 +14804,7 @@ msgstr "" "バージョンに問題がある場合はいつでも復元できます。アップデートされた設定に含" "まれるもの:" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "コンソールにモデル情報をリストします。" @@ -14890,7 +14894,7 @@ msgstr "" "ここにメモを書いておくことができます。 このテキストは、Gコードヘッダーのコメ" "ントに追加されます。" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "SLAプリント材料に関するメモをここに記入できます。" @@ -15050,7 +15054,7 @@ msgstr "" "現在の変更により、保存されているすべてのエクストルーダー(ツール)の変更が削" "除されます。" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "ファイルが修復されました。" @@ -15089,7 +15093,7 @@ msgstr "Zオフセット" msgid "Z travel" msgstr "Z移動" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "ジグザグ" @@ -15211,7 +15215,7 @@ msgstr "デフォルトプリントプロファイル" msgid "default value" msgstr "デフォルト値" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "削除" @@ -15289,7 +15293,7 @@ msgid "flow rate is maximized" msgstr "最大送り量になります" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -15313,7 +15317,7 @@ msgstr "g" msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" @@ -15330,7 +15334,7 @@ msgid "in" msgstr "インチ" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -15343,7 +15347,7 @@ msgstr "" "ステム(またはデフォルト)値にリセットします。" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -15351,7 +15355,7 @@ msgstr "" "設定が現在の設定グループのシステム(デフォルト)値と同じであることを示します" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -15389,11 +15393,11 @@ msgstr "" "Alessandro RanellucciとRepRapコミュニティによるSlic3rに基づいています。 " #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "の下でライセンスされています" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" @@ -15417,7 +15421,7 @@ msgstr "最大PrusaSclierバージョン" msgid "min PrusaSlicer version" msgstr "最小PrusaSlicerバージョン" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" @@ -15457,19 +15461,18 @@ msgstr "ml" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -15483,8 +15486,9 @@ msgstr "mm (0で無効化)" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mmまたは%" @@ -15546,7 +15550,7 @@ msgstr "モデル" msgid "modified" msgstr "変更あり" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "金額/ボトル" @@ -15604,7 +15608,7 @@ msgstr "プリンター" msgid "printer model" msgstr "プリンターモデル" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "外す" @@ -15625,11 +15629,11 @@ msgstr "最小%sと最大%sが必要です" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -15752,8 +15756,8 @@ msgstr "コールバックの書込に失敗しました" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" diff --git a/resources/localization/ko/PrusaSlicer_ko_KR.po b/resources/localization/ko/PrusaSlicer_ko_KR.po index 2649b60740..7b8e39940f 100644 --- a/resources/localization/ko/PrusaSlicer_ko_KR.po +++ b/resources/localization/ko/PrusaSlicer_ko_KR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2020-02-28 09:34+0900\n" "Last-Translator: lee hak-min \n" "Language-Team: ulsanether\n" @@ -21,16 +21,16 @@ msgstr "" "X-Crowdin-Language: ko\n" "X-Crowdin-File: ko_KR.po\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -38,26 +38,26 @@ msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" "약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "%s에 대하여" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "라이선스는" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -65,7 +65,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -75,7 +75,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others. 한국어 번역 울산에테르, 밤송이직박구리" -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "" @@ -204,7 +204,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "사이즈" @@ -262,19 +262,18 @@ msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-code 좌표 거리 #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -307,7 +306,7 @@ msgid "Load shape from STL..." msgstr "STL파일 로드." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "설정" @@ -320,7 +319,7 @@ msgid "Load..." msgstr "불러오기..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "제거" @@ -528,19 +527,19 @@ msgstr "직선 채우기 패턴으로 전환해야 합니까?" msgid "Infill" msgstr "인필(채움)" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "잘못된 헤드 관통" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "잘못된 핀 헤드 지름" @@ -649,7 +648,7 @@ msgid "Standard" msgstr "표준" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "모두 선택" @@ -909,7 +908,7 @@ msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" msgid "Firmware Type" msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "펌웨어" @@ -1204,7 +1203,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "되돌리기" @@ -1818,7 +1817,7 @@ msgstr "확인" msgid "Cancelling..." msgstr "취소 중...." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1834,7 +1833,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "추가" @@ -1844,7 +1843,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "지우기 " @@ -2025,8 +2024,8 @@ msgstr "" msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "리트렉션" @@ -2081,7 +2080,7 @@ msgstr "프린트 설정" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "필라멘트" @@ -2303,7 +2302,7 @@ msgid "Add..." msgstr "추가..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "전부 지우기" @@ -2350,7 +2349,7 @@ msgid "Next Undo action: %1%" msgstr "다음 작업 실행 취소 : %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "다시실행" @@ -2390,7 +2389,7 @@ msgid "Selection-Remove from rectangle" msgstr "선택- 사각형에서 제거" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "자르기" @@ -2645,7 +2644,7 @@ msgid "Quality" msgstr "품질" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "닫힘 거리" @@ -2748,7 +2747,7 @@ msgstr "이동" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "회전" @@ -2765,7 +2764,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "크기" @@ -2816,7 +2815,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "에러" @@ -2900,7 +2899,7 @@ msgid "Minimal points distance" msgstr "최소한의 지점 거리" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "서포트 지점 밀도" @@ -3673,7 +3672,7 @@ msgid "Speed" msgstr "속도" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3696,52 +3695,51 @@ msgstr "스커트와 브림" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "고급" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "서포트" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "속이 빈 공동(Hollowing)" @@ -3883,7 +3881,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "병합" @@ -3944,7 +3942,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "쪼개기" @@ -4574,11 +4572,11 @@ msgstr "높이" msgid "Width" msgstr "폭" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "팬 속도" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "온도" @@ -4862,7 +4860,7 @@ msgstr "" msgid "Attention!" msgstr "주목!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "키보드 단축기" @@ -4899,7 +4897,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "G-code 내보내기" @@ -5242,13 +5240,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "디스크에서 플래터 다시 로드" @@ -5285,7 +5283,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "미리보기" @@ -5363,7 +5361,7 @@ msgid "Keyboard shortcuts" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "" @@ -5371,11 +5369,11 @@ msgstr "" msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "" @@ -5401,13 +5399,13 @@ msgid "Print Settings" msgstr "출력 설정" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "재질 설정" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "필라멘트 설정" @@ -5490,621 +5488,621 @@ msgstr "다이얼로그 표시" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "기본 " -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "윗부분 " -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "위에서 보기" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "바닥 " -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "바닥 보기" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "뒷면 보기" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "왼쪽 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "왼쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "오른쪽 " -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "오른쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "새로운 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 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:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "가져오기 STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 로드" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "번들 &설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "G-code 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "S&엔드 G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "도구 경로를 OBJ로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "번들 & 내보내기 설정" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스 및 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "지금(다시)자르기" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "STL 파일 복구" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "&종료" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "%s 종료" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "모든 객체(object)를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "모든 객체(object) 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "모든 객체(object)를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "&되돌리기" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&복사 " -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&붙이기 " -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "클립보드 붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "설정 인쇄 탭" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "3D 편집용 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "호스트 업로드 대기열 인쇄 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "3D 장면에서 오브젝트/인스턴스 레이블 표시" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&시점" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&도움말" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "파일을 찾을수 없다" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "Svg" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G 코드" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "슬라이싱" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택하십시오:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "% d 사전 설정을 가져 왔습니다." @@ -6321,8 +6319,8 @@ msgstr "복제본" msgid "Instance %d" msgstr "복제본 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "레이어" @@ -6395,7 +6393,7 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "호스트 업로드 인쇄" @@ -6546,7 +6544,7 @@ msgid "Select what kind of support do you need" msgstr "서포트의 종류를 선택하세요" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" @@ -6642,7 +6640,7 @@ msgid "(including spool)" msgstr "" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "비용" @@ -7110,10 +7108,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "일반" @@ -7562,7 +7560,7 @@ msgid "Add/Remove presets" msgstr "" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "" @@ -7574,7 +7572,7 @@ msgstr "" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "" @@ -7877,11 +7875,11 @@ msgstr "전혀 충돌 없음" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -7990,12 +7988,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "스텔스" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "보통" @@ -8246,7 +8244,7 @@ msgstr "전체 프로필 이름" msgid "symbolic profile name" msgstr "기호 프로파일 이름" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "레이어 및 둘레" @@ -8334,7 +8332,7 @@ msgstr "겹침(Overlap)" msgid "Flow" msgstr "유량(Flow)" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "그 외" @@ -8342,52 +8340,52 @@ msgstr "그 외" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "연속 인쇄" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "사후 처리 스크립트" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "속한 그룹" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8399,82 +8397,82 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "배드(Bed)" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "냉각(Cooling)" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "사용" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "냉각 임계 값" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "필라멘트 특성" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "인쇄 속도 중단" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "타워 매개변수 지우기" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "수동 G코드" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "스타트 G코드" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "엔드 G코드" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "체적 흐름 힌트를 사용할 수 없음" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8487,20 +8485,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "크기와 좌표" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "기능" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 갯수." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8511,64 +8509,64 @@ msgstr "" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "레이어 변경 전 G 코드" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "툴 채인지 G 코드" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "객체(object) 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "노출" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8577,39 +8575,39 @@ msgstr "노출" msgid "Machine limits" msgstr "머신 한계설정" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 무음 모드 용입니다" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "최고 가속도" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "저크(Jerk)값 한계" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "싱글 익스트루더 MM 설정" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8617,29 +8615,29 @@ msgstr "" "이것은 단일 압출기 다중 재질 프린터이며 모든 압출기의 지름이 새 값으로 설정됩" "니다. 계속하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "레이어 높이 한계치" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "위치 (다중 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "도구 비활성화시 리트렉션 (다중 익스트루더 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "필라멘트 색상으로 재설정" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8649,51 +8647,51 @@ msgstr "" "\n" "펌웨어 리트렉션 하려면 비활성화해야합니까?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "펌웨어 레트렉션" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "제거(remove)" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "지우기" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8702,92 +8700,92 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "찾기" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "전체 단어 일치" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "잠금 해제 잠금" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8799,12 +8797,12 @@ msgstr "" "잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" "는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "흰색 글머리 기호" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -8812,12 +8810,12 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" "오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8829,7 +8827,7 @@ msgstr "" "현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " "클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -8837,7 +8835,7 @@ msgstr "" "LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" "다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -8849,11 +8847,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -8861,7 +8859,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -8873,7 +8871,7 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -8881,7 +8879,7 @@ msgstr "" "LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" "다." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -8891,7 +8889,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -8899,7 +8897,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -8909,42 +8907,42 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format 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:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "객체(object) 고도" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "개체 주위패드" @@ -9027,7 +9025,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9087,49 +9085,49 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -9767,26 +9765,26 @@ msgid "" msgstr "" "%1%에 대한 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "선택한 3mf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10535,8 +10533,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -10551,9 +10549,8 @@ msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다. #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -10760,8 +10757,8 @@ msgstr "" msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10908,8 +10905,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm/s 또는 %" @@ -10991,7 +10989,7 @@ msgid "Extruder Color" msgstr "익스트루더 컬러" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "이것은 시각적 도움말로 Slic3r 접점에서만 사용된다." @@ -11084,7 +11082,7 @@ msgstr "" msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "색상" @@ -11257,8 +11255,8 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "밀도" @@ -11319,7 +11317,7 @@ msgstr "" msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(알 수 없음)" @@ -12975,7 +12973,7 @@ msgid "" "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13560,33 +13558,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13598,11 +13598,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13611,63 +13611,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13676,63 +13648,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "디스플레이 너비" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "디스플레이의 높이" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "수평으로 미러" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "수직 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "수직으로 미러" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "디스플레이 방향" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -13742,55 +13714,55 @@ msgstr "" "레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" "다." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "세로모드" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "기울이기 시간" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "천천히 기울이기" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "천천히 기울이는 속도" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13800,59 +13772,59 @@ msgstr "" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "프린터 스케일링 보정" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -13862,165 +13834,165 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA 재질 유형" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "병 볼륨" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "병 무게" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g /ml" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "가격 /병" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "최소 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "최대 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "최대 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "확장 보정" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA 인쇄 재료 참고 사항" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "헤드 포인팅 측면 지름" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "핀 헤드가 모델 표면에 침투 하는 정도" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "뒤쪽 구 중재봉선에서 앞쪽 구 중재봉선 까지의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "서포트 기둥의 지름 (mm)" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 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:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 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:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14030,23 +14002,23 @@ msgstr "" "로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" "적 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "지그재그" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "크로스" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "동적" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "기둥 확장 계수" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -14054,27 +14026,27 @@ msgstr "" "브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " "없음을 의미 하나는 전체 증가를 의미 합니다." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "서포트 베이스 지름" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "기둥 베이스의 mm 직경" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "서포트 기준 높이" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "서포트 베이스 원추의 높이" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "지지기본 안전 거리" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -14083,34 +14055,34 @@ msgstr "" "모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " "패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "임계 각도" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "최대 브리지 길이" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "브릿지의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "최대 기둥 연결 거리" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -14118,39 +14090,39 @@ msgstr "" "지원 대상을 들어 올려야 하는 양입니다. \"개체 주위 패드\"를 사용하도록 설정하" "면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 옵션 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -14161,19 +14133,19 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "패드 브럼 사이즈" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "패드가 포함된 형상 주위로 얼마나 확장되어야 하는지" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -14183,11 +14155,11 @@ msgstr "" "이 매개 변수는 두 개의 작은 패드의 중재봉선이 얼마나 되어야 하는지 정의 합니" "다. 그들은 하나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -14195,83 +14167,83 @@ msgstr "" "배드 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" "다." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "오브젝트 주위에 패드를 작성하고 지지 고도를 무시합니다." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "어디서나 개체 주위에 패드" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "사방 오브젝트 주위의 포스 패드" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "패드 객체(object) 갭" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "0 고도 모드에서 객체(object) 바닥과 생성된 패드 사이의 간격입니다." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "패드 객체(object) 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "패드 객체(object) 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "개체와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "패드 객체(object) 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "속빈 공동 사용" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "빈 내부를 가지고 모델을 비우기" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "속이 빈 모델의 최소 벽 두께입니다." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" "성능 계산의 정확성. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -14280,185 +14252,185 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "OBJ 내보내기" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "모델을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "AMF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "STL 내보내기" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "이 도움말을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "도움말 (FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "도움말 (SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "모델에 대한 정보를 콘솔에 씁니다." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "지정 된 파일에 구성을 저장 합니다." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "중앙" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "지정된 점을 중재봉선으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "이 계수로 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "모눈에 따라 복제" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 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:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14466,31 +14438,31 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "X 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Y 주위로 회전" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Y 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "배율 인수 또는 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -14498,29 +14470,29 @@ msgstr "" "지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 " "분할 합니다." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "크기에 맞게 조정" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "존재 하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14528,27 +14500,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "구성 파일 로드" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14556,33 +14528,33 @@ msgstr "" "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " "이상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "출력파일" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 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:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 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:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14591,11 +14563,11 @@ msgstr "" "지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " "유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -14605,11 +14577,11 @@ msgstr "" "trace\n" "예를 들어. loglevel=2 치명적인, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/ko_KR/PrusaSlicer_ko.po b/resources/localization/ko_KR/PrusaSlicer_ko.po index 24924dab45..75f834f2c9 100644 --- a/resources/localization/ko_KR/PrusaSlicer_ko.po +++ b/resources/localization/ko_KR/PrusaSlicer_ko.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2021-04-05 21:03+0900\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.4.2\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" "약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "%s 정보" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "이 라이센스는" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공공 라이센스, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others. 한국어 번역 울산에테르, 밤송이직박구리 (2.2.0)" -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "버전 정보" @@ -213,7 +213,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "크기" @@ -271,19 +271,18 @@ msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-코드 좌표 거리 #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -316,7 +315,7 @@ msgid "Load shape from STL..." msgstr "STL파일 로드." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "설정" @@ -329,7 +328,7 @@ msgid "Load..." msgstr "불러오기..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "삭제" @@ -543,19 +542,19 @@ msgstr "직선 채우기 패턴으로 전환해야 합니까?" msgid "Infill" msgstr "채움(infill)" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "머리 침투가 머리 너비보다 크지 않아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "잘못된 헤드 관통" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "잘못된 핀 헤드 지름" @@ -664,7 +663,7 @@ msgid "Standard" msgstr "표준" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "모두" @@ -924,7 +923,7 @@ msgstr "%s 지원하는 다른 공급업체 선택" msgid "Firmware Type" msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "펌웨어 철회" @@ -1227,7 +1226,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "실행 취소" @@ -1866,7 +1865,7 @@ msgstr "확인" msgid "Cancelling..." msgstr "취소 중..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1882,7 +1881,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "추가" @@ -1892,7 +1891,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "삭제" @@ -2073,8 +2072,8 @@ msgstr "운동" msgid "Extrusion" msgstr "압출 없음" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "리트랙션 후 최소 이동 거리" @@ -2129,7 +2128,7 @@ msgstr "출력 설정" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "필라멘트 설정을 선택" @@ -2351,7 +2350,7 @@ msgid "Add..." msgstr "더하기..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "모두 삭제" @@ -2398,7 +2397,7 @@ msgid "Next Undo action: %1%" msgstr "다음 작업 실행 취소 : %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "다시 실행" @@ -2440,7 +2439,7 @@ msgid "Selection-Remove from rectangle" msgstr "선택 영역-사각형에서 제거" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "잘라내기" @@ -2695,7 +2694,7 @@ msgid "Quality" msgstr "품질" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "닫힘 거리" @@ -2798,7 +2797,7 @@ msgstr "이동" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "회전" @@ -2815,7 +2814,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "크기" @@ -2866,7 +2865,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "오류" @@ -2950,7 +2949,7 @@ msgid "Minimal points distance" msgstr "최소한의 지점 거리" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "서포트 지점 밀도" @@ -3754,7 +3753,7 @@ msgid "Speed" msgstr "속도" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3777,52 +3776,51 @@ msgstr "스커트와 브림" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "고급" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "서포트" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "물체 속이 빈(Hollowing)" @@ -3964,7 +3962,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "병합" @@ -4025,7 +4023,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "분할" @@ -4661,11 +4659,11 @@ msgstr "높이" msgid "Width" msgstr "넓이" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "팬 속도" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "온도" @@ -4946,7 +4944,7 @@ msgstr "침대에 다중 부품 오브젝트가 있는 SLA 프로젝트를 로 msgid "Attention!" msgstr "주의!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "키보드 단축키" @@ -4983,7 +4981,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "ini/amf/3mf/gcode에서 구성을 로드하고 병합" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "G코드 내보내기" @@ -5332,13 +5330,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "G코드 파일 열기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "디스크에서 플래터 다시 로드" @@ -5375,7 +5373,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "미리보기" @@ -5458,7 +5456,7 @@ msgid "Keyboard shortcuts" msgstr "키보드 단축키" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "새로운 프라사슬라이스인스턴스 열기" @@ -5466,11 +5464,11 @@ msgstr "새로운 프라사슬라이스인스턴스 열기" msgid "G-code preview" msgstr "G 코드 미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "G코드 뷰어 열기" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "프라우슬라이서 오픈" @@ -5496,13 +5494,13 @@ msgid "Print Settings" msgstr "출력 설정" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "재질 설정" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "필라멘트 설정" @@ -5585,100 +5583,100 @@ msgstr "대화상자 표시" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "ISO" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "상단 " -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "위에서 보기 " #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "하단 " -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "바닥 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "뒷면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "왼쪽" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "왼쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "오른쪽" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "오른쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "새 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5686,523 +5684,523 @@ msgstr "" "선택한 프로젝트를 더 이상 사용할 수 없습니다.\n" "최근 프로젝트 목록에서 제거하시겠습니까?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "프로젝트 저장 및" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 저장." -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "STL/OBJ/AMF/3MF 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "제국 단위로 저장된 모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 부하" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "가져오기 구성 및 번들 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "내보내기 및 G 코드" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "S&end G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "현재 플레이트를 G 코드로 SD 카드/플래시 드라이브로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "공구 경로를 OBJ로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "구성 및 번들 내보내기 " -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "프린터 구성 번들 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "실제 프린터를 포함한 모든 사전 설정내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "G 코드가 내보낸 후 SD 카드/플래시 드라이브를 배출합니다." -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스와 저장" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)지금 슬라이스 " -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "STL 파일 수리" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "종료" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "종료 %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "모든 개체를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "모든 개체의 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "모든 객체를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "되돌리기(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "복사(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "붙여 넣기 클립 보드" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "검색" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "설정 검색" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "인쇄 및 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "프린터 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "3D 편집 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "사전 보기" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "인쇄 호스트 업로드 대기열 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "3D 씬에서 개체/인스턴스 레이블 표시" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "사이드바 축소" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "보기(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&도움" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "G 코드 열기" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "프라우슬라이서 오픈" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 #, fuzzy msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "파일을 찾을 수 없음" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG 업로드 사용" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "새로운 슬라이싱 작업 시작" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% 성공적으로 슬라이스되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택." -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음)." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 사전 설정을 가져 왔습니다." @@ -6422,8 +6420,8 @@ msgstr "적용" msgid "Instance %d" msgstr "인스턴스 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "레이어" @@ -6498,7 +6496,7 @@ msgstr "프린터의 설명 이름" msgid "Add preset for this printer device" msgstr "이 프린터 장치에 대한 사전 설정 추가" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "프린터 호스트 업로드 대기" @@ -6651,7 +6649,7 @@ msgid "Select what kind of support do you need" msgstr "필요한 지원 종류를 선택합니다." #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" @@ -6747,7 +6745,7 @@ msgid "(including spool)" msgstr "(스풀 포함)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "비용" @@ -7217,10 +7215,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "일반" @@ -7687,7 +7685,7 @@ msgid "Add/Remove presets" msgstr "사전 설정 추가/제거" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "실제 프린터 추가" @@ -7699,7 +7697,7 @@ msgstr "사전 설정 편집" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "실제 프린터 편집" @@ -8003,11 +8001,11 @@ msgstr "전혀 충돌 없음" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -8119,12 +8117,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "\"%1%\" 사전 설정으로 전환하기만 하면 됩니다." #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "스텔스" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "보통" @@ -8376,7 +8374,7 @@ msgstr "전체 프로필 이름" msgid "symbolic profile name" msgstr "기호 프로필 이름" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "레이어 및 둘레" @@ -8467,7 +8465,7 @@ msgstr "오버랩" msgid "Flow" msgstr "흐름도" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "기타" @@ -8475,52 +8473,52 @@ msgstr "기타" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "순차적 인쇄" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "압출기 클리어런스" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "종속성" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8532,82 +8530,82 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "노즐" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "침대" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "자동 냉각 사용" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "활성화" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "냉각 한계 값" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "필라멘트 속성" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "인쇄 속도 재정의" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "타워 파라미터 지우기" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "G 코드 시작" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "끝 G 코드" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "볼륨 흐름 힌트를 사용할 수 없음" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8628,20 +8626,20 @@ msgstr "" "열립니다. 실제 프린터 프로파일은 PrusaSlicer/physical_printer 디렉터리에 저장" "됩니다." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "크기 및 좌표" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "권한" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 숫자." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8652,64 +8650,64 @@ msgstr "" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 직경을 첫 번째 압출기 노즐 직경 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "레이어가 G 코드를 변경하기 전에" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "공구 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "객체 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "색상 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G 코드 인쇄 일시 중지" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "템플릿 사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "최소 노출 시간" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8718,39 +8716,39 @@ msgstr "최소 노출 시간" msgid "Machine limits" msgstr "기계 제한" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 스텔스 모드용입니다." -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "최대 피드값" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "최대 가속" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "바보 제한" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "최소 공급률" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "단일 압출기 MM 설정" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8758,29 +8756,29 @@ msgstr "" "이것은 단일 압출기 다중 재료 프린터이며, 모든 압출기의 직경은 새 값으로 설정" "됩니다. 계속 하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "레이어 높이 제한" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "위치 (멀티 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "도구가 비활성화된 때의 철회(다중 압출기 설정에 대한 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "필라멘트 색상으로 재설정" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8790,51 +8788,51 @@ msgstr "" "\n" "펌웨어 철회를 활성화하기 위해 비활성화해야 합니까?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "펌웨어 철회" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "분리" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "제거" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "삭제" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "이 실제 프린터의 마지막 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "실제 프린터 \"%2%\"에서 \"%1%\" 사전 설정을 삭제하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8843,62 +8841,62 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "찾기" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "전체 단어 일치" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "기계 제한은 G 코드로 방출되고 인쇄 시간을 예측하는 데 사용됩니다." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -8908,26 +8906,26 @@ msgstr "" "는 데 사용됩니다, 따라서 프린터가 기계 제한의 다른 세트를 적용 할 수 있으므" "로 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" "기계 제한이 설정되지 않으므로 인쇄 시간 추정치가 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "" "UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " @@ -8936,7 +8934,7 @@ msgstr "" "릭합니다." #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8948,14 +8946,14 @@ msgstr "" "잠금 해제 된 LOCK 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템 " "(또는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -8963,12 +8961,12 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 비기본적) 사전 설정을 나타내고,\n" "오른쪽 단추: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8980,7 +8978,7 @@ msgstr "" "뒤로 화살표 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 마지막으로 저" "장된 사전 설정으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -8988,7 +8986,7 @@ msgstr "" "잠긴 LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다" "는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9000,11 +8998,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9012,7 +9010,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9024,14 +9022,14 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" "LOCK 아이콘잠기는 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9041,7 +9039,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9049,7 +9047,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9059,31 +9057,31 @@ msgstr "" "음을 나타냅니다.\n" "현재 값을 마지막 저장된 사전 설정으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9092,11 +9090,11 @@ msgstr "" "\"%1%\"는 \"%3%\" 범주에 있기 때문에 \"%2% %1%\"이 비활성화됩니다.\n" "\"%1%\"을 활성화하려면 \"%2%\"을 끄십시오." -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "객체 고도" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "물체 주위의 패드" @@ -9181,7 +9179,7 @@ msgstr "" "저장되지 않은 변경 사항에 대해 다시 묻는 것입니다." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9248,49 +9246,49 @@ msgstr "" "지 않은 변경 사항이 있습니다." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "압출기 수" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -9932,26 +9930,26 @@ msgid "" msgstr "" "%1% 대해 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "선택한 3mf 파일은 최신 버전의 %1% 저장되었으며 호환되지 않습니다." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10707,8 +10705,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -10723,9 +10721,8 @@ msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다. #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -10930,8 +10927,8 @@ msgstr "" msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11078,8 +11075,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm 또는 %" @@ -11159,7 +11157,7 @@ msgid "Extruder Color" msgstr "익스트루더 컬러" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." @@ -11252,7 +11250,7 @@ msgstr "" msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "색상" @@ -11425,8 +11423,8 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "밀도" @@ -11491,7 +11489,7 @@ msgstr "" msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(알 수 없음)" @@ -13175,7 +13173,7 @@ msgid "" "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13763,33 +13761,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13801,11 +13801,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13814,63 +13814,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13879,63 +13851,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "표시 폭" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "디스플레이 높이" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "가로로 대칭" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "세로 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "세로로 미러" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "표시 방향" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -13944,55 +13916,55 @@ msgstr "" "SLA 프린터 내부에 실제 LCD 디스플레이 방향을 설정합니다. 세로 모드는 디스플레" "이 너비와 높이 매개 변수의 의미를 뒤집고 출력 이미지가 90도 회전합니다." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "세로" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "빠른 기울기의 시간" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "천천히 기울이기" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "천천히 기울이는 속도" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14002,59 +13974,59 @@ msgstr "" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "프린터 크기 조정 보정" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "보정 의 표시에 따라 슬라이스 된 2D 다각형을 팽창하거나 수축합니다." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "코끼리 발 최소 폭" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "코끼리 발 보정을 할 때 유지 해야 하는 기능의 최소 폭." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14064,145 +14036,145 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA 재료 유형" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "병 볼륨" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "병 무게" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "가격 /병" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수가 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "최소 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "최대 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "최대 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "확장에 대한 수정" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA 프린트 소재 노트" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로파일" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "핀헤드 프론트 직경" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "헤드 포인팅 측면 지름" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "잘못된 헤드 관통" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "핀헤드가 모델 표면에 침투해야 하는 양" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "핀헤드 너비" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "기둥 직경" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "서포트 기둥의 지름 (mm)" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "작은 기둥 직경 퍼센트" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -14210,11 +14182,11 @@ msgstr "" "일반 필라가 맞지 않는 문제가 있는 부위에 사용되는 일반 기둥 직경에 비해 작은 " "기둥의 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "기둥의 최대 교량" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -14222,11 +14194,11 @@ msgstr "" "기둥에 배치할 수 있는 최대 브리지 수입니다. 브리지는 지지점 핀헤드를 잡고 작" "은 가지로 기둥에 연결합니다." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "기둥 연결 모드" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14236,23 +14208,23 @@ msgstr "" "로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" "적 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "지그재그" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "십자가" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "동적" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "기둥 확대 계수" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -14260,27 +14232,27 @@ msgstr "" "브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " "없음을 의미 하나는 전체 증가를 의미 합니다." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "서포트 베이스 지름" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "기둥 베이스의 mm 직경" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "서포트 기준 높이" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "서포트 베이스 원추의 높이" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "지지 기지 안전 거리" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -14289,34 +14261,34 @@ msgstr "" "모델에서 mm의 기둥 베이스의 최소 거리입니다. 이 매개 변수에 따른 간격이 모델" "과 패드 사이에 삽입되는 0 고도 모드에서 의미가 있습니다." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "임계 각도" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "최대 브리지 길이" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "브릿지의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "최대 기둥 연결 거리" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -14324,39 +14296,39 @@ msgstr "" "지원되는 개체를 들어 올려야 하는 지원 의 양입니다. \"개체 주위 의 패드\"가 활" "성화되면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 선택적 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -14367,19 +14339,19 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "패드 브럼 사이즈" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "패드가 포함된 형상 주위에 얼마나 멀리 확장되어야 합니까?" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -14389,94 +14361,94 @@ msgstr "" "변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" "나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" "침대 평면을 기준으로 패드 벽의 경사입니다. 90도는 직선 벽을 의미합니다." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "오브젝트 주위에 패드를 만들고 지지표 표고를 무시합니다." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "사방 물체 주위의 패드" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "사방 물체 주위의 힘 패드" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "패드 오브젝트 갭" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "오브젝트 바닥과 생성된 패드 사이의 간격이 0 고도 모드에서 발생합니다." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "패드 오브젝트 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "패드 오브젝트 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "패드 오브젝트 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가." -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "중공 활성화" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "빈 인테리어를 가지고 모델을 중공" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "벽 두께" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "비어 있는 모델의 최소 벽 두께입니다." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "명중률" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" "성능 대 계산의 정확도. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -14488,185 +14460,185 @@ msgstr "" "플러스 닫는 거리)로 계산된 다음 지정된 오프셋으로 다시 팽창합니다. 닫는 거리" "가 클수록 내부가 더 둥글게 됩니다. 0에서 내부는 외관을 가장 닮은 것입니다." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "OBJ 내보내기" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "수출 SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "모델(들)을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "AMF로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 도구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "G 코드 뷰어" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "이미 슬라이스되고 저장된 G 코드 시각화" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "도움말 표시하기" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "도움말(FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "도움말(SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "콘솔에 모델에 대한 정보를 작성합니다." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "지정된 파일에 구성을 저장합니다." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "중앙" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "지정된 점을 중심으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "이 계수에 따라 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "그리드별 중복" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 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:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14674,60 +14646,60 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "X 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Y 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Y 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "배율 또는 백분율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" "지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "크기 조정" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "지정된 볼륨에 맞게 배율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "존재하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "--load에 제공된 파일이 존재하지 않는 경우 실패하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14735,27 +14707,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "로드 구성 파일" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14763,21 +14735,21 @@ msgstr "" "지정된 파일에서 구성을 로드합니다. 여러 파일에서 옵션을 로드하는 데 두 번 이" "상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "출력 파일" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 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:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "단일 인스턴스 모드" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -14787,11 +14759,11 @@ msgstr "" "나 기존 PrusaSlicer 창이 활성화됩니다. 응용 프로그램 기본 설정에서 " "\"single_instance\" 구성 값을 재정의합니다." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14800,11 +14772,11 @@ msgstr "" "지정된 디렉터리에서 설정을 로드하고 저장합니다. 이 기능은 서로 다른 프로파일" "을 유지 관리하거나 네트워크 저장소의 구성을 포함하는 데 유용합니다." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -14814,11 +14786,11 @@ msgstr "" "적\n" "예를 들어. loglevel=2는 치명적, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러로 렌더링" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/ko_KR/PrusaSlicer_ko_KR.po b/resources/localization/ko_KR/PrusaSlicer_ko_KR.po index 93a403ed3c..510b303b9c 100644 --- a/resources/localization/ko_KR/PrusaSlicer_ko_KR.po +++ b/resources/localization/ko_KR/PrusaSlicer_ko_KR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2021-04-04 22:15+0900\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.4.2\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" "약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "%s 정보" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "이 라이센스는" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공공 라이센스, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " "numerous others. 한국어 번역 울산에테르, 밤송이직박구리 (2.2.0)" -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "버전 정보" @@ -213,7 +213,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "크기" @@ -271,19 +271,18 @@ msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-코드 좌표 거리 #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -316,7 +315,7 @@ msgid "Load shape from STL..." msgstr "STL파일 로드." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "설정" @@ -329,7 +328,7 @@ msgid "Load..." msgstr "불러오기..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "삭제" @@ -543,19 +542,19 @@ msgstr "직선 채우기 패턴으로 전환해야 합니까?" msgid "Infill" msgstr "채움(infill)" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "머리 침투가 머리 너비보다 크지 않아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "잘못된 헤드 관통" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "잘못된 핀 헤드 지름" @@ -664,7 +663,7 @@ msgid "Standard" msgstr "표준" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "모두" @@ -924,7 +923,7 @@ msgstr "%s 지원하는 다른 공급업체 선택" msgid "Firmware Type" msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "펌웨어 철회" @@ -1227,7 +1226,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "실행 취소" @@ -1866,7 +1865,7 @@ msgstr "확인" msgid "Cancelling..." msgstr "취소 중..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1882,7 +1881,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "추가" @@ -1892,7 +1891,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "삭제" @@ -2073,8 +2072,8 @@ msgstr "운동" msgid "Extrusion" msgstr "압출 없음" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "리트랙션 후 최소 이동 거리" @@ -2129,7 +2128,7 @@ msgstr "출력 설정" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "필라멘트 설정을 선택" @@ -2351,7 +2350,7 @@ msgid "Add..." msgstr "더하기..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "모두 삭제" @@ -2398,7 +2397,7 @@ msgid "Next Undo action: %1%" msgstr "다음 작업 실행 취소 : %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "다시 실행" @@ -2440,7 +2439,7 @@ msgid "Selection-Remove from rectangle" msgstr "선택 영역-사각형에서 제거" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "잘라내기" @@ -2695,7 +2694,7 @@ msgid "Quality" msgstr "품질" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "닫힘 거리" @@ -2798,7 +2797,7 @@ msgstr "이동" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "회전" @@ -2815,7 +2814,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "크기" @@ -2866,7 +2865,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "오류" @@ -2950,7 +2949,7 @@ msgid "Minimal points distance" msgstr "최소한의 지점 거리" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "서포트 지점 밀도" @@ -3754,7 +3753,7 @@ msgid "Speed" msgstr "속도" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3777,52 +3776,51 @@ msgstr "스커트와 브림" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "고급" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "서포트" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "물체 속이 빈(Hollowing)" @@ -3964,7 +3962,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "병합" @@ -4025,7 +4023,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "분할" @@ -4661,11 +4659,11 @@ msgstr "높이" msgid "Width" msgstr "넓이" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "팬 속도" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "온도" @@ -4946,7 +4944,7 @@ msgstr "침대에 다중 부품 오브젝트가 있는 SLA 프로젝트를 로 msgid "Attention!" msgstr "주의!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "키보드 단축키" @@ -4983,7 +4981,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "ini/amf/3mf/gcode에서 구성을 로드하고 병합" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "G코드 내보내기" @@ -5332,13 +5330,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "G코드 파일 열기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "디스크에서 플래터 다시 로드" @@ -5375,7 +5373,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "미리보기" @@ -5458,7 +5456,7 @@ msgid "Keyboard shortcuts" msgstr "키보드 단축키" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "새로운 프라사슬라이스인스턴스 열기" @@ -5466,11 +5464,11 @@ msgstr "새로운 프라사슬라이스인스턴스 열기" msgid "G-code preview" msgstr "G 코드 미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "G코드 뷰어 열기" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "프라우슬라이서 오픈" @@ -5496,13 +5494,13 @@ msgid "Print Settings" msgstr "출력 설정" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "재질 설정" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "필라멘트 설정" @@ -5585,100 +5583,100 @@ msgstr "대화상자 표시" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "ISO" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "상단 " -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "위에서 보기 " #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "하단 " -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "바닥 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "뒷면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "왼쪽" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "왼쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "오른쪽" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "오른쪽 보기 " -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "새 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5686,523 +5684,523 @@ msgstr "" "선택한 프로젝트를 더 이상 사용할 수 없습니다.\n" "최근 프로젝트 목록에서 제거하시겠습니까?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "프로젝트 저장 및" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 저장." -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "STL/OBJ/AMF/3MF 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "제국 단위로 저장된 모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 부하" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "가져오기 구성 및 번들 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "내보내기 및 G 코드" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "S&end G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "현재 플레이트를 G 코드로 SD 카드/플래시 드라이브로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "공구 경로를 OBJ로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "구성 및 번들 내보내기 " -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "프린터 구성 번들 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "실제 프린터를 포함한 모든 사전 설정내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "G 코드가 내보낸 후 SD 카드/플래시 드라이브를 배출합니다." -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스와 저장" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)지금 슬라이스 " -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "STL 파일 수리" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "종료" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "종료 %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "모든 개체를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "모든 개체의 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "모든 객체를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "되돌리기(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "복사(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "붙여 넣기 클립 보드" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "검색" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "설정 검색" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "인쇄 및 어 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "프린터 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "3D 편집 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "사전 보기" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "인쇄 호스트 업로드 대기열 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "3D 씬에서 개체/인스턴스 레이블 표시" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "사이드바 축소" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "보기(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&도움" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "G 코드 열기" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "프라우슬라이서 오픈" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 #, fuzzy msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "파일을 찾을 수 없음" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG 업로드 사용" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "새로운 슬라이싱 작업 시작" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% 성공적으로 슬라이스되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택." -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음)." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 사전 설정을 가져 왔습니다." @@ -6422,8 +6420,8 @@ msgstr "적용" msgid "Instance %d" msgstr "인스턴스 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "레이어" @@ -6498,7 +6496,7 @@ msgstr "프린터의 설명 이름" msgid "Add preset for this printer device" msgstr "이 프린터 장치에 대한 사전 설정 추가" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "프린터 호스트 업로드 대기" @@ -6651,7 +6649,7 @@ msgid "Select what kind of support do you need" msgstr "필요한 지원 종류를 선택합니다." #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" @@ -6747,7 +6745,7 @@ msgid "(including spool)" msgstr "(스풀 포함)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "비용" @@ -7217,10 +7215,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "일반" @@ -7687,7 +7685,7 @@ msgid "Add/Remove presets" msgstr "사전 설정 추가/제거" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "실제 프린터 추가" @@ -7699,7 +7697,7 @@ msgstr "사전 설정 편집" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "실제 프린터 편집" @@ -8003,11 +8001,11 @@ msgstr "전혀 충돌 없음" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -8119,12 +8117,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "\"%1%\" 사전 설정으로 전환하기만 하면 됩니다." #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "스텔스" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "보통" @@ -8376,7 +8374,7 @@ msgstr "전체 프로필 이름" msgid "symbolic profile name" msgstr "기호 프로필 이름" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "레이어 및 둘레" @@ -8467,7 +8465,7 @@ msgstr "오버랩" msgid "Flow" msgstr "흐름도" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "기타" @@ -8475,52 +8473,52 @@ msgstr "기타" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "순차적 인쇄" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "압출기 클리어런스" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "종속성" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8532,82 +8530,82 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "노즐" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "침대" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "자동 냉각 사용" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "활성화" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "냉각 한계 값" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "필라멘트 속성" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "인쇄 속도 재정의" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "타워 파라미터 지우기" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "G 코드 시작" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "끝 G 코드" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "볼륨 흐름 힌트를 사용할 수 없음" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8628,20 +8626,20 @@ msgstr "" "열립니다. 실제 프린터 프로파일은 PrusaSlicer/physical_printer 디렉터리에 저장" "됩니다." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "크기 및 좌표" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "권한" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "프린터 익스트루더 숫자." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8652,64 +8650,64 @@ msgstr "" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 직경을 첫 번째 압출기 노즐 직경 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "레이어가 G 코드를 변경하기 전에" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "공구 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "객체 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "색상 변경 G 코드" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G 코드 인쇄 일시 중지" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "템플릿 사용자 지정 G 코드" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "최소 노출 시간" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8718,39 +8716,39 @@ msgstr "최소 노출 시간" msgid "Machine limits" msgstr "기계 제한" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 스텔스 모드용입니다." -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "최대 피드값" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "최대 가속" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "바보 제한" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "최소 공급률" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "단일 압출기 MM 설정" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8758,29 +8756,29 @@ msgstr "" "이것은 단일 압출기 다중 재료 프린터이며, 모든 압출기의 직경은 새 값으로 설정" "됩니다. 계속 하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "레이어 높이 제한" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "위치 (멀티 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "도구가 비활성화된 때의 철회(다중 압출기 설정에 대한 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "필라멘트 색상으로 재설정" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8790,51 +8788,51 @@ msgstr "" "\n" "펌웨어 철회를 활성화하기 위해 비활성화해야 합니까?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "펌웨어 철회" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "분리" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "제거" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "삭제" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "이 실제 프린터의 마지막 사전 설정입니다." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "실제 프린터 \"%2%\"에서 \"%1%\" 사전 설정을 삭제하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8843,62 +8841,62 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "찾기" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "전체 단어 일치" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "기계 제한은 G 코드로 방출되고 인쇄 시간을 예측하는 데 사용됩니다." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -8908,26 +8906,26 @@ msgstr "" "는 데 사용됩니다, 따라서 프린터가 기계 제한의 다른 세트를 적용 할 수 있으므" "로 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" "기계 제한이 설정되지 않으므로 인쇄 시간 추정치가 정확하지 않을 수 있습니다." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "" "UNLOCKED LOCK 아이콘은 일부 설정이 변경되었으며 현재 옵션 그룹의 시스템(또는 " @@ -8936,7 +8934,7 @@ msgstr "" "릭합니다." #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8948,14 +8946,14 @@ msgstr "" "잠금 해제 된 LOCK 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템 " "(또는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -8963,12 +8961,12 @@ msgstr "" "왼쪽 단추의 경우: 비시스템(또는 비기본적) 사전 설정을 나타내고,\n" "오른쪽 단추: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8980,7 +8978,7 @@ msgstr "" "뒤로 화살표 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 마지막으로 저" "장된 사전 설정으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -8988,7 +8986,7 @@ msgstr "" "잠긴 LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하다" "는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9000,11 +8998,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9012,7 +9010,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9024,14 +9022,14 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" "LOCK 아이콘잠기는 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9041,7 +9039,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9049,7 +9047,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9059,31 +9057,31 @@ msgstr "" "음을 나타냅니다.\n" "현재 값을 마지막 저장된 사전 설정으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9092,11 +9090,11 @@ msgstr "" "\"%1%\"는 \"%3%\" 범주에 있기 때문에 \"%2% %1%\"이 비활성화됩니다.\n" "\"%1%\"을 활성화하려면 \"%2%\"을 끄십시오." -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "객체 고도" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "물체 주위의 패드" @@ -9181,7 +9179,7 @@ msgstr "" "저장되지 않은 변경 사항에 대해 다시 묻는 것입니다." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9248,49 +9246,49 @@ msgstr "" "지 않은 변경 사항이 있습니다." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "압출기 수" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -9932,26 +9930,26 @@ msgid "" msgstr "" "%1% 대해 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "선택한 3mf 파일은 최신 버전의 %1% 저장되었으며 호환되지 않습니다." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10707,8 +10705,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -10723,9 +10721,8 @@ msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다. #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -10930,8 +10927,8 @@ msgstr "" msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11078,8 +11075,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm 또는 %" @@ -11159,7 +11157,7 @@ msgid "Extruder Color" msgstr "익스트루더 컬러" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." @@ -11252,7 +11250,7 @@ msgstr "" msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "색상" @@ -11425,8 +11423,8 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "밀도" @@ -11491,7 +11489,7 @@ msgstr "" msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(알 수 없음)" @@ -13175,7 +13173,7 @@ msgid "" "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13763,33 +13761,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13801,11 +13801,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13814,63 +13814,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13879,63 +13851,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "표시 폭" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "디스플레이 높이" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "가로로 대칭" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "세로 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "세로로 미러" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "표시 방향" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -13944,55 +13916,55 @@ msgstr "" "SLA 프린터 내부에 실제 LCD 디스플레이 방향을 설정합니다. 세로 모드는 디스플레" "이 너비와 높이 매개 변수의 의미를 뒤집고 출력 이미지가 90도 회전합니다." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "세로" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "빠른 기울기의 시간" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "천천히 기울이기" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "천천히 기울이는 속도" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14002,59 +13974,59 @@ msgstr "" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "프린터 크기 조정 보정" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "보정 의 표시에 따라 슬라이스 된 2D 다각형을 팽창하거나 수축합니다." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "코끼리 발 최소 폭" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "코끼리 발 보정을 할 때 유지 해야 하는 기능의 최소 폭." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14064,145 +14036,145 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA 재료 유형" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "병 볼륨" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "병 무게" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "가격 /병" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수가 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "최소 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "최대 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "최대 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "최소 초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "확장에 대한 수정" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA 프린트 소재 노트" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로파일" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "핀헤드 프론트 직경" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "헤드 포인팅 측면 지름" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "잘못된 헤드 관통" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "핀헤드가 모델 표면에 침투해야 하는 양" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "핀헤드 너비" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "기둥 직경" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "서포트 기둥의 지름 (mm)" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "작은 기둥 직경 퍼센트" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -14210,11 +14182,11 @@ msgstr "" "일반 필라가 맞지 않는 문제가 있는 부위에 사용되는 일반 기둥 직경에 비해 작은 " "기둥의 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "기둥의 최대 교량" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -14222,11 +14194,11 @@ msgstr "" "기둥에 배치할 수 있는 최대 브리지 수입니다. 브리지는 지지점 핀헤드를 잡고 작" "은 가지로 기둥에 연결합니다." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "기둥 연결 모드" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14236,23 +14208,23 @@ msgstr "" "로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" "적 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "지그재그" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "십자가" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "동적" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "기둥 확대 계수" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -14260,27 +14232,27 @@ msgstr "" "브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " "없음을 의미 하나는 전체 증가를 의미 합니다." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "서포트 베이스 지름" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "기둥 베이스의 mm 직경" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "서포트 기준 높이" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "서포트 베이스 원추의 높이" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "지지 기지 안전 거리" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -14289,34 +14261,34 @@ msgstr "" "모델에서 mm의 기둥 베이스의 최소 거리입니다. 이 매개 변수에 따른 간격이 모델" "과 패드 사이에 삽입되는 0 고도 모드에서 의미가 있습니다." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "임계 각도" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "최대 브리지 길이" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "브릿지의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "최대 기둥 연결 거리" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -14324,39 +14296,39 @@ msgstr "" "지원되는 개체를 들어 올려야 하는 지원 의 양입니다. \"개체 주위 의 패드\"가 활" "성화되면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 선택적 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -14367,19 +14339,19 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "패드 브럼 사이즈" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "패드가 포함된 형상 주위에 얼마나 멀리 확장되어야 합니까?" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -14389,94 +14361,94 @@ msgstr "" "변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" "나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" "침대 평면을 기준으로 패드 벽의 경사입니다. 90도는 직선 벽을 의미합니다." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "오브젝트 주위에 패드를 만들고 지지표 표고를 무시합니다." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "사방 물체 주위의 패드" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "사방 물체 주위의 힘 패드" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "패드 오브젝트 갭" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "오브젝트 바닥과 생성된 패드 사이의 간격이 0 고도 모드에서 발생합니다." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "패드 오브젝트 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "패드 오브젝트 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "오브젝트와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "패드 오브젝트 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가." -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "중공 활성화" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "빈 인테리어를 가지고 모델을 중공" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "벽 두께" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "비어 있는 모델의 최소 벽 두께입니다." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "명중률" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" "성능 대 계산의 정확도. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -14488,185 +14460,185 @@ msgstr "" "플러스 닫는 거리)로 계산된 다음 지정된 오프셋으로 다시 팽창합니다. 닫는 거리" "가 클수록 내부가 더 둥글게 됩니다. 0에서 내부는 외관을 가장 닮은 것입니다." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "수출 OBJ" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "수출 SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "모델(들)을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "AMF로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 도구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "G 코드 뷰어" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "이미 슬라이스되고 저장된 G 코드 시각화" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "도움말 표시하기" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "도움말(FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "도움말(SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시합니다." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "콘솔에 모델에 대한 정보를 작성합니다." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "지정된 파일에 구성을 저장합니다." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "중앙" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "지정된 점을 중심으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "이 계수에 따라 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "그리드별 중복" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 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:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14674,60 +14646,60 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "X 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Y 주위 회전" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Y 축을 중심 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "배율 또는 백분율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" "지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "크기 조정" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "지정된 볼륨에 맞게 배율을 조정합니다." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "존재하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "--load에 제공된 파일이 존재하지 않는 경우 실패하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14735,27 +14707,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "로드 구성 파일" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14763,21 +14735,21 @@ msgstr "" "지정된 파일에서 구성을 로드합니다. 여러 파일에서 옵션을 로드하는 데 두 번 이" "상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "출력 파일" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 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:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "단일 인스턴스 모드" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -14787,11 +14759,11 @@ msgstr "" "나 기존 PrusaSlicer 창이 활성화됩니다. 응용 프로그램 기본 설정에서 " "\"single_instance\" 구성 값을 재정의합니다." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14800,11 +14772,11 @@ msgstr "" "지정된 디렉터리에서 설정을 로드하고 저장합니다. 이 기능은 서로 다른 프로파일" "을 유지 관리하거나 네트워크 저장소의 구성을 포함하는 데 유용합니다." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -14814,11 +14786,11 @@ msgstr "" "적\n" "예를 들어. loglevel=2는 치명적, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러로 렌더링" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/nl/PrusaSlicer_nl.po b/resources/localization/nl/PrusaSlicer_nl.po index 78ac5d1fc6..01d8cf20e9 100644 --- a/resources/localization/nl/PrusaSlicer_nl.po +++ b/resources/localization/nl/PrusaSlicer_nl.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2021-12-14 09:56+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -14,16 +14,16 @@ msgstr "" "X-Poedit-Basepath: .\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Gedeeltelijk auteursrecht" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Copyright" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -31,26 +31,26 @@ msgstr "" "Licentieovereenkomst van alle volgende programma's maken deel uit van de " "software-licentieovereenkomst" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Over %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Versie" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "is gelicenseerd onder de" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero Algemene Publieke Licentie, versie 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -58,7 +58,7 @@ msgstr "" "PrusaSlicer is gebaseerd op Slic3r van Alessandro Ranellucci en de RepRap-" "community." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -68,7 +68,7 @@ msgstr "" "Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik, Simon " "Tillema en vele anderen." -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Kopieer versie-info" @@ -210,7 +210,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "Grootte" @@ -269,19 +269,18 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -316,7 +315,7 @@ msgid "Load shape from STL..." msgstr "Laad vorm van STL..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Instellingen" @@ -329,7 +328,7 @@ msgid "Load..." msgstr "Laad..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Verwijder" @@ -558,19 +557,19 @@ msgstr "Moet dit aangepast worden naar het rechtlijnig patroon?" msgid "Infill" msgstr "Vulling" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "Koppenetratie mag niet groter zijn dan de kopbreedte." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Ongeldige koppenetratie" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Pinkopdiameter moet kleiner zijn dan de pijlerdiameter." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Ongeldige pinkopdiameter" @@ -679,7 +678,7 @@ msgid "Standard" msgstr "Standaard" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Alles" @@ -950,7 +949,7 @@ msgstr "Kies een andere leverancier die ondersteund wordt door %s" msgid "Firmware Type" msgstr "Firmwaretype" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" @@ -1266,7 +1265,7 @@ msgstr "Uitvoeren" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Maak ongedaan" @@ -1928,7 +1927,7 @@ msgstr "Bevestiging" msgid "Cancelling..." msgstr "Annuleren..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Vormengalerij" @@ -1944,7 +1943,7 @@ msgstr "Voeg toe aan bed" msgid "Add selected shape(s) to the bed" msgstr "Voeg geselecteerd(e) object(en) toe aan bed" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Voeg toe" @@ -1954,7 +1953,7 @@ msgstr "Voeg een of meer aangepaste vormen toe" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Verwijder" @@ -2140,8 +2139,8 @@ msgstr "Beweging" msgid "Extrusion" msgstr "Extrusie" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Retractie" @@ -2196,7 +2195,7 @@ msgstr "Printinstellingen" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -2420,7 +2419,7 @@ msgid "Add..." msgstr "Voeg toe..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Verwijder alles" @@ -2467,7 +2466,7 @@ msgid "Next Undo action: %1%" msgstr "Volgende ongedaan maken: %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Doe opnieuw" @@ -2509,7 +2508,7 @@ msgid "Selection-Remove from rectangle" msgstr "Selectie - Verwijder van boxselectie" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Snij door" @@ -2771,7 +2770,7 @@ msgid "Quality" msgstr "Kwaliteit" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Sluitafstand" @@ -2878,7 +2877,7 @@ msgstr "Verplaats" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Roteer" @@ -2895,7 +2894,7 @@ msgstr "Toepassen" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Verschaal" @@ -2950,7 +2949,7 @@ msgstr "" "geselecteerd" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Fout" @@ -3034,7 +3033,7 @@ msgid "Minimal points distance" msgstr "Minimale puntafstand" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Dichtheid van supportpunten" @@ -3878,7 +3877,7 @@ msgid "Speed" msgstr "Snelheid" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3901,52 +3900,51 @@ msgstr "Skirt en brim" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Geavanceerd" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Support" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Basisplaat" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Uithollen" @@ -4088,7 +4086,7 @@ msgid "Revert conversion from meters" msgstr "Omrekenen van meters terugdraaien" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Samenvoegen" @@ -4149,7 +4147,7 @@ msgid "Split the selected object into individual parts" msgstr "Splits de geselecteerde objecten in individuele onderdelen" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Splits" @@ -4803,11 +4801,11 @@ msgstr "Hoogte" msgid "Width" msgstr "Breedte" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Ventilatorsnelheid" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Temperatuur" @@ -5094,7 +5092,7 @@ msgstr "U kunt geen SLA-project laden met een meerdelig object op het bed" msgid "Attention!" msgstr "Attentie!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" @@ -5136,7 +5134,7 @@ msgstr "" "Laad configuratie van INI-, AMF-, 3MF- of gcode-bestanden en voeg samen" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Exporteer gcode-bestand" @@ -5489,13 +5487,13 @@ msgstr "Stel het extrudernummer in voor de geselecteerde items" msgid "Objects List" msgstr "Objectenlijst" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Open een G-code-bestand" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Herlaad modellen van schijf" @@ -5532,7 +5530,7 @@ msgid "Show/Hide G-code window" msgstr "Toon/verberg G-code venster" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Sliceweergave" @@ -5616,7 +5614,7 @@ msgid "Keyboard shortcuts" msgstr "Sneltoetsen" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Open een PrusaSlicer venster" @@ -5624,11 +5622,11 @@ msgstr "Open een PrusaSlicer venster" msgid "G-code preview" msgstr "Sliceweergave" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Open de G-code weergave" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Open PrusaSlicer" @@ -5654,13 +5652,13 @@ msgid "Print Settings" msgstr "Printinstellingen" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Materiaalinstellingen" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Filamentinstellingen" @@ -5743,7 +5741,7 @@ msgstr "Toon Over-dialoogvenster" msgid "Show Tip of the Day" msgstr "Toon tip van de dag" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5751,94 +5749,94 @@ msgstr "" "Opent tip van de dag melding in de rechteronderhoek, of toont een andere tip " "als die al open staat." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Toon de lijst met sneltoetsen" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Isometrisch" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "Bovenkant" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 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:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "Onderkant" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Onderaanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Voorkant" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Vooraanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Achterzijde" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Achteraanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Links" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Linkerzijaanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Rechts" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Rechterzijaanzicht" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "Nieuw project" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Start nieuw project" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "Open project" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Open een projectbestand" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Huidige projecten" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5846,508 +5844,508 @@ msgstr "" "Het geselecteerde project is niet langer beschikbaar.\n" "Wilt u het verwijderen uit de lijst met recente projecten?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "Project opslaan" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Projectbestand opslaan" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Project opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Projectbestand opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importeer STL-, OBJ-, AMF- of 3MF-bestanden" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Laad een model" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Importeer STL (Engelse eenheden)" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Laad een model dat is opgeslagen met Engelse eenheden" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Importeer SL1 / SL1S archief" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Laad SL1 / SL1S archief" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importeer configuratiebestand" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Laad geëxporteerd configuratiebestand" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Importeer configuratie van project" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Laad configuratie van projectbestand" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importeer configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Laad presets van een bundel" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "Importeer" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Exporteer G-code" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Exporteer modellen als gcode-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "Stuur G-code" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Stuur huidige weergave als G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exporteer G-code naar SD-kaart / USB-stick" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Exporteer modellen als G-code naar SD-kaart/USB-stick" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Exporteer modellen als STL" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Exporteer modellen als STL-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Exporteer modellen inclusief supports als STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Exporteer modellen met support als STL-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Exporteer toolpaden als OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Exporteer toolpaden als OBJ-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Exporteer configuratie" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Exporteer huidige configuratie naar bestand" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Exporteer configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Exporteer alle presets naar bestand" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Exporteer configuratiebundel met fysieke printers" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "Exporteer alle presets, inclusief fysieke printers naar bestand" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "Exporteer" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "SD-kaart / USB-stick uitwerpen" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 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:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Snel slicen" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Slice naar een gcode-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Snel slicen en opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Slice naar gcode-bestand, opslaan als" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Herhaal laatste snelle slice" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Herhaal laatste snelle slice" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(&Her)slice nu" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Start nieuw sliceproces" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "&Repareer STL-bestand" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Automatisch een STL-bestand repareren" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Voorbeeldweergave" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "Afsluiten" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "%s afsluiten" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "Selecteer alles" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Selecteer alle objecten" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "Deselecteer alles" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Deselecteer alle objecten" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Verwijder geselecteerde" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Verwijdert huidige selectie" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Verwijder alles" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Verwijdert alle objecten" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "Ongedaan maken" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "Opnieuw doen" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "Kopieer" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Kopieer selectie naar klembord" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "Plak" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Plak van klembord" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Herlaad van schijf" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Zoek" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Zoek in instellingen" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "Tabblad modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Toon de modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Tabblad printinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Toon de printinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Tabblad filamentinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Toon de filamentinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Tabblad printerinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Toon de printerinstellingen" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3D-bewerkingsweergave" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Toon de modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Sliceweergave" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Toon de weergave van de slice" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Open het venster voor bewerken van de vormengalerij" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Printhost-uploadwachtrij" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Toon het venster van de printhost-uploadwachtrij" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Open nieuwe instantie" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Vergelijk presets" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Vergelijk presets" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Toon labels" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Toon object-/instantielabels in de modelweergave" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "Zijbalk inklappen" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Zijbalk inklappen" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "Volledig scherm" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Volledig scherm" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "Bestand" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "Bewerken" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "Venster" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "Toon" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Help" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&Open G-code" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Open &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "Exporteer" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "Stuur om te printen" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Materiaalinstellingentab" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 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:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Niet eerder gesliced bestand." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Eerder gesliced bestand (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") niet gevonden." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Bestand niet gevonden" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s-bestand opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "ZIP-bestand opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Slicen" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "%s verwerken" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% is succesvol gesliced." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Slicen klaar!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Selecteer het STL-bestand om te repareren:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ-bestand opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Het bestand is gerepareerd." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Repareer" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Configuratie opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Laden van een configuratiebestand" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Selecteer configuratie om te laden:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Exporteren van configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6355,15 +6353,15 @@ msgstr "" "Sommige presets zijn aangepast en de niet-opgeslagen wijzigingen zullen niet " "worden geëxporteerd in de configuratiebundel." -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Presetbundel opslaan als:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Laden van een configuratiebundel" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d presets succesvol geïmporteerd." @@ -6590,8 +6588,8 @@ msgstr "Instanties" msgid "Instance %d" msgstr "Instantie %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Lagen" @@ -6668,7 +6666,7 @@ msgstr "Beschrijvende naam voor de printer" msgid "Add preset for this printer device" msgstr "Voeg preset toe voor deze printer" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Printhost-upload" @@ -6830,7 +6828,7 @@ msgid "Select what kind of support do you need" msgstr "Selecteer welk type support nodig is" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Support alleen op het bed" @@ -6928,7 +6926,7 @@ msgid "(including spool)" msgstr "(inclusief spoel)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Kosten" @@ -7447,10 +7445,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "Plak van klembord" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Algemeen" @@ -7948,7 +7946,7 @@ msgid "Add/Remove presets" msgstr "Toevoegen/verwijderen van presets" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Voeg fysieke printer toe" @@ -7960,7 +7958,7 @@ msgstr "Bewerk preset" msgid "Change extruder color" msgstr "Verander extruderkleur" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Bewerk fysieke printer" @@ -8272,11 +8270,11 @@ msgstr "Fout: geen ramming" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -8389,12 +8387,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "Schakel naar de \"%1%\"-preset" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Stille modus" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normaal" @@ -8663,7 +8661,7 @@ msgstr "volledige profielnaam" msgid "symbolic profile name" msgstr "symbolische profielnaam" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Lagen en perimeters" @@ -8751,7 +8749,7 @@ msgstr "Overlapping" msgid "Flow" msgstr "Stroom" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Overige" @@ -8759,52 +8757,52 @@ msgstr "Overige" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Output-opties" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Achtereenvolgens printen" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Extruderruimte" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Outputbestand" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Scripts voor nabewerking" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Opmerkingen" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Afhankelijkheden" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Profielafhankelijkheden" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "Nabewerkscripts zullen de G-code wijzigen." -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8823,82 +8821,82 @@ msgstr[1] "" "Verwijder deze alstublieft; dit kan problemen veroorzaken in de visualisatie " "en printtijdschattingen." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Gereserveerde sleutelwoorden gevonden in" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Overschrijven door filament" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Nozzle" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Bed" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Koeling" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Toestaan" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Ventilatorinstellingen" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Koeldrempels" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Filamenteigenschappen" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Printsnelheid overschrijven" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Afveegblokparameters" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Toolwisselparameter voor multi-materialprinters met één extruder" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Ramming-instellingen" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Custom G-code" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Start G-code" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "Eind G-code" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Volumetrische stroom - opmerkingen niet beschikbaar" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8920,20 +8918,20 @@ msgstr "" "printerinstellingentab. Het fysieke printerprofiel is opgeslagen in de " "locatie PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Grootte en coördinaten" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Mogelijkheden" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Aantal extruders van de printer." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8945,64 +8943,64 @@ msgstr "" "Wilt u de diameters voor alle extruders aanpassen gelijk aan die van de " "eerste extruder?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Nozzlediameter" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-code die komt vóór de laagwisseling" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-code die komt na de laagwisseling" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "Toolwisseling G-code" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-code die komt tussen objecten (bij achtereenvolgens printen)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "Kleurwissel G-code" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "Pauzeer print G-code" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Template custom G-code" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Scherm" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Draaiing" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Draaitijd" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Correcties" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Belichtingstijd" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -9011,39 +9009,39 @@ msgstr "Belichtingstijd" msgid "Machine limits" msgstr "Machinelimieten" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Waarden in deze kolom zijn voor de normale modus" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Waarden in deze kolom zijn voor de stille modus" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Maximale snelheden" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Maximale acceleraties" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Ruklimieten" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Minimale snelheden" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Multi-materialsetup met één extruder" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Parameter voor multi-material met één extruder" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9052,19 +9050,19 @@ msgstr "" "extruders worden ingesteld op de nieuwe waarde. Weet u zeker dat u wilt " "doorgaan?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Laagdiktelimieten" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Positie (voor multi-extruderprinters)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Beweeg alleen Z omhoog" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9072,11 +9070,11 @@ msgstr "" "Retractie als de tool uit staat (geavanceerde instelling voor multi-" "extrudersetups)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Reset naar filamentkleur" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9086,31 +9084,31 @@ msgstr "" "\n" "Moet deze uitgezet worden om firmwareretractie te gebruiken?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Firmware-retractie" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Nieuwe printerpreset geselecteerd" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Ontkoppeld" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "verwijder" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "verwijderen" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "Het is een laatste preset voor deze fysieke printer." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9118,7 +9116,7 @@ msgid "" msgstr "" "Weet je zeker dat je \"%1%\" wilt verwijderen van de fysieke printer \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9130,7 +9128,7 @@ msgstr[1] "" "De onderstaande fysieke printers zijn gebaseerd op de preset die u wilt " "verwijderen." -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9139,7 +9137,7 @@ msgstr[0] "" msgstr[1] "" "Let op dat de geselecteerde preset ook voor deze printers wordt verwijderd." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9153,7 +9151,7 @@ msgstr[1] "" "De onderstaande fysieke printers zijn alleen gebaseerd op de preset die u " "wilt verwijderen." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9165,57 +9163,57 @@ msgstr[1] "" "Let op dat deze printers worden verwijderd na het verwijderen van de " "geselecteerde preset." -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format 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:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "Preset %1%" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Stel in" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Zoeken" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Alleen hele woorden" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Machinelimieten worden opgenomen in de G-code en gebruikt voor de geschatte " "printtijd." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -9225,7 +9223,7 @@ msgstr "" "gebruikt om de printtijd te schatten, waardoor ze niet nauwkeurig kunnen " "zijn bij een printer met andere machinelimieten." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9233,12 +9231,12 @@ msgstr "" "Machinelimieten zijn niet ingesteld, waardoor de geschatte printtijd niet " "nauwkeurig is." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "Vergrendeld" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9246,12 +9244,12 @@ msgstr "" "geeft aan dat de instellingen gelijk zijn aan de systeemwaarden voor de " "huidige optiegroep" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "Ontgrendeld" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9263,12 +9261,12 @@ msgstr "" "Klik op het ontgrendeld-pictogram om de instelling te resetten naar de " "systeemwaarden voor de huidige optiegroep." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "Wit bolletje" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -9276,12 +9274,12 @@ 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:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "Pijltje terug" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9293,7 +9291,7 @@ msgstr "" "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:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9301,7 +9299,7 @@ msgstr "" "Vergrendeld-pictogram geeft aan dat de instellingen gelijk zijn aan de " "systeemwaarde van de huidige optiegroep" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9313,11 +9311,11 @@ msgstr "" "Klik om alle instellingen voor de huidige optiegroep te resetten naar " "systeemwaarden." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 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:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9325,7 +9323,7 @@ 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:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9338,14 +9336,14 @@ msgstr "" "Klik om alle instellingen terug te zetten voor de huidige optiegroep naar de " "laatst opgeslagen preset." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 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:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9355,7 +9353,7 @@ msgstr "" "aan de systeemwaarde.\n" "Klik om de huidige waarde te resetten naar de systeemwaarde." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9363,7 +9361,7 @@ msgstr "" "Het witte bolletje geeft aan dat de waarde gelijk is aan de laatst " "opgeslagen preset." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9373,31 +9371,31 @@ msgstr "" "gelijk is aan de laatst opgeslagen preset.\n" "Klik om de waarde te resetten naar de laatst opgeslagen preset." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Materiaal" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Materiaal-printprofiel" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Supportkop" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Supportpijler" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Verbindingen van de supporttakken en kruisingen" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Automatisch genereren" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9406,11 +9404,11 @@ msgstr "" "\"%1%\" is uitgeschakeld omdat \"%2%\" aanstaat in \"%3%\"-categorie.\n" "Om \"%1%\" aan te zetten moet \"%2%\" uit staan" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Objectverhoging" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Basisplaat rondom object" @@ -9495,7 +9493,7 @@ msgstr "" "om weer te vragen over niet-opgeslagen wijzigingen." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9563,39 +9561,39 @@ msgstr "" "volgende niet-opgeslagen wijzigingen:" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Aantal extruders" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Toon alle presets (inclusief incompatibele)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Linker presetwaarde" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Rechter presetwaarde" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Een van de presets niet gevonden" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Vergeleken presets hebben verschillende soorten printers" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Presets zijn gelijk" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9604,11 +9602,11 @@ msgstr "" "Klik op deze knop om dezelfde preset te selecteren voor de rechter en linker " "preset." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Ongedefinieerde categorie" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Ongedefinieerde groep" @@ -10284,7 +10282,7 @@ msgstr "" "Kan de extrusiebreedte niet berekenen voor %1%: Variabele '%2%' niet " "beschikbaar." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10293,7 +10291,7 @@ msgstr "" "Het geselecteerde 3MF-bestand is opgeslagen in een nieuwere versie van %1% " "en is niet geschikt." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10301,7 +10299,7 @@ msgstr "" "De geselecteerde 3MF bevat een FDM-supports geschilderd object van een " "nieuwere versie van PrusaSlicer en is niet compatibel." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10309,7 +10307,7 @@ msgstr "" "De geselecteerde 3MF bevat een naadschildering object van een nieuwere " "versie van PrusaSlicer en is niet compatibel." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -11104,8 +11102,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -11120,9 +11118,8 @@ msgstr "Deze ventilatorsnelheid wordt aangehouden bij bruggen en overhanging." #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -11340,8 +11337,8 @@ msgstr "" msgid "Default print profile" msgstr "Standaard printprofiel" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11490,8 +11487,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm of %" @@ -11576,7 +11574,7 @@ msgid "Extruder Color" msgstr "Extruderkleur" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 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 " @@ -11674,7 +11672,7 @@ msgstr "" msgid "approximate seconds" msgstr "geschat aantal seconden" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Kleur" @@ -11855,8 +11853,8 @@ msgstr "" "daarom een schuifmaat en doe meerdere metingen over het hele filament. " "Bereken vervolgens het gemiddelde." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Dichtheid" @@ -11924,7 +11922,7 @@ msgstr "" msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Onbekend)" @@ -13701,7 +13699,7 @@ msgid "" "plane." msgstr "Gebruik deze instelling om het patroon van het support te draaien." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -14334,33 +14332,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14372,11 +14372,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14385,63 +14385,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14450,63 +14422,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Schermbreedte" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Breedte van het scherm" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Schermhoogte" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Hoogte van het scherm" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Aantal pixels" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Aantal pixels in de breedte" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Aantal pixels in de hoogte" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Scherm horizontaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Spiegel horizontaal" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Horizontaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Scherm verticaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Verticaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Verticaal spiegelen" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Schermoriëntatie" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -14516,55 +14488,55 @@ msgstr "" "Staande modus zal de breedte- en hoogteparameters omwisselen en de output " "wordt 90 graden gedraaid." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Liggend" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Staand" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Snel" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Snelle draaiing" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Tijd van de snelle draaiing" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Langzaam" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Langzaam draaien" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Tijd van de langzame draaiing" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Vulgebied" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14574,40 +14546,40 @@ msgstr "" "Als het printgebied buiten een specifieke waarde valt \n" "wordt een korte draaiing gebruikt, anders een snelle" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Verschalingscorrectie voor printer" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Verschalingscorrectie over de X-as" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Verschalingscorrectie in X-richting" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Verschalingscorrectie over de Y-as" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Verschalingscorrectie in Y-riching" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Verschalingscorrectie over de Z-as" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Verschalingscorrectie in Z-riching" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Absolute correctie voor printer" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14615,20 +14587,20 @@ msgstr "" "Zal de geslicede veelhoeken uitrekken of laten krimpen, afhankelijk van de " "correctiewaarde." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Squish-compensatiebreedte" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "Minimale breedte van delen waarop squish-compensatie wordt toegepast." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Gammacorrectie voor printer" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14638,43 +14610,43 @@ msgstr "" "betekent een waarde die in het midden ligt. Dit gedrag elimineert anti-" "aliasing zonder dat gaten in de veelhoeken verloren gaan." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA-materiaaltype" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Laagdikte eerste laag" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Flesinhoud (volume)" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Flesinhoud (gewicht)" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "€/fles" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Transitielagen" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14682,103 +14654,103 @@ msgstr "" "Aantal lagen waarin de initiële belichtingstijd stapsgewijs wordt " "teruggebracht naar de standaard belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Minimale belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Maximale belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Minimale initiële belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Maximale initiële belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Initiële belichtingstijd" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Vergrotingscorrectie" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Uitzettingscorrectie over de X-as" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Uitzettingscorrectie over de Y-as" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Uitzettingscorrectie over de Z-as" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA-printmateriaal opmerkingen" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 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:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Standaard SLA-materiaalprofiel" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Genereer support" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Genereer support voor de modellen" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Diameter voorzijde pinkop" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Diameter van de puntige zijde van de kop" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Koppenetratie" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 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:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Pinkopbreedte" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 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:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Pijlerdiameter" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Diameter van de supportpijlers (in mm)" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Percentage van smalle pijlerdiameter" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -14786,11 +14758,11 @@ msgstr "" "Het percentage van smallere pijlers vergeleken met normale pijlerdiameters " "die worden gebruikt in moeilijk te bereiken plekken." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Maximaal aantal bruggen op een pijler" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -14798,11 +14770,11 @@ msgstr "" "Maximaal aantal bruggen dat op een pijler geplaatst kan worden. Bruggen " "houden supportpuntkop bij elkaar en verbinden pijlers as smalle takken." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Pijlerverbindingsmodus" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14812,23 +14784,23 @@ msgstr "" "kruisend (dubbele zigzag) of dynamisch zijn. Dynamisch houdt in dat wordt " "geschakeld tussen de eerste twee, afhankelijk van de pijlerafstand." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zigzag" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Kruisend" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dynamisch" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Pijlervergrotingsfactor" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -14836,27 +14808,27 @@ msgstr "" "Bruggen of pijlers samenvoegen met andere pijlers kan de radius vergroten. 0 " "betekent geen vergroting, 1 betekent volle vergroting." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Supportbasis - diameter" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Diameter van de pijlerbasis (in mm)" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Supportbasis - hoogte" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Hoogte van de pijlerbasiskegel" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Supportbasis - veilige afstand" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -14866,27 +14838,27 @@ msgstr "" "modus zonder verhoging waar een gat volgens deze parameter wordt ingevoegd " "tussen het model en de basisplaat." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Kritische hoek" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "De standaardhoek voor de verbinding van supporttakken en kruisingen." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Maximale bruglengte" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "Maximale bruglengte" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Maximale pijler-verbindafstand" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -14894,7 +14866,7 @@ msgstr "" "Maximale verbindingsafstand van twee pijlers. Een waarde van 0 schakelt aan " "elkaar verbonden pijlers uit." -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -14902,39 +14874,39 @@ msgstr "" "Hoe veel het support omhoog moet bewegen op het ondersteunde object. Als " "'Basisplaat rondom object' is ingeschakeld wordt deze waarde genegeerd." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Relatieve waarde van de dichtheid van supportpunten." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Minimale supportpuntafstand" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "Minimale afstand tussen supportpunten." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Gebruik basisplaat" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Voeg een basisplaat toe onder het model met support" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Basisplaat - wanddikte" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Dikte van de basisplaat en optionele wanden." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Basisplaat - wandhoogte" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -14946,19 +14918,19 @@ msgstr "" "sommige resins een sterk zuigeffect in de holte produceren, wat het afpellen " "van de print van het folie lastig kan maken." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Basisplaat - expansie" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 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:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Maximale combineerafstand" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -14968,11 +14940,11 @@ msgstr "" "van één grote. Deze parameter bepaalt hoe ver de tussenafstand van de " "kleinere basisplaten mogen zijn." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Basisplaat - zijhoek" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -14980,23 +14952,23 @@ msgstr "" "Hoek van de basisplaatzijde ten opzichte van het bed. 90 graden betekent een " "rechte zijkant." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Genereer basisplaat rondom object en schakel objectverhoging uit" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Overal basisplaat rondom object" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Forceer basisplaat overal rondom het object" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Basisplaat - gat" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15004,11 +14976,11 @@ msgstr "" "Het gat tussen de onderkant van het object en de gegenereerde basisplaat in " "de modus zonder verhoging." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Basisplaat - verbindingstakafstand" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -15016,46 +14988,46 @@ msgstr "" "Afstand tussen twee verbindingstakken die het object verbinden aan de " "basisplaat." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Basisplaat - verbindingstakbreedte" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 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:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Basisplaat - Verbindingstakinsteek" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 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:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Uithollen toestaan" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Hol een model uit voor een leeg binnenste" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Wanddikte" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Minimale wanddikte van een uitgehold model." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Nauwkeurigheid" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15063,7 +15035,7 @@ msgstr "" "Prestatie tegenover nauwkeurigheid van berekenen. Lagere waarde kunnen " "ongewenste artefacten produceren." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -15077,11 +15049,11 @@ msgstr "" "binnenste ronder. Bij een waarde van 0 is het binnenste vrijwel gelijk aan " "de buitenzijde." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Printsnelheid" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15091,63 +15063,63 @@ msgstr "" "vloeibaarheid of met holle delen. Het vertraagt de kantelbeweging en voegt " "een vertraging toe na de belichting." -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Exporteer OBJ" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Exporteer de modellen als OBJ-bestand." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Exporteer SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 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:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Exporteer 3MF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Exporteer de modellen als 3MF-bestanden." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Exporteer AMF" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Exporteer de modellen als AMF-bestanden." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Exporteer STL" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Exporteer de modellen als STL-bestand." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Slice het model en exporteer de paden als G-code-bestand." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "G-code weergave" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Visualiseer een reeds opgeslagen G-code" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Slice" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15155,71 +15127,71 @@ msgstr "" "Slice het model als FFF of SLA, gebaseerd op de 'printer_technology'-" "configuratiewaarde." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Help" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Toon deze hulp zien." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Help (FFF-opties)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 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:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Help (SLA opties)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "Toon de volledige lijst van SLA-printconfiguratie-opties." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Output model-info" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Schrijf informatie over het model naar de console." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Sla configuratiebestand op" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Sla configuratie op in aangegeven bestand." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "XY uitlijnen" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Lijn de modellen uit op het gegeven punt." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Snijdt model op de ingestelde hoogte." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Centreer" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Centreer de print op het middelpunt." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Niet schikken" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15227,11 +15199,11 @@ msgstr "" "Herschik de modellen niet voor het samenvoegen en behoudt de originele X- en " "Y-coördinaten." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Plaats op bed" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15239,23 +15211,23 @@ msgstr "" "Til het object boven het bed als deze er gedeeltelijk onder valt. Staat " "standaard aan. Gebruik \"no_ensure_on_bed\" om uit te zetten." -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Dupliceer" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Meerdere kopieën van dit aantal." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Dupliceer in raster" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Meerdere kopieën in raster." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15263,7 +15235,7 @@ msgstr "" "Schik de toegevoegde modellen en combineer ze tot één model om eenmalig " "acties uit te voeren." -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -15271,31 +15243,31 @@ msgstr "" "Probeer alle niet-gesloten meshes te repareren (deze optie is impliciet " "toegevoegd om, wanneer dat nodig is, onmogelijke modellen toch te slicen)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Rotatiehoek rond de Z-as in graden." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Draai over de X-as" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Rotatiehoek rond de X-as in graden." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Draai over de Y-as" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Rotatiehoek rond de Y-as in graden." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Schalingsfactor of percentage." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15303,23 +15275,23 @@ msgstr "" "Detecteer niet-verbonden onderdelen in het model en deel ze op in " "verschillende objecten." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Verschaal naar passing" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Verschaal naar passing in het gegeven volume." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Negeer niet-bestaande configuratiebestanden" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 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:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15327,7 +15299,7 @@ msgstr "" "Doorgang-compatibiliteitsregel bij het laden van configuraties van " "configuratie- en projectbestanden (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15340,11 +15312,11 @@ msgstr "" "onbekende waarde zonder melding of woordelijk te vervangen door een " "standaardwaarde." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Sla onbekende configuratiewaarden over" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15352,7 +15324,7 @@ msgstr "" "Sta to om onbekende configuratiewaarden te lezen door woordelijk te " "substitueren met standaardwaarden." -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15360,11 +15332,11 @@ msgstr "" "Sta to om onbekende configuratiewaarden te lezen door zonder melding te " "substitueren met standaardwaarden." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Laad configuratiebestand" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15372,11 +15344,11 @@ msgstr "" "Laad configuratie uit een specifiek bestand. Dit kan meerdere keren gebruikt " "worden om instellingen uit meerdere bestanden te laden." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Outputbestand" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15384,11 +15356,11 @@ msgstr "" "Het bestand waaroverheen wordt geschreven (als dit niet aangegeven is, wort " "dit gebaseerd op het inputbestand)." -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Enkele instantiemodus" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15399,11 +15371,11 @@ msgstr "" "gestuurd. Dit overschrijft de \"enkele instantie\"-configuratiewaarde van de " "programmavoorkeuren." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Bestandslocatie voor de data" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15413,11 +15385,11 @@ msgstr "" "verschillende profielen of het opnemen van configuraties van een " "netwerkopslag." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Logboekniveau" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15427,11 +15399,11 @@ msgstr "" "debug, 5: traceer\n" "Voorbeeld: loglevel = 2 geeft fataal-, fout- en waarschuwingslevelberichten." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Render met software-renderer" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/pl/PrusaSlicer.mo b/resources/localization/pl/PrusaSlicer.mo index 28a03f071a..32a82f1146 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 03bb6a8aac..03a26b9011 100644 --- a/resources/localization/pl/PrusaSlicer_pl.po +++ b/resources/localization/pl/PrusaSlicer_pl.po @@ -9,7 +9,7 @@ msgstr "" "%10 <=9)) || (n%100 >= 12 && n%100 <= 14)) ? 2 : 3);\n" "X-Generator: Prusalator\n" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -37,9 +37,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -152,7 +151,7 @@ msgstr[2] "%1% (%2$d powłok)" msgstr[3] "%1% (%2$d powłok)" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Zestaw ustawień" @@ -171,7 +170,7 @@ msgstr "" msgid "%1% was substituted with %2%" msgstr "%1% zamieniono na %2%" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% został pomyślnie pocięty." @@ -193,7 +192,7 @@ msgstr "%3.2f mm³/s z prędkością filamentu %3.2f mm/s." msgid "%d lines: %.2f mm" msgstr "%d linii: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "pomyślnie zaimportowano %d zestawów ustawień." @@ -364,7 +363,7 @@ msgstr "" msgid "&About %s" msgstr "&O %s" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "S&chowaj pasek narzędzi" @@ -376,27 +375,27 @@ msgstr "&Konfiguracja" msgid "&Configuration Snapshots" msgstr "Zrzuty Konfigura&cji" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Kopiuj" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Usuń &zaznaczone" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Edytuj" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Eksport" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Ustawienia &filamentu" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Plik" @@ -404,19 +403,19 @@ msgstr "&Plik" msgid "&Finish" msgstr "&Zakończ" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "&Pełny ekran" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Podgląd &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "Pomo&c" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Import" @@ -424,7 +423,7 @@ msgstr "&Import" msgid "&Language" msgstr "Język ap&likacji" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Nowy Projekt" @@ -432,19 +431,19 @@ msgstr "&Nowy Projekt" msgid "&Next >" msgstr "&Dalej>" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&Otwórz G-code" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&Otwórz Projekt" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "Wkle&j" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&Podgląd Stołu" @@ -452,35 +451,35 @@ msgstr "&Podgląd Stołu" msgid "&Preferences" msgstr "&Preferencje" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "Wyjś&cie" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "Powtó&rz" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "Nap&rawa pliku STL" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "Zapi&sz Projekt" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "Zaznacz w&szystko" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "Co&fnij" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Widok" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Okno" @@ -489,7 +488,7 @@ msgstr "&Okno" msgid "(All)" msgstr "(Wszystko)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Pono&wne) Cięcie" @@ -501,7 +500,7 @@ msgstr "(Ponowne) Cięcie" msgid "(Some lines not shown)" msgstr "(Niektórych linii nie pokazano)" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Nieznane)" @@ -513,7 +512,7 @@ msgstr "(wliczając szpulę)" msgid "(minimum)" msgstr "(minimum)" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") nie znaleziono." @@ -569,7 +568,7 @@ msgstr "2 mm" msgid "3 (heavy)" msgstr "3 (ciężki)" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" @@ -666,7 +665,7 @@ msgstr "" "Generalną zasadą jest 60 °C dla PLA i 110 °C dla ABS. Ustaw zero, jeśli nie " "masz podgrzewanego stołu." -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -693,7 +692,7 @@ msgstr "Klucz API" msgid "Abort" msgstr "Przerwij" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "O %s" @@ -710,7 +709,7 @@ msgstr "Ustawienia przyspieszeń (zaawansowane)" msgid "Access violation" msgstr "Naruszenie dostępu" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Dokładność" @@ -750,7 +749,7 @@ msgstr "" "Adaptacyjnego podpierającego, aby skrócić czas drukowania i zmniejszyć " "zużycie filamentu? Przeczytaj więcej w dokumentacji." -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Dodaj" @@ -814,7 +813,7 @@ msgstr "Dodaj Kształt z Galerii" msgid "Add Shapes from Gallery" msgstr "Dodaj Kształty z Galerii" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Dodaj podkładkę pod podporami modelu" @@ -931,7 +930,7 @@ msgid "Add pause print" msgstr "Dodaj pauzę" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Dodaj fizyczną drukarkę" @@ -1031,17 +1030,16 @@ msgstr "Adres" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Zaawansowane" @@ -1077,16 +1075,16 @@ msgstr "" "filamentu na wieży czyszczącej, aby wydrukować dobre wypełnienie lub zbędny " "model." -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-code wykonywany po zmianie warstwy" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Wyrównaj XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Wyrównaj model z danym punktem." @@ -1099,7 +1097,7 @@ msgid "Aligned Rectilinear" msgstr "Jednokierunkowe linie równoległe" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Wszystkie" @@ -1299,7 +1297,7 @@ msgstr "Automatycznie stosuj zmianę koloru" msgid "Apply to all the remaining small objects being loaded." msgstr "Zastosuj do wszystkich pozostałych małych obiektów, które są ładowane." -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "Arachne" @@ -1311,7 +1309,7 @@ msgstr "Generator obrysów Arachne" msgid "Archimedean Chords" msgstr "Spirala Archimedesa" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Czy na pewno chcesz %1% ten zestaw ustawień?" @@ -1328,7 +1326,7 @@ msgstr "" msgid "Are you sure you want to continue?" msgstr "Czy na pewno chcesz kontynuować?" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -1342,7 +1340,7 @@ msgstr "" msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "Czy na pewno chcesz usunąć drukarkę \"%1%\"?" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Czy na pewno chcesz usunąć wszystkie zamienniki?" @@ -1350,7 +1348,7 @@ msgstr "Czy na pewno chcesz usunąć wszystkie zamienniki?" msgid "Are you sure you want to do it?" msgstr "Czy na pewno chcesz to zrobić?" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Wypełnienie obszaru" @@ -1381,7 +1379,7 @@ msgstr "" "Czy wiesz, że możesz kliknąć prawym przyciskiem myszy ikonę Rozmieść, " "aby dostosować odstęp między modelami i umożliwić ich automatyczne obracanie?" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -1535,7 +1533,7 @@ msgstr "Automatycznie generuj punkty podpór" msgid "Autogeneration will erase all manually edited points." msgstr "Generowanie automatyczne usunie wszystkie ręcznie ustawione punkty." -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Generowanie automatyczne" @@ -1543,7 +1541,7 @@ msgstr "Generowanie automatyczne" msgid "Automatic updates" msgstr "Automatyczne aktualizacje" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Automatyczna naprawa pliku STL" @@ -1559,11 +1557,11 @@ msgstr "Unikaj ruchów nad obrysami" msgid "Avoid crossing perimeters - Max detour length" msgstr "Unikaj ruchów nad obrysami - maksymalna długość objazdu" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "STRZAŁKA W TYŁ" -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -1576,7 +1574,7 @@ msgstr "" "Kliknij, aby zresetować wszystkie ustawienia w obecnej grupie opcji do tych " "z ostatnio zapisanego zestawu ustawień." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -1591,7 +1589,7 @@ msgstr "" msgid "Background processing" msgstr "Przetwarzanie w tle" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Wycofaj przy nieznanej konfiguracji" @@ -1599,7 +1597,7 @@ msgstr "Wycofaj przy nieznanej konfiguracji" msgid "Balanced" msgstr "Zbalansowana" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Stół" @@ -1647,7 +1645,7 @@ msgstr "" "Temperatura stołu dla warstw powyżej pierwszej. Ustaw 0, aby wyłączyć " "kontrolowanie temperatury w pliku wyjściowym." -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-code wykonywany przed zmianą warstwy" @@ -1672,7 +1670,7 @@ msgstr "Najlepsza jakość powierzchni" msgid "Between objects G-code" msgstr "G-code wykonywany przy przejściach pomiędzy modelami" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "" "G-code wykonywany przy przejściach pomiędzy modelami (druk sekwencyjny)" @@ -1695,11 +1693,11 @@ msgstr "Blokuj podpory" msgid "Block supports by angle" msgstr "Blokuj podpory wg kąta" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Pojemność butelki" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Waga butelki" @@ -1716,7 +1714,7 @@ msgstr "Spód" msgid "Bottom" msgstr "Dolne" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Widok od dołu" @@ -1991,8 +1989,8 @@ msgstr "" "Nie można kontynuować bez punktów podpór! Dodaj punkty podpór lub wyłącz ich " "generowanie." -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Możliwości" @@ -2000,7 +1998,7 @@ msgstr "Możliwości" msgid "Capture a configuration snapshot" msgstr "Zapisz zrzut konfiguracji" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Niewrażliwe na wielkość liter" @@ -2008,11 +2006,11 @@ msgstr "Niewrażliwe na wielkość liter" msgid "Category" msgstr "Kategoria" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Punkt centralny" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Wyśrodkuj model wokół podanego punktu centralnego." @@ -2118,7 +2116,7 @@ msgstr "Wybierz archiwum SLA:" 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:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Wybierz plik do pocięcia (STL/OBJ/AMF/3MF/PRUSA):" @@ -2164,7 +2162,7 @@ msgstr "Koło" msgid "Circular" msgstr "Okrągły" -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "Klasyczny" @@ -2172,11 +2170,13 @@ msgstr "Klasyczny" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" -"Klasyczny generator obrysów tworzy ścieżki o stałej szerokości wytłaczania, " -"a dla bardzo cienkich obszarów stosuje wypełnienie szczelin. Silnik Arachne " -"wytwarza obrysy o zmiennej szerokości wytłaczania." +"Klasyczny generator obrysów tworzy obrysy o stałej szerokości wytłaczania, a " +"dla bardzo cienkich obszarów stosuje wypełnienie szczelin. Silnik Arachne " +"wytwarza obrysy o zmiennej szerokości wytłaczania. Ustawienie to ma wpływ " +"również na wypełnienie koncentryczne." #: src/slic3r/GUI/Preferences.cpp:295 msgid "Clear Undo / Redo stack on new project" @@ -2255,7 +2255,7 @@ msgid "Closing PrusaSlicer. Current project is modified." msgstr "Zamykanie PrusaSlicer. Bieżący projekt został zmodyfikowany." #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Dystans domykania" @@ -2263,7 +2263,7 @@ msgstr "Dystans domykania" msgid "Closing radius" msgstr "Promień zamykania" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Zwiń pasek narzędzi" @@ -2271,11 +2271,11 @@ msgstr "Zwiń pasek narzędzi" msgid "Collapse/Expand the sidebar" msgstr "Zwiń/rozwiń pasek narzędzi" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Kolor" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-code dla zmiany koloru" @@ -2339,12 +2339,12 @@ msgstr "Komendy" msgid "Comment:" msgstr "Komentarz:" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Porównaj zestawy ustawień" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Porównaj zestawy ustawień" @@ -2352,7 +2352,7 @@ msgstr "Porównaj zestawy ustawień" msgid "Compare this preset with some another" msgstr "Porównaj ten zestaw ustawień z innym" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Porównane zestawy ustawień mają różne technologie druku" @@ -2516,7 +2516,7 @@ msgstr "" "będzie ograniczona do wartości parametru infill_anchor, ale nie dłuższa niż " "ten parametr. Ustaw zero, aby wyłączyć kotwiczenie." -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Łączenia słupków i skrzyżowań podpór" @@ -2570,7 +2570,7 @@ msgstr "Kontynuować i zainstalować aktualizacje konfiguracji?" msgid "Continue to activate a configuration snapshot %1%?" msgstr "Kontynuować przywracanie zrzutu konfiguracji %1%?" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -2587,7 +2587,7 @@ msgstr "" "Swój wkład mają: Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas " "Meszaros, Lukas Matena, Vojtech Kral, David Kocik oraz wielu innych." -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -2606,7 +2606,7 @@ msgstr "Konwertuj z jednostek imperialnych" msgid "Convert from meters" msgstr "Konwertuj z metrów" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Chłodzenie" @@ -2618,7 +2618,7 @@ msgstr "Ruchy chłodzące przyspieszają zaczynając od tej prędkości." 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:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Progi chłodzenia" @@ -2643,11 +2643,11 @@ msgstr "Kopia" msgid "Copy" msgstr "Kopiuj" -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Skopiuj informacje o wersji" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Skopiuj zaznaczenie do schowka" @@ -2711,32 +2711,32 @@ msgstr "" "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:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Prawa autorskie" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Korekcja rozciągnięcia" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Korekcja rozszerzania w osi X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Korekcja rozszerzania w osi Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Korekcja rozszerzania w osi Z" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Korekcje" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Koszt" @@ -2808,7 +2808,7 @@ msgstr "" "finalną rozdzielczość wydruku, więc zalecane jest ustawienie tej wartości na " "rozsądnie niskim poziomie." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Dodaj podkładkę wokół modelu i zignoruj podniesienie na podporach" @@ -2827,7 +2827,7 @@ msgid "Creating a new project while the current project is modified." msgstr "" "Tworzenie nowego projektu podczas gdy bieżący projekt jest modyfikowany." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Kąt krytyczny" @@ -2835,7 +2835,7 @@ msgstr "Kąt krytyczny" msgid "Critical error" msgstr "Błąd krytyczny" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Krzyżowy" @@ -2881,8 +2881,8 @@ msgstr "" "w formacie crt/pem. Jeśli pole zostanie puste, to zostanie użyty plik z " "systemowego repozytorium CA." -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Własny G-code" @@ -2926,7 +2926,7 @@ msgid "Custom template (\"%1%\")" msgstr "Własny szablon (\"%1%\")" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Przetnij" @@ -2934,7 +2934,7 @@ msgstr "Przetnij" msgid "Cut by Plane" msgstr "Tnij Płaszczyzną" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Przetnij model na wysokości Z." @@ -2942,7 +2942,7 @@ msgstr "Przetnij model na wysokości Z." msgid "Cylinder" msgstr "Cylinder" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "&Odznacz wszystko" @@ -2950,7 +2950,7 @@ msgstr "&Odznacz wszystko" msgid "Dark mode (experimental)" msgstr "Interfejs w trybie ciemnym (eksperymentalny)" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Katalog danych" @@ -2976,7 +2976,7 @@ msgstr "Zmniejsz ilość instancji" msgid "Default" msgstr "Domyślnie" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Domyślny profil materiału SLA" @@ -3015,8 +3015,8 @@ msgstr "" msgid "Default print profile" msgstr "Domyślny profil druku" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -3030,7 +3030,7 @@ msgstr "" msgid "Define a custom printer profile" msgstr "Zdefiniuj własny profil drukarki" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -3048,11 +3048,11 @@ msgstr "Opóźnienie po rozładowaniu" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Usuń" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Usuń &wszystko" @@ -3106,7 +3106,7 @@ msgid "Delete Subobject" msgstr "Usuń Model Podrzędny" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Usuń wszystko" @@ -3164,16 +3164,16 @@ msgstr "Usuń zaznaczenie - kliknij lewym przyciskiem lub wciśnij klawisz \"-\" msgid "Delete tool change" msgstr "Usuń zmianę narzędzia" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Usuwa wszystkie modele" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Usuwa zaznaczenie" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Gęstość" @@ -3185,9 +3185,9 @@ msgstr "Gęstość wypełnienia wewnętrznego, wyrażana w zakresie 0% - 100%." msgid "Density of the first raft or support layer." msgstr "Gęstość pierwszej warstwy raftu lub podpór." -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Zależności" @@ -3211,7 +3211,7 @@ msgstr "Odznacz wszystko" msgid "Deselect by rectangle" msgstr "Odznaczenie prostokątem" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Odznacza wszystkie modele" @@ -3247,7 +3247,7 @@ msgstr "Odłącz od ustawień systemowych" msgid "Detach preset" msgstr "Odłącz zestaw ustawień" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Odłączono" @@ -3271,7 +3271,7 @@ msgstr "" msgid "Detect thin walls" msgstr "Wykrywanie cienkich ścian" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -3295,15 +3295,15 @@ msgstr "Urządzenie:" msgid "Diameter" msgstr "Średnica" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Średnica podstawy słupka w mm" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Średnica słupków podpór w mm" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Średnica spiczastej części łącznika" @@ -3367,31 +3367,31 @@ msgstr "Odrzuć wszystkie własne zmiany" msgid "Discard changes" msgstr "Odrzuć zmiany" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Wyświetlacz" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Wysokość wyświetlacza" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Pokaż odbicie poziome" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Pokaż orientację" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Wyświetl okno kolejki serwera druku" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Pokaż odbicie pionowe" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Orientacja wyświetlacza" @@ -3410,7 +3410,7 @@ msgstr "" "Odległość między skirtem i brimem (gdy draft shield jest wyłączony) a " "modelami." -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -3449,11 +3449,11 @@ msgstr "Odstęp używany przy automatycznym rozmieszczaniu modeli na stole." msgid "Divide by zero" msgstr "Dzielenie przez zero" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 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:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -3509,7 +3509,7 @@ msgstr "Czy chcesz ustawić domyślne materiały SLA dla tych modeli drukarek?" 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/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Nie układaj" @@ -3573,11 +3573,11 @@ msgstr "" msgid "Drop to bed" msgstr "Upuść na stół" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Duplikuj" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Duplikuj wg siatki" @@ -3594,11 +3594,11 @@ msgstr "Podczas drukowania innych warstw wentylator będzie pracować na %1%%%" msgid "During the other layers, fan will be turned off." msgstr "Podczas drukowania innych warstw wentylator będzie wyłączony." -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dynamicznie" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "&Eksport" @@ -3649,7 +3649,7 @@ msgstr "Edytuj własny G-code" msgid "Edit pause print message" msgstr "Edytuj komunikat wstrzymania wydruku" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Edytuj fizyczną drukarkę" @@ -3673,7 +3673,7 @@ msgstr "Edytowanie" msgid "Eigen vectorization supported:" msgstr "Obsługiwana wektoryzacja własna:" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Wysuń kar&tę SD / pamięć flash" @@ -3681,7 +3681,7 @@ msgstr "Wysuń kar&tę SD / pamięć flash" msgid "Eject SD card / Flash drive" msgstr "Wysuń kartę SD / pamięć flash" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 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." @@ -3698,7 +3698,7 @@ msgstr "Wysuwanie urządzenia %s(%s) nie powiodło się." msgid "Elephant foot compensation" msgstr "Kompensacja \"stopy słonia\"" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Minimalna szerokość stopy słonia" @@ -3731,7 +3731,7 @@ msgstr "Przekaż do G-code" msgid "Empty layer between %1% and %2%." msgstr "Pusta warstwa między %1% i %2%." -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Włącz" @@ -3748,11 +3748,11 @@ msgstr "Włącz tryb ciemny" 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:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Włącz drążenie" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Włącz odbicie poziome dla obrazów wyjściowych" @@ -3767,7 +3767,7 @@ msgstr "" "Włącz prasowanie górnych warstw gorącą dyszą dla uzyskania gładkiej " "powierzchni" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -3775,7 +3775,7 @@ msgstr "" "Umożliwia odczytanie nieznanych wartości konfiguracyjnych przez ciche " "zastąpienie ich wartościami domyślnymi." -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -3826,7 +3826,7 @@ msgstr "" msgid "Enable variable layer height feature" msgstr "Zmienna wysokość warstwy" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Włącz odbicie pionowe dla obrazów wyjściowych" @@ -3842,7 +3842,7 @@ msgstr "" "Umożliwia wypełnianie szczelin między pojedynczymi obrysami oraz między " "najbardziej wewnętrznym obrysem i wypełnieniem." -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" @@ -3874,7 +3874,7 @@ msgstr "Wymuś podpory" msgid "Enqueued" msgstr "Zakolejkowano" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Zawsze upuszczaj na stół" @@ -3982,7 +3982,7 @@ msgstr "" "Błąd: \"%2%\"" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Błąd" @@ -4132,23 +4132,23 @@ msgstr "Tryb Eksperta" msgid "Export" msgstr "Eksport" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Eksport Konfigura&cji" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Eksport &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Ekspor&t ścieżek narzędzi do OBJ" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Eksport 3MF" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Eksport AMF" @@ -4156,11 +4156,11 @@ msgstr "Eksport AMF" msgid "Export AMF file:" msgstr "Eksport pliku AMF:" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Eks&port Paczki Konfiguracyjnej" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Eksport paczki konfiguracyjnej z drukarkami fizycznymi" @@ -4169,15 +4169,15 @@ msgid "Export G-Code." msgstr "Eksport G-code." #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Eksport G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Eksport G-gode na kartę SD / pamięć flash" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Eksport OBJ" @@ -4185,19 +4185,19 @@ msgstr "Eksport OBJ" msgid "Export OBJ file:" msgstr "Eksport pliku OBJ:" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Eksport stołu jako &STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Eksport stołu z podporam&i do STL" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Eksport SLA" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Eksport STL" @@ -4205,12 +4205,12 @@ msgstr "Eksport STL" msgid "Export STL file:" msgstr "Eksport pliku STL:" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" "Eksport do pliku wszystkich zestawów ustawień wraz z fizycznymi drukarkami" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Eksport wszystkich zestawów ustawień do pliku" @@ -4222,23 +4222,23 @@ msgstr "Eksport jako STL" msgid "Export config" msgstr "Eksport konfiguracji" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Eksport obecnej konfiguracji do pliku" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Eksport zawartości stołu jako G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 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:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Eksport zawartości stołu jako STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Eksport zawartości stołu jako STL wraz z podporami" @@ -4255,19 +4255,19 @@ msgstr "Niepowodzenie eksportu tymczasowego pliku 3MF" msgid "Export sources full pathnames to 3mf and amf" msgstr "Eksport pełnych ścieżek do 3MF i AMF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Eksport model(i) jako 3MF." -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Eksport model(i) jako AMF." -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Eksport model(i) jako OBJ." -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Eksport modeli jako STL." @@ -4275,7 +4275,7 @@ msgstr "Eksport modeli jako STL." msgid "Export to SD card / Flash drive" msgstr "Eksport na kartę SD / pamięć flash" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Eksport ścieżek narzędzi jako OBJ" @@ -4287,7 +4287,7 @@ msgstr "Eksport" msgid "Exporting G-code" msgstr "Eksportowanie G-code" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Eksportowanie paczki konfiguracji" @@ -4308,11 +4308,11 @@ msgstr "Eksportowanie" msgid "Exposition time is out of printer profile bounds." msgstr "Czas naświetlania jest poza zakresem profilu drukarki." -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Naświetlanie" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Czas naświetlania" @@ -4374,7 +4374,7 @@ msgstr "Kolor ekstrudera" msgid "Extruder changed to" msgstr "Ekstruder zmieniony na" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Odstęp od ekstrudera" @@ -4383,7 +4383,7 @@ msgid "Extruder offset" msgstr "Margines ekstrudera" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -4391,7 +4391,7 @@ msgid "Extruders" msgstr "Ekstrudery" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Liczba ekstruderów" @@ -4431,7 +4431,7 @@ msgstr "Drukarki FFF" msgid "Facets" msgstr "Powierzchnie" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Warstwy przejściowe" @@ -4463,11 +4463,11 @@ msgstr "Nie udało się wywiercić niektórych otworów w modelu" msgid "Fan Speed (%)" msgstr "Prędkość wentylatora (%)" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Ustawienia wentylatora" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Prędkość wentylatora" @@ -4501,11 +4501,11 @@ msgstr "Wentylator będzie zawsze pracować na %1%%%" msgid "Fan will be turned off." msgstr "Wentylator będzie wyłączony." -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Szybkie" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Szybkie przechylanie" @@ -4529,7 +4529,7 @@ msgstr "Rodzaje funkcji" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -4541,7 +4541,7 @@ msgstr "Średnica Filamentu:" msgid "Filament End G-code" msgstr "G-code dla zakończenia filamentu" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Nadpisywane Ustawienia" @@ -4550,7 +4550,7 @@ msgid "Filament Profiles Selection" msgstr "Wybór profili filamentu" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Ustawienia Filamentu" @@ -4592,7 +4592,7 @@ msgstr "Notatki do filamentu" msgid "Filament parking position" msgstr "Pozycja zatrzymania filamentu" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Właściwości filamentu" @@ -4609,7 +4609,7 @@ msgstr "Czas rozładowania filamentu" msgid "Filaments" msgstr "Filamenty" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Nie znaleziono pliku" @@ -4677,7 +4677,7 @@ msgstr "Wypełnij pozostałą przestrzeń stołu instancjami wybranego modelu" msgid "Filling bed" msgstr "Wypełnianie stołu" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Znajdź" @@ -4689,11 +4689,11 @@ msgstr "Znajdź podany wzorzec w linijkach pliku G-code i zamień je." msgid "Finished" msgstr "Zakończono" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Retrakcja z firmware" @@ -4909,7 +4909,7 @@ 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:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Wymuś podkładkę wokół wszystkich modeli, wszędzie" @@ -4941,7 +4941,7 @@ msgstr "" "Format miniaturek G-kodu: PNG dla najlepszej jakości, JPG dla najmniejszego " "rozmiaru, QOI dla firmware z małą ilością pamięci" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -4949,7 +4949,7 @@ msgstr "" "Reguła kompatybilności w przód przy wczytywaniu konfiguracji z plików " "konfiguracyjnych i plików projektu (3MF, AMF)." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Znaleziono zarezerwowane słowa kluczowe w" @@ -4961,11 +4961,11 @@ msgstr "Od" 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:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Przód" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Widok przodu" @@ -4973,7 +4973,7 @@ msgstr "Widok przodu" msgid "Full fan speed at layer" msgstr "Pełna prędkość wentylatora na warstwie " -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Pełny ekran" @@ -5021,7 +5021,7 @@ msgstr "Grubość Fuzzy Skin" msgid "Fuzzy skin type." msgstr "Rodzaj Fuzzy Skin." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-code" @@ -5059,11 +5059,11 @@ msgstr "Zamiana G-code" msgid "G-code thumbnails" msgstr "Miniaturki G-code" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Przeglądarka G-code" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "Ogólna Licencja Publiczna (GPL) GNU Affero, wersja 3" @@ -5080,10 +5080,10 @@ msgstr "Galeria" msgid "Gap fill" msgstr "Wypełnienie szpar" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Ogólne" @@ -5113,11 +5113,11 @@ msgstr "" "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:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Generowanie podpór" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Generowanie podpór dla modeli" @@ -5309,11 +5309,11 @@ msgstr "" msgid "Head diameter" msgstr "Średnica łącznika" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Przenikanie łączników" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "Przenikanie łączników nie powinno być większe niż ich średnica." @@ -5337,7 +5337,7 @@ msgstr "Wysokość (mm)" msgid "Height of skirt expressed in layers." msgstr "Wysokość skirtu wyrażona w warstwach." -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Wysokość wyświetlacza" @@ -5362,15 +5362,15 @@ 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:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Pomoc" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Pomoc (opcje FFF)" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Pomoc (opcje SLA)" @@ -5404,7 +5404,7 @@ msgstr "Wysoko" msgid "High extruder current on filament swap" msgstr "Zwiększenie prądu ekstrudera przy zmianie filamentu" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Wysoka lepkość" @@ -5436,7 +5436,7 @@ msgstr "Średnica otworu" msgid "Hollow and drill" msgstr "Drążenie i wiercenie" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Wydrąż model, aby uzyskać puste wnętrze" @@ -5444,16 +5444,16 @@ msgstr "Wydrąż model, aby uzyskać puste wnętrze" msgid "Hollow this object" msgstr "Wydrąż ten model" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Drążenie" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -5521,20 +5521,20 @@ msgstr "" "Umieść kursor nad przyciskiem, aby uzyskać więcej informacji\n" "lub kliknij ten przycisk." -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 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:3867 +#: src/libslic3r/PrintConfig.cpp:3840 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:3576 +#: src/libslic3r/PrintConfig.cpp:3549 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -5753,7 +5753,7 @@ msgstr "" "Jeśli włączone, na górze podglądu 3D będzie wyświetlany przycisk zwijania " "bocznego panelu" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -6025,7 +6025,7 @@ msgstr "" "lub niedziałających punktów dystrybucji. Można włączyć tę opcję dla " "samodzielnie podpisanych certyfikatów, jeśli połączenie nie powiedzie się." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignoruj nieistniejące pliki konfiguracyjne" @@ -6043,15 +6043,15 @@ msgstr "Niedozwolona instrukcja" msgid "Import" msgstr "Import" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Import Konfigura&cji" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Import Paczki Konfi&guracyjnej" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Import konfiguracji z &projektu" @@ -6067,7 +6067,7 @@ msgstr "Import Modelu" msgid "Import Objects" msgstr "Importuj Modele" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Import archiwum SL1 / SL1S" @@ -6075,11 +6075,11 @@ msgstr "Import archiwum SL1 / SL1S" msgid "Import SLA archive" msgstr "Import archiwum SLA" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Import STL (jednostki imperialne)" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Import STL/OBJ/AM&F/3MF" @@ -6207,11 +6207,11 @@ msgstr "Dziedziczy profil" 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:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Początkowy czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Wysokość pierwszej warstwy" @@ -6316,7 +6316,7 @@ msgstr "Błąd wewnętrzny: %1%." msgid "Internal infill" msgstr "Wypełnienie wewnętrzne" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Nieprawidłowe przenikanie łączników podpór" @@ -6344,7 +6344,7 @@ msgstr "" msgid "Invalid numeric input." msgstr "Nieprawidłowa wartość numeryczna." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Błędna średnica łącznika" @@ -6380,11 +6380,11 @@ msgstr "Rodzaj prasowania" msgid "Is it safe?" msgstr "Czy jest to bezpieczne?" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Izometryczny" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Widok izometryczny" @@ -6411,7 +6411,7 @@ msgstr "" "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/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "Jest to ostatni zestaw ustawień dla fizycznej drukarki." @@ -6425,7 +6425,7 @@ msgstr "" msgid "It's not possible to delete the last related preset for the printer." msgstr "Nie ma możliwości usunięcia ostatniego zestawu ustawień dla drukarki." -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Limity jerku" @@ -6491,7 +6491,7 @@ msgstr "Zachowaj wybrane ustawienia." msgid "Keep upper part" msgstr "Zachowaj górną część" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Skróty klawiszowe" @@ -6499,11 +6499,11 @@ msgstr "Skróty klawiszowe" msgid "Keyboard shortcuts" msgstr "Skróty klawiszowe" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "ZAMKNIĘTA KŁÓDKA" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -6511,7 +6511,7 @@ 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:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -6523,7 +6523,7 @@ msgstr "" msgid "Label objects" msgstr "Oznacz modele" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Tryb krajobrazu" @@ -6563,7 +6563,7 @@ msgstr "" "\n" "Wysokość warstwy zostanie zresetowana do 0,01." -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Limit wysokości warstw" @@ -6571,8 +6571,8 @@ msgstr "Limit wysokości warstw" msgid "Layer range Settings to modify" msgstr "Zakres warstw dla modyfikacji ustawień" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Warstwy" @@ -6589,7 +6589,7 @@ msgstr "Warstwy" msgid "Layers and Perimeters" msgstr "Warstwy i Obrysy" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Warstwy i obrysy" @@ -6602,15 +6602,15 @@ msgstr "Opcje układu" msgid "Leave \"%1%\" enabled" msgstr "Zostaw opcję \"%1%\" włączoną" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Lewo" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Wartość z zestawu ustawień po lewej" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Widok lewy" @@ -6647,7 +6647,7 @@ msgid "Length of the infill anchor" msgstr "Długość kotwiczenia wypełnienia" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -6659,7 +6659,7 @@ msgstr "" msgid "Lift Z" msgstr "Z-hop" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -6719,19 +6719,19 @@ msgstr "Wczytaj Element" msgid "Load Project" msgstr "Wczytaj Projekt" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Wczytaj model" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Wczytaj archiwum SL1 / SL1S" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Wczytaj model zapisany w jednostkach imperialnych" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -6740,7 +6740,7 @@ 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:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Wczytaj plik konfiguracyjny" @@ -6758,11 +6758,11 @@ msgstr "" "W podobny sposób możesz użyć menu \"Plik -> Import -> Import archiwum SL1/" "SL1S\", co pozwala również na odtworzenie modeli 3D z danych wokselowych." -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Wczytaj konfigurację z pliku projektu" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -6770,11 +6770,11 @@ 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:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Wczytaj wyeksportowany plik konfiguracyjny" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Wczytaj zestaw ustawień" @@ -6806,11 +6806,11 @@ msgstr "Wczytywanie konfiguracji" msgid "Loading file" msgstr "Wczytywanie pliku" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Wczytywanie paczki konfiguracyjnej" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Wczytywanie pliku konfiguracyjnego" @@ -6849,7 +6849,7 @@ msgstr "Lokalny układ współrzędnych" msgid "Lock supports under new islands" msgstr "Zablokuj podpory pod nowymi wyspami" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Poziom logowania" @@ -6865,7 +6865,7 @@ msgstr "Niski" msgid "Lowest Z height" msgstr "Najniższa wysokość Z" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -6874,7 +6874,7 @@ msgstr "Najniższa wysokość Z" msgid "Machine limits" msgstr "Limity maszynowe" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -6882,7 +6882,7 @@ msgstr "" "Limity maszynowe nie zostały ustawione, dlatego szacowany czas druku może " "odbiegać od rzeczywistości." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -6892,7 +6892,7 @@ msgstr "" "obliczenia czasu drukowania, który może okazać się niedokładny, ponieważ " "drukarka może zastosować inne." -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" @@ -6918,20 +6918,20 @@ msgstr "Edycja ręczna" msgid "Masked SLA file exported to %1%" msgstr "Maskowany plik SLA wyeksportowany do %1%" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Dopasuj pojedynczy wiersz" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Ustawienia mate&riału" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Materiał" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Ustawienia materiału" @@ -6940,7 +6940,7 @@ msgstr "Ustawienia materiału" msgid "Material Settings Tab" msgstr "Ustawienia materiału" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Profil materiału używanego do drukowania" @@ -6948,19 +6948,19 @@ msgstr "Profil materiału używanego do drukowania" msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Maksymalna długość mostu" -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Maks. liczba mostków na słupku" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Maksymalny dystans łączenia" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Maksymalny dystans łączenia słupków" @@ -7056,7 +7056,7 @@ msgstr "Maksymalne przyspieszenie podczas retrakcji" msgid "Maximum acceleration when retracting (M204 R)" msgstr "Maksymalne przyspieszenie przy retrakcji (M204 R)" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Maksymalne przyspieszenia" @@ -7078,7 +7078,7 @@ msgstr "" "powstanie efektu low-poly, a ponieważ redukcja kodu odbywa się na każdej " "warstwie oddzielnie, może to przełożyć się również na artefakty na wydruku." -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Maksymalny czas naświetlania" @@ -7114,11 +7114,11 @@ msgstr "Maksymalny posuw (prędkość ruchu) osi Y" msgid "Maximum feedrate of the Z axis" msgstr "Maksymalny posuw (prędkość ruchu) osi Z" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Maksymalne prędkości posuwu" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Maksymalny początkowy czas naświetlania" @@ -7158,7 +7158,7 @@ msgstr "Maksymalny jerk dla osi Z" msgid "Maximum length of the infill anchor" msgstr "Maksymalna długość kotwiczenia wypełnienia" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -7189,7 +7189,7 @@ msgid "Medium" msgstr "Średni" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Łączenie" @@ -7205,7 +7205,7 @@ msgstr "Scal modele w jeden model wieloczęściowy" msgid "Merged" msgstr "Scalono" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -7245,7 +7245,7 @@ msgstr "Min" msgid "Min print speed" msgstr "Minimalna prędkość druku" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Minimalne rozmieszczenie punktów podpór" @@ -7287,11 +7287,11 @@ msgstr "" "Ustaw zero, aby wyłączyć upraszczanie i użyć pełnej rozdzielczości pliku " "wejściowego." -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Minimalny czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3128 msgid "Minimum feature size" msgstr "Minimalny rozmiar detalu" @@ -7303,15 +7303,15 @@ msgstr "Minimalna prędkość posuwu z ekstruzją" msgid "Minimum feedrate when extruding (M205 S)" msgstr "Minimalna prędkość posuwu z ekstruzją (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Minimalna prędkość posuwu" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Minimalny początkowy czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Minimalna szerokość obrysu" @@ -7335,15 +7335,19 @@ msgstr "" msgid "Minimum thickness of a top / bottom shell" msgstr "Minimalna grubość górnej/dolnej powłoki" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" "Minimalna grubość cienkich detali. Elementy modelu, które są cieńsze niż ta " "wartość, nie będą drukowane, natomiast elementy grubsze niż minimalny " -"rozmiar detalu zostaną poszerzone do minimalnej szerokości obrysu." +"rozmiar detalu zostaną poszerzone do minimalnej szerokości obrysu. Jeśli " +"wyrażona w procentach (na przykład 25%), zostanie obliczona na podstawie " +"średnicy dyszy." #: src/libslic3r/PrintConfig.cpp:2899 msgid "Minimum top shell thickness" @@ -7366,11 +7370,11 @@ msgstr "Minimalna prędkość posuwu ruchu jałowego" msgid "Minimum travel feedrate (M205 T)" msgstr "Minimalna prędkość posuwu ruchu jałowego (M205 T)" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Minimalna grubość ścianki drążonego modelu." -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" @@ -7395,7 +7399,7 @@ msgstr "" msgid "Mirror Object" msgstr "Odbicie Lustrzane" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Odbij w poziomie" @@ -7415,7 +7419,7 @@ msgstr "Odbicie lustrzane wybranego modelu w osi Y" msgid "Mirror the selected object along the Z axis" msgstr "Odbicie lustrzane wybranego modelu w osi Z" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Odbij w pionie" @@ -7591,11 +7595,11 @@ 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:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Pomnóż ilość kopii przez stworzenie siatki." -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Pomnóż ilość kopii przez tę wartość." @@ -7683,7 +7687,7 @@ msgstr "Nowy układ z dostępem przez przycisk ustawień w górnym menu" msgid "New prerelease version %1% is available." msgstr "Dostępna jest nowa wersja przedpremierowa %1% ." -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Wybrano nowy zestaw ustawień drukarki" @@ -7743,7 +7747,7 @@ msgstr "" "Nie ma możliwości wygenerowania podkładki dla tego modelu przy obecnych " "ustawieniach" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Brak poprzednio pociętych plików." @@ -7751,7 +7755,7 @@ msgstr "Brak poprzednio pociętych plików." msgid "No sparse layers (EXPERIMENTAL)" msgstr "Brak warstw bez czyszczenia (EKSPERYMENTALNE)" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "Punkty nie zostaną umieszczone bliżej siebie niż ustawiona wartość." @@ -7767,7 +7771,7 @@ msgid "None" msgstr "Brak" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normalny" @@ -7783,7 +7787,7 @@ msgstr "Nie znaleziono:" msgid "Note" msgstr "Uwaga" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -7800,7 +7804,7 @@ msgstr[3] "" "Pamiętaj, że wybrany zestaw ustawień zostanie usunięty również z tych " "drukarek." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -7818,7 +7822,7 @@ msgstr[3] "" "Weź pod uwagę, że te drukarki zostaną usunięte przy usuwaniu wybranego " "zestawu ustawień." -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -7868,12 +7872,12 @@ msgstr "Uwaga: ten zestaw ustawień zostanie zastąpiony po zapisaniu" 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:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Notatki" @@ -7887,7 +7891,7 @@ msgstr "Uwaga" msgid "Notify about new releases" msgstr "Powiadamiaj o nowych wydaniach" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Dysza" @@ -7899,7 +7903,7 @@ msgstr "Średnica dyszy:" msgid "Nozzle and Bed Temperatures" msgstr "Temperatury dyszy oraz stołu" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Średnica dyszy" @@ -7930,7 +7934,7 @@ msgstr "" msgid "Number of cooling moves" msgstr "Ilość ruchów chłodzących" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Liczba ekstruderów drukarki." @@ -7958,15 +7962,15 @@ msgstr "" "\", to może ona nadpisać wartość wprowadzoną w tym polu. Ustaw zero, aby " "całkowicie wyłączyć skirt." -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Liczba pikseli" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Liczba pikseli w osi X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Liczba pikseli w osi Y" @@ -7982,7 +7986,7 @@ msgstr "Liczba zwartych warstw górnych i dolnych." msgid "Number of solid layers to generate on top surfaces." msgstr "Liczba zwartych warstw górnych." -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -7998,7 +8002,7 @@ msgstr "Ilość zmian narzędzi" msgid "Object Settings to modify" msgstr "Ustawienia modelu do modyfikacji" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Podniesienie modelu" @@ -8123,7 +8127,7 @@ msgstr "Włącz/wyłącz wyświetlanie jednej warstwy suwaka pionowego" msgid "One layer mode" msgstr "Tryb jednej warstwy" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Jeden z zestawów ustawień nie został znaleziony" @@ -8148,7 +8152,7 @@ msgstr "" "stole tylko jeden model lub włącz druk sekwencyjny parametrem " "\"complete_objects\"." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -8158,7 +8162,7 @@ msgstr "Tworzenie podpór tylko na stole. Nie będą tworzone na wydruku." msgid "Only infill where needed" msgstr "Tylko potrzebne wypełnienie" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Z-hop tylko" @@ -8200,7 +8204,7 @@ msgstr "" "Zapobieganie wyciekom jest obecnie niedostępne przy włączonej wieży " "czyszczącej." -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Otwórz &PrusaSlicer" @@ -8220,11 +8224,11 @@ msgstr "Otwórz folder." msgid "Open G-code file:" msgstr "Otwórz plik G-code:" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Otwórz przeglądarkę G-code" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Otwórz nową instancję" @@ -8232,20 +8236,20 @@ msgstr "Otwórz nową instancję" msgid "Open Preferences." msgstr "Otwórz Preferencje." -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Otwórz PrusaSlicer " -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Otwórz plik G-code" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Otwórz nową instancję PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Otwórz plik projektu" @@ -8287,7 +8291,7 @@ msgstr "Otwórz stronę %s w przeglądarce" 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:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Otwórz okno dialogowe, aby zmodyfikować galerię kształtów" @@ -8304,7 +8308,7 @@ msgid "Opening new project while some presets are unsaved." msgstr "" "Otwieranie nowego projektu, gdy niektóre zestawy ustawień nie są zapisane." -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -8380,7 +8384,7 @@ msgstr "Anulowano ustawianie orientacji." msgid "Origin" msgstr "Punkt zerowy" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Inne" @@ -8400,15 +8404,15 @@ msgstr "Zewnętrzny i wewnętrzny brim" msgid "Outer brim only" msgstr "Tylko zewnętrzny brim" -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Plik Wyjściowy" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Informacje o Modelu wyjściowym" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Plik wyjściowy" @@ -8416,7 +8420,7 @@ msgstr "Plik wyjściowy" msgid "Output filename format" msgstr "Format pliku wyjściowego" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Opcje wyjściowe" @@ -8441,19 +8445,19 @@ msgstr "Próg zwisu" msgid "Overlap" msgstr "Nakładanie" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Ustawienia d&ruku" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Podkładka" @@ -8461,15 +8465,15 @@ msgstr "Podkładka" msgid "Pad and Support" msgstr "Podkładka i Podpory" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Podkładka wokół modelu" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Podkładka wokół wszystkich modeli" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Rozmiar brimu dla podkładki" @@ -8477,31 +8481,31 @@ msgstr "Rozmiar brimu dla podkładki" 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:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Przenikanie łącznika podkładki z modelem" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Rozmieszczenie łączników podkładki z modelem" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Szerokość łącznika podkładki z modelem" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Odstęp modelu od podkładki" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Wysokość ścianki podkładki" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Kąt pochylenia ścianki podkładki" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Grubość ścianki podkładki" @@ -8633,7 +8637,7 @@ msgstr "Wklej" msgid "Paste From Clipboard" msgstr "Wklej Ze Schowka" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Wklej zawartość schowka" @@ -8672,7 +8676,7 @@ msgstr "Wzór podpór." msgid "Pause" msgstr "Pauza" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G-code dla pauzy drukowania" @@ -8708,7 +8712,7 @@ msgstr "" "Wykonaj integrację z pulpitem (ustawia ten plik binarny tak, aby był możliwy " "do wyszukania przez system)." -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -8751,7 +8755,7 @@ msgstr "" msgid "Perimeter" msgstr "Obrys" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Liczba rozmieszania obrysów" @@ -8763,15 +8767,15 @@ msgstr "Ekstruder dla obrysów" msgid "Perimeter generator" msgstr "Generator obrysów" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Długość zmiany obrysu" -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Margines filtra zmiany obrysu" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Kąt graniczny zmiany obrysu" @@ -8822,27 +8826,27 @@ msgstr "" "Rozmiary grafik przechowywanych w plikach .gcode i .sl1 / .sl1s, w formacie: " "\"XxY, XxY, ...\"" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Tryb łączenia słupków" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Średnica słupka" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Współczynnik rozszerzania słupka" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 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/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Przednia średnica łącznika" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Szerokość łącznika" @@ -8890,11 +8894,11 @@ msgstr "" msgid "Please select the file to reload" msgstr "Wybierz plik do przeładowania" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Częściowe prawa autorskie" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Tryb Portretowy" @@ -8903,7 +8907,7 @@ msgstr "Tryb Portretowy" msgid "Position" msgstr "Pozycja" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Pozycja (dla drukarek z kilkoma ekstruderami)" @@ -8919,7 +8923,7 @@ msgstr "Pozycja Y" msgid "Position of perimeters starting points." msgstr "Pozycja startowa druku obrysów." -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "Skrypty do post-processingu powinny modyfikować G-code na miejscu." @@ -8941,11 +8945,11 @@ msgstr "" "Ustaw skrypt, aby zmieniał G-code na miejscu i zajrzyj do instrukcji, aby " "dowiedzieć się, jak opcjonalnie zmienić nazwę przetwarzanego G-code.\n" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Skrypty do przetwarzania końcowego" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Pod&gląd" @@ -9017,7 +9021,7 @@ msgstr "" msgid "Preset with name \"%1%\" already exists." msgstr "Zestaw ustawień o nazwie \"%1%\" już istnieje." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9026,7 +9030,7 @@ msgstr "" "Kliknij ten przycisk, aby wybrać ten sam zestaw ustawień dla prawego i " "lewego zestawu." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Zestawy ustawień są takie same" @@ -9066,7 +9070,7 @@ msgstr "" msgid "Pressure equalizer (experimental)" msgstr "Korektor ciśnienia (eksperymentalny)" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -9087,7 +9091,7 @@ msgstr "" "procentach (np. 25%), to zostanie obliczony na podstawie średnicy dyszy." #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Podgląd cięcia" @@ -9095,7 +9099,7 @@ msgstr "Podgląd cięcia" msgid "Preview hollowed and drilled model" msgstr "Podgląd drążenia/wiercenia" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Poprzednio pocięty plik (" @@ -9107,7 +9111,7 @@ msgstr "Wyczyść wszystkie używane ekstrudery" msgid "Print" msgstr "Druk" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Kolej&ka zadań serwera druku" @@ -9115,7 +9119,7 @@ msgstr "Kolej&ka zadań serwera druku" msgid "Print Diameters" msgstr "Średnice" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Przesyłanie do serwera druku" @@ -9154,15 +9158,15 @@ msgstr "Pauzuje wydruk" msgid "Print settings" msgstr "Ustawienia druku" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Prędkość druku" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Nadpisanie prędkości druku" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Ustawi&enia drukarki" @@ -9197,11 +9201,11 @@ msgstr "Ustawienia Drukarki" msgid "Printer Settings Tab" msgstr "Ustawienia drukarki" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Korekcje bezwzględne drukarki" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Korekcja gamma drukarki" @@ -9213,32 +9217,32 @@ msgstr "Notatki o drukarce" msgid "Printer preset names" msgstr "Nazwy zestawów ustawień drukarek" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Korekcja skalowania przez drukarkę w osi X" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Korekcja skalowania przez drukarkę w osi Y" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Korekcja skalowania przez drukarkę w osi Z" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Korekcja skalowania drukarki" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Korekcja skalowania przez drukarkę w osi X" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Korekcja skalowania przez drukarkę w osi Y " -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Korekcja skalowania przez drukarkę w osi Z" @@ -9285,7 +9289,7 @@ msgid "Process %1% / 100" msgstr "Przetwarzanie %1% / 100" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Przetwarzanie %s" @@ -9299,9 +9303,9 @@ msgstr "" "Przetwarzanie modelu '%1%' z więcej niż 1 milionem trójkątów może być " "powolne. Wysoce zalecamy zmniejszenie ilości trójkątów." -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Zależności profilowe" @@ -9393,7 +9397,7 @@ msgid "" "PrusaSlicer has encountered an error while taking a configuration snapshot." msgstr "PrusaSlicer napotkał błąd przy wykonywaniu zrzutu konfiguracji." -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -9514,15 +9518,15 @@ msgstr "Szybka" msgid "Quick Add Settings (%s)" msgstr "Szybkie dodanie ustawień (%s)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Szybkie Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Szybkie cięcie i Zapis jako" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Wyjście z %s" @@ -9590,7 +9594,7 @@ msgstr "Szerokość linii wyciskania" msgid "Ramming parameters" msgstr "Parametry wyciskania" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Ustawienia wyciskania" @@ -9610,8 +9614,8 @@ msgstr "Zakres" msgid "Rasterizing layers" msgstr "Rasteryzowanie warstw" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Wczytaj ponownie z d&ysku" @@ -9623,15 +9627,15 @@ msgstr "Ponowna konfiguracja" msgid "Ready" msgstr "Gotowe" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Tył" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Widok z tyłu" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Ostatni&e projekty" @@ -9674,7 +9678,7 @@ msgid "Rectilinear grid" msgstr "Linie równoległe - kratka" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Powtórz" @@ -9707,7 +9711,7 @@ msgstr "Odśwież drukarki" msgid "Regular" msgstr "Zwykły" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Wyrażenie regularne" @@ -9757,9 +9761,9 @@ msgstr "Wczytaj z:" msgid "Reload plater from disk" msgstr "Przeładuj wirtualny stół z dysku" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Przeładuj wirtualny stół z dysku" @@ -9785,7 +9789,7 @@ msgid "Remember output directory" msgstr "Zapamiętaj katalog wyjściowy" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Usuń" @@ -9912,11 +9916,11 @@ msgstr "" msgid "Render" msgstr "Render" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Renderuj programowo" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -9924,7 +9928,7 @@ msgstr "" "Renderowanie software'owe. Dołączony silnik MESA zostanie użyty zamiast " "domyślnego OpenGL." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Naprawa" @@ -9956,11 +9960,11 @@ msgstr "Naprawianie modelu przez usługę Netfabb" msgid "Repairing was canceled" msgstr "Naprawianie zostało anulowane" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Powtórz Ostatnie Szybkie Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Powtórz ostatnie szybkie cięcie" @@ -9972,7 +9976,7 @@ msgstr "Zamiana z:" msgid "Replace the selected volume with new STL" msgstr "Zamień wybrany kształt na nowy STL" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Zamień na" @@ -10040,7 +10044,7 @@ msgstr "Resetuj skalę" msgid "Reset selection" msgstr "Reset zaznaczenia" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Zresetuj do koloru filamentu" @@ -10064,8 +10068,8 @@ msgstr "Długość retrakcji przed ruchem czyszczącym" msgid "Retract on layer change" msgstr "Retrakcja przy zmianie warstwy" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Retrakcja" @@ -10087,7 +10091,7 @@ msgid "" msgstr "" "Retrakcja nie zostanie wykonana przy ruchu jałowym krótszym niż ta wartość." -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -10119,15 +10123,15 @@ msgstr "Odwróć przeliczanie z metrów" msgid "Review the substitutions and adjust them if needed." msgstr "Przejrzyj zamienniki i dostosuj je w razie potrzeby." -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Prawo" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Wartość z zestawu ustawień po prawej" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Widok prawy" @@ -10164,15 +10168,15 @@ msgstr "Prawy przycisk myszy:" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Obróć" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Obróć wokół osi X" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Obróć wokół osi Y" @@ -10201,15 +10205,15 @@ msgstr "" msgid "Rotation" msgstr "Obrót" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Kąt obrotu w stopniach wokół osi X." -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Kąt obrotu w stopniach wokół osi Y." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Kąt obrotu w stopniach wokół osi Z." @@ -10227,11 +10231,11 @@ msgstr "Uruchom %s" msgid "Running post-processing scripts" msgstr "Wykonywanie skryptów przetwarzania końcowego (post-processing)" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "Wyślij G-cod&e" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "W&yślij do druku" @@ -10261,7 +10265,7 @@ msgstr "Skróty klawiszowe \"uchwytów\" SLA" msgid "SLA material" msgstr "Materiał SLA" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Rodzaj materiału SLA" @@ -10273,7 +10277,7 @@ msgstr "Materiały SLA" msgid "SLA print" msgstr "Druk SLA" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Notatki dla materiału SLA" @@ -10285,7 +10289,7 @@ msgstr "Ustawienia druku SLA" msgid "SLA supports outside the print area were detected." msgstr "Wykryto podpory SLA poza obszarem roboczym." -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" @@ -10304,7 +10308,7 @@ msgstr "Zapisz" msgid "Save %s as:" msgstr "Zapisz %s jako:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Zapisz plik %s jako:" @@ -10313,11 +10317,11 @@ msgstr "Zapisz plik %s jako:" msgid "Save G-code file as:" msgstr "Zapisz plik G-code jako:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 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/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Z&apisz projekt jako" @@ -10325,15 +10329,15 @@ msgstr "Z&apisz projekt jako" msgid "Save SL1 / SL1S file as:" msgstr "Zapisz plik SL1 / SL1S jako:" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Zapisz plik konfiguracyjny" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Zapisz konfigurację jako:" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Zapisz konfigurację jako wskazany plik." @@ -10343,11 +10347,11 @@ msgstr "Zapisz konfigurację jako wskazany plik." msgid "Save current %s" msgstr "Zapisz bieżące %s" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Zapisz obecny projekt" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Zapisz obecny projekt jako" @@ -10360,7 +10364,7 @@ msgstr "Zapisz plik jako:" msgid "Save preset" msgstr "Zapisz zestaw ustawień" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Zapisz paczkę ustawień jako:" @@ -10389,7 +10393,7 @@ msgstr "Zapisz wybrane opcje w zestawie ustawień \"%1%\"." msgid "Save the selected options." msgstr "Zapisz wybrane opcje." -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Zapisz plik .zip jako:" @@ -10403,7 +10407,7 @@ msgstr "Niepowodzenie zapisywania siatki jako 3MF." #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Skaluj" @@ -10419,11 +10423,11 @@ msgstr "Współczynnik skalowania" 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:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Skaluj, aby dopasować" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Skaluj, aby wypełnić zadaną objętość." @@ -10431,7 +10435,7 @@ msgstr "Skaluj, aby wypełnić zadaną objętość." msgid "Scale to print volume" msgstr "Skaluj do obszaru roboczego" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Współczynnik lub procent skalowania." @@ -10462,7 +10466,7 @@ msgstr "Kierunek jitter wyznaczany przez szew" msgid "Seams" msgstr "Szwy" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Szu&kaj" @@ -10485,7 +10489,7 @@ msgstr "" msgid "Search in English" msgstr "Szukaj po angielsku" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Szukaj w ustawieniach" @@ -10572,7 +10576,7 @@ msgstr "Wybierz akcję, która ma zostać zastosowana do pliku" msgid "Select by rectangle" msgstr "Zaznaczenie prostokątem" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Wybierz konfigurację do wczytania:" @@ -10580,7 +10584,7 @@ msgstr "Wybierz konfigurację do wczytania:" 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/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Wybierz zestawy ustawień do porównania" @@ -10592,7 +10596,7 @@ msgstr "Wybierz kształt z galerii" msgid "Select showing settings" msgstr "Wybierz widok ustawień" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Wybierz plik STL do naprawy:" @@ -10676,7 +10680,7 @@ msgstr "Zaznaczenie-Usunięcie z listy" msgid "Selection-Remove from rectangle" msgstr "Zaznaczenie-Usuń z prostokąta" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Zaznacza wszystkie modele" @@ -10693,7 +10697,7 @@ msgstr "Wyślij G-code" msgid "Send system info" msgstr "Wyślij informacje systemowe" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Wyślij zawartość stołu do druku jako G-code" @@ -10717,7 +10721,7 @@ msgstr "Wysyłanie informacji systemowych..." msgid "Seq." msgstr "Sekw." -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Drukowanie sekwencyjne (model po modelu)" @@ -10733,7 +10737,7 @@ msgstr "Port szeregowy:" msgid "Service name" msgstr "Nazwa usługi" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Ustaw" @@ -10860,7 +10864,7 @@ msgstr "Ustaw wybrane elementy jako do druku lub nie" msgid "Set settings tabs as menu items (experimental)" msgstr "Ustawianie zakładek ustawień jako elementów menu (eksperymentalne)" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -11021,7 +11025,7 @@ msgstr "" msgid "Set upper thumb as active" msgstr "Ustaw górny punkt jako aktywny" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -11032,7 +11036,7 @@ msgstr "" "Np: loglevel=2 loguje krytyczne, błędy i ostrzeżenia." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Ustawienia" @@ -11083,7 +11087,7 @@ msgstr "" msgid "Shape" msgstr "Kształt" -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Galeria kształtów" @@ -11134,7 +11138,7 @@ msgstr "Pokaż powiadomienie \"Porada dnia\" po uruchomieniu" msgid "Show &Configuration Folder" msgstr "Pokaż folder Konfigura&cyjny" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Pokaż &etykiety" @@ -11150,7 +11154,7 @@ msgstr "Pokaż okienko" msgid "Show advanced settings" msgstr "Pokaż ustawienia zaawansowane" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Pokaż wszystkie ustawienia (w tym niekompatybilne)" @@ -11190,7 +11194,7 @@ msgstr "Pokaż wysokość modelu" msgid "Show object height on the ruler" msgstr "Pokaż wysokość modelu na linijce" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Pokaż etykiety modelu/instancji w widoku edycji 3D" @@ -11218,43 +11222,43 @@ msgstr "Pokaż podpory" msgid "Show system information" msgstr "Pokaż informacje o systemie" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Pokaż widok edycji 3D" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Pokaż podgląd cięcia 3D" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Pokaż ustawienia filamentu" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "Pokaż pełną listę opcji konfiguracji druku SLA." -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "Pokaż pełną listę opcji konfiguracji druku/G-code." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Pokaż listę skrótów klawiszowych" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Pokaż zawartość stołu" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Pokaż ustawienia druku" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Pokaż ustawienia drukarki" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Pokaż tą wskazówkę pomocy." @@ -11338,7 +11342,7 @@ msgstr "Uprość model" msgid "Single Extruder Multi Material" msgstr "Multi Material z jednym ekstruderem" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -11350,15 +11354,15 @@ msgstr "" "Czy chcesz zmienić średnicę dyszy dla wszystkich ekstruderów na wartość z " "pierwszego?" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Ustawienia MM dla jednego ekstrudera" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Parametry multimaterial przy jednym ekstruderze" -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Tryb jednej instancji" @@ -11371,7 +11375,7 @@ msgctxt "OfFile" msgid "Size" msgstr "Rozmiar" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Rozmiar i koordynaty" @@ -11440,15 +11444,15 @@ msgstr "" msgid "Slic3r will not scale speed down below this speed." msgstr "PrusaSlicer nie będzie skalował prędkości poniżej tej wartości." -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Cięcie jako G-code" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Cięcie jako G-code, zapisz jako" @@ -11465,15 +11469,15 @@ msgstr "Cięcie" msgid "Slice resolution" msgstr "Rozdzielczość cięcia" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 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:4417 +#: src/libslic3r/PrintConfig.cpp:4392 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:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -11490,13 +11494,13 @@ msgstr "Informacje o cięciu" msgid "Sliced object \"%1%\" looks like a logo or a sign" msgstr "Pocięty model \"%1%\" wygląda jak logo lub znak" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Cięcie zakończone!" @@ -11532,7 +11536,7 @@ msgstr "Cięcie modelu" msgid "Slicing supports" msgstr "Cięcie podpór" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Wolne" @@ -11540,7 +11544,7 @@ msgstr "Wolne" msgid "Slow down if layer print time is below" msgstr "Zwolnij jeśli czas warstwy wynosi mniej niż" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Wolne przechylanie" @@ -11548,7 +11552,7 @@ msgstr "Wolne przechylanie" msgid "Small perimeters" msgstr "Małe obrysy" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Procent średnicy małego słupka" @@ -11646,7 +11650,7 @@ msgid "Some SLA materials were uninstalled." msgstr "Niektóre materiały SLA zostały odinstalowane." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -11671,7 +11675,7 @@ msgid "" msgstr "" "Niektóre modele są zbyt wysokie, aby można było wydrukować je bez kolizji." -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -11690,7 +11694,7 @@ msgstr "" "Niektóre zestawy ustawień są modyfikowane i niezapisane zmiany nie zostaną " "przechwycone przez zrzut konfiguracji." -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -11877,7 +11881,7 @@ msgid "Spiral vase" msgstr "Tryb wazy" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Podziel" @@ -11942,13 +11946,13 @@ msgstr "Standard" msgid "Stars" msgstr "Gwiazdki" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "G-code startowy" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Rozpocznij nowy projekt" @@ -11956,7 +11960,7 @@ msgstr "Rozpocznij nowy projekt" msgid "Start at height" msgstr "Zakres od" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Uruchom nowy proces cięcia" @@ -12008,7 +12012,7 @@ msgid "Status:" msgstr "Stan:" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Stealth" @@ -12067,19 +12071,19 @@ msgstr "Wymuszenie podpór" msgid "Support Generator" msgstr "Generator podpór" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Średnica stopy podpory" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Wysokość stopy podpory" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Bezpieczna odległość stopy podpory" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Łącznik podpory" @@ -12131,7 +12135,7 @@ msgid "Support material/raft/skirt extruder" msgstr "Ekstruder dla podpór/tratwy (raft)/skirtu" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Podpory tylko na stole" @@ -12139,12 +12143,12 @@ msgstr "Podpory tylko na stole" msgid "Support parameter change" msgstr "Zmiana parametrów podpór" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Słupek podpory" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Gęstość punktów podpór" @@ -12153,16 +12157,16 @@ msgid "Support points edit" msgstr "Edycja punktów podpór" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Podpory" @@ -12314,7 +12318,7 @@ msgstr "Wykonywanie zrzutu konfiguracji" msgid "Taking a configuration snapshot failed." msgstr "Niepowodzenie wykonywania zrzutu konfiguracji." -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Temperatura" @@ -12340,7 +12344,7 @@ msgstr "Zmiana temperatury" msgid "Temperatures" msgstr "Temperatury" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Szablon niestandardowego G-code" @@ -12497,7 +12501,7 @@ msgstr "" "Wieża czyszcząca jest dostępna dla wielu modeli pod warunkiem, że mają one " "równą wysokość warstwy" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -12556,7 +12560,7 @@ msgstr "" "globalnym systemie koordynat, po osadzeniu kątów obrotu w koordynatach " "modelu." -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "Domyślny kąt łączenia słupków i \"skrzyżowań\" podpór." @@ -12673,7 +12677,7 @@ msgstr "Rodzaj filamentu używanego przy własnym G-code." msgid "The file does not exist." msgstr "Plik nie istnieje" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -12706,7 +12710,7 @@ msgstr "Następujące modele drukarek SLA nie mają przypisanych materiałów:" msgid "The following characters are not allowed by a FAT file system:" msgstr "Następujące znaki są niedozwolone w systemie plików FAT:" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -12774,7 +12778,7 @@ msgstr "Następujące skróty mają zastosowanie, gdy aktywy jest określony uch msgid "The following values were substituted:" msgstr "Następujące wartości zostały zamienione:" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -12782,7 +12786,7 @@ msgstr "" "Odstęp między najniższą częścią modelu a wygenerowaną podkładką w trybie " "zerowego podniesienia." -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Wysokość stożka bazowego podpory" @@ -12822,7 +12826,7 @@ 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:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -12830,7 +12834,7 @@ 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:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "Maksymalna długość mostu" @@ -12855,7 +12859,7 @@ msgstr "" "Maksymalny dystans, na jaki może zostać odsunięty każdy punkt (w dwóch " "kierunkach), mierzony prostopadle do zewnętrznej ściany." -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -12889,7 +12893,7 @@ 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:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -12930,7 +12934,7 @@ msgid "" msgstr "" "Model zostanie podniesiony o zadaną ilość warstw i umieszczony na podporach." -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -12938,7 +12942,7 @@ msgstr "" "Udział procentowy mniejszych słupków w stosunku do normalnych w " "problematycznych obszarach, gdzie normalne słupki nie mieszczą się." -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -12948,7 +12952,7 @@ msgstr "" "Jeśli gabaryty wydruku przekraczają zadaną wartość,\n" "to zostanie użyte wolne przechylanie, w innym przypadku - szybkie" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -12966,7 +12970,7 @@ msgstr[3] "" "Poniższe drukarki fizyczne bazują na zestawie ustawień, który masz zamiar " "usunąć." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -13042,7 +13046,7 @@ msgstr "Wpisana nazwa pliku jest nieprawidłowa;" msgid "The provided name is not valid;" msgstr "Wpisana nazwa jest nieprawidłowa." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -13050,7 +13054,7 @@ msgstr "" "Wybrany plik 3MF zawiera podpory FDM namalowane przy pomocy nowszej wersji " "PrusaSlicer i nie jest kompatybilny." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -13058,7 +13062,7 @@ msgstr "" "Wybrany plik 3MF zawiera model pomalowany do Multi Material przy pomocy " "nowszej wersji PrusaSlicer i nie jest kompatybilny." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -13066,7 +13070,7 @@ msgstr "" "Wybrany plik 3MF zawiera szew namalowany przy pomocy nowszej wersji " "PrusaSlicer i nie jest kompatybilny." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -13113,7 +13117,7 @@ msgstr "" "Wybrany obiekt nie może zostać podzielony, ponieważ składa się z tylko " "jednej bryły." -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -13149,7 +13153,7 @@ msgstr "Rozmiar modelu może być wyrażony w calach" msgid "The size of the object is zero" msgstr "Rozmiar obiektu wynosi zero" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -13225,7 +13229,7 @@ msgstr "Podana nazwa nie jest prawidłowa;" msgid "The supplied settings will cause an empty print." msgstr "Wprowadzone ustawienia spowodują pusty wydruk." -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Grubość podkładki i opcjonalnie wydrążenie ścianek." @@ -13618,11 +13622,11 @@ msgstr "" msgid "This is a default preset." msgstr "To jest domyślny zestaw ustawień." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 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:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -13635,7 +13639,7 @@ msgid "This is a system preset." msgstr "To jest systemowy zestaw ustawień." #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Ta funkcja jest używana jedynie w interfejsie PrusaSlicer jako pomoc " @@ -13953,7 +13957,7 @@ msgstr "" "uruchomić ponownie konfigurację początkową. Spowoduje to stworzenie kopii " "istniejącej konfiguracji przed zainstalowaniem plików kompatybilnych z %s ." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -13966,7 +13970,7 @@ msgstr "" "rezygnację lub zastąpienie nieznanej wartości wartością domyślną po cichu " "lub z powiadomieniem." -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -13989,15 +13993,15 @@ msgstr "" "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:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Przechylanie" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Przechylanie dla żywicy o wysokiej lepkości" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Czas przechylania" @@ -14026,15 +14030,15 @@ msgstr "" "rozładowanie nowego filamentu podczas zmiany narzędzia (przy wykonywaniu " "kodu T). Ten czas jest dodawany do szacowanego czasu druku." -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Czas szybkiego przechylania" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Czas wolnego przechylania" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Czas super wolnego przechylania" @@ -14096,7 +14100,7 @@ msgstr "Narzędzie" msgid "Tool #" msgstr "Narzędzie #" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-code wykonywany przy zmianie narzędzia" @@ -14118,7 +14122,7 @@ msgstr "Pozycja narzędzia" msgid "Tool type" msgstr "Rodzaj narzędzia" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Parametry zmiany narzędzia dla drukarek MM z jednym ekstruderem" @@ -14141,7 +14145,7 @@ msgstr "" "Porada dot. grubości dolnej / górnej powłoki: niedostępne z powodu " "nieprawidłowej wysokości warstwy." -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Widok z góry" @@ -14234,7 +14238,7 @@ msgstr "Jałowy" msgid "Triangles" msgstr "Trójkąty" -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14256,11 +14260,11 @@ msgstr "Rodzaj drukarki." msgid "Type:" msgstr "Typ:" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "OTWARTA KŁÓDKA" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -14272,7 +14276,7 @@ msgstr "" "Kliknij, aby zresetować wszystkie ustawienia obecnej grupy ustawień do " "wartości systemowych (lub domyślnych)." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -14313,11 +14317,11 @@ msgstr "Nie można zamienić na więcej niż jeden kształt" msgid "Undef" msgstr "Undef" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Niezdefiniowana kategoria" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Niezdefiniowana grupa" @@ -14331,7 +14335,7 @@ msgstr "Niedomiar" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Cofnij" @@ -14531,7 +14535,7 @@ msgstr "Użyj wolnego widoku" msgid "Use inches" msgstr "Użyj cali" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Użyj podkładki" @@ -14622,11 +14626,11 @@ 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:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Wartości w tej kolumnie dotyczą trybu Normal" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Wartości w tej kolumnie dotyczą trybu Stealth" @@ -14671,7 +14675,7 @@ msgstr "Producent:" msgid "Verbose G-code" msgstr "G-code rozszerzony" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Wersja" @@ -14720,7 +14724,7 @@ msgstr "" "Wejdź w \"Preferencje\" i zaznacz \"%1%\",\n" "aby zmienić wybór." -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Wizualizacja pociętego i zapisanego G-code" @@ -14745,7 +14749,7 @@ msgstr "Części modelu przeorganizowane" msgid "Volumetric" msgstr "Objętościowy" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Podpowiedzi dot. objętości przepływu są niedostępne" @@ -14768,16 +14772,16 @@ msgstr "Natężenie przepływu" msgid "WARNING:" msgstr "OSTRZEŻENIE:" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "BIAŁA KROPKA" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 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:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -14785,7 +14789,7 @@ 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -14793,7 +14797,7 @@ msgstr "" "BIAŁA KROPKA oznacza, że wartość jest taka sama jak w ostatnio zapisanym " "zestawie ustawień." -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Grubość ścianki" @@ -14953,7 +14957,7 @@ msgstr "" "Jeśli retrakcja jest korygowana po ruchu jałowym, ekstruder przepchnie taką " "dodatkową ilość filamentu. Ta opcja jest rzadko potrzebna." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14968,17 +14972,19 @@ msgstr "" "centralnych, ale może powodować powstawanie szczelin lub nadmierne " "wytłaczanie." -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" "Podczas przechodzenia między różnymi liczbami obrysów, gdy część staje się " "cieńsza, przydzielana jest pewna ilość miejsca na rozdzielenie lub " -"połączenie segmentów obrysu." +"połączenie segmentów obrysu. Jeśli jest wyrażona w procentach (na przykład " +"100%), zostanie obliczona na podstawie średnicy dyszy." -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Całe słowo" @@ -14990,7 +14996,7 @@ msgstr "Szerokość" msgid "Width (mm)" msgstr "Szerokość (mm)" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 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" @@ -14998,16 +15004,16 @@ msgstr "Odstęp pomiędzy środkami przedniej i tylnej części łącznika podpo msgid "Width of a wipe tower" msgstr "Szerokość wieży czyszczącej" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 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:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Szerokość wyświetlacza" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -15021,7 +15027,7 @@ msgstr "" "jest wyrażona w procentach (na przykład 85%), zostanie obliczona na " "podstawie średnicy dyszy." -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -15064,7 +15070,7 @@ msgstr "Wieża czyszcząca - dostosowanie objętości czyszczenia" msgid "Wipe tower brim width" msgstr "Szerokość brimu wieży czyszczącej" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Parametry wieży czyszczącej" @@ -15130,7 +15136,7 @@ msgstr "" "\n" "Zaktualizowane paczki konfiguracyjne:" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Zapis informacji o modelu do konsoli." @@ -15220,7 +15226,7 @@ msgid "" msgstr "" "Tutaj możesz umieścić notatki, które zostaną dodane do nagłówka pliku G-code." -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 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." @@ -15380,7 +15386,7 @@ msgstr "" "Obecne zmiany spowodują usunięcie wszystkich zapisanych zmian ekstruderów " "(narzędzi)." -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Twój plik został naprawiony." @@ -15419,7 +15425,7 @@ msgstr "Z offset" msgid "Z travel" msgstr "Prędkość jałowa osi Z" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zig-Zag" @@ -15541,7 +15547,7 @@ msgstr "domyślny profil druku" msgid "default value" msgstr "wartość domyślna" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "usuń" @@ -15619,7 +15625,7 @@ msgid "flow rate is maximized" msgstr "przepływ osiąga wartości szczytowe" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -15644,7 +15650,7 @@ msgstr "g" msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" @@ -15661,7 +15667,7 @@ msgid "in" msgstr "cale" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -15674,7 +15680,7 @@ msgstr "" "grupy ustawień do wartości systemowych (lub domyślnych)." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -15683,7 +15689,7 @@ msgstr "" "wartości dla danej grupy opcji" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -15722,11 +15728,11 @@ msgstr "" "RepRap." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "ma licencję na warunkach" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" @@ -15750,7 +15756,7 @@ msgstr "max wersja PrusaSlicer" msgid "min PrusaSlicer version" msgstr "min wersja PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" @@ -15790,19 +15796,18 @@ msgstr "ml" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -15816,8 +15821,9 @@ msgstr "mm (zero, aby wyłączyć)" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm lub %" @@ -15879,7 +15885,7 @@ msgstr "model" msgid "modified" msgstr "zmodyfikowano" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "pieniędzy/butelkę" @@ -15939,7 +15945,7 @@ msgstr "drukarka" msgid "printer model" msgstr "model drukarki" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "usuń" @@ -15960,11 +15966,11 @@ msgstr "wymaga min. %s i max. %s" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -16087,8 +16093,8 @@ msgstr "błąd write calledback" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" diff --git a/resources/localization/pt_BR/PrusaSlicer.mo b/resources/localization/pt_BR/PrusaSlicer.mo index 8aead23b9f..5d518e1be3 100644 Binary files a/resources/localization/pt_BR/PrusaSlicer.mo and b/resources/localization/pt_BR/PrusaSlicer.mo differ diff --git a/resources/localization/pt_BR/PrusaSlicer_pt_BR.po b/resources/localization/pt_BR/PrusaSlicer_pt_BR.po index bd091d84c2..0fbc54f1ba 100644 --- a/resources/localization/pt_BR/PrusaSlicer_pt_BR.po +++ b/resources/localization/pt_BR/PrusaSlicer_pt_BR.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,16 +13,16 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Direitos autorais das partes" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Direitos autorais" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -30,26 +30,26 @@ msgstr "" "Os contratos de licença de todos os seguintes programas (bibliotecas) são " "parte do contrato de licença de aplicativo" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "Sobre %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Versão" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "está licenciado sobre o(a)" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "Licensa GNU Affero General Public, versão 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -57,7 +57,7 @@ msgstr "" "PrusaSlicer é baseado no Slic3r criado por Alessandro Ranellucci e a " "comunidade RepRap." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -67,7 +67,7 @@ msgstr "" "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik e " "outros." -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Copiar Informações da Versão" @@ -209,7 +209,7 @@ msgstr "Agendando upload para ` %1%` . Veja a aba -> Print Host Upload Queue" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "Tamanho" @@ -269,19 +269,18 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -316,7 +315,7 @@ msgid "Load shape from STL..." msgstr "Carregar forma do STL..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Config" @@ -329,7 +328,7 @@ msgid "Load..." msgstr "Carregar..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Remover" @@ -553,20 +552,20 @@ msgstr "Devo mudar para padrão de preenchimento retilíneo?" msgid "Infill" msgstr "Preenchimento" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "A penetração da cabeça não deve ser maior do que a largura da cabeça." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Penetração inválida da cabeça" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "" "O diâmetro da cabeça de pino deve ser menor do que o diâmetro do pilar." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Diâmetro inválido da cabeça de pino" @@ -675,7 +674,7 @@ msgid "Standard" msgstr "Todos padrão" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Todos" @@ -949,7 +948,7 @@ msgstr "Escolha outro fornecedor suportado por %s" msgid "Firmware Type" msgstr "Tipo de Firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Firmware" @@ -1266,7 +1265,7 @@ msgstr "Executar" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Desfazer" @@ -1932,7 +1931,7 @@ msgstr "Confirmação" msgid "Cancelling..." msgstr "Cancelando..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Galeria de Formas" @@ -1948,7 +1947,7 @@ msgstr "Adicionar a mesa" msgid "Add selected shape(s) to the bed" msgstr "Adicione a(s) forma(s) selecionada(s) à mesa" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Adicionar" @@ -1958,7 +1957,7 @@ msgstr "Adicionar uma ou mais formas personalizadas" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Deletar" @@ -2143,8 +2142,8 @@ msgstr "Movimento" msgid "Extrusion" msgstr "Extrusão" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Retração" @@ -2199,7 +2198,7 @@ msgstr "Config. de impressão" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filamento" @@ -2423,7 +2422,7 @@ msgid "Add..." msgstr "Adicionar..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Deletar todos" @@ -2470,7 +2469,7 @@ msgid "Next Undo action: %1%" msgstr "Próxima ação de desfazer: %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Refazer" @@ -2512,7 +2511,7 @@ msgid "Selection-Remove from rectangle" msgstr "Seleção-remover do retângulo" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Cortar" @@ -2772,7 +2771,7 @@ msgid "Quality" msgstr "Qualidade" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Distância de fechamento" @@ -2878,7 +2877,7 @@ msgstr "Mover" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Rotacionar" @@ -2895,7 +2894,7 @@ msgstr "Aplicar" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Escala" @@ -2950,7 +2949,7 @@ msgstr "" "selecionada" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Erro" @@ -3034,7 +3033,7 @@ msgid "Minimal points distance" msgstr "Distância mínima entre pontos" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Densidade dos pontos de suporte" @@ -3888,7 +3887,7 @@ msgid "Speed" msgstr "Velocidade" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3911,52 +3910,51 @@ msgstr "Saia e aba" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Avançado" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Suportes" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Bloco" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Deixar oco" @@ -4098,7 +4096,7 @@ msgid "Revert conversion from meters" msgstr "Reverter conversão de metros" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Mesclar" @@ -4159,7 +4157,7 @@ msgid "Split the selected object into individual parts" msgstr "Dividir o objeto selecionado em partes individuais" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Dividir" @@ -4816,11 +4814,11 @@ msgstr "Altura" msgid "Width" msgstr "Espessura" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Velocidade do ventoinha" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Temperatura" @@ -5117,7 +5115,7 @@ msgstr "" msgid "Attention!" msgstr "Atenção!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Atalhos do teclado" @@ -5151,10 +5149,10 @@ msgstr "Config importação de ini/amf/3mf/gcode" #: src/slic3r/GUI/KBShortcutsDialog.cpp:85 msgid "Load Config from ini/amf/3mf/gcode and merge" -msgstr "Carregar config. de um. ini/AMF/3mf/Gcode e mesclar" +msgstr "Carregar config. de um. ini/AMF/3mf/gcode e mesclar" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Exportar G-code" @@ -5511,13 +5509,13 @@ msgstr "Definir o número da extrusora para os itens selecionados" msgid "Objects List" msgstr "Lista de objetos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Abrir um arquivo G-code" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Recarregar a bandeja do disco" @@ -5554,7 +5552,7 @@ msgid "Show/Hide G-code window" msgstr "Mostrar/ocultar janela de G-code" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Visualização" @@ -5638,7 +5636,7 @@ msgid "Keyboard shortcuts" msgstr "Atalhos do teclado" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Abrir uma nova instância do PrusaSlicer" @@ -5646,11 +5644,11 @@ msgstr "Abrir uma nova instância do PrusaSlicer" msgid "G-code preview" msgstr "Previsualização do G-code" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Abrir visualizador G-code" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Versão mínima do PrusaSlicer" @@ -5677,13 +5675,13 @@ msgid "Print Settings" msgstr "Config. de impressão" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Config. de material" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Config. de filamento" @@ -5766,7 +5764,7 @@ msgstr "Mostrar diálogo sobre" msgid "Show Tip of the Day" msgstr "Mostrar dica do dia" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5774,94 +5772,94 @@ msgstr "" "Abre a notificação da Dica do dia no canto inferior direito ou mostra outra " "dica se já estiver aberta." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Mostrar lista dos atalhos no teclado" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Isométrico" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Vista isométrica" #. TRN To be shown in the main menu View->Top #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "Topo" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Vista do topo" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "Base" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Vista da base" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Frente" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Vista da frente" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Traseira" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Vista traseira" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Esquerda" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Vista esquerda" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Direita" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Vista direita" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Novo projeto" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Começar um novo projeto" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&Abrir projeto" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Abrir novo projeto" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Projetos recentes" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5869,510 +5867,510 @@ msgstr "" "O projeto selecionado não está mais disponível.\n" "Você quer removê-lo da lista de projetos recentes?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "&Salvar projeto" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Salvar arquivo do projeto atual" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Salvar projeto &como" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Salvar arquivo atual como" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importar STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Carregar um modelo" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Importar STL (Unidades Imperiais)" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Carregar um modelo salvo com unidades imperiais" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Importar Arquivo SL1 / SL1S" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Carregar um arquivo SL1 / Sl1S" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Importar &configuração" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Carregar config. de arquivo exportado" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Importar Configuração de &Projeto" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Carregar config. de arquivo de projeto" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Importar coleção &de config" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Carregar predefinições de um pacote" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Importar" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Exportar &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Exporte a bandeja atual como o G-code" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "E&nviar G-code" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Enviar para imprimir a bandeja atual como G-code" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Exporte o G-code para o cartão SD / Flash Drive" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Exportar bandeja atual como G-code para cartão SD / unidade Flash" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Exportar bandeja como &STL" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Exporte a bandeja atual como STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Exportar Bandeja como STL & Incluindo Suportes" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Exporte a bandeja atual como o STL que inclui suportes" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Exportar &Percursos como OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Exportar percursos como OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Exportar &config" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Exporte a config. atual para o arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Exportar coleção &de config" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Exporte todas as predefinições para o arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Exportar coleção &de config com Impressoras Físicas" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" "Exporte todas as predefinições, incluindo impressoras físicas, para o arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Ejetar cartão SD / Flash Drive" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "Ejetar cartão SD / unidade Flash após G-code for exportado para ele." -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Fatiamento rápido" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Fatiar um arquivo em um G-code" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Salvamento rápido e salvar como" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Fatiar um arquivo em um G-code, salvar como" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Repetir Último Fatiamento Rápido" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Repetir último fatiamento rápido" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Re)Fatiar ago&ra" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Começar novo processo de fatiamento" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "&Reparar arquivo STL" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Reparar automaticamente um arquivo STL" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Visualizar &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "&Sair" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Sair %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "&Selecionar tudo" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Selecionar todos os objetos" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "D&esmarcar todos" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Deselecionar todos os objetos" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "&Excluir selecionados" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Excluir a seleção atual" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Deletar &Tudo" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Excluir todos os objetos" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "&Desfazer" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Refazer" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Copiar" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Copiar seleção para a área de transferência" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&Colar" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Colar área de transferência" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Re&carregar do disco" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Pesquisa&r" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Procurar em configurações" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&Bandeja" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Mostrar a bandeja" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "C&onfig. de impressão" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Mostrar as config. de impressão" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "&Config. de filamentos" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Mostrar as config. de filamento" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "A&ba de config. da impressora" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Mostrar as config. da impressora" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Mostrar a vista de edição 3D" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Pre&visualização" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Mostrar a pré-visualização do fatiamento 3D" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Abra a caixa de diálogo para modificar a galeria de formas" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Imprimir &Fila de upload do Host" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Exibir a janela fila de upload do host de impressão" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Abrir Nova Instância" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Comparar predefinições" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Comparar predefinições" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Mostrar &rótulos" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Mostrar rótulos de objeto/instância em cena 3D" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "&Recolher barra lateral" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Recolher barra lateral" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "&Tela cheia" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Tela cheia" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Arquivo" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Editar" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Janela" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Vista" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Ajuda" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&Abrir G-code" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Abrir &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "E&xportar" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "E&nviar para impressora" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "A&ba de config. de material" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Escolha um arquivo para fatiar (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Sem arquivo fatiado anteriormente." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Arquivo fatiado anteriormente (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") não encontrado." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Arquivo não encontrado" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Salve o arquivo %s como:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Salvar arquivo compactado(zip) como:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Fatiamento" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Processando %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% foi fatiado com sucesso." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Fatiamento completo!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Selecione o arquivo STL para corrigir:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" "Salvar arquivo OBJ (menos propenso a erros de coordenada que STL) como:" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Seu arquivo foi corrigido." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Corrigir" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Salvar config. como:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Carregando um arquivo de configuração" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Selecionar config. para carregar:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Exportando pacote de configuração" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6380,15 +6378,15 @@ msgstr "" "Algumas predefinições forma modificadas e as alterações não salvas não serão " "exportadas para pacote de configuração." -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Salvar pacote de predefinições como:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Carregando um pacote de configuração" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d predefinições importadas com êxito." @@ -6616,8 +6614,8 @@ msgstr "Instâncias" msgid "Instance %d" msgstr "Instância %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Camadas" @@ -6694,7 +6692,7 @@ msgstr "Nome descritivo para a impressora" msgid "Add preset for this printer device" msgstr "Adicionar predefinição para esta impressora" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Upload do host de impressão" @@ -6853,7 +6851,7 @@ msgid "Select what kind of support do you need" msgstr "Selecione o tipo de suporte que você precisa" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Suportes somente na mesa de impressão" @@ -6953,7 +6951,7 @@ msgid "(including spool)" msgstr "(incluindo carretel)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Custo" @@ -7462,10 +7460,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "Colar da área de transferência" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Geral" @@ -7978,7 +7976,7 @@ msgid "Add/Remove presets" msgstr "Adicionar/Remover predefinições" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Adicionar impressora física" @@ -7990,7 +7988,7 @@ msgstr "Editar a predefinição" msgid "Change extruder color" msgstr "Alterar a cor da extrusora" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Editar impressora física" @@ -8306,11 +8304,11 @@ msgstr "NÃO USAR RAMMING" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -8425,12 +8423,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "Basta mudar para a predefinição \"%1%\"" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Silencioso" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normal" @@ -8703,7 +8701,7 @@ msgstr "nome customizado da config" msgid "symbolic profile name" msgstr "nome customizado da config" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Camadas e perímetros" @@ -8791,7 +8789,7 @@ msgstr "Cobrir" msgid "Flow" msgstr "Fluxo" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Outro" @@ -8799,53 +8797,53 @@ msgstr "Outro" msgid "Arachne perimeter generator" msgstr "Gerador de perímetro Arachne" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Opções de saída" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Impressão sequencial" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Folga da extrusora" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Arquivo de saída" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Scripts de pós-processamento" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Notas" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Dependências" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Dependências de perfil" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" "Os scripts de pós-processamento devem modificar o arquivo de G-code no local." -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8858,84 +8856,84 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Palavras-chave reservadas encontradas em" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Sobrescrever config. de filamento" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Bico de impressão" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Mesa" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Resfriamento" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Habilitar" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Config. da ventoinha" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Limiares de resfriamento" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Propriedades de filamento" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Substituição da velocidade de impressão" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Parâmetros da torre de limpeza" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Parâmetros de mudança de ferramenta com impressoras de multi material com " "apenas uma extrusora" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Config. de Ramming" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "G-code customizado" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "G-code de início" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "G-code de finalização" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Dicas de fluxo volumétrico não disponíveis" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8957,20 +8955,20 @@ msgstr "" "\"engrenagem\" na guia Configurações da impressora. Os perfis de impressora " "física estão sendo armazenados no diretório PrusaSlicer /physical_printer." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Tamanho e coordenadas" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Capacidades" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Número de extrusoras da impressora." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8982,64 +8980,64 @@ msgstr "" "Você quer mudar o diâmetro para todas as extrusoras ao primeiro valor do " "diâmetro da ponteira da extrusora?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Diâmetro do bico" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "Antes da mudança de camada G-code" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "Após a mudança da camada do G-code" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-code de troca de ferramenta" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-code entre objetos (para impressão sequencial)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-code de troca de cor" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "Pausa impressão ou G-code personalizado" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Modelo de G-code customizado" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Exibição" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Inclinar" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Tempo de inclinação" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Correções" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Exposição" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -9048,39 +9046,39 @@ msgstr "Exposição" msgid "Machine limits" msgstr "Limites da máquina" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Valores nesta coluna são para o modo normal" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Valores nesta coluna são para o modo furtivo" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Velocidade máxima de alimentação" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Acelerações máximas" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Limites de empurrão" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Velocidades alimentação mínimos" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Config. de extrusora multi material" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Parâmetros para extrusora única multimaterial" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9088,19 +9086,19 @@ msgstr "" "Esta é uma única impressora multimaterial extrusora, diâmetros de todas as " "extrusoras será definido para o novo valor. Você quer prosseguir?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Limites de altura da camada" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Posição (para impressoras multiextrusoras)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Apenas elevar Z" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9108,11 +9106,11 @@ msgstr "" "Retração quando a ferramenta está desativada (config. avançadas para " "instalações multiextrusoras)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Restabelecer cor do filamento" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9122,31 +9120,31 @@ msgstr "" "\n" "Devo desativá-lo, a fim de permitir a retração de firmware?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Retração do firmware" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Nova predefinição de impressora selecionada" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Separado" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "remover" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "excluir" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "É uma última predefinição para esta impressora física." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9155,7 +9153,7 @@ msgstr "" "Tem certeza de que deseja excluir predefinição \"%1%\" da impressora física " "\"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9163,14 +9161,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9180,7 +9178,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9188,57 +9186,57 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Tem certeza de que deseja %1% da predefinição selecionada?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Predefinição" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Definir" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Achar" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Substituir por" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Expressão regular" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Não diferencia maiúsculas de minúsculas" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Palavra inteira" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Corresponder a uma única linha" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Tem certeza de que deseja excluir todas as substituições?" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Os limites da máquina serão emitidos para o G-code e usados ​​o para estimar o " "tempo de impressão." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -9249,7 +9247,7 @@ msgstr "" "preciso, pois a impressora pode aplicar um conjunto diferente de limites da " "máquina." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9257,12 +9255,12 @@ msgstr "" "Os limites da máquina não são definidos, portanto, a estimativa do tempo de " "impressão pode não ser precisa." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "CADEADO FECHADO" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9270,12 +9268,12 @@ msgstr "" "indica que as config. são as mesmas que os valores do sistema (ou padrão) " "para o grupo de opções atual" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "CADEADO ABERTO" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9287,12 +9285,12 @@ msgstr "" "Clique no ícone DESBLOQUEAR para redefinir todas as config. do grupo de " "opções atual para os valores do sistema (ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "PONTO BRANCO" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -9301,12 +9299,12 @@ msgstr "" "padrão),\n" "para o botão direito: indica que as config. não foram modificadas." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "REDEFINIR" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9318,7 +9316,7 @@ msgstr "" "Clique no ícone REDEFINIR para redefinir todas as config. do grupo de opções " "atual para a última predefinição salva." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9326,7 +9324,7 @@ msgstr "" "O ícone CADEADO FECHADO indica que as config. são as mesmas que os valores " "do sistema (ou padrão) para o grupo de opções atual" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9338,13 +9336,13 @@ msgstr "" "Clique para redefinir todas as config. para o grupo de opções atual para os " "valores do sistema (ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "O ícone PONTO BRANCO indica uma predefinição que não é do sistema (ou não " "predefinida)." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9352,7 +9350,7 @@ msgstr "" "O ícone PONTO BRANCO indica que as config. são as mesmas da última " "predefinição salva para o grupo de opções atual." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9364,7 +9362,7 @@ msgstr "" "Clique para redefinir todas as config. do grupo de opções atual para a " "última predefinição salva." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9372,7 +9370,7 @@ msgstr "" "O ícone CADEADO FECHADO indica que o valor é o mesmo que o valor do sistema " "(ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9382,7 +9380,7 @@ msgstr "" "valor do sistema (ou padrão).\n" "Clique para redefinir o valor atual para o valor do sistema (ou padrão)." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9390,7 +9388,7 @@ msgstr "" "O ícone PONTO BRANCO indica que o valor é o mesmo da última predefinição " "guardada." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9400,31 +9398,31 @@ msgstr "" "predefinição salva.\n" "Clique para redefinir o valor atual para a última predefinição salva." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Material" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Perfil de impressão de materiais" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Cabeça de suporte" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Pilar de suporte" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Conexão das varas de suporte e junções" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Geração Automática" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9433,11 +9431,11 @@ msgstr "" "\"%1%\" está desabilitado porque \"%2%\" está ativado na categoria \"%3%\".\n" "Para habilitar \"%1%\", desligue \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Elevação do objeto" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Pad em torno do objeto" @@ -9530,7 +9528,7 @@ msgstr "" "para ser questionado sobre alterações não salvas novamente." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9600,39 +9598,39 @@ msgstr "" "possui as seguintes alterações não salvas:" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Contagem de extrusoras" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Selecione predefinições para comparar" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Mostrar todas as predefinições (incluindo incompatíveis)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Valor predefinido esquerdo" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Valor predefinido direito" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Uma das predefinições não foi encontrada" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "As predefinições comparadas têm tecnologia de impressora diferente" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "As predefinições são as mesmas" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9641,11 +9639,11 @@ msgstr "" "Clique neste botão para selecionar a mesma predefinição para a predefinição " "direita e esquerda." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Categoria indefinida" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Grupo indefinido" @@ -10325,7 +10323,7 @@ msgstr "" "Não é possível calcular a largura de extrusão para %1%: Variável \"%2%\" não " "acessível." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10334,7 +10332,7 @@ msgstr "" "O arquivo 3mf selecionado foi salvo com uma versão mais recente de %1% e não " "é compatível." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10342,7 +10340,7 @@ msgstr "" "O 3MF selecionado contém FDM objetos pintados de suporte usando uma versão " "mais recente do PrusaSlicer e não é compatível." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10350,7 +10348,7 @@ msgstr "" "O 3MF selecionado contém um objeto pintado com costura usando uma versão " "mais recente do PrusaSlicer e não é compatível." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -11160,8 +11158,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -11177,9 +11175,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -11400,8 +11397,8 @@ msgstr "" msgid "Default print profile" msgstr "Perfil de impressão padrão" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11459,11 +11456,11 @@ msgid "" "PrusaSlicer settings. If you have multiple extruders, the gcode is processed " "in extruder order." msgstr "" -"Este procedimento final é inserido no final do arquivo de saída, antes da " -"extremidade da impressora Gcode (e antes de qualquer troca de ferramenta " -"deste filamento em caso de impressoras multimaterial). Observe que você pode " -"usar variáveis de espaço reservado para todas as config. de PrusaSlicer. Se " -"você tiver várias extrusoras, o Gcode é processado em ordem de extrusora." +"Este procedimento final é inserido no final do arquivo de saída, antes do " +"G-code final da impressora (e antes de qualquer troca de ferramenta deste filamento em caso de " +"impressoras multimateriais). Observe que você pode usar variáveis de espaço reservado para todas as " +"Configurações do PrusaSlicer. Se você tiver várias extrusoras, o G-code será processado " +"em ordem de extrusão." #: src/libslic3r/PrintConfig.cpp:706 msgid "Ensure vertical shell thickness" @@ -11553,8 +11550,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm ou %" @@ -11639,7 +11637,7 @@ msgid "Extruder Color" msgstr "Cor da extrusora" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Isso é usado apenas na interface PrusaSlicer como uma ajuda visual." @@ -11738,7 +11736,7 @@ msgstr "" msgid "approximate seconds" msgstr "segundos aproximados" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Cor" @@ -11925,8 +11923,8 @@ msgstr "" "paquímetro e fazer várias medições ao longo do filamento, em seguida, " "calcular a média." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Densidade" @@ -11994,7 +11992,7 @@ msgstr "" msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Desconhecido)" @@ -12252,7 +12250,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1330 msgid "Verbose G-code" -msgstr "Gcode detalhado" +msgstr "G-code detalhado" #: src/libslic3r/PrintConfig.cpp:1331 msgid "" @@ -13665,7 +13663,7 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" "Este procedimento de início é inserido no começo, depois de qualquer " -"impressora iniciar Gcode (e depois de qualquer troca de ferramenta para este " +"G-code de início da impressora (e depois de qualquer troca de ferramenta para este " "filamento em caso de impressoras de vários materiais). Isso é usado para " "substituir as config. de um filamento específico. Se PrusaSlicer detecta " "M104, M109, M140 ou M190 em seus códigos personalizados, esses comandos não " @@ -13673,8 +13671,8 @@ msgstr "" "personalizar a ordem dos comandos de aquecimento e outras ações " "personalizadas. Observe que você pode usar variáveis de espaço reservado " "para todas as config. de PrusaSlicer, para que você possa colocar um comando " -"\"M109 S [temperatura_primeira_camada]\" onde quiser. Se você tiver várias " -"extrusoras, o Gcode é processado em ordem de extrusora." +"\"M109 S[first_layer_temperature]\" onde quiser. Se você tiver várias " +"extrusoras, o G-code é processado em ordem de extrusora." #: src/libslic3r/PrintConfig.cpp:2450 msgid "Color change G-code" @@ -13814,7 +13812,7 @@ msgstr "" "Use essa config. para girar o padrão de material de suporte no plano " "horizontal." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -14465,39 +14463,35 @@ msgstr "Gerador de perímetro" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" -"Gerador de perímetro clássico produz perímetros com largura de extrusão " -"constante e para áreas muito finas é usado preenchimento de lacunas. O motor " -"Arachne produz perímetros com largura de extrusão variável." - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Comprimento de transição do perímetro" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" -"Ao fazer a transição entre diferentes números de perímetros à medida que a " -"peça se torna mais fina, uma certa quantidade de espaço é alocado para " -"dividir ou unir os segmentos do perímetro." -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Margem do filtro de transição de perímetro" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14517,11 +14511,11 @@ msgstr "" "superextrusão. Se expresso em porcentagem (por exemplo 25%), será calculado " "com base no diâmetro do bocal." -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Ângulo limite de transição de perímetro" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14535,11 +14529,11 @@ msgstr "" "Reduzir essa configuração reduz o número e o comprimento desses perímetros " "centrais, mas pode deixar lacunas ou overextrude." -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Contagem de distribuição de perímetro" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -14549,69 +14543,24 @@ msgstr "" "variação precisa ser espalhada. Valores mais baixos significa que os " "perímetros externos não mudam de largura." -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "Limite de perímetro intermediário dividido" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" -"A menor largura de extrusão, como fator da largura normal de extrusão, acima " -"da qual o perímetro médio (se há um) será dividido em dois. Reduza esta " -"configuração para usar perímetros mais finos. Aumente para usar menos " -"perímetros mais amplos. Observe que isso se aplica -como se- a forma inteira " -"devesse ser preenchida com perímetro, então o meio aqui se refere ao meio do " -"objeto entre duas bordas externas da forma, mesmo que hajana verdade é " -"preenchimento ou outros tipos de extrusão na impressão em vez do perímetro." - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "Adicionar limite de perímetro médio" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" -"A menor largura de extrusão, como fator da largura normal de extrusão, acima " -"da qual um perímetro médio (se não havia um já) será adicionado. Reduza esta " -"configuração para usar perímetros mais finos. Aumente para usar menos " -"perímetros mais amplos. Observe que isso se aplica -como se- a forma inteira " -"devesse ser preenchida com perímetro, então o meio aqui se refere ao meio do " -"objeto entre duas bordas externas da forma, mesmo que hajana verdade é " -"preenchimento ou outros tipos de extrusão na impressão em vez do perímetro." - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "Tamanho mínimo do recurso" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -"Espessura mínima de recursos finos. Recursos de modelo mais finos que esse " -"valor não serão impressos, enquanto os recursos mais espessos que o tamanho " -"mínimo do recurso serão ampliados para a largura mínima do perímetro." -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Largura mínima do perímetro" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14625,63 +14574,63 @@ msgstr "" "próprio recurso. Se expresso em porcentagem (por exemplo, 85%), será " "calculado com base no diâmetro do bocal." -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Largura do display" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Largura do display" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Altura do display" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Altura do display" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Número de pixels em" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Número de pixels em X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Número de pixels em Y" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Exibir espelhamento horizontal" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Espelhar horizontalmente" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Habilitar espelhamento horizontal de imagens de saída" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Exibir espelhamento vertical" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Espelharvertical" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Habilitar espelhamento vertical de imagens de saída" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Orientação do display" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -14691,55 +14640,55 @@ msgstr "" "retrato inverterá o significado dos parâmetros de largura e altura da tela e " "as imagens de saída serão giradas por 90 graus." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Paisagem" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Retrato" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Rápido" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Inclinação rápida" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Tempo da inclinação rápida" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Lento" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Inclinação lenta" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Tempo da inclinação lenta" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Alta viscosidade" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Inclinação para resina de alta viscosidade" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Tempo da inclinação super lenta" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Preenchimento de área" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14750,40 +14699,40 @@ msgstr "" "em seguida, uma inclinação lenta será usada, caso contrário-uma inclinação " "rápida" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Correção de dimensionamento da impressora" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Correção de dimensionamento da impressora no eixo X" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Correção do eixo X da escala da impressora" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Correção de dimensionamento da impressora no eixo Y" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Correção do eixo Y da escala da impressora" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Correção de dimensionamento da impressora no eixo Z" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Correção do eixo Z de dimensionamento da impressora" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Correção absoluta da impressora" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14791,22 +14740,22 @@ msgstr "" "Irá inflar ou esvaziar os polígonos 2D cortados de acordo com o sinal da " "correção." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Largura mínima do pé de elefante" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Largura mínima de características para manter ao fazer compensação do pé de " "elefante." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Correção de gama de impressora" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14816,43 +14765,43 @@ msgstr "" "valor gama de zero significa limiarização com o limiar no meio. Este " "comportamento elimina suavização sem perder buracos em polígonos." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Tipo de Material de SLA" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Altura da camada inicial" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Volume do pote" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "ml" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Peso do pote" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "kg" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "g/ml" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "dinheiro/pote" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Camadas desbotadas" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14860,104 +14809,104 @@ msgstr "" "Número de camadas necessárias para o tempo de exposição desvanecer-se do " "tempo de exposição inicial ao tempo de exposição" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Tempo mínimo de exposição" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Tempo máximo de exposição" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Tempo de exposição" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Tempo inicial mínimo de exposição" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Tempo inicial máximo de exposição" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Tempo inicial mínimo de exposição" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Correção para expansão" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Correção para expansão no eixo X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Correção para expansão no eixo Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Correção para expansão no eixo Z" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Notas de material de impressão de SLA" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "" "Você pode colocar suas anotações sobre o material de impressão de SLA aqui." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Perfil de material de SLA padrão" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Gerar suportes" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Gere suportes para os modelos" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Diâmetro dianteiro principal da sustentação" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Diâmetro do lado apontando da cabeça" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Penetração inválida da cabeça" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "Quanto a cabeça de alfinete tem de penetrar na superfície do modelo" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Largura da cabeça de suporte" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "Largura do centro da esfera traseira ao centro da esfera dianteira" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Diâmetro do pilar do suporte" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Diâmetro em mm dos pilares de suporte" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Diâmetro do pilar do suporte" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -14966,11 +14915,11 @@ msgstr "" "normal que são usados ​​em áreas problemáticas onde um pilar normal não pode " "caber." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Distância máxima de conexão entre pilares" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -14978,11 +14927,11 @@ msgstr "" "Número máximo de pontes que podem ser colocadas em um pilar. As pontes " "seguram pinças de ponto de apoio e se conectam a pilares como pequenos ramos." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Modalidade da conexão da coluna da sustentação" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14992,23 +14941,23 @@ msgstr "" "(zig-zag dobro) ou dinâmico que comutará automaticamente entre os primeiros " "dois dependendo da distância dos dois pilares." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zig-Zag" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Cruz" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dinâmico" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Fator de alargamento da coluna" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -15016,27 +14965,27 @@ msgstr "" "Mesclar pontes ou pilares em outros pilares pode aumentar o raio. Zero " "significa que não há aumento, um significa aumento total." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Diâmetro base do suporte" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Diâmetro em mm da base do pilar" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Altura base do suporte" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "A altura do cone da base da coluna" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Distância da segurança da base da sustentação" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -15046,27 +14995,27 @@ msgstr "" "elevação zero, onde uma lacuna de acordo com este parâmetro é inserida entre " "o modelo e o pad." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Ângulo crítico" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "O ângulo padrão para conectar suportes e junções." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Comprimento máximo da ponte" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "O comprimento máximo de uma ponte" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Distância máxima de conexão entre pilares" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -15074,7 +15023,7 @@ msgstr "" "A distância máxima de dois pilares para ficar ligado uns com os outros. Um " "valor zero irá proibir o pilar em cascata." -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -15082,39 +15031,39 @@ msgstr "" "Quanto os suportes devem levantar o objecto suportado. Se \"pad em torno do " "objeto\" estiver habilitado, esse valor será ignorado." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Esta é uma medida relativa de densidade de pontos de suporte." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Distância mínima dos pontos de suporte" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "Nenhum ponto de apoio será colocado mais perto do que este limiar." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Use pad" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Adicionar um pad por baixo do modelo suportado" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Espessura da parede do pad" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "A espessura da pad e suas paredes de cavidade opcionais." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Altura da parede do pad" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -15126,19 +15075,19 @@ msgstr "" "produzir um efeito de sucção extrema dentro da cavidade, o que torna a " "descascar a impressão fora da folha de IVA difícil." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Tamanho da borda do bloco" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "Até onde o bloco deve se estender em torno da geometria contida" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Distância máxima da fusão" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -15148,11 +15097,11 @@ msgstr "" "grande. Este parâmetro define até que ponto o centro de duas pads menores " "deve ser. Se eles estão mais perto, eles vão se fundir em uma pad." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Inclinação da parede da pad" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15160,23 +15109,23 @@ msgstr "" "A inclinação da parede da pad em relação ao plano da mesa. 90 graus " "significa paredes retas." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Criar pad ao redor do objeto e ignorar a elevação de suporte" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Pad em torno do objeto em todo lugar" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Forçar Pad em torno do objeto em todo lugar" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Vão entre o pad e o objeto" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15184,55 +15133,55 @@ msgstr "" "A lacuna entre a parte inferior do objeto e o pad gerado no modo de elevação " "zero." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Inserir pad entre o objeto" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" "Distância entre duas varas do conector que conectam o objeto e a pad gerada." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Largura do conector do objeto pad" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "Largura das varas do conector que conectam o objeto e a pad gerada." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Pad objeto conector de penetração" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "Quanto deve os conectores minúsculos penetrar no corpo do modelo." -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Ativar o modo oco" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Deixar o modelo oco para ter um interior vazio" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Espessura da parede" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Espessura mínima da parede de um modelo oco." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Precisão" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15240,7 +15189,7 @@ msgstr "" "Desempenho versus precisão do cálculo. Valores mais baixos podem produzir " "artefatos indesejados." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -15254,11 +15203,11 @@ msgstr "" "distância de fechamento torna o interior mais arredondado. Ao zero, o " "interior será o mais parecido com o exterior." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Velocidade de impressão" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15268,63 +15217,63 @@ msgstr "" "maior viscosidade ou com algumas peças ocas. Ele diminui o movimento de " "inclinação e adiciona um atraso antes da exposição." -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Exportar OBJ" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Exportar modelo(s) como OBJ." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Exportar SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Fatiar o modelo e exportar as camadas de impressão SLA como PNG." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Exportar 3MF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Exportar modelo(s) como 3MF." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Exportar AMF" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Exportar modelo(s) como AMF." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Exportar STL" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Exportar modelo(s) como STL." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Fatiar o modelo e exportar o percurso da ferramenta como G-code." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Tipo de G-code" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Visualize um G-code já fatiado e salvo" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Fatiar" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15332,71 +15281,71 @@ msgstr "" "Divida o modelo como FFF ou SLA com base no valor de config. " "printer_technology." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Ajuda" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Mostrar esta ajuda." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Ajuda (opções FDM)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "Mostre a lista completa de opções de config. do Print/G-code." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Ajuda (opções SLA)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "Mostrar a lista completa de opções de config. de impressão de SLA." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Informações do modelo de saída" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Escreva informações sobre o modelo para o console." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Salvar arquivo de config" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Salvar config. para o arquivo específico." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Alinhar XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Alinhar modelo de acordo com o ponto inserido." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Cortar modelo ao Z fornecido." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Centralizar" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Centralizar a impressão de acordo com o centro informado." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Não organizar" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15404,11 +15353,11 @@ msgstr "" "Não reorganize os modelos fornecidos antes de Mesclar e manter suas " "coordenadas XY originais." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Garanta na mesa" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15416,23 +15365,23 @@ msgstr "" "Levante o objeto acima da mesa quando estiver parcialmente abaixo. " "Habilitado por padrão, use --no-ensure-on-bed para desabilitar." -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Duplicar" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Multiplicar cópias por esse fator." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Duplicar por grade" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Multiplique cópias criando uma grade." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15440,7 +15389,7 @@ msgstr "" "Organize os modelos fornecidos em uma placa e junte-os em um único modelo, a " "fim de executar ações uma só vez." -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -15449,31 +15398,31 @@ msgstr "" "adicionada sempre que precisamos cortar o modelo para executar a ação " "solicitada)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Ângulo de rotação ao redor do eixo Zem graus." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Rotacionar no X" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Ângulo de rotação ao redor do eixo X em graus." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Rotacionar no Y" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Ângulo de rotação ao redor do eixo Y em graus." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Escalando fator ou porcentagem." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15481,23 +15430,23 @@ msgstr "" "Detecte peças não conectadas em um determinado modelo (s) e divida-as em " "objetos separados." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Dimensionar para caber" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Escalar para se adequar ao volume informado." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ignorar arquivos de config. não existentes" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Não falhe se um arquivo fornecido para--carregamento não existe." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15505,7 +15454,7 @@ msgstr "" "Regra de compatibilidade de encaminhamento ao carregar configurações de " "arquivos de configuração e arquivos de projeto (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15518,11 +15467,11 @@ msgstr "" "decidir sair ou substitua um valor desconhecido por um padrão de forma " "silenciosa ou detalhada." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Resgate em valores de configuração desconhecidos" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15530,7 +15479,7 @@ msgstr "" "Habilite a leitura de valores de configuração desconhecidos substituindo-os " "detalhadamente por padrões." -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15538,11 +15487,11 @@ msgstr "" "Habilite a leitura de valores de configuração desconhecidos substituindo-os " "silenciosamente por padrões." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Carregar arquivo de config" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15550,11 +15499,11 @@ msgstr "" "Carregar a config. do arquivo especificado. Ele pode ser usado mais de uma " "vez para carregar opções de vários arquivos." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Arquivo de saída" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15562,11 +15511,11 @@ msgstr "" "O arquivo onde a saída será gravada (se não for especificado, ele será " "baseado no arquivo de entrada)." -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Modo instancia única" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15577,11 +15526,11 @@ msgstr "" "existente é ativada. Substitui o valor de configuração \"single_instance\" " "das preferências do aplicativo." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Diretório de dados" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15590,11 +15539,11 @@ msgstr "" "Carregar e armazenar as config. no diretório especificado. Isso é útil para " "manter perfis diferentes ou incluir config. de um armazenamento de rede." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Nível de registro" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15605,11 +15554,11 @@ msgstr "" "Por exemplo. loglevel=2 logs de mensagens fatais, de nível de erro e de " "aviso." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Renderizar com um software renderizador" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -16032,6 +15981,10 @@ msgid "" "surfaces, save a lot of the filament, and decrease the print time? Read more " "in the documentation." msgstr "" +"Preenchimento de raio\n" +"Você sabia que pode usar o preenchimento de Raio para suportar apenas superfícies " +"de topo, para economizar muito filamento e diminuir o tempo de impressão? Leia mais " +"na documentação." #: resources/data/hints.ini: [hint:Fullscreen mode] msgid "" diff --git a/resources/localization/ru/PrusaSlicer.mo b/resources/localization/ru/PrusaSlicer.mo index e14e0d2954..6615b18cc5 100644 Binary files a/resources/localization/ru/PrusaSlicer.mo and b/resources/localization/ru/PrusaSlicer.mo differ diff --git a/resources/localization/ru/PrusaSlicer_ru.po b/resources/localization/ru/PrusaSlicer_ru.po index 9f74222001..6ea0133da6 100644 --- a/resources/localization/ru/PrusaSlicer_ru.po +++ b/resources/localization/ru/PrusaSlicer_ru.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2022-06-30 00:16+0700\n" "Last-Translator: Andylg \n" "Language-Team: \n" @@ -19,16 +19,16 @@ msgstr "" "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.0.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "С использованием разработок" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Copyright" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -36,26 +36,26 @@ msgstr "" "Лицензионные соглашения всех следующих программ (библиотек) являются частью " "лицензионного соглашения" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "О %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Версия" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "лицензирован в соответствии с" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, version 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -63,7 +63,7 @@ msgstr "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -74,7 +74,7 @@ msgstr "" "numerous others. Если вы нашли ошибки в русском переводе пишите на " "andylg@yandex.ru." -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Скопировать информацию о версии" @@ -221,7 +221,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "Размер" @@ -281,19 +281,18 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "мм" @@ -327,7 +326,7 @@ msgid "Load shape from STL..." msgstr "Загрузка формы стола из STL файла..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Настройки" @@ -340,7 +339,7 @@ msgid "Load..." msgstr "Загрузить..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Удалить" @@ -567,19 +566,19 @@ msgstr "Заменить его на прямолинейный (Rectilinear)?" msgid "Infill" msgstr "Заполнение" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "Глубина проникновения носика поддержки не должна превышать его длину." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Недопустимая глубина проникновения носика поддержки" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Диаметр носика поддержки должен быть меньше диаметра тела поддержки." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Недопустимый диаметр носика поддержки" @@ -688,7 +687,7 @@ msgid "Standard" msgstr "Стандартные" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Все" @@ -958,7 +957,7 @@ msgstr "Выберите другого производителя, поддер msgid "Firmware Type" msgstr "Тип прошивки" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Прошивка" @@ -1280,7 +1279,7 @@ msgstr "Выполнить" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Отмена действия" @@ -1941,7 +1940,7 @@ msgstr "Подтверждение" msgid "Cancelling..." msgstr "Отмена..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "Библиотека фигур" @@ -1957,7 +1956,7 @@ msgstr "Добавить на стол" msgid "Add selected shape(s) to the bed" msgstr "Добавьте выбранную фигуру(-ы) на стол" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Добавить в библиотеку" @@ -1967,7 +1966,7 @@ msgstr "Добавьте одну или несколько пользовате #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Удалить" @@ -2152,8 +2151,8 @@ msgstr "Перемещение" msgid "Extrusion" msgstr "Экструзия" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Ретракт (втягивание)" @@ -2208,7 +2207,7 @@ msgstr "Профиль печати" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Профиль прутка" @@ -2434,7 +2433,7 @@ msgid "Add..." msgstr "Добавить..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Удалить всё" @@ -2481,7 +2480,7 @@ msgid "Next Undo action: %1%" msgstr "Следующее действие отмены: %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Повтор действия" @@ -2523,7 +2522,7 @@ msgid "Selection-Remove from rectangle" msgstr "Выбор\\Удаление из прямоугольника" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Разрезать" @@ -2783,7 +2782,7 @@ msgid "Quality" msgstr "Качество" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Расстояние смыкания полости" @@ -2889,7 +2888,7 @@ msgstr "Перемещение" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Поворот" @@ -2906,7 +2905,7 @@ msgstr "Применить" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Масштаб" @@ -2959,7 +2958,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "В настоящее время упрощение работает только при выборе одной модели" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Ошибка" @@ -3043,7 +3042,7 @@ msgid "Minimal points distance" msgstr "Мин. расстояние м/у точками" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Плотность точек поддержки" @@ -3894,7 +3893,7 @@ msgid "Speed" msgstr "Скорость" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3917,52 +3916,51 @@ msgstr "Юбка и кайма" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Дополнительно" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Поддержка" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Подложка" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Полость" @@ -4104,7 +4102,7 @@ msgid "Revert conversion from meters" msgstr "Отменить преобразование размера из метрической системы мер" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Объединить" @@ -4165,7 +4163,7 @@ msgid "Split the selected object into individual parts" msgstr "Разделить выбранную модель на отдельные части" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Разделить" @@ -4835,11 +4833,11 @@ msgstr "Высота" msgid "Width" msgstr "Ширина" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Скорость вентилятора" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Температура" @@ -5136,7 +5134,7 @@ msgstr "Вы не можете загрузить SLA проект с соста msgid "Attention!" msgstr "Внимание!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Горячие клавиши" @@ -5173,7 +5171,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "Загрузить конфигурацию из ini/amf/3mf/g-кода и объединить" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Экспорт в G-код" @@ -5526,13 +5524,13 @@ msgstr "Задать номер экструдера для выбранных msgid "Objects List" msgstr "Список моделей" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Выберите G-код файл" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Перезагрузить стол с диска" @@ -5570,7 +5568,7 @@ msgid "Show/Hide G-code window" msgstr "Показать/скрыть окно отображения G-кода" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Предпросмотр нарезки" @@ -5654,7 +5652,7 @@ msgid "Keyboard shortcuts" msgstr "Горячие клавиши" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Запустить новый экземпляр PrusaSlicer" @@ -5662,11 +5660,11 @@ msgstr "Запустить новый экземпляр PrusaSlicer" msgid "G-code preview" msgstr "Предпросмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Открыть просмотрщик G-кода" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Открыть PrusaSlicer" @@ -5692,13 +5690,13 @@ msgid "Print Settings" msgstr "Настройки печати" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Настройка материала" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Настройки прутка" @@ -5781,7 +5779,7 @@ msgstr "Показать окно с информацией о программ msgid "Show Tip of the Day" msgstr "Показать полезный совет" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." @@ -5789,94 +5787,94 @@ msgstr "" "Открывает уведомление о полезном совете в правом нижнем углу или показывает " "другой совет, если уведомление уже открыто." -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Показать список сочетаний клавиш" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Изометрия" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "Сверху" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Вид сверху" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "Снизу" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Вид снизу" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Спереди" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Вид спереди" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Сзади" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Вид сзади" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Слева" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Вид слева" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Справа" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Вид справа" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Новый проект" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Начать новый проект" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&Открыть проект" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Открыть файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Недавние проекты" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5884,510 +5882,510 @@ msgstr "" "Выбранный проект больше недоступен.\n" "Удалить его из списка последних проектов?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "&Сохранить проект" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Сохранить текущий файл проекта" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Сохранить проект &как" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Сохранить текущий файл проекта как" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Загру&зить STL/OBJ/AMF/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Загрузить модель" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "За&грузить STL (английская система мер)" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Загрузить модель, сохраненную с размерами в английской системе мер" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "Загрузить SL1 / SL1S &архив" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "Загрузить SL1 / Sl1S архив" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Импортировать &конфигурацию" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Загрузить сохранённый файл конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Импортировать конфигурацию из &проекта" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Загрузить конфигурацию из файла проекта" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Импортировать &пакет конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Импортировать пакет конфигураций из файла" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&Импорт" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Экспорт в G-&код" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Экспортировать текущие модели со стола в G-код" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "&Отправить G-код" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Отправить на печать текущий стол как G-код" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Экспорт G-кода на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" "Экспортировать текущие модели со стола в G-код на SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Экспорт &стола в STL" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Экспортировать текущие модели со стола в STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Экспорт стола в STL вместе с &поддержками" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Экспортировать текущий стол в STL, включая поддержки" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Экспорт траектории &инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Экспортировать траекторию инструмента в OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Экспорт &текущей конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Экспортировать текущую конфигурацию в файл" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Экспорт &всех конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Экспортировать все конфигурации в единый файл" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Экспорт всех конфигураций с физическими принтерами" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "Экспорт всех профилей в файл, включая физические принтеры" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Из&влечь SD-карту / USB-накопитель" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" "Извлечение SD-карты / USB-накопителя (после экспорта G-кода на носитель)" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Быстро нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Нарезать файл" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Быстро нарезать и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Нарезать файл и сохранить как" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Повторить последнюю быструю нарезку" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Повтор последней быстрой нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(&Пере)Нарезать" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Начать новый процесс нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "По&чинить STL файл" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Автоматическая починка STL файла" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Пр&едпросмотр G-кода" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "В&ыход" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Выйти из %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "Выбрать &всё" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "Снять в&ыбор со всего" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Выбрать все модели" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "&Удалить выбранные" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Удалить текущие выбранные модели" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Уд&алить всё" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Удалить все модели" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "&Отмена" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Повтор" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "С&копировать" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Скопировать выделенное в буфер обмена" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "Вс&тавить" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Вставить из буфера обмена" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Пере&загрузить с диска" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Пои&ск" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Поиск в настройках" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "Вкладка &стола" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Показать вкладку стола" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Вкладка настройки &печати" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Показать настройки печати" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Вкладка настройки п&рутка" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Показать настройки прутка" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Вкладка настройки прин&тера" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Показать настройки принтера" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "&3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Показать вкладку 3D-вид" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Предпр&осмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Показать предпросмотр нарезки" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "Открытие диалогового окна для редактирования библиотеки фигур." -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Очередь загрузки на &хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Показать очередь загрузки на хост печати" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "Запустить новый экземпляр программы" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "Сравнение профилей" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "Сравнение профилей" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Показать &имена файлов" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Отображать имена файлов моделей\\копий в окне 3D-вида" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "&Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Свернуть боковую панель" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "Полно&экранный режим" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "Полноэкранный режим" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Файл" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Правка" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Окна" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Вид" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Помощь" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "&Открыть G-код файл" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Открыть &PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "&Экспорт" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "&Отправить на печать" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Вкладка настройки материала" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Выберите файл для нарезки (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Нет ранее нарезанного файла." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Ранее нарезанный файл" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") не найден." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Файл не найден" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Сохранить %s файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Сохранить .zip файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Нарезка" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Обработка %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% успешно нарезан." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Нарезка завершена!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Выберите STL файл для починки:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Сохранить в OBJ как (меньше подвержен ошибкам в координатах, чем STL):" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Ваш файл был починен." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Ремонт" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Сохранить конфигурацию в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "Загрузка файла конфигурации" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Выберите файл конфигурации для загрузки:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "Экспорт пакета конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." @@ -6395,15 +6393,15 @@ msgstr "" "Некоторые профили изменены, и несохранённые изменения не будут " "экспортированы в пакет конфигурации." -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Сохранить все конфигурации в файл как:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "Загрузка пакета конфигураций" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "Успешно импортировано профилей: %d шт." @@ -6635,8 +6633,8 @@ msgstr "Копии" msgid "Instance %d" msgstr "Копия %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Слои" @@ -6714,7 +6712,7 @@ msgstr "Имя принтера" msgid "Add preset for this printer device" msgstr "Добавить профиль для этого принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Загрузка на хост печати" @@ -6879,7 +6877,7 @@ msgid "Select what kind of support do you need" msgstr "Выбор варианта поддержки" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Только от стола" @@ -6983,7 +6981,7 @@ msgid "(including spool)" msgstr "(включая катушку)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Стоимость" @@ -7515,10 +7513,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "Вставка из буфера обмена" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Общие" @@ -8034,7 +8032,7 @@ msgid "Add/Remove presets" msgstr "Добавить/удалить профиль" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Добавить физический профиль" @@ -8046,7 +8044,7 @@ msgstr "Изменить профиль" msgid "Change extruder color" msgstr "Изменить цвет экструдера" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Изменить физический профиль" @@ -8362,11 +8360,11 @@ msgstr "НЕ ДОПУСКАТЬ РЭММИНГ" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "с" @@ -8480,12 +8478,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "Просто переключиться на профиль \"%1%\"" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Тихий режим" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Нормальный режим" @@ -8756,7 +8754,7 @@ msgstr "полное имя профиля" msgid "symbolic profile name" msgstr "символическое имя профиля" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Слои и периметры" @@ -8844,7 +8842,7 @@ msgstr "Перекрытие" msgid "Flow" msgstr "Поток" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Прочее" @@ -8852,52 +8850,52 @@ msgstr "Прочее" msgid "Arachne perimeter generator" msgstr "Генератор периметра на движке Arachne" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Выходные параметры" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Последовательная печать" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Радиус безопасной зоны экструдера" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Выходной файл" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Скрипты постобработки" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Заметки" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Зависимости" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Зависимости профиля" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "Скрипты постобработки модифицируют файл G-кода так как вам нужно." -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8920,83 +8918,83 @@ msgstr[2] "" "Удалите их, так как это может вызвать проблемы при визуализации G-кода и " "оценке времени печати." -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "Найдены зарезервированные ключевые слова в" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Переопределение парам. прутка" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Стол" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Охлаждение" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Вкл." -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Настройки вентилятора" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Пороги включения обдува" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Настройки прутка" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Ограничение скорости печати" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Параметры черновой башни" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Параметры смены инструмента в одноэкструдерных мультиматериальных принтерах" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Настройки рэмминга" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Пользовательский G-код" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Стартовый G-код" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "Завершающий G-код" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Подсказки об объёмном расходе недоступны." -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -9017,20 +9015,20 @@ msgstr "" "нажатии на значок шестеренки на вкладке настройки принтера. Профили " "физического принтера сохраняются в папке PrusaSlicer/physical_printer." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Размер и координаты" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Характеристики принтера" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Количество экструдеров у принтера." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -9042,64 +9040,64 @@ msgstr "" "Изменить диаметр всех экструдеров на значение диаметра сопла первого " "экструдера?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Диаметр сопла" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-код, выполняемый перед сменой слоя" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-код выполняемый после смены слоя" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-код выполняемый при смене инструмента" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-код выполняемый между моделями (для последовательной печати)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-код смены цвета" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G-код паузы печати" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Пользовательский шаблон G-кода" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Наклон ванночки" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Время наклона ванночки" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Корректировка" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Экспозиция" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -9108,44 +9106,44 @@ msgstr "Экспозиция" msgid "Machine limits" msgstr "Ограничения принтера" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Значения в этой колонке для нормального режима" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Значения в этой колонке для тихого режима" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Максимальная скорость (#define DEFAULT_MAX_FEEDRATE {X, Y, Z, E})" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "" "Максимальное ускорение (#define DEFAULT_MAX_ACCELERATION {X,Y,Z,E}, #define " "DEFAULT_RETRACT_ACCELERATION, )" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Ограничение рывка (#define DEFAULT_{X,Y,Z,E}JERK)" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "" "Минимальная скорость (#define DEFAULT_MINIMUMFEEDRATE и #define " "DEFAULT_MINTRAVELFEEDRATE)" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Экструдер в ММ принтере" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "" "Параметры экструдера в одноэкструдерном мультиматериальном (ММ) принтере" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -9153,19 +9151,19 @@ msgstr "" "Это одноэкструдерный мультиматериальный принтер, диаметры всех экструдеров " "будут установлены на новое значение. Вы хотите продолжить?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Ограничение высоты слоя" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Позиция экструдера (для многоэкструдерных принтеров)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Приподнимать сопло только" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -9173,11 +9171,11 @@ msgstr "" "Ретракт, при отключении сопла (дополнительные настройки для " "многоэкструдерных принтеров)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Сброс в цвет прутка" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -9187,31 +9185,31 @@ msgstr "" "\n" "Отключить его для включения ретракта из прошивки?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Ретракт из прошивки" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "Выбран новый профиль принтера" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Отсоединён" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "убрать" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "удалить" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "Это последний профиль для этого физического принтера." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -9220,7 +9218,7 @@ msgstr "" "Вы действительно хотите удалить профиль \"%1%\" из физического принтера \"%2%" "\"?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -9235,7 +9233,7 @@ msgstr[2] "" "Физические принтеры расположенные ниже, основаны на профиле, который вы " "собираетесь удалить." -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -9246,7 +9244,7 @@ msgstr[1] "" msgstr[2] "" "Обратите внимание, что выбранный профиль будет удалён и из этих принтеров." -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -9263,7 +9261,7 @@ msgstr[2] "" "Приведенные ниже физические принтеры основаны только на профиле, который вы " "собираетесь удалить." -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -9278,57 +9276,57 @@ msgstr[2] "" "Обратите внимание, что эти принтеры будут удалены после удаления выбранного " "профиля." -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Вы уверены, что хотите %1% выбранный профиль?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "Профиль %1%" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Выбор" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Найти" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "Заменить на" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "Регулярное выражение" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "Не учитывать регистр" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Слово целиком" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "Совпадение в одной строке" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "Вы действительно хотите удалить все замены?" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Ограничения принтера будут передаваться в G-код и использоваться для оценки " "времени печати." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -9338,7 +9336,7 @@ msgstr "" "используются для оценки времени печати, которое может быть неточным, " "поскольку принтер может применять другой набор ограничений для принтера." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9346,12 +9344,12 @@ msgstr "" "Ограничения принтера не заданы, поэтому оценка времени печати может быть " "неточной." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "ЗАКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9359,12 +9357,12 @@ msgstr "" "указывает, что настройки совпадают с системными значениями (или значениями " "по умолчанию) для текущей группы." -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "ОТКРЫТЫЙ ЗАМОЧЕК" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9376,12 +9374,12 @@ msgstr "" "Нажмите, чтобы сбросить все настройки текущей группы до системных значений " "(или значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "БЕЛЫЙ МАРКЕР" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -9389,12 +9387,12 @@ msgstr "" "слева: указывает на не системный профиль (или профиль не по умолчанию),\n" "справа: указывает, что параметры не были изменены." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "ЗНАЧОК СО СТРЕЛКОЙ" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9407,7 +9405,7 @@ msgstr "" "настройки для текущей группы до последнего\n" "сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9415,7 +9413,7 @@ msgstr "" "ЗАКРЫТЫЙ ЗАМОЧЕК указывает, что настройки совпадают с системными значениями " "(или значениями по умолчанию) для текущей группы." -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9427,12 +9425,12 @@ msgstr "" "Нажмите, чтобы сбросить все настройки текущей группы до системных значений " "(или значений по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "БЕЛЫЙ МАРКЕР указывает на не системный профиль (или профиль не по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9440,7 +9438,7 @@ msgstr "" "БЕЛЫЙ МАРКЕР означает, что настройки совпадают с настройками в последнем " "сохранённом профиле для текущей группы." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9452,7 +9450,7 @@ msgstr "" "Нажмите, чтобы сбросить все настройки для текущей группы до последнего " "сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9460,7 +9458,7 @@ msgstr "" "ЗАКРЫТЫЙ ЗАМОЧЕК указывает, что значение совпадает с системным значением " "(или значение по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9471,7 +9469,7 @@ msgstr "" "Нажмите, чтобы сбросить текущее значение к системному значению (или значению " "по умолчанию)." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9479,7 +9477,7 @@ msgstr "" "БЕЛЫЙ МАРКЕР указывает, что значение совпадает со значением в последнем " "сохранённом профиле." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9489,31 +9487,31 @@ msgstr "" "значением в последнем сохранённом профиле для текущей группы.\n" "Нажмите, чтобы сбросить значение до последнего сохранённого значения профиля." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Материал" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "Профиль печати материалами" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Носик поддержки" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Тело поддержки" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Соединения опор поддержки со связующим узлом" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Автоматическая генерация" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9522,11 +9520,11 @@ msgstr "" "\"%1%\" отключена, так как \"%2%\" находится в категории \"%3%\".\n" "Чтобы включить \"%1%\", отключите \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Высота подъёма модели" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Подложка вокруг модели" @@ -9619,7 +9617,7 @@ msgstr "" "чтобы вернуть запрос о несохранённых изменениях." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9687,39 +9685,39 @@ msgstr "" "несохранённые изменения:" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Количество экструдеров" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "Выберите профили для сравнения" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "Показать все профили (включая несовместимые)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "Значение в левом профиле" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "Значение в правом профиле" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "Не найден один из профилей" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "Сравниваемые профили имеют различную технологию печати" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "Отличия в профилях отсутствуют" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9727,11 +9725,11 @@ msgstr "" "Профили отличаются.\n" "Нажмите эту кнопку, чтобы выставить в правый профиль тоже что и в левом." -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "Неопределённая категория" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "Неопределённая группа" @@ -10404,7 +10402,7 @@ msgstr "" "Не удаётся рассчитать ширину экструзии для %1%: Переменная \"%2%\" " "недоступна." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " @@ -10413,7 +10411,7 @@ msgstr "" "Выбранный 3mf файл не совместим, так как был сохранён в более новой версии " "%1%." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." @@ -10421,7 +10419,7 @@ msgstr "" "Выбранный 3MF файл содержит модель с нарисованными поддержками созданными с " "использованием более новой версии PrusaSlicer и несовместим." -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." @@ -10429,7 +10427,7 @@ msgstr "" "Выбранный 3MF файл содержит модель с нарисованным швом созданным с " "использованием более новой версии PrusaSlicer и несовместим." -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -11246,8 +11244,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -11263,9 +11261,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -11487,8 +11484,8 @@ msgstr "" msgid "Default print profile" msgstr "Профиль печати по умолчанию" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11640,8 +11637,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "мм или %" @@ -11728,7 +11726,7 @@ msgid "Extruder Color" msgstr "Цвет экструдера" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Этот параметр используется только в интерфейсе PrusaSlicer в качестве " @@ -11827,7 +11825,7 @@ msgstr "" msgid "approximate seconds" msgstr "приблизительно секунд" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Цвет" @@ -12008,8 +12006,8 @@ msgstr "" "используйте штангенциркуль, чтобы сделать несколько измерений вдоль прутка и " "вычислить среднее значение." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Плотность" @@ -12078,7 +12076,7 @@ msgstr "" msgid "g" msgstr "г" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Неизвестно)" @@ -13918,7 +13916,7 @@ msgstr "" "Используйте этот параметр для поворота рисунка поддержки в горизонтальной " "плоскости." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -14556,40 +14554,35 @@ msgstr "Генератор периметров" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" -"Движок классического генератора периметров создает их с постоянной шириной " -"экструзии, а для очень тонких участков используется параметр «Заполнение " -"пробелов». Движок Arachne же создает периметры с переменной шириной " -"экструзии." -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3074 msgid "Classic" msgstr "Классический движок" -#: src/libslic3r/PrintConfig.cpp:3074 +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "Движок Arachne" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "Длина перехода к периметру" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" -"При переходе между разным количеством периметров по мере того, как деталь " -"становится тоньше, выделяется определенное пространство для разделения или " -"соединения линий периметров." -#: src/libslic3r/PrintConfig.cpp:3089 +#: src/libslic3r/PrintConfig.cpp:3091 msgid "Perimeter transitioning filter margin" msgstr "Поле фильтра при переходе между периметрами" -#: src/libslic3r/PrintConfig.cpp:3091 +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14610,11 +14603,11 @@ msgstr "" "переэкструзии материала. Если задано в процентах, то расчёт производится " "относительно диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "Пороговый угол перехода между периметрами" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14629,11 +14622,11 @@ msgstr "" "сократить количество и длину этих центральных периметров, но при этом могут " "остаться зазоры или произойти чрезмерное экструдирование." -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "Счетчик распределений по периметрам" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " @@ -14643,70 +14636,24 @@ msgstr "" "распространить изменения. Более низкое значение означает, что ширина внешних " "периметров не изменяется." -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "Порог разделения среднего периметра" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" -"Минимальное значение ширины экструзии в процентах от нормальной, при " -"превышении которой средний периметр (если он есть) будет разделён на два. " -"Уменьшение этого параметра, сделает периметры более тонкими, увеличение - " -"более широкими. Примечание: это применимо, когда вся фигура заполняется " -"периметром, поэтому серединой в данном случае является середина объекта " -"между двумя внешними краями фигуры, даже если на самом деле в печати вместо " -"периметра присутствует заполнение или другие виды экструзии." - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "Добавление порога среднего периметра" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" -"Минимальное значение ширины экструзии в процентах от нормальной, при " -"превышении которой будет добавлен средний периметр (если его еще не было). " -"Уменьшение этого параметра, сделает периметры более тонкими, увеличение - " -"более широкими. Примечание: это применимо, когда вся фигура заполняется " -"периметром, поэтому серединой в данном случае является середина объекта " -"между двумя внешними краями фигуры, даже если на самом деле в печати вместо " -"периметра присутствует заполнение или другие виды экструзии." - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "Минимальный размер элемента" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -"Минимальная толщина тонких элементов. Элементы модели, которые тоньше этого " -"значения, не будут напечатаны, в то время как элементы, толщина которых " -"превышает Минимальный размер элемента, будут расширены до минимальной ширины " -"периметра." -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "Минимальная ширина периметра" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14720,63 +14667,63 @@ msgstr "" "элемента. Если задано в процентах, то расчёт производится относительно " "диаметра сопла." -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Высота дисплея" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Высота дисплея." -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Количество пикселей" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Количество пикселей по X." -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Количество пикселей по Y." -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Горизонтальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Зеркалировать по горизонтали" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Включение горизонтального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Вертикальное зеркалирование дисплея" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Зеркалировать по вертикали" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Включение вертикального зеркалирования выходных изображений." -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Ориентация дисплея" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -14786,55 +14733,55 @@ msgstr "" "режим перевернёт значения параметров ширины и высоты дисплея, а выходные " "изображения будут повёрнуты на 90 градусов." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Альбомная" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Портретная" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Быстро" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Быстрый наклон" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Время быстрого наклона." -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Медленно" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Медленный наклон" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Время медленного наклона." -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "Высокая вязкость" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "Наклон ванночки для смолы с высокой вязкостью" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "Время очень медленного наклона ванночки." -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Площадь заполнения" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14844,40 +14791,40 @@ msgstr "" "то будет использоваться медленный наклон, в противном случае - быстрый " "наклон." -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Корректировка масштабирования" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "Корректировка масштабирования принтера по оси X" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "Корректировка масштабирования принтера по оси X" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Корректировка масштабирования принтера по оси Y" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "Корректировка масштабирования принтера по оси Y" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Корректировка масштабирования принтера по оси Z" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "Корректировка масштабирования принтера по оси Z" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Абсолютная корректировка принтера" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -14885,22 +14832,22 @@ msgstr "" "Будет надувать или сдувать нарезанные 2D-полигоны в соответствии со знаком " "коррекции." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Минимальная ширина «слоновьей ноги»" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Минимальная ширина, которую нужно поддерживать для компенсации «слоновьей " "ноги»." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Корректировка гаммы-коррекции" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14910,43 +14857,43 @@ msgstr "" "значение гаммы означает пороговое значение с порогом посередине. Такое " "поведение убирает сглаживание без потери отверстий в полигонах." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Тип SLA материала" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Начальная высота слоя" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Объём бутылки" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "мл" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Вес бутылки" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "г/мл" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "цена/бутылка" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14954,107 +14901,107 @@ msgstr "" "Количество начальных слоёв, необходимых для изменения времени засветки от " "«Время засветки начальных слоёв» до «Время засветки основных слоёв»." -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Мин. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Макс. время засветки основных слоёв" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Время засветки обычных слоёв" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Мин. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Макс. время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Время засветки начальных слоёв" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Коррекция расширения" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "Корректировка расширения по оси X" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Корректировка расширения по оси Y" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Корректировка расширения по оси Z" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Примечание к SLA материалу" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "" "Здесь вы можете разместить свои заметки относительно SLA материала для " "печати." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Профиль SLA материала по умолчанию" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Генерировать поддержку" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Генерация поддержки для моделей." -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Диаметр носика поддержки" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Диаметр носика поддержки." -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Глубина проникновения носика поддержки" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "Задаёт, как глубоко носик поддержки будет проникать в модель." -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Длина носика поддержки" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "" "Длина носика поддержки (ширина от центра задней сферы до центра передней " "сферы)." -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Диаметр тела поддержки" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Диаметр тела поддержки в мм." -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Диаметр маленьких тел поддержки в процентах" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -15063,11 +15010,11 @@ msgstr "" "диаметром тел поддержки, которые используются в проблемных областях, где " "нормальный столбик поддержки не может поместиться." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Макс. количество мостов на теле поддержки" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -15076,11 +15023,11 @@ msgstr "" "Мосты удерживают носики поддержки и соединяются с телами поддержки в виде " "небольших ветвей." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Тип соединения тела поддержки" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -15091,23 +15038,23 @@ msgstr "" "который автоматически переключается между первыми двумя, в зависимости от " "расстояния между телами поддержки." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Зигзагообразный" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Перекрёстный" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Динамический" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Коэффициент расширения тела поддержки" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -15115,27 +15062,27 @@ msgstr "" "Слияние мостов или тел поддержки в другие тела поддержки может увеличить их " "радиус. 0 - отсутствие увеличения, 1 - полное увеличение." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Диаметр основания поддержки" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Диаметр основания поддержки в мм." -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Высота основания поддержки" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Высота конусообразного основания поддержки." -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Безопасное расстояние основания поддержки" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -15145,27 +15092,27 @@ msgstr "" "смысл в режиме нулевой высоты подъёма, когда между моделью и подложкой " "вставляется зазор заданный этим параметром." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Критический угол" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "Угол соединения опор поддержки со связующим узлом." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Максимальная длина моста" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "Максимальная длина моста." -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Максимальное расстояние между телом поддержки" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -15173,7 +15120,7 @@ msgstr "" "Максимальное расстояние между двумя телами поддержки для связи друг с " "другом. Нулевое значение - запрет на соединение тел поддержки каскадом." -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -15181,39 +15128,39 @@ msgstr "" "Определяет насколько опоры должны поднимать поддерживаемую модель. Если " "включёно «Подложка вокруг модели», это значение игнорируется." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Относительный показатель плотности точек поддержки." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Минимальное расстояние между точками поддержки" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "Точки поддержки не будут размещены ближе этого порогового значения." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Использовать подложку" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Добавляет подложку под поддерживаемую модель." -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Толщина стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Толщина подложки и её дополнительных стенок полости." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Высота стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -15225,19 +15172,19 @@ msgstr "" "некоторые смолы могут создавать чрезмерный эффект всасывания внутри полости, " "что затрудняет снятие модели." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Размер каймы подложки" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "Как далеко должна простираться подложка вокруг существующей геометрии." -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Максимальное расстояние слияния" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -15248,11 +15195,11 @@ msgstr "" "двух меньших подложек. Если они находятся слишком близко, то будут " "объединены в одну подложку." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Наклон стенки подложки" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -15260,23 +15207,23 @@ msgstr "" "Наклон стенки подложки относительно плоскости стола. 90 градусов означает " "прямые стены." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Создаёт подложку вокруг модели, игнорируя высоту подъёма поддержкой." -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Подложка вокруг модели везде" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Принудительное создание подложки вокруг модели везде." -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Зазор между дном модели и подложкой" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." @@ -15284,11 +15231,11 @@ msgstr "" "Зазор между дном модели и сгенерированной подложкой в режиме нулевой высоты " "подъёма." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Шаг соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -15296,47 +15243,47 @@ msgstr "" "Расстояние между двумя соединительными опорами, которые соединяют модель и " "сгенерированную подложку." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Ширина соединительного элемента подложки модели" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" "Ширина соединительных опор, которые соединяют модель со сгенерированной " "подложкой." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Глубина проникновения соединительного элемента в модель" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" "Задаёт как глубоко соединительные элементы должны проникают в тело модели." -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Создавать полость" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Создание пустотелой модели." -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Толщина стенки" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Минимальная толщина стенки полой модели." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Точность" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -15344,7 +15291,7 @@ msgstr "" "Быстродействие расчёта против точности расчёта. \n" "Низкие значения этого параметра могут привести к нежелательным артефактам." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -15359,11 +15306,11 @@ msgstr "" "При нулевом значении внутреннее пространство будет больше всего напоминать " "наружную сторону модели." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "Скорость печати" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -15373,65 +15320,65 @@ msgstr "" "материалов с повышенной вязкостью или для некоторых полых деталей. Это " "замедляет наклон ванночки и добавляет задержку перед засветкой." -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Экспорт в OBJ" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Экспортировать модель(и) в формат OBJ." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Экспорт для SLA печати" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Нарезать модель и экспортировать слои печати для SLA в формат PNG." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Экспорт в 3MF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Экспортировать модель(и) в формат 3MF." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Экспорт в AMF" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Экспортировать модель(и) в формат AMF." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Экспорт в STL" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Экспортировать модель(и) в формат STL." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "" "Нарезать модель и экспортировать траекторию движения инструмента в G-код " "файл." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Просмотрщик G-кода" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Визуализация уже нарезанного и сохраненного G-кода" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Нарезать" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -15439,71 +15386,71 @@ msgstr "" "Нарезает модель в зависимости от типа печати (FFF или SLA) на основе " "значения конфигурации printer_technology." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Помощь" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Показать помощь." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Помощь (FFF настройки)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "Показать полный список параметров конфигурации печати/G-кода." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Помощь (SLA настройки)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "Показать полный список параметров конфигурации SLA печати." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Информация о выходной модели" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Записать информацию о модели в консоль." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Сохранить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Сохраните конфигурацию в указанный файл." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Выровнять по XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Выровнять модель по заданной точке." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Разрезать модель по Z." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "По центру" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Центрировать печать вокруг данного центра." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Не расставлять" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -15511,11 +15458,11 @@ msgstr "" "Не переставлять данные модели перед объединением и сохранять их исходные XY " "координаты." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "Обеспечивать размещение на столе" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -15523,23 +15470,23 @@ msgstr "" "Поднимает модель над столом, когда она частично находится внизу. Включено по " "умолчанию. Для отключения используйте --no-ensure-on-bed to disable." -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Дубликат" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Увеличить количество копий на этот коэффициент." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Дублировать по сетке" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Увеличить количество копий путём создания сетки." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -15547,7 +15494,7 @@ msgstr "" "Расставьте представленные модели на столе и объединить их в одну модель, " "чтобы выполнить действия один раз." -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -15556,31 +15503,31 @@ msgstr "" "всякий раз, когда нужно нарезать модель для выполнения запрошенного " "действия)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Угол поворота вокруг оси Z в градусах." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Поворот вокруг оси X" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Угол поворота вокруг оси X в градусах." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Поворот вокруг оси Y" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Угол поворота вокруг оси Y в градусах." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Коэффициент масштабирования или процент." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15588,24 +15535,24 @@ msgstr "" "Обнаружение несвязанных частей в выбранных моделях и разделение их на " "отдельные объекты." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Отмасштабировать под область печати" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Масштабировать в соответствии с заданным объёмом." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Игнорировать несуществующие конфигурационные файлы" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" "Не терпеть неудачу, если файла, предоставленного для --load, не существует." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." @@ -15613,7 +15560,7 @@ msgstr "" "Правило прямой совместимости при загрузке конфигураций из файлов " "конфигурации и файлов проекта (3MF, AMF)." -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15626,11 +15573,11 @@ msgstr "" "неизвестное значение значением по умолчанию автоматически или путем их " "полной замены." -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "Отмена неизвестных значений конфигурации" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." @@ -15638,7 +15585,7 @@ msgstr "" "Позволяет считывать неизвестные значения конфигурации путем их полной замены " "значениями по умолчанию." -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." @@ -15646,11 +15593,11 @@ msgstr "" "Позволяет считывать неизвестные значения конфигурации, автоматически заменяя " "их значениями по умолчанию." -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Загрузить конфигурацию" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15658,11 +15605,11 @@ msgstr "" "Загрузить конфигурацию из указанного файла. Его можно использовать более " "одного раза для загрузки параметров из нескольких файлов." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Выходной файл" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15670,11 +15617,11 @@ msgstr "" "Файл, в который будут записываться выходные данные (если он не указан, то " "будет основан на входном файле)." -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Одни экземпляр программы" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15685,11 +15632,11 @@ msgstr "" "Переопределяет значение конфигурации \"single_instance\" из настроек " "приложения." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Папка конфигурации пользователя" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15698,11 +15645,11 @@ msgstr "" "Загрузите и сохраните настройки в данном каталоге. Это полезно для " "сохранения различных профилей или конфигураций из сетевого хранилища." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Уровень ведения журнала" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15714,11 +15661,11 @@ msgstr "" "Например, loglevel=2 регистрирует неустранимые ошибки, ошибки и " "предупреждения." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Визуализация с помощью программного рендеринга" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/tr/PrusaSlicer_tr.po b/resources/localization/tr/PrusaSlicer_tr.po index ec06e2e005..6c7bee6ed4 100644 --- a/resources/localization/tr/PrusaSlicer_tr.po +++ b/resources/localization/tr/PrusaSlicer_tr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2019-05-23 00:37+0300\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,16 +18,16 @@ msgstr "" "X-Generator: Poedit 2.2.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Bölümler telif hakkı" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Telif Hakkı" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -35,26 +35,26 @@ msgstr "" "İlgili tüm programların (kütüphanelerin) lisans sözleşmeleri, ana uygulama " "lisans sözleşmesinin bir parçasıdır" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "%s Hakkında" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Sürüm" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "lisans türü" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero Genel Kamu Lisansı, sürüm 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -62,7 +62,7 @@ msgstr "" "PrusaSlicer, Alessandro Ranellucci ve RepRap topluluğuna ait olan Slic3r alt " "yapısına sahiptir." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -72,7 +72,7 @@ msgstr "" "Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik ve diğerlerinin katkıları " "ile." -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "" @@ -200,7 +200,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "Boyut" @@ -258,19 +258,18 @@ msgstr "0,0 G-code koordinatının dikdörtgenin sol ön köşesine olan mesafes #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -305,7 +304,7 @@ msgid "Load shape from STL..." msgstr "STL dosyadan şekil yükle..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Ayarlar" @@ -318,7 +317,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Kaldır" @@ -519,19 +518,19 @@ msgstr "" msgid "Infill" msgstr "Dolgu" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "Kafa penetrasyonu kafa genişliğinden daha büyük olmamalıdır." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Geçersiz kafa penetrasyonu" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Pinhead çapı, sütun çapından daha küçük olmalıdır." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Geçersiz iğne başı çapı" @@ -640,7 +639,7 @@ msgid "Standard" msgstr "Standart" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Tümü" @@ -895,7 +894,7 @@ msgstr "" msgid "Firmware Type" msgstr "Yazılım Türü" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Yazılım" @@ -1193,7 +1192,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Geri Al" @@ -1804,7 +1803,7 @@ msgstr "Onaylama" msgid "Cancelling..." msgstr "İptal ediliyor..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1820,7 +1819,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Ekle" @@ -1830,7 +1829,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Sil" @@ -2011,8 +2010,8 @@ msgstr "" msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Geri çekme" @@ -2067,7 +2066,7 @@ msgstr "Baskı ayarları" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Filament" @@ -2291,7 +2290,7 @@ msgid "Add..." msgstr "Ekle..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Tümünü sil" @@ -2338,7 +2337,7 @@ msgid "Next Undo action: %1%" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Yinele" @@ -2378,7 +2377,7 @@ msgid "Selection-Remove from rectangle" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Kes" @@ -2633,7 +2632,7 @@ msgid "Quality" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "" @@ -2736,7 +2735,7 @@ msgstr "Taşı" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Çevir" @@ -2753,7 +2752,7 @@ msgstr "Uygula" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Ölçek" @@ -2804,7 +2803,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Hata" @@ -2888,7 +2887,7 @@ msgid "Minimal points distance" msgstr "En düşük nokta mesafesi" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Destek noktaları yoğunluğu" @@ -3657,7 +3656,7 @@ msgid "Speed" msgstr "Hız" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3680,52 +3679,51 @@ msgstr "Etek ve kenar" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Gelişmiş" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Destekler" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Altlık" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "" @@ -3867,7 +3865,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Birleştir" @@ -3928,7 +3926,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Bölünmüş" @@ -4566,11 +4564,11 @@ msgstr "Yükseklik" msgid "Width" msgstr "Genişlik" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Fan hızı" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Sıcaklık" @@ -4851,7 +4849,7 @@ msgstr "" msgid "Attention!" msgstr "Dikkat!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Klavye kısayolları" @@ -4888,7 +4886,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "G-code Dışa Aktar" @@ -5237,13 +5235,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "" @@ -5280,7 +5278,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Ön izleme" @@ -5358,7 +5356,7 @@ msgid "Keyboard shortcuts" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "" @@ -5366,11 +5364,11 @@ msgstr "" msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "" @@ -5396,13 +5394,13 @@ msgid "Print Settings" msgstr "Baskı Ayarları" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Malzeme Ayarları" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Filament Ayarları" @@ -5485,622 +5483,622 @@ msgstr "Hakkında" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Klavye kısayollarının listesini göster" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Perspektif" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Perspektif görünümü" #. 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "Üst" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Üst Görünüm" #. 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:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "Alt" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Alt Görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Ön" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Ön görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Arka" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Arka görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "Sol" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Sol görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "Sağ" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Sağ görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "&Yeni Proje" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Yeni bir proje başlat" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "& Proje Aç" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Bir proje dosyası açın" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 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:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "& Projeyi Kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Mevcut proje dosyasını kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Projeyi farklı kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Mevcut proje dosyasını farklı kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Bir model yükle" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "&Ayarları İçe Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Dışa aktarılan yapılandırma dosyasını yükle" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Proje dosyasından yapılandırmayı yükle" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Ha&zır Ayarları İçe Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Paketten hazır ayarları yükleme" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&İçe Aktarma" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "&G-code Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Geçerli tablayı G-code olarak dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Geçerli tablayı STL olarak dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Geçerli tablayı destekler ile STL olarak dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Ayarları &Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Geçerli yapılandırmayı dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "&Hazır Ayarları Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Tüm hazır ayarları dışa aktar" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "&Dışa Aktar" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Hızlı Dilim" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Bir dosyayı G koduna dilimleme" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Hızlı Dilim ve Farklı Kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Bir dosyayı dilimle ve farklı kaydet" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Son Hızlı Dilimi Tekrarla" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Son hızlı dilimi tekrarla" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Tekrar)Dilimle" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Yeni dilimleme işlemine başla" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "& STL dosyasını onar" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Bir STL dosyasını otomatik olarak onar" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "&Çıkış" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "%s uygulamasını kapat" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Tüm nesneleri seçer" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Tüm nesnelerin seçimini kaldırır" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Mevcut seçimi siler" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Tüm nesneleri sil" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "&Geri Al" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "&Yinele" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "&Kopyala" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Seçimi panoya kopyala" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "&Yapıştır" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Panodan yapıştır" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&Tabla Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Tablayı göster" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "B&askı Ayarları Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Baskı ayarlarını göster" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "& Filament Ayarları Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Filament ayarlarını göster" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Yazıcı Ayarları S&ekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Yazıcı ayarlarını göster" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&B" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "3B düzenleme görünümünü göster" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Ön izleme" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "3B dilimleme ön izlemesini göster" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Yazdırma ve Ana Bilgisayar Yükleme Kuyruğu" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Ana Bilgisayar Yükleme Sırasını Yazdır penceresini görüntüle" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&Dosya" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Düzenle" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&Pencere" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&Görünüm" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&Yardım" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Mate&ryal Ayarları Sekmesi" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Dilimlemek için bir dosya seçin (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Daha önce dilimlenmiş dosya yok." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Önceden dilimlenmiş dosya (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") bulunamadı." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Dosya bulunamadı" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "%s dosyasını farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-kod" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Zip dosyasını farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Dilimleme" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "%s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Dilimleme Yapıldı!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Onarılacak STL dosyasını seçin:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" "OBJ dosyasını kaydet (hataları STL'den koordine etmeye daha az eğilimli):" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Dosyanız onarıldı." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Onar" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Yapılandırmayı farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Yüklenecek yapılandırmayı seçin:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Ön ayar paketini farklı kaydet:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d ön ayar başarıyla içe aktarıldı." @@ -6322,8 +6320,8 @@ msgstr "Örnekleri" msgid "Instance %d" msgstr "Kopya %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Katmanlar" @@ -6393,7 +6391,7 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Ana Bilgisayar yüklemesini yazdır" @@ -6547,7 +6545,7 @@ msgid "Select what kind of support do you need" msgstr "Ne tür bir desteğe ihtiyacınız olduğunu seçin" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Yalnızca tablada destek" @@ -6649,7 +6647,7 @@ msgid "(including spool)" msgstr "" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Maliyet" @@ -7119,10 +7117,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Genel" @@ -7568,7 +7566,7 @@ msgid "Add/Remove presets" msgstr "" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "" @@ -7580,7 +7578,7 @@ msgstr "" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "" @@ -7882,11 +7880,11 @@ msgstr "TÜMÜNDE SIKIŞTIRMA YOK" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -7995,12 +7993,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Gizli" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Normal" @@ -8253,7 +8251,7 @@ msgstr "" msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Katmanlar ve duvarlar" @@ -8341,7 +8339,7 @@ msgstr "Üzerine bindirme" msgid "Flow" msgstr "Akış" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Diğer" @@ -8349,52 +8347,52 @@ msgstr "Diğer" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Çıktı seçenekleri" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Sıralı baskı" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Çıktı dosyası" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "İşlem sonrası komut dosyaları" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Notlar" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Bağımlılıklar" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Profil bağımlılıkları" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8407,83 +8405,83 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Tabla" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Soğutma" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Etkin" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Fan ayarları" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Soğutma eşikleri" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Filament özellikleri" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Baskı hızı geçersiz kılma" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "" "Tek ekstrüder Çoklu Filament (MM) yazıcılarla takım değiştirme parametreleri" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Sıkıştırma ayarları" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Özel G-code" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Başlangıç G-code" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "Bitiş G-code" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8496,20 +8494,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Boyut ve koordinatlar" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Kabiliyetler" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Yazıcının ekstrüder sayısı." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8517,64 +8515,64 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Nozül çapı" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "Katman değiştirmeden önce G-code" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "Katman değişiminden sonra G-code" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "Takım değiştirme G kodu" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "Nesneler arasında Gcode (sıralı baskı için)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Ekran" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Eğim" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Yatırma zamanı" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Düzeltmeler" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Poz" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8583,57 +8581,57 @@ msgstr "Poz" msgid "Machine limits" msgstr "Makine sınırları" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Bu sütundaki değerler Normal mod içindir" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Bu sütundaki değerler Gizli mod içindir" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "En yüksek hızlar" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "En yüksek ivme (Acceleration)" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Ani Hareket (Jerk) sınırları" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "En düşük besleme hızı" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Tek ekstrüder çoklu filament kurulumu" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Tek ekstrüder çok yönlü parametreler" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 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:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Katman yüksekliği sınırları" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Konum (çoklu ekstrüder yazıcıları için)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Koşullu Z kaldırma" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -8641,11 +8639,11 @@ msgstr "" "Takım devre dışı bırakıldığında geri çekme (çoklu ekstrüder ayarları için " "gelişmiş ayarlar)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8656,38 +8654,38 @@ msgstr "" "Donanımsal Geri Çekmeyi etkinleştirmek için Temizleme seçeneğini kapatmamı " "iste misiniz?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Firmware Retraction" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "kaldır" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "sil" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8695,14 +8693,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8712,7 +8710,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -8720,84 +8718,84 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "%1% ayarını seçili ön ayar yapmak istediğinizden emin misiniz?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% Ön Ayar" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Ayarla" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Bul" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Tam kelime" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "KAPALI KİLİT" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "AÇIK KİLİT" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8805,23 +8803,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "BEYAZ NOKTA" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "GERİ OK" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8833,13 +8831,13 @@ msgstr "" "Geçerli seçenek grubunun tüm ayarlarını en son kaydedilen ön ayara " "sıfırlamak için GERİ OK tuşuna basın." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 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:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -8847,11 +8845,11 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -8859,7 +8857,7 @@ msgstr "" "BEYAZ NOKTA simgesi ayarların geçerli seçenek grubu için en son kaydedilen " "ön ayardakiyle aynı olduğunu gösterir." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -8871,20 +8869,20 @@ msgstr "" "Geçerli seçenek grubunun tüm ayarlarını en son kaydedilen ön ayara " "sıfırlamak için tıklayın." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -8892,7 +8890,7 @@ msgstr "" "BEYAZ NOKTA simgesi, değerin son kaydedilen ön ayardakiyle aynı olduğunu " "gösterir." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -8902,42 +8900,42 @@ msgstr "" "olmadığını gösterir.\n" "Geçerli değeri son kaydedilen ön ayara sıfırlamak için tıklayın." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Malzeme" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Destek kafa" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Destek ayağı" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "Destek çubuklarının ve birleşimlerinin bağlantısı" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Otomatik oluşturma" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format 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:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Nesne yüksekliği" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "" @@ -9020,7 +9018,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9081,49 +9079,49 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -9752,26 +9750,26 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10511,8 +10509,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -10527,9 +10525,8 @@ msgstr "Bu fan hızı tüm köprüler ve çıkıntılar sırasında uygulanır." #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -10742,8 +10739,8 @@ msgstr "" msgid "Default print profile" msgstr "Varsayılan yazdırma profili" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10887,8 +10884,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm veya %" @@ -10970,7 +10968,7 @@ msgid "Extruder Color" msgstr "Ekstrüder Rengi" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "Bu sadece Slic3r arayüzünde görsel bir yardım olarak kullanılır." @@ -11066,7 +11064,7 @@ msgstr "" msgid "approximate seconds" msgstr "yaklaşık saniye" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Renk" @@ -11246,8 +11244,8 @@ msgstr "" "bir kumpas kullanın ve filament boyunca birçok ölçüm yapın, ardından " "ortalamayı hesaplayın." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Yoğunluk" @@ -11311,7 +11309,7 @@ msgstr "" msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "" @@ -12980,7 +12978,7 @@ msgid "" "plane." msgstr "Destek desenini yatay düzlemde döndürmek için bu ayarı kullanın." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13581,33 +13579,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13619,11 +13619,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13632,63 +13632,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13697,63 +13669,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Ekran genişliği" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Ekranın genişliği" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Ekran yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Ekran yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Piksel sayısı" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "X'teki piksel sayısı" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Y cinsinden piksel sayısı" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Ekran yönü" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -13763,55 +13735,55 @@ msgstr "" "genişliği ve yükseklik parametrelerinin anlamını değiştirecek ve çıkış " "görüntüleri 90 derece döndürülecektir." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Peyzaj" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Portre" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Hızlı" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Hızlı eğim" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Hızlı yatırma zamanı" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Yavaş" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Yavaş eğim" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Yavaş yatırma zamanı" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Alan dolgusu" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13821,40 +13793,40 @@ msgstr "" "Baskı alanı belirtilen değeri aşarsa,\n" "yavaş eğim kullanılır, aksi takdirde - hızlı eğim kullanılır" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Yazıcı ölçeklendirme düzeltmesi" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Yazıcı mutlak düzeltme" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." @@ -13862,20 +13834,20 @@ msgstr "" "Dilimlenen 2D poligonları düzeltme işaretine göre şişirecek veya " "söndürecektir." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Yazıcı gama düzeltmesi" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -13885,43 +13857,43 @@ msgstr "" "gamma değeri, ortadaki eşik ile eşik anlamına gelir. Bu davranış, " "çokgenlerde delik kaybetmeden kenar bozulmalarını ortadan kaldırır." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "İlk katman yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Soluk katmanlar" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -13929,123 +13901,123 @@ msgstr "" "Maruz kalma süresi için gereken katman sayısı, ilk maruz kalma süresinden " "maruz kalma süresine kadar kaybolur" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Pozlama süresi" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "İlk maruz kalma süresi" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Genişleme için düzeltme" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA baskı malzemesi notları" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "SLA baskı malzemesi ile ilgili notlarınızı buraya yazabilirsiniz." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Varsayılan SLA malzeme profili" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Destek üret" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Modeller için destek oluşturun" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Başın gösterdiği tarafın çapı" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "Pinheadin model yüzeyine ne kadar nüfuz etmesi gerektiği" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "Arka küre merkezinden ön küre merkezine genişlik" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Destek direklerinin mm cinsinden çapı" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 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:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 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:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14055,23 +14027,23 @@ msgstr "" "bağlı olarak otomatik olarak ilk ikisi arasında geçiş yapacak zig-zag, " "çapraz (çift zig-zag) veya dinamik olabilir." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Zikzaklı" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Çapraz" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Dinamik" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Ayağı genişletme faktörü" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -14079,54 +14051,54 @@ msgstr "" "Köprüler veya sütunların başka bir sütunla birleştirilmesi yarıçapı " "artırabilir. Sıfır, artış yok demektir, biri tam artış demektir." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Destek taban çapı" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Sütun tabanının mm cinsinden çapı" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Destek taban yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Sütun tabanı konisinin yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Kritik açı" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "Destek çubuklarını ve bağlantılarını bağlamak için varsayılan açı." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "En fazla köprü uzunluğu" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "Bir köprünün en fazla uzunluğu" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Max sütun bağlama mesafesi" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -14134,45 +14106,45 @@ msgstr "" "Birbiriyle bağlantı kurması için iki sütunun en fazla mesafesi. Sıfır " "değeri, direk basamaklandırmasını yasaklar." -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 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:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Bu, destek noktalarının yoğunluğunun göreceli bir ölçüsüdür." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Destek noktalarının en düşük mesafesi" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "Bu eşikten daha yakın hiçbir destek noktası yerleştirilmeyecektir." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Ped kullan" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Desteklenen modelin altına bir ped ekler" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Ped duvar kalınlığı" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Pedin kalınlığı ve isteğe bağlı boşluk duvarları." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Ped duvar yüksekliği" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -14184,19 +14156,19 @@ msgstr "" "boşluğun içinde aşırı bir emme etkisi oluşturabilir ve bu da baskıyı " "ayırmayı zorlaştırır." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "En fazla birleştirme mesafesi" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -14206,11 +14178,11 @@ msgstr "" "birlikte olabilir. Bu parametre iki küçük pedin ortasının ne kadar uzakta " "olması gerektiğini tanımlar. Yaklaşırlarsa, bir pede birleştirilirler." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Ped duvar eğimi" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." @@ -14218,82 +14190,82 @@ msgstr "" "Ped duvarının tabla düzlemine göre eğimi. 90 derece, düz duvarlar anlamına " "gelir." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -14302,75 +14274,75 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "OBJ olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Model(ler)i OBJ olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "SLA olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" "Modeli dilimleyin ve SLA yazdırma katmanlarını PNG olarak dışa aktarın." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "3MF Olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Model(ler)i 3MF olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "AMF Olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Model(ler)i AMF olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "STL olarak Dışa Aktar" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Model(ler)i STL olarak dışa aktar." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Modeli dilimleyin ve takım yollarını G kodu olarak dışa aktarın." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Dilim" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -14378,71 +14350,71 @@ msgstr "" "Modeli, printer_technology yapılandırma değerine göre FFF veya SLA olarak " "dilimleyin." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Yardım" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Bu yardımı göster." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Yardım (FFF seçenekleri)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "Baskı/G-code yapılandırma seçeneklerinin tam listesini göster." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Yardım (SLA seçenekleri)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "SLA yazdırma yapılandırma seçeneklerinin tam listesini göster." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Çıktı Model Bilgisi" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Modelle ilgili bilgileri konsola yazın." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Konfigürasyon dosyasını kaydet" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Yapılandırmayı belirtilen dosyaya kaydeder." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "XY'yi Hizala" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Modeli verilen noktaya hizala." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Modeli belirtilen Z seviyesinden kes." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Merkez" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Baskıyı verilen merkezin çevresine ortala." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Düzenleme" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -14450,33 +14422,33 @@ msgstr "" "Birleştirmeden ve orijinal XY koordinatlarını saklamadan modelleri yeniden " "düzenleme." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Çoğalt" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Kopyaları bu faktörle çarpın." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Kılavuza göre çoğalt" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Izgara oluşturarak kopyaları çarpın." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -14484,7 +14456,7 @@ msgstr "" "Tedarik edilen modelleri bir plaka içinde düzenleyin ve bir kez işlem yapmak " "için bunları tek bir modelde birleştirin." -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14493,60 +14465,60 @@ msgstr "" "eylemi gerçekleştirmek için modeli dilimlememiz gerektiğinde dolaylı olarak " "eklenir)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Z ekseni etrafındaki dönüş açısı, derece olarak." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "X etrafında döndür" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "X ekseni etrafındaki dönüş açısı, derece olarak." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Y etrafında döndür" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Y ekseni etrafındaki dönüş açısı, derece olarak." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Ölçekleme faktörü veya yüzdesi." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" "Modellerde bağlı olmayan parçaları tespit et ve bunları ayrı nesnelere böl." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Uygun ölçek" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Verilen hacme uyması için ölçeklendirin." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Var olmayan config dosyalarını yoksay" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Do not fail if a file supplied to --load does not exist." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14554,27 +14526,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Konfigürasyon dosyası yükle" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -14582,33 +14554,33 @@ msgstr "" "Belirtilen dosyadan yapılandırmayı yükle. Seçenekleri birden fazla dosyadan " "yüklemek için birden fazla kez kullanılabilir." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Çıktı dosyası" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." msgstr "" "Çıktının yazılacağı dosya (belirtilmemişse girdi dosyasına dayanacaktır)." -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 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:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Veri dizini" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14618,22 +14590,22 @@ msgstr "" "için veya bir ağ depolama birimindeki yapılandırmaları dahil etmek için " "kullanışlıdır." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Günlük seviyesi" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Bir yazılım oluşturucuyla işleme" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/uk/PrusaSlicer_uk.po b/resources/localization/uk/PrusaSlicer_uk.po index 7503b4c323..b4fb008bca 100644 --- a/resources/localization/uk/PrusaSlicer_uk.po +++ b/resources/localization/uk/PrusaSlicer_uk.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2021-02-03 17:15+0100\n" "Last-Translator: Oleksandra Iushchenko \n" "Language-Team: \n" @@ -14,16 +14,16 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "Використані розробки" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "Копірайт" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" @@ -31,26 +31,26 @@ msgstr "" "Ліцензійні угоди всіх наступних програм (бібліотек) є частиною ліцензійної " "угоди програми" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "О %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "Версія" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "ліцензовано згідно" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "Загальна публічна ліцензія GNU Affero, версія 3" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -58,7 +58,7 @@ msgstr "" "PrusaSlicer заснований на Slic3r від Alessandro Ranellucci та спільноти " "RepRap." -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -68,7 +68,7 @@ msgstr "" "Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik та багатьох " "інших." -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "Скопіювати інформацію про версію" @@ -209,7 +209,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "Розмір" @@ -267,19 +267,18 @@ msgstr "Відстань координат 0,0 G-коду від нижньог #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "мм" @@ -314,7 +313,7 @@ msgid "Load shape from STL..." msgstr "Завантажте форму з STL ..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "Налаштування" @@ -327,7 +326,7 @@ msgid "Load..." msgstr "Завантажити..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "Видалити" @@ -547,19 +546,19 @@ msgstr "Чи потрібно змінити його на прямоліній msgid "Infill" msgstr "Заповнення" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "Проникнення головки не повинно бути більше її ширини." -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "Неприпустиме проникнення головки" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "Діаметр головки стовпа повинен бути менше діаметра стовпа." -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "Неприпустимий діаметр головки" @@ -668,7 +667,7 @@ msgid "Standard" msgstr "Стандартний" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "Всі" @@ -933,7 +932,7 @@ msgstr "Виберіть іншого постачальника, який пі msgid "Firmware Type" msgstr "Тип прошивки" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "Прошивка" @@ -1234,7 +1233,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "Скасувати" @@ -1886,7 +1885,7 @@ msgstr "Підтвердження" msgid "Cancelling..." msgstr "Скасування..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1902,7 +1901,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "Додати" @@ -1912,7 +1911,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "Видалити" @@ -2093,8 +2092,8 @@ msgstr "Переміщення" msgid "Extrusion" msgstr "Екструзія" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "Переривання" @@ -2149,7 +2148,7 @@ msgstr "Параметри друку" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "Філамент" @@ -2375,7 +2374,7 @@ msgid "Add..." msgstr "Додати..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "Видалити все" @@ -2422,7 +2421,7 @@ msgid "Next Undo action: %1%" msgstr "Скасувати дію: %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "Повторити" @@ -2464,7 +2463,7 @@ msgid "Selection-Remove from rectangle" msgstr "Виділення - Видалено прямокутником" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "Розрізати" @@ -2719,7 +2718,7 @@ msgid "Quality" msgstr "Якість" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "Відстань закриття" @@ -2822,7 +2821,7 @@ msgstr "Пересунути" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "Обертати" @@ -2839,7 +2838,7 @@ msgstr "Застосувати" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "Масштаб" @@ -2890,7 +2889,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "Помилка" @@ -2974,7 +2973,7 @@ msgid "Minimal points distance" msgstr "Мінімальна відстань точок" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "Щільність точок підтримки" @@ -3785,7 +3784,7 @@ msgid "Speed" msgstr "Швидкість" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3808,52 +3807,51 @@ msgstr "Плінтус та край" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "Розширений" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "Підтримки" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "Подушка" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "Випорожнення" @@ -3995,7 +3993,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "Об’єднати" @@ -4056,7 +4054,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "Розділити" @@ -4719,11 +4717,11 @@ msgstr "Висота" msgid "Width" msgstr "Ширина" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "Швидкість вентилятора" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "Температура" @@ -5007,7 +5005,7 @@ msgstr "" msgid "Attention!" msgstr "Увага!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "Гарячі клавіши" @@ -5044,7 +5042,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "Завантажити конфігурацію з INI/AMF/3MF/GCODE та об’єднати" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "Експорт G-коду" @@ -5400,13 +5398,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "Відкрити файл G-кода" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "Перезавантажити стіл з диска" @@ -5443,7 +5441,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "Попередній перегляд" @@ -5527,7 +5525,7 @@ msgid "Keyboard shortcuts" msgstr "Гарячі клавіши" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "Відкрити новий екземпляр PrusaSlicer" @@ -5535,11 +5533,11 @@ msgstr "Відкрити новий екземпляр PrusaSlicer" msgid "G-code preview" msgstr "Перегляд G-коду" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "Відкрити переглядач G-коду" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "Відкрити PrusaSlicer" @@ -5565,13 +5563,13 @@ msgid "Print Settings" msgstr "Параметри друку" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "Параметри матеріалу" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "Параметри філаменту" @@ -5654,100 +5652,100 @@ msgstr "Показати діалог Про Slic3r" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "Показати список гарячих клавіш" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Вид Iso" #. 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "Зверху" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "Вид зверху" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "Знизу" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "Вид знизу" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "Спереду" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "Вид спереду" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "Ззаду" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "Вид ззаду" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "З лівого боку" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "Вид з лівого боку" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "З правого боку" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "Вид з правого боку" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "Новий проект" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "Почати новий проект" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "Відкрити проект" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "Відкрити файл проекту" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "Останні проекти" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5755,523 +5753,523 @@ msgstr "" "Вибраний проект більше не доступний.\n" "Видалити його зі списку останніх проектів?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "Зберегти проект" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "Зберегти файл поточного проекту" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "Зберегти проект як" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "Зберегти файл поточного проекту як" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Імпорт STL/OBJ/AMF/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "Завантажити модель" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "Імпорт SТL (в імперських одиницях)" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "Завантажити модель, збережену в імперських одиницях" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "Імпорт конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "Завантажити експортований файл конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "Імпорт конфігурації з проекту" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "Завантажити конфігурацію з файлу проекту" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "Імпорт пакету конфігурацій" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "Завантажити налаштування з пакету" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "Імпорт" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "Експортувати G-код" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "Експорт поточної пластини як G-код" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "Надіслати G-код" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "Надіслати на принтер поточний стіл як G-код" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "Експорт G-коду на SD-карту / Флешку" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "Експорт поточного столу як G-код на SD-карту / Флешку" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "Експорт столу як STL" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "Експорт поточної пластини як STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "Експорт столу як STL, включаючи підтримку" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "Експорт поточного столу як STL, включаючи підтримку" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "Експорт шляхів інструментів як OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "Експорт шляхів інструментів як OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "Експортувати конфігурацію" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "Експортувати поточну конфігурацію в файл" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "Експортувати пакет конфігурації" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "Експортувати всі налаштування у файл" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "Експортувати пакет конфігурації, включаючи фізичні принтери" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "Експортуйте всі пресети, включаючи фізичні принтери, у файл" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "Експорт" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "Від'єднати SD-карту/флешку" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" "Від'єднати SD-карту / Флешку після того, як на неї був експортований G-код." -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "Швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "Нарізати файл у G-код" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "Швидко нарізати та зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "Нарізати файл у G-код, зберегти як" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "Повторити останнє швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "Повторити останнє швидке нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "(Пере)Нарізати зараз" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "Почати новий процес нарізання" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "Відновити STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "Автоматично відновити як STL-файл" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "Перегляд G-коду" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "Вихід" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "Вийти з %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "Вибрати все" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "Скасувати вибір усіх" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "Скасовує вибір усіх об’єктів" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "Видалити вибране" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "Видаляє поточний вибір" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "Видалити все" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "Видалити всі об'єкти" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "Відмінити" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "Повторити" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "Копіювати" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "Скопіювати вибране в буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "Вставити" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "Вставити буфер обміну" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "Перезавантажити з диска" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "Пошук" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "Шукайте в налаштуваннях" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "Вкладка Платер" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "Показати plater" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "Вкладка параметрів друку" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "Показати параметри друку" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "Вкладка параметрів філаменту" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "Показати параметри філаменту" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "Вкладка параметрів принтеру" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "Показати параметри принтеру" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "Показати режим 3D-редагування" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "Попередній перегляд" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "Показати попередній перегляд 3D нарізки" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "Черга завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "Показати вікна черги завантаження хоста друку" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "Показувати мітки" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "Показувати мітки об’єктів/екземплярів у 3D-сцені" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "Згорнути бічну панель" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "Файл" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&Редагування" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "Вікно" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "Вид" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "Допомога" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "Відкрити G-код" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "Відкрити PrusaSlicer" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "Експорт" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "Надіслати на принтер" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "Вкладка параметрів матеріалу" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Вибрати файл для нарізання (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "Немає попередньо нарізаного файлу." -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "Попередньо нарізаний файл (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") не знайдено." -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "Файл не знайдено" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "Зберегти файл %s як:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-код" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "Зберегти zip-файл як:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "Нарізання" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "Обробка %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% був успішно нарізаний." -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "Нарізання завершено!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "Вибрати STL-файл для відновлення:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "Зберегти OBJ-файл (менш схильний координувати помилки, ніж STL) як:" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "Ваш файл було відновлено." -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "Відновити" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "Зберегти конфігурацію як:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "Вибрати конфігурацію для завантаження:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "Зберегти набір налаштувань як:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d налаштувань успішно імпортовано." @@ -6501,8 +6499,8 @@ msgstr "Екземпляри" msgid "Instance %d" msgstr "Екземпляр %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "Шари" @@ -6577,7 +6575,7 @@ msgstr "Описова назва принтера" msgid "Add preset for this printer device" msgstr "Додати пресет для цього пристрою принтера" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "Завантаження хоста друку" @@ -6732,7 +6730,7 @@ msgid "Select what kind of support do you need" msgstr "Виберіть необхідну вам підтримку" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "Підтримки тільки на столі" @@ -6834,7 +6832,7 @@ msgid "(including spool)" msgstr "(включаючи котушку)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "Вартість" @@ -7315,10 +7313,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "Вставити з буферу обміну" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "Загальне" @@ -7794,7 +7792,7 @@ msgid "Add/Remove presets" msgstr "Додати/Видалити пресети" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "Додати фізичний принтер" @@ -7806,7 +7804,7 @@ msgstr "Редагувати пресет" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "Редагувати фізичний принтер" @@ -8115,11 +8113,11 @@ msgstr "ВЗАГАЛІ БЕЗ раммінгу" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "с" @@ -8230,12 +8228,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "Просто переключитися до пресету \"%1%\"" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "Тихий" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "Нормальний" @@ -8491,7 +8489,7 @@ msgstr "повне ім'я профілю" msgid "symbolic profile name" msgstr "символічне ім'я профілю" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "Шари та периметри" @@ -8579,7 +8577,7 @@ msgstr "Перекриття" msgid "Flow" msgstr "Потік" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "Інше" @@ -8587,52 +8585,52 @@ msgstr "Інше" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "Параметри виводу" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "Послідовне друкування" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "Область зіткнення екструдера" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "Вихідний файл" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "Скрипти пост-обробки" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "Примітки" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "Залежності" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "Залежності профілю" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8646,82 +8644,82 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "Переписування глобальних змінних" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "Сопло" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "Стіл" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "Охолодження" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "Увімкнути" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "Налаштування вентилятора" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "Пороги охолодження" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "Властивості філаменту" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "Перевизначення швидкості друку" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "Параметри вежі витирання" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "Параметри зміни інструменту в одно-екструдерному ММ-принтері" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "Налаштування раммінгу" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "Користувацький G-код" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "Початок G-коду" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "Закінчення G-коду" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "Підказки об'ємного потоку відсутні" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8743,20 +8741,20 @@ msgstr "" "вкладці \"Параметри принтеру\". Профілі фізичного принтера зберігаються в " "каталозі \"PrusaSlicer/physical_printer\"." -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "Розмір і координати" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "Можливості" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "Кількість екструдерів у принтері." -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8768,64 +8766,64 @@ msgstr "" "Хочете змінити діаметр для всіх екструдерів на значення діаметра сопла " "першого екструдера?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "Діаметр сопла" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "G-код перед зміною шару" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "G-код після зміни шару" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "G-код зміни інструменту" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "G-код між об'єктами (для послідовного друку)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "G-код зміни кольору" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "G-код для паузи друку" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "Шаблон власного G-коду" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "Дисплей" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "Нахил" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "Час нахилу" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "Поправки" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "Експозиція" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8834,39 +8832,39 @@ msgstr "Експозиція" msgid "Machine limits" msgstr "Механічних обмеження" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "Значення в цьому стовпці для нормального режиму" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "Значення в цьому стовпці для тихого режиму" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "Максимальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "Максимальні прискорення" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "Обмеження ривку" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "Мінімальна швидкість подачі" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "Налаштування MM екструдера" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "Параметри екструдеру в багато-екструдерному принтері" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 msgid "" "This is a single extruder multimaterial printer, diameters of all extruders " "will be set to the new value. Do you want to proceed?" @@ -8874,19 +8872,19 @@ msgstr "" "Це одно-екструдерний багато-матеріальний принтер, діаметри всіх екструдерів " "будуть встановлені на нове значення. Ви хочете продовжити?" -#: src/slic3r/GUI/Tab.cpp:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "Межі висоти шару" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "Позиція (для мульти-екструдерних принтерів)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "Межі підняття Z" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" @@ -8894,11 +8892,11 @@ msgstr "" "Переривання при відключенні інструмента (додаткові налаштування для " "налагодження мульти-екструдерів)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "Скинути до кольору філаменту" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8909,31 +8907,31 @@ msgstr "" "\n" "Відключити його для увімкнення програмного переривання?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "Програмне переривання" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "Від'єднаний" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "видалити" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "Це останній пресет для цього фізичного принтера." -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " @@ -8941,7 +8939,7 @@ msgid "" msgstr "" "Ви впевнені, що хочете видалити пресет \"%1%\" із фізичного принтера \"%2%\"?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" @@ -8950,7 +8948,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." @@ -8958,7 +8956,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8969,7 +8967,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" @@ -8978,57 +8976,57 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "Ви впевнені, що хочете %1% вибраний пресет?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% пресет" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "Встановити" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "Знайти" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "Тільки цілі слова" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" "Механічних обмеження публікуватимуться в G-код і використовуватимуться для " "розрахунку часу друку." -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -9038,7 +9036,7 @@ msgstr "" "використовуватися для оцінки часу друку, що, отже, може бути неточним, " "оскільки принтер може застосовувати інший набір механічних обмежень." -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." @@ -9046,12 +9044,12 @@ msgstr "" "Механічних обмеження не встановлені, тому оцінка часу друку може бути " "неточною." -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "ЗАКРИТИЙ ЗАМОК" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 msgid "" "indicates that the settings are the same as the system (or default) values " "for the current option group" @@ -9059,12 +9057,12 @@ msgstr "" "вказує на те, що параметри збігаються із системними (або за замовчуванням) " "значеннями для поточної групи опцій" -#: src/slic3r/GUI/Tab.cpp:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "ВІДКРИТИЙ ЗАМОК" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -9076,12 +9074,12 @@ msgstr "" "Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " "значень (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "БІЛА КУЛЯ" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -9089,12 +9087,12 @@ msgstr "" "для лівої кнопки: вказує на несистемний (або не за замовчуванням) пресет,\n" "для правої кнопки: вказує на те, що параметри не були змінені." -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "СТРІЛКА НАЗАД" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -9106,7 +9104,7 @@ msgstr "" "Клацніть, щоб скинути всі параметри для поточної групи параметрів до " "останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -9114,7 +9112,7 @@ msgstr "" "Значок \"ЗАКРИТИЙ ЗАМОК\" вказує на те, що параметри збігаються із " "системними (або за замовчуванням) значеннями для поточної групи опцій" -#: src/slic3r/GUI/Tab.cpp:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -9127,12 +9125,12 @@ msgstr "" "Клацніть, щоб скинути всі налаштування для поточної групи опцій до системних " "значень (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" "Значок \"БІЛА КУЛЯ\" вказує на несистемний (або не за замовчуванням) пресет." -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -9140,7 +9138,7 @@ msgstr "" "Значок \"БІЛА КУЛЯ\" вказує на те, що параметри збігаються тими, які є в " "останньому збереженому пресеті для поточної групи опцій." -#: src/slic3r/GUI/Tab.cpp:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9152,7 +9150,7 @@ msgstr "" "Клацніть, щоб скинути всі параметри для поточної групи параметрів до " "останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -9160,7 +9158,7 @@ msgstr "" "Значок \"ЗАКРИТИЙ ЗАМОК\" вказує на те, що значення збігається із системним " "(або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9170,7 +9168,7 @@ msgstr "" "дорівнює системному (або за замовчуванням) значенню.\n" "Клацніть, щоб скинути поточне значення до системного (або за замовчуванням)." -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -9178,7 +9176,7 @@ msgstr "" "Значок \"БІЛА КУЛЯ\" вказує на те, що значення збігається з значенням " "збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9188,31 +9186,31 @@ msgstr "" "дорівнює останньому збереженому пресету.\n" "Клацніть, щоб скинути поточне значення до останнього збереженого пресету." -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "Матеріал" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "Головка підтримки" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "Стовп підтримки" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "З'єднання опорних стовпів і стиків" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "Автоматичне згенерування" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9221,11 +9219,11 @@ msgstr "" "\"%1%\" вимкнено, оскільки в категорії \"%3%\" увімкнено \"%2%\".\n" "Щоб увімкнути \"%1%\", вимкніть \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "Підняття об’єкта" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "Подушка навколо об’єкта" @@ -9310,7 +9308,7 @@ msgstr "" "щоб знову запитати про незбережені зміни." #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -9378,49 +9376,49 @@ msgstr "" "зміни:" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "Кількість екструдерів" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -10073,26 +10071,26 @@ msgid "" msgstr "" "Не вдається розрахувати ширину екструзії для %1%: Змінна \"%2%\" недоступна." -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "Вибраний 3MF-файл було збережено з новою версією %1% і не сумісний." -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10871,8 +10869,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -10887,9 +10885,8 @@ msgstr "Ця швидкість вентилятора виконується д #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -11102,8 +11099,8 @@ msgstr "" msgid "Default print profile" msgstr "Профіль друку за замовчанням" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11256,8 +11253,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "мм або %" @@ -11343,7 +11341,7 @@ msgid "Extruder Color" msgstr "Колір екструдера" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" "Ця опція використовується лише у інтерфейсі Slic3r як візуальна допомога." @@ -11442,7 +11440,7 @@ msgstr "" msgid "approximate seconds" msgstr "приблизні секунди" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "Колір" @@ -11623,8 +11621,8 @@ msgstr "" "використовуйте суматор і виконайте декілька вимірювань вздовж філаменту, " "потім обчисліть середнє значення." -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "Щільність" @@ -11692,7 +11690,7 @@ msgstr "" msgid "g" msgstr "г" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(Невідомий)" @@ -13440,7 +13438,7 @@ msgstr "" "Використовуйте цей параметр, щоб повернути шаблон підтримуючого матеріалу на " "горизонтальній площині." -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -14051,33 +14049,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -14089,11 +14089,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -14102,63 +14102,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -14167,63 +14139,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "Ширина дисплея" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "Висота дисплея" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "Висота дисплею" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "Кількість пікселів за віссю" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "Кількість пікселів за віссю X" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Кількість пікселів за віссю Y" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "Горизонтальне віддзеркалення дисплея" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "Віддзеркалити горизонтально" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "Увімкнути горизонтальне віддзеркалення вихідних зображень" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "Вертикальне віддзеркалення дисплея" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "Віддзеркалити вертикально" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "Увімкнути вертикальне віддзеркалення вихідних зображень" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "Орієнтація дисплея" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -14233,55 +14205,55 @@ msgstr "" "Портретний режим переверне значення параметрів ширини та висоти дисплея, а " "вихідні зображення повернуть на 90 градусів." -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "Альбомна" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "Книжкова" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "Швидкий" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "Швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "Час швидкого нахилу" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "Повільний" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "Повільний нахил" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "Час повільного нахилу" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "Заповнена область" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -14291,61 +14263,61 @@ msgstr "" "Якщо область друку перевищує вказане значення,\n" "тоді буде використовуватися повільний нахил, інакше - швидкий нахил" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "Корекція масштабування принтера" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "Абсолютна корекція принтера" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "Надує або спустить нарізані 2D-полігони відповідно до знака корекції." -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "Мінімальна ширина слонової стопи" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" "Мінімальна ширина частей, яку слід підтримувати, виконуючи компенсацію стопи " "слона." -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "Гамма - корекція принтера" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -14355,43 +14327,43 @@ msgstr "" "гамми означає порогове значення з порогом посередині. Така поведінка усуває " "згладжування, не втрачаючи дірок у полігонах." -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "Тип SLA-матеріалу" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "Висота першого шару" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "Об’єм пляшки" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "мл" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "Вага пляшки" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "кг" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "г/мл" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "грошових одиниць/пляшку" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "Шари початкового контакту" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" @@ -14399,103 +14371,103 @@ msgstr "" "Кількість шарів, необхідних для часу експозиції, зменшується від початкового " "часу експозиції до часу експозиції" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "Мінімальний час експозиції" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "Максимальний час експозиції" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "Час експозиції" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "Мінімальний час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "Максимальний час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "Час початкової експозиції" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "Поправка на розширення" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "Примітки до друкованих SLA-матеріалів" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "Тут ви можете помістити свої нотатки щодо SLA-матеріалу." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "Профіль SLA-матеріалу за замовчанням" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "Генерувати підтримки" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "Генерувати підтримки для моделей" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "Діаметр головки стовпа" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "Діаметр носику головки" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "Проникнення головки" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "На скільки носики повинні проникати в поверхню моделі" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "Ширина головки стовпа" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "Ширина від центру задньої кулі до передньої кулі" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "Діаметр стовпів" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "Діаметр стовпів підтримки у мм" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "Процентний діаметр малих стовпів" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "" "The percentage of smaller pillars compared to the normal pillar diameter " "which are used in problematic areas where a normal pilla cannot fit." @@ -14503,11 +14475,11 @@ msgstr "" "Відсоток менших стовпів порівняно з нормальним діаметром стовпа, які " "використовуються в проблемних зонах, де нормальний стовп не може поміститися." -#: src/libslic3r/PrintConfig.cpp:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "Макс. мостів на стовпі" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -14515,11 +14487,11 @@ msgstr "" "Максимальна кількість мостів, які можна розмістити на тримаючому стовпі. " "Мости утримують верхівки опор і з'єднуються зі стовпами як гілочки." -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "Режим з'єднання стовпів" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14529,23 +14501,23 @@ msgstr "" "поперечним (подвійний зигзагоподібний) або динамічним, який автоматично " "перемикається між першими двома залежно від відстані двох стовпів." -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "Зіг-Заг" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "Перехресний" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "Динамічний" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "Коефіцієнт розширення стовпа" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -14553,27 +14525,27 @@ msgstr "" "Злиття мостів або стовпів в інші стовпи може збільшити радіус. Нуль означає " "відсутність збільшення, один означає повне збільшення." -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "Діаметр основи підтримки" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "Діаметр основи стовпа у мм" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "Висота основи підтримки" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "Висота конуса основи стовпа" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "Безпечна відстань між основами підтримки" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 " @@ -14583,27 +14555,27 @@ msgstr "" "нульового підняття, коли між моделлю та майданчиком вставляється зазор " "відповідно до цього параметра." -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "Критичний кут" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "Кут за замовчуванням для з'єднання опорних палочок і з'єднань." -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "Максимальна довжина мосту" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "Максимальна довжина мосту" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "Макс. відстань між стовпами" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." @@ -14611,7 +14583,7 @@ msgstr "" "Максимальна відстань двох стовпів для з'єднання між собою. Нульове значення " "забороняє каскадування стовпів." -#: src/libslic3r/PrintConfig.cpp:3721 +#: src/libslic3r/PrintConfig.cpp:3694 msgid "" "How much the supports should lift up the supported object. If \"Pad around " "object\" is enabled, this value is ignored." @@ -14619,39 +14591,39 @@ msgstr "" "Скільки опор повинно піднімати підтримуваний об’єкт. Якщо ввімкнено функцію " "\"Подушка навколо об’єкта\", це значення ігнорується." -#: src/libslic3r/PrintConfig.cpp:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "Відносний показних щільності точок підтримки." -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "Мінімальна відстань опорних точок" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "Жодні точки підтримки не будуть розміщені ближче цього порогу." -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "Використовувати полушку" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "Додати подушечку під підтримувану модель" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "Товщина стінки подушки" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "Товщина подушки та її додаткових стінок порожнини." -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "Висота стінки подушки" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -14663,19 +14635,19 @@ msgstr "" "можуть мати надзвичайний ефект всмоктування всередині порожнини, що " "ускладнює відшарування відбитка з фольги." -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "Розмір краю подушки" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "Як далеко повинна розширюватися подушка навколо вміщуваної геометрії" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "Макс. відстань об'єднання" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -14685,45 +14657,45 @@ msgstr "" "великої. Цей параметр визначає, наскільки далеко повинен бути центр двох " "менших подушок. Якщо вони стануть ближче, вони об’єднаються в одну велику." -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "Нахил стінки подушки" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" "Нахил стінки подушки відносно площини столу. 90 градусів означає прямі стіни." -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "Створити подушку навколо об’єкта та ігнорувати підняття підтримки" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "Подушка скрізь навколо об’єкта" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "Створити подушку навколо об’єкта" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "Розрив Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" "Розрив між дном об’єкта та генерованою подушкою в режимі нульового підняття." -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "Крок з'єднувача Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." @@ -14731,45 +14703,45 @@ msgstr "" "Відстань між двома з'єднувальними паличками, які з'єднують об'єкт та " "генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "Ширина з'єднувача Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" "Ширина з'єднувальної паличками, що з'єднує об'єкт та генеровану подушку." -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "Глибина проникнення з'єднувача Подушка-Об'єкт" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "На скільки крихітні з'єднувачі повинні проникати в тіло моделі." -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "Увімкнути формування порожнин" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "Випорожнити модель, щоб мати порожній інтер’єр" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "Товщина стінки" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "Мінімальна товщина стінки порожнистої моделі." -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "Точність" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." @@ -14777,7 +14749,7 @@ msgstr "" "Продуктивність проти точності розрахунку. Менші значення можуть спричинити " "небажані артефакти." -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -14790,74 +14762,74 @@ msgstr "" "назад до заданого зміщення. Більша відстань до закриття робить інтер’єр " "більш округлим. При нулі інтер’єр найбільше буде нагадувати екстер’єр." -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "Експорт OBJ" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "Експорт моделі як OBJ." -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "Експорт SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "Нарізати модель та експортувати шари SLA-друку до PNG." -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "Експортувати 3MF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "Експорт моделі як 3MF." -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "Експортувати AMF" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "Експорт моделі як АMF." -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "Експорт STL" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "Експорт моделі як STL." -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "Нарізати та експортувати G-код." -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "Переглядач G-коду" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "Візуалізувати вже нарізаний та збережений G-код" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "Нарізати" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." @@ -14865,71 +14837,71 @@ msgstr "" "Нарізати модель як FFF або SLA на основі значення printer_technology, " "зазначеного у конфігурації." -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "Допомога" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "Показати цю підказку." -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "Допомога (FFF параметри)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "Показати повний список параметрів конфігурації друку / G-коду." -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "Допомога (SLA параметри)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "Показати повний перелік параметрів конфігурації SLA-друку." -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "Інформація про вихідну модель" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "Писати інформацію про модель на консолі." -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "Зберегти файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "Зберегти конфігурацію у вказаному файлі." -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "Вирівняти XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "Вирівняйте модель за заданою точкою." -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "Розрізати модель за заданим Z." -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "Центр" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "Відцентруйте друк навколо заданого центру." -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "Не впорядковувати" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." @@ -14937,33 +14909,33 @@ msgstr "" "Не переставляйте дані моделі перед об’єднанням та зберігайте їх початкові " "координати XY." -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "Дублювати" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "Збільшить кількість копій на цей коефіцієнт." -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "Дублювати за сіткою" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "Збільшить кількість копій, створивши сітку." -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 msgid "" "Arrange the supplied models in a plate and merge them in a single model in " "order to perform actions once." @@ -14971,7 +14943,7 @@ msgstr "" "Розташувати поставлені моделі на платформі та об’єднати їх в одну модель, " "щоб виконати дії один раз." -#: src/libslic3r/PrintConfig.cpp:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14980,31 +14952,31 @@ msgstr "" "кожного разу, коли нам потрібно нарізати модель для виконання запитуваної " "дії)." -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "Кут обертання навколо осі Z у градусах." -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "Обертати навколо осі X" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "Кут обертання навколо осі Х у градусах." -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "Обертати навколо осі Y" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "Кут обертання навколо осі Y у градусах." -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "Коефіцієнт масштабування або відсоток." -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." @@ -15012,29 +14984,29 @@ msgstr "" "Визначити непоєднані частини у даній моделі (моделях) та розділити їх на " "окремі об’єкти." -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "Масштабувати під область друку" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "Масштабувати під задану область друку." -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "Ігнорувати неіснуючі конфігураційні файли" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "Не відмовляти, якщо файл, який подається до --load, не існує." -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -15042,27 +15014,27 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "Завантажити файл конфігурації" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -15070,11 +15042,11 @@ msgstr "" "Завантажити конфігурацію із зазначеного файлу. Його можна використовувати " "більше одного разу для завантаження опцій з декількох файлів." -#: src/libslic3r/PrintConfig.cpp:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "Вихідний файл" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 msgid "" "The file where the output will be written (if not specified, it will be " "based on the input file)." @@ -15082,11 +15054,11 @@ msgstr "" "Файл, в який буде записано вихідні дані (якщо не вказано, він базуватиметься " "на вхідному файлі)." -#: src/libslic3r/PrintConfig.cpp:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "Режим одного екземпляру PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -15097,11 +15069,11 @@ msgstr "" "вікно PrusaSlicer. Замінює значення конфігурації \"single_instance\" у " "налаштуваннях програми." -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "Каталог даних" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -15110,11 +15082,11 @@ msgstr "" "Завантажити та зберегти налаштування у вказаному каталозі. Це корисно для " "ведення різних профілів або включення конфігурацій із мережевого сховища." -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "Рівень журналізації" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" @@ -15125,11 +15097,11 @@ msgstr "" "Наприклад. loglevel=2 журнали фатальних, помилок і повідомлень рівня " "попередження." -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "Візуалізувати за допомогою програмного засобу візуалізації" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/localization/zh_CN/PrusaSlicer.mo b/resources/localization/zh_CN/PrusaSlicer.mo index 6d2ce2b8e0..66c4a83cad 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 3e91e471ea..42b5540dfa 100644 --- a/resources/localization/zh_CN/PrusaSlicer_zh_CN.po +++ b/resources/localization/zh_CN/PrusaSlicer_zh_CN.po @@ -7,59 +7,59 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" -"PO-Revision-Date: 2022-06-25 23:45-0700\n" -"Last-Translator: Yifei Ding \n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" +"PO-Revision-Date: 2022-08-22 12:37+0800\n" +"Last-Translator: Bral@qq.com\n" "Language-Team: \n" "Language: zh_CN\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: Poedit 3.0.1\n" +"X-Generator: Poedit 3.1\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "部分版权" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "版权所有" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "所有以下程序(库)的许可协议是应用程序许可协议的一部分" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "关于 %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "版本" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "根据" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 通用公共许可证,第 3 版" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" "PrusaSlicer 是以 Alessandro Ranellucci 和 RepRap 社区的 Slic3r 为基础的。" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -68,7 +68,7 @@ msgstr "" "Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph " "Lenox, Y.Sapir, Mike Sheldrake, Vojtech Bubnik 等人的贡献。" -#: src/slic3r/GUI/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "复制版本信息" @@ -205,7 +205,7 @@ msgstr "计划上传到 `%1%`。请参阅窗口-> 打印主机上传队列" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "大小" @@ -263,19 +263,18 @@ msgstr "G-Code 0,0 坐标相对于矩形框左前角的距离。" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "mm" @@ -308,7 +307,7 @@ msgid "Load shape from STL..." msgstr "从 STL 文件加载形状..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "设置" @@ -321,7 +320,7 @@ msgid "Load..." msgstr "加载..." #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "移除" @@ -427,7 +426,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1449 #: src/libslic3r/PrintConfig.cpp:285 msgid "Layer height" -msgstr "层高" +msgstr "层高度" #: src/slic3r/GUI/ConfigManipulation.cpp:61 msgid "" @@ -435,13 +434,13 @@ msgid "" "\n" "The first layer height will be reset to 0.01." msgstr "" -"首层高度无效。\n" +"第一层高度无效。\n" "\n" -"首层高度将重置为0.01。" +"第一层高度将重置为 0.01。" #: src/slic3r/GUI/ConfigManipulation.cpp:62 src/libslic3r/PrintConfig.cpp:1226 msgid "First layer height" -msgstr "首层高度" +msgstr "第一层高度" #: src/slic3r/GUI/ConfigManipulation.cpp:82 msgid "" @@ -453,17 +452,17 @@ msgid "" "- Ensure vertical shell thickness enabled\n" "- Detect thin walls disabled" msgstr "" -"螺旋花瓶(单线打印)模式需要:\n" -"- 一圈轮廓\n" +"螺旋花瓶模式需要:\n" +"- 一个周长\n" "- 无顶部固体层\n" "- 0% 填充密度\n" "- 无支撑材料\n" -"- 启用确保垂直外壳厚度\n" +"- 确保启用垂直外壳厚度\n" "- 禁用检测薄壁" #: src/slic3r/GUI/ConfigManipulation.cpp:90 msgid "Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "要调整这些设置以启用螺旋花瓶吗?" +msgstr "要我调整这些设置以启用螺旋花瓶吗?" #: src/slic3r/GUI/ConfigManipulation.cpp:91 msgid "Spiral Vase" @@ -505,8 +504,8 @@ msgid "" "Supports work better, if the following feature is enabled:\n" "- Detect bridging perimeters" msgstr "" -"如果启用以下功能,则支撑工作得更好:\n" -"- 检测桥接轮廓" +"如果启用以下功能,则支撑工作得更好:\n" +"- 检测桥接周长" #: src/slic3r/GUI/ConfigManipulation.cpp:167 msgid "Shall I adjust those settings for supports?" @@ -538,19 +537,19 @@ msgstr "我要换成直线填充模式吗?" msgid "Infill" msgstr "填充" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "头部穿透不应大于头部宽度。" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "无效头部穿透" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "针头直径应小于支柱直径。" -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "无效的针头直径" @@ -659,7 +658,7 @@ msgid "Standard" msgstr "标准" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "所有" @@ -911,7 +910,7 @@ msgstr "选择 %s 支持的其他供应商" msgid "Firmware Type" msgstr "固件类型" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "固件" @@ -1208,7 +1207,7 @@ msgstr "执行" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "撤销" @@ -1847,7 +1846,7 @@ msgstr "确认" msgid "Cancelling..." msgstr "正在取消..." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "形状画廊" @@ -1863,7 +1862,7 @@ msgstr "加在床上" msgid "Add selected shape(s) to the bed" msgstr "将选定形状添加到床上" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "加入" @@ -1873,7 +1872,7 @@ msgstr "添加一个或多个自定义形状" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "删除" @@ -2046,7 +2045,7 @@ msgstr "期间" #: src/slic3r/GUI/GCodeViewer.cpp:3609 src/slic3r/GUI/GUI_Preview.cpp:1049 #: src/libslic3r/PrintConfig.cpp:2905 msgid "Travel" -msgstr "空驶" +msgstr "旅行" #: src/slic3r/GUI/GCodeViewer.cpp:3612 msgid "Movement" @@ -2056,8 +2055,8 @@ msgstr "移动" msgid "Extrusion" msgstr "挤压" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "回抽" @@ -2112,7 +2111,7 @@ msgstr "打印设置" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "耗材" @@ -2132,7 +2131,7 @@ msgstr "隐身模式" #: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1212 #: src/libslic3r/PrintConfig.cpp:1257 msgid "First layer" -msgstr "首层" +msgstr "第一层" #: src/slic3r/GUI/GCodeViewer.cpp:3767 msgid "Total" @@ -2334,7 +2333,7 @@ msgid "Add..." msgstr "添加..." #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "全部删除" @@ -2381,7 +2380,7 @@ msgid "Next Undo action: %1%" msgstr "下一个撤消操作: %1%" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "重做" @@ -2423,7 +2422,7 @@ msgid "Selection-Remove from rectangle" msgstr "从矩形中选择-删除" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "剪切" @@ -2679,7 +2678,7 @@ msgid "Quality" msgstr "质量" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "近距离" @@ -2784,7 +2783,7 @@ msgstr "移动" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "旋转" @@ -2801,7 +2800,7 @@ msgstr "应用" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "比例" @@ -2853,7 +2852,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "当前仅当选择单个零件时才允许简化" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "错误" @@ -2937,7 +2936,7 @@ msgid "Minimal points distance" msgstr "最小点距离" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "支撑点密度" @@ -3152,7 +3151,7 @@ msgstr "" #: src/slic3r/GUI/GUI_App.cpp:270 msgid "Artwork model by Leslie Ing" -msgstr "" +msgstr "Leslie Ing 的艺术品模型" #: src/slic3r/GUI/GUI_App.cpp:411 #, boost-format @@ -3292,11 +3291,11 @@ msgstr "" #: src/slic3r/GUI/GUI_App.cpp:980 msgid "Import" -msgstr "进口" +msgstr "导入" #: src/slic3r/GUI/GUI_App.cpp:981 msgid "Don't import" -msgstr "不要进口" +msgstr "不要导入" #: src/slic3r/GUI/GUI_App.cpp:989 msgid "Continue and import newer configuration?" @@ -3696,7 +3695,7 @@ msgstr "致命错误,捕获异常:%1%" #: src/libslic3r/PrintConfig.cpp:2826 src/libslic3r/PrintConfig.cpp:2886 #: src/libslic3r/PrintConfig.cpp:2895 src/libslic3r/PrintConfig.cpp:3066 msgid "Layers and Perimeters" -msgstr "图层和轮廓" +msgstr "图层和周长" #: src/slic3r/GUI/GUI_Factories.cpp:56 src/slic3r/GUI/GUI_Factories.cpp:131 #: src/slic3r/GUI/GUI_Preview.cpp:249 src/slic3r/GUI/Tab.cpp:1547 @@ -3754,7 +3753,7 @@ msgid "Speed" msgstr "速度" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3773,56 +3772,55 @@ msgstr "挤出宽度" #: src/libslic3r/PrintConfig.cpp:516 src/libslic3r/PrintConfig.cpp:527 #: src/libslic3r/PrintConfig.cpp:543 msgid "Skirt and brim" -msgstr "裙边和brim" +msgstr "环绕和裙边" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "高级" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "支持" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "垫" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "掏空" @@ -3964,7 +3962,7 @@ msgid "Revert conversion from meters" msgstr "从仪表恢复转换" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "合并" @@ -4025,7 +4023,7 @@ msgid "Split the selected object into individual parts" msgstr "将选定对象拆分为各个部分" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "分裂" @@ -4659,11 +4657,11 @@ msgstr "高度" msgid "Width" msgstr "宽度" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "风扇速度" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "温度" @@ -4682,7 +4680,7 @@ msgstr "功能类型" #: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:330 #: src/libslic3r/ExtrusionEntity.cpp:352 msgid "Perimeter" -msgstr "轮廓" +msgstr "周长" #: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:331 #: src/libslic3r/ExtrusionEntity.cpp:354 @@ -4933,7 +4931,7 @@ msgstr "导入完成。" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:187 msgid "The file does not exist." -msgstr "" +msgstr "该文件不存在。" #: src/slic3r/GUI/Jobs/SLAImportJob.cpp:221 msgid "" @@ -4949,7 +4947,7 @@ msgstr "不能在床上加载包含多部分对象的 SLA 项目" msgid "Attention!" msgstr "注意!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "键盘快捷键" @@ -4986,7 +4984,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "从 ini/amf/3mf/gcode 加载配置并合并" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "导出 G-Code" @@ -5333,13 +5331,13 @@ msgstr "设置所选项目的挤出机编号" msgid "Objects List" msgstr "对象列表" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "打开一个 G-Code 文件" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "从磁盘重新加载制版机" @@ -5376,7 +5374,7 @@ msgid "Show/Hide G-code window" msgstr "显示/隐藏 G-Code 窗口" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "预览" @@ -5454,7 +5452,7 @@ msgid "Keyboard shortcuts" msgstr "键盘快捷键" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "打开一个新的 PrusaSlicer 实例" @@ -5462,11 +5460,11 @@ msgstr "打开一个新的 PrusaSlicer 实例" msgid "G-code preview" msgstr "G-Code 预览" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "打开 G-Code 查看器" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "打开 PrusaSlicer" @@ -5492,13 +5490,13 @@ msgid "Print Settings" msgstr "打印设置" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "材料设置" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "耗材设置" @@ -5581,100 +5579,100 @@ msgstr "显示关于对话框" msgid "Show Tip of the Day" msgstr "显示每日小贴士" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "在右下角打开“每日提示”通知,或在已打开的情况下显示另一个提示。" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "显示键盘快捷键的列表" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "等距" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "顶部" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "顶部视图" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "底部" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "底部视图" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "前面" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "前视图" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "后面" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "后视图" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "左面" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "左视图" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "右面" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "右视图" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "新建项目(&N)" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "启动一个新项目" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "打开项目(&O)" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "打开项目文件" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "最近项目" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 msgid "" "The selected project is no longer available.\n" "Do you want to remove it from the recent projects list?" @@ -5682,522 +5680,522 @@ msgstr "" "所选项目不再可用。\n" "是否要将其从最近的项目列表中删除?" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "保存项目(&S)" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "保存当前项目文件" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "将项目另存为(&A)" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "将当前项目文件另存为" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "导入 STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "加载模型" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "导入 STL (英制单位)" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "加载使用英制单位保存的模型" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "导入 SL1 / SL1S 档案" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "加载 SL1 / Sl1S 存档" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "导入配置(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "加载导出的配置文件" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "从项目导入配置(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "从项目文件加载配置" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "导入配置组(&B)" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "从包加载预设" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "导入(&I)" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "导出 G-Code(&G)" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "将当构建板导出为 G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "发送 G-Code(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "发送以 G-Code 打印当前板" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "将 G-Code 导出到 SD 卡/闪存驱动器" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "将当前板作为 G-Code 导出到 SD 卡/闪存驱动器" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "将板材导出为 STL(&S)" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "将当前构建板导出为 STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "将板材导出为 STL,包括支架(&I)" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "导出当前构建板为 STL,包括支撑" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "将工具路径导出为 OBJ(&T)" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "导出工具路径作为 OBJ" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "导出配置(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "将当前配置导出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "导出配置包(&B)" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "将所有预设导出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "使用物理打印机导出配置包" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "将包括物理打印机在内的所有预设导出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "导出(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "弹出 SD 卡/闪存驱动器(&T)" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "将 G-Code 导出到 SD 卡/闪存驱动器后将其弹出。" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "将文件切片成 G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "快速切片并另存为" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "将文件切片成 G-Code, 并另存为" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "重复上次快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "重复最后一个快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "立即重新切片(&W)" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "开始新的切片流程" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "修复 STL 文件(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "自动修复 STL 文件" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "G-Code 预览(&G)" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "退出(&Q)" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "退出 %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "全选(&S)" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "选择所有对象" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "取消选择(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "取消选择所有对象" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "删除所选内容(&D)" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "删除当前选择" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "全部删除(&A)" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "删除所有对象" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "撤销(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "重做(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "复制(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "将选择复制到剪贴板" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "粘贴(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "粘贴剪贴板" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "从磁盘重新加载(&L)" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "搜索(&H)" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "在设置中搜索" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "构建板选项卡(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "显示平台构建板" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "打印设置选项卡(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "显示打印设置" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "耗材设置选项卡(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "显示耗材设置" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "打印机设置选项卡(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "显示打印机设置" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "显示 3D 编辑视图" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "预览(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "显示 3D 切片预览" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "打开对话框以修改形状库" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "打印主机上传队列(&H)" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "显示打印主机上传队列窗口" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "打开新实例" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "比较预设" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "比较预设" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "显示标签(&L)" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "在三维场景中显示对象/实例标签" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "折叠边栏(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "折叠边栏" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "全屏(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "全屏" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "文件(&F)" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "编辑(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "窗口(&W)" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "视图(&V)" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "帮助(&H)" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "打开 G-Code(&O)" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "打开 PrusaSlicer(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "导出(&X)" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "发送到打印机(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "配合设置选项卡(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "选择要切片的文件 (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "没有预切片的文件。" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "预切片文件 (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") 无法找到。" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "文件未找到" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "将 %s 文件另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-Code" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "将 zip 文件另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "切片" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "处理 %s" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "%1% 已成功切片。" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "切片完成!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "选择要修复的 STL 文件:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "将 OBJ 文件 (不像 STL 那样容易发生坐标错误) 保存为:" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "您的文件已修复。" -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "修复" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "将配置另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "加载配置文件" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "选择要加载的配置:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "导出配置包" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "某些预设已修改,未保存的更改将不会导出到配置包中。" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "将预设配置组另存为:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "加载配置包" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 预设已成功导入。" @@ -6416,8 +6414,8 @@ msgstr "实例" msgid "Instance %d" msgstr "实例 %d" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "图层" @@ -6493,7 +6491,7 @@ msgstr "打印机的描述性名称" msgid "Add preset for this printer device" msgstr "添加此打印机设备的预设" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "打印主机上传" @@ -6556,7 +6554,7 @@ msgstr "提供的名称为空。无法保存。" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:634 msgid "You have to enter a printer name." -msgstr "" +msgstr "您必须输入打印机名称。" #: src/slic3r/GUI/PhysicalPrinterDialog.cpp:642 #, boost-format @@ -6640,12 +6638,12 @@ msgstr "工具更换次数" #: src/slic3r/GUI/Plater.cpp:431 msgid "Select what kind of support do you need" -msgstr "选择需要的支撑类型" +msgstr "选择您需要何种支撑" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" -msgstr "仅生成打印面板上的支撑" +msgstr "仅从打印面板支撑" #: src/slic3r/GUI/Plater.cpp:434 src/slic3r/GUI/Plater.cpp:564 msgid "For support enforcers only" @@ -6663,7 +6661,7 @@ msgstr "裙边" msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." -msgstr "此标志启用将在首层上的每个对象周围打印裙边." +msgstr "此标志启用将在第一层上的每个对象周围打印裙边。" #: src/slic3r/GUI/Plater.cpp:477 msgid "Purging volumes" @@ -6736,10 +6734,10 @@ msgstr "挤出机上的长丝 %1%" #: src/slic3r/GUI/Plater.cpp:1402 msgid "(including spool)" -msgstr "(包括料盘)" +msgstr "(包括线轴)" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "费用" @@ -7222,10 +7220,10 @@ msgstr "修复网格后,移除了定制支架、接缝和多材料喷漆。" msgid "Paste From Clipboard" msgstr "从剪贴板粘贴" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "常规" @@ -7691,7 +7689,7 @@ msgid "Add/Remove presets" msgstr "添加/删除预设" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "添加物理打印机" @@ -7703,7 +7701,7 @@ msgstr "编辑预设" msgid "Change extruder color" msgstr "更改挤出机颜色" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "编辑物理打印机" @@ -7777,7 +7775,7 @@ msgstr "除前 %1% 图层外。" #: src/slic3r/GUI/PresetHints.cpp:61 msgid "except for the first layer." -msgstr "首层除外。" +msgstr "第一层除外。" #: src/slic3r/GUI/PresetHints.cpp:64 msgid "During the other layers, fan will be turned off." @@ -8004,11 +8002,11 @@ msgstr "完全不存在" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -8119,12 +8117,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "只需切换到 \"%1%\" 预设" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "隐形" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "正常" @@ -8383,7 +8381,7 @@ msgstr "完整配置文件名" msgid "symbolic profile name" msgstr "符号配置文件名" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "层和轮廓" @@ -8449,7 +8447,7 @@ msgstr "自动调速 (高级)" #: src/slic3r/GUI/Tab.cpp:1615 msgid "Pressure equalizer (experimental)" -msgstr "" +msgstr "压力均衡器(实验)" #: src/slic3r/GUI/Tab.cpp:1619 msgid "Multiple Extruders" @@ -8457,7 +8455,7 @@ msgstr "多个挤出机" #: src/slic3r/GUI/Tab.cpp:1627 msgid "Ooze prevention" -msgstr "预防漏料" +msgstr "Ooze 预防" #: src/slic3r/GUI/Tab.cpp:1647 msgid "Extrusion width" @@ -8471,60 +8469,60 @@ msgstr "交叠" msgid "Flow" msgstr "流量" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "其他" #: src/slic3r/GUI/Tab.cpp:1674 msgid "Arachne perimeter generator" -msgstr "" +msgstr "Arachne 轮廓生成器" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "输出选项" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "顺序打印" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "挤出机间隙" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "输出文件" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "后处理脚本" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "备注" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "依赖" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "配置文件依赖" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "后处理脚本应适当修改 G-Code 文件。" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8538,82 +8536,82 @@ msgstr[0] "" "下一行 %s 包含保留关键字。\n" "请删除它们,因为它们可能会导致 G-Code 可视化和打印时间估计出现问题。" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "在中找到保留关键字" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "耗材参数替换" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "喷嘴" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "热床" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "冷却" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "启用" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "风扇设置" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "冷却阈值" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "耗材特性" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "打印速度覆盖" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "擦料塔参数" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "单挤出机 多色 打印机的工具更换参数" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "冲击设置" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "自定义 G-Code" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "起始 G-Code" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "结尾 G-Code" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "容积流量提示不可用" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8632,20 +8630,20 @@ msgstr "" "物理打印机配置文件编辑器也会打开。\n" "物理打印机配置文件存储在 PrusaSlicer/Physical_Printer 目录中。" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "大小和坐标" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "功能" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "打印机的挤出机数。" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8656,64 +8654,64 @@ msgstr "" "和所有挤出机必须具有相同的直径。\n" "是否要将所有挤出机的直径更改为第一挤出机喷嘴直径值?" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "喷嘴直径" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "图层更改前 G-Code" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "图层更改后 G-Code" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "工具更改 G-Code" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "模型对象之间的 G-Code (用于顺序打印)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "颜色更改 G-Code" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "暂停打印 G-Code" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "模板自定义 G-Code" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "显示" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "倾斜" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "倾斜时间" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "修正" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "曝光" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8722,68 +8720,68 @@ msgstr "曝光" msgid "Machine limits" msgstr "机器限制" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "此列中的值用于正常模式" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "此列中的值用于隐身模式" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "最大进给率" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "最大加速度" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "抖动限制" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "最小进给率" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "单挤出机 MM 设置" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "单挤出机多材料参数" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 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:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "层高度限制" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "位置(适用于多挤出打印机)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "仅提升 Z" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "工具禁用时的回抽 (多挤出机设置的高级设置)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "重置为耗材颜色" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8793,51 +8791,51 @@ msgstr "" "\n" "我应禁用它,以便启用固件回抽?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "固件回抽" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "已选择新打印机预设" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "独立的" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "移除" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "删除" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "这是这台物理打印机的最后一次预设。" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "是否确实要从物理打印机 \"%2%\" 中删除 \"%1%\" 预设?" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "下面的物理打印机基于此预设,您将要删除。" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "请注意,选定的预设也将从这些打印机中删除。" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8846,62 +8844,62 @@ msgid_plural "" "delete." msgstr[0] "下面的物理打印机仅基于此预设,您将要删除。" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "请注意,删除选定预设后,这些打印机将被删除。" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "是否确实要将所选预设 %1%?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "%1% 预设" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "设置" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "查找" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "替换为" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "正则表达式" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "不区分大小写" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "整字" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "匹配单线" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "是否确实要删除所有替换?" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "机器限制将发送到 G-Code,并用于估计打印时间。" -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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 " @@ -8910,29 +8908,29 @@ msgstr "" "机器限制不会发送到 G-Code,但它们将用于估计打印时间,因此可能不准确,因为打印" "机可能会应用不同的机器限制集。" -#: src/slic3r/GUI/Tab.cpp:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "未设置机器限制,因此打印时间估计可能不准确。" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "锁定锁" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "解锁锁" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8942,12 +8940,12 @@ msgstr "" "指示某些设置已更改,并且不等于当前选项组的系统(或默认值)值。\n" "单击\"锁定锁定\"图标可将当前选项组的所有设置重置为系统(或默认值)值。" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "灰色点" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 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." @@ -8955,12 +8953,12 @@ msgstr "" "对于左侧按钮:指示非系统(或非默认)预设,\n" "对于右侧按钮:指示设置尚未修改。" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "后箭头" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8970,13 +8968,13 @@ msgstr "" "指示设置已更改,不等于当前选项组的最后一个保存预设。\n" "单击\"后退箭头\"图标可将当前选项组的所有设置重置为上次保存的预设。" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 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:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -8986,17 +8984,17 @@ msgstr "" "锁定的锁图标指示某些设置已更改,并且不等于当前选项组的系统(或默认值)值。\n" "单击此处可将当前选项组的所有设置重置为系统(或默认值)值。" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "灰色点图标表示非系统(或非默认)预设。" -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 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:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -9006,13 +9004,13 @@ msgstr "" "后退箭头图标表示设置已更改,不等于当前选项组的最后保存预设。\n" "单击此处可将当前选项组的所有设置重置为上次保存的预设。" -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "锁定锁定图标表示该值与系统(或默认值)值相同。" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -9021,13 +9019,13 @@ msgstr "" "锁定的锁 图标指示该值已更改,不等于系统(或默认值)值。\n" "单击以将当前值重置为系统(或默认值)值。" -#: src/slic3r/GUI/Tab.cpp:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "灰色点图标表示该值与上次保存的预设中的值相同。" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -9036,31 +9034,31 @@ msgstr "" "后退箭头图标指示该值已更改,不等于上次保存的预设。\n" "单击以将当前值重置为上次保存的预设。" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "材料" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "材料打印配置文件" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "支撑头" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "支撑支柱" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "支撑杆和接头的连接" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "自动生成" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format msgid "" "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" @@ -9069,11 +9067,11 @@ msgstr "" "\"%1%\" 被禁用,因为 \"%2%\" 在 \"%3%\" 类别中处于启用状态。\n" "要启用 \"%1%\",请关闭 \"%2%\"" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "对象高程" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "对象周围填充" @@ -9159,7 +9157,7 @@ msgid "" msgstr "访问 “首选项” 并选中 \"%1%\",再次询问未保存的更改。" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "有些字段太长,无法容纳。鼠标右键单击显示全文。" @@ -9219,39 +9217,39 @@ msgid "" msgstr "预设 \"%1%\" 与新的打印配置文件不兼容,它有以下未保存的更改:" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "挤出机计数" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "选择要比较的预设" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "显示所有预设(包括不兼容)" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "左预设值" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "右预设值" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "其中一个预设未找到" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "不同的预设有不同的打印机技术" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "预设是一样的" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." @@ -9259,11 +9257,11 @@ msgstr "" "预设是不同的。\n" "单击此按钮为左右预设选择相同的预设。" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "未定义类别" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "未定义组" @@ -9845,7 +9843,7 @@ msgstr "中止" #: src/libslic3r/GCode.cpp:539 msgid "There is an object with no extrusions in the first layer." -msgstr "首层中有一个没有拉伸的对象。" +msgstr "第一层中有一个没有拉伸的对象。" #: src/libslic3r/GCode.cpp:570 #, boost-format @@ -9907,26 +9905,26 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "无法计算 %1% 的拉伸宽度:无法访问变量 \"%2%\"。" -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "所选 3mf 文件已使用较新版本的 %1% 保存,不兼容。" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "所选 3MF 包含 FDM,支持使用较新版本的 PrusaSlicer 绘制对象,不兼容。" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "所选 3MF 包含使用较新版本的 PrusaSlicer 的接缝绘制对象,不兼容。" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10135,7 +10133,7 @@ msgstr "擦料塔目前仅支持相对挤出机寻址 (use_relative_e_distances= #: src/libslic3r/Print.cpp:496 msgid "Ooze prevention is currently not supported with the wipe tower enabled." -msgstr "当前不支持启用擦料塔时同时启用预防漏料。" +msgstr "启用擦料塔时,当前不支持 Ooze 预防。" #: src/libslic3r/Print.cpp:498 msgid "" @@ -10225,7 +10223,7 @@ msgstr "" #: src/libslic3r/Print.cpp:651 msgid "First layer height can't be greater than nozzle diameter" -msgstr "首层高度不能大于喷嘴直径" +msgstr "第一层高度不能大于喷嘴直径" #: src/libslic3r/Print.cpp:656 msgid "Layer height can't be greater than nozzle diameter" @@ -10413,7 +10411,8 @@ 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 平面上缩小, 以补偿首层斜视, 也就是大象脚的效果。" +"第一层将被相对于配置的值在 XY 平面上缩小, 以补偿第一层斜视, 也就是大象脚的效" +"果。" #: src/libslic3r/PrintConfig.cpp:268 msgid "G-code thumbnails" @@ -10429,13 +10428,13 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:275 msgid "Format of G-code thumbnails" -msgstr "" +msgstr "G-Code 缩略图格式" #: src/libslic3r/PrintConfig.cpp:276 msgid "" "Format of G-code thumbnails: PNG for best quality, JPG for smallest size, " "QOI for low memory firmware" -msgstr "" +msgstr "G-Code 缩略图格式: PNG 质量最佳,JPG 尺寸最小,QOI 用于低内存固件" #: src/libslic3r/PrintConfig.cpp:287 msgid "" @@ -10543,12 +10542,12 @@ msgid "" "is mostly useful with Bowden extruders which suffer from oozing. This " "feature slows down both the print and the G-code generation." msgstr "" -"优化移动移动,以尽量减少周界交叉。这在远程(Bowden)挤出机中最有用,因为这些" -"挤出机更容易漏料。启用此功能会降低打印和 G 代码生成速度。" +"优化移动移动,以尽量减少周界交叉。这在鲍登挤出机中最有用,它们容易渗漏。此功" +"能可降低打印和 G-Code 生成速度。" #: src/libslic3r/PrintConfig.cpp:402 msgid "Avoid crossing perimeters - Max detour length" -msgstr "避免穿越轮廓-最大绕行长度" +msgstr "避免穿越周长-最大绕行长度" #: src/libslic3r/PrintConfig.cpp:404 msgid "" @@ -10557,8 +10556,8 @@ msgid "" "travel path. Detour length could be specified either as an absolute value or " "as percentage (for example 50%) of a direct travel path." msgstr "" -"避免跨越轮廓的最大绕行长度。如果绕道长度超过该值,则避免穿越轮廓不适用于该行" -"驶路径。迂回长度可以指定为绝对值或直接行驶路径的百分比(例如50%)。" +"避免穿越周长的最大绕行长度。如果绕道长度超过该值,则避免穿越周长不适用于该行" +"驶路径。迂回长度可以指定为绝对值或直接行驶路径的百分比(例如 50%)。" #: src/libslic3r/PrintConfig.cpp:407 msgid "mm or % (zero to disable)" @@ -10572,7 +10571,7 @@ msgstr "其他层" msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." -msgstr "首层之后层的床温。将此设置为零以禁用输出中的床温控制命令。" +msgstr "第一层之后层的床温。将此设置为零以禁用输出中的床温控制命令。" #: src/libslic3r/PrintConfig.cpp:418 msgid "Bed temperature" @@ -10658,8 +10657,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -10674,9 +10673,8 @@ msgstr "此风扇速度在所有桥和悬空期间强制执行。" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -10726,18 +10724,18 @@ msgid "" "the first layer. When raft is used, no brim is generated (use " "raft_first_layer_expansion)." msgstr "" -"边缘的水平宽度,将围绕首层上的每个对象打印。使用筏板时,不会产生边缘(使用筏" -"板_首层_扩展)。" +"边缘的水平宽度,将围绕第一层上的每个对象打印。使用筏板时,不会产生边缘(使用" +"筏板_第一层_扩展)。" #: src/libslic3r/PrintConfig.cpp:526 msgid "Brim type" -msgstr "Brim 类型" +msgstr "裙边类型" #: src/libslic3r/PrintConfig.cpp:528 msgid "" "The places where the brim will be printed around each object on the first " "layer." -msgstr "边缘将在首层上的每个对象周围打印的位置。" +msgstr "边缘将在第一层上的每个对象周围打印的位置。" #: src/libslic3r/PrintConfig.cpp:534 msgid "No brim" @@ -10859,7 +10857,7 @@ msgid "" "specific acceleration values are used (perimeter/infill). Set zero to " "prevent resetting acceleration at all." msgstr "" -"这是打印机在使用特定于角色的加速值(轮廓/填充)后将重置为的加速。设置零以防止" +"这是打印机在使用特定于角色的加速值(周长/填充)后将重置为的加速。设置零以防止" "重置加速度。" #: src/libslic3r/PrintConfig.cpp:644 @@ -10879,8 +10877,8 @@ msgstr "" msgid "Default print profile" msgstr "默认打印配置文件" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -11010,8 +11008,8 @@ msgid "" "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 x 喷嘴直径。如果以百分比表示 (例如 200%), " +"将其设置为非零值, 以设置外部周长的手动挤出宽度。如果为零, 将使用默认挤出宽" +"度, 如果没有设置默认值将使用 1.125x 喷嘴直径。如果以百分比表示 (例如 200%), " "则将根据图层高度计算。" #: src/libslic3r/PrintConfig.cpp:754 src/libslic3r/PrintConfig.cpp:865 @@ -11019,8 +11017,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm 或 %" @@ -11048,7 +11047,7 @@ msgstr "首先打印外部轮廓" msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." -msgstr "将轮廓轮廓从最外层的轮廓打印到最里面的轮廓,而不是默认的反向顺序。" +msgstr "将轮廓周长从最外层的轮廓打印到最里面的轮廓,而不是默认的反向顺序。" #: src/libslic3r/PrintConfig.cpp:781 msgid "Extra perimeters if needed" @@ -11096,7 +11095,7 @@ msgid "Extruder Color" msgstr "挤出头颜色" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "这仅在 Slic3r 界面中用作视觉帮助。" @@ -11153,7 +11152,7 @@ msgid "" "height." msgstr "" "此值设置为非零值,以允许手动挤出宽度。如果向左留为零,Slic3r 将从喷嘴直径派生" -"挤出宽度(参见工具尖,了解轮廓挤出宽度、填充挤出宽度等)。如果以百分比表示" +"挤出宽度(参见工具尖,了解周长挤出宽度、填充挤出宽度等)。如果以百分比表示" "(例如:230%),则将在图层高度上计算。" #: src/libslic3r/PrintConfig.cpp:873 @@ -11185,7 +11184,7 @@ msgstr "" msgid "approximate seconds" msgstr "近似秒" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "颜色" @@ -11278,7 +11277,7 @@ msgstr "冷却运动正逐渐以这个速度加速。" #: src/libslic3r/PrintConfig.cpp:974 msgid "Minimal purge on wipe tower" -msgstr "擦料塔上的最小擦料体积" +msgstr "擦料塔上的最小清理量" #: src/libslic3r/PrintConfig.cpp:975 msgid "" @@ -11349,8 +11348,8 @@ msgstr "" "在此处输入您的耗材直径。需要比较好的精度,建议使用卡钳沿耗材进行多次测量,然" "后计算平均值。" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "密度" @@ -11396,7 +11395,7 @@ msgstr "元/公斤" #: src/libslic3r/PrintConfig.cpp:1074 msgid "Spool weight" -msgstr "料盘重量" +msgstr "线轴重量" #: src/libslic3r/PrintConfig.cpp:1075 msgid "" @@ -11405,14 +11404,14 @@ msgid "" "the calculated weight of the filament with the spool to find out whether the " "amount of filament on the spool is sufficient to finish the print." msgstr "" -"输入空耗材滑阀的重量。打印前,可以对部分消耗的耗材料盘进行称重,并将测量重量" -"与耗材和料盘的计算重量进行比较,以确定料盘上的耗材量是否足以完成打印。" +"输入空耗材滑阀的重量。打印前,可以对部分消耗的耗材线轴进行称重,并将测量重量" +"与耗材与线轴的计算重量进行比较,以确定线轴上的耗材量是否足以完成打印。" #: src/libslic3r/PrintConfig.cpp:1079 msgid "g" msgstr "g" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "(未知)" @@ -11475,7 +11474,7 @@ msgstr "螺旋形" #: src/libslic3r/PrintConfig.cpp:1178 msgid "Adaptive Cubic" -msgstr "自适应立方体" +msgstr "自适应立方" #: src/libslic3r/PrintConfig.cpp:1179 msgid "Support Cubic" @@ -11489,11 +11488,11 @@ msgstr "闪电" msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." -msgstr "这是打印机用于首层的加速。设置为零以禁用首层的加速度控制。" +msgstr "这是打印机用于第一层的加速。设置为零以禁用第一层的加速度控制。" #: src/libslic3r/PrintConfig.cpp:1193 msgid "First object layer over raft interface" -msgstr "筏接触面上的首个对象层" +msgstr "筏接口上的第一个对象层" #: src/libslic3r/PrintConfig.cpp:1194 msgid "" @@ -11501,18 +11500,18 @@ msgid "" "above raft interface. Set zero to disable acceleration control for first " "layer of object above raft interface." msgstr "" -"这是打印机将用于raft界面上方首层对象的加速度。设置为零可禁用筏接口上方首层物" -"体的加速度控制。" +"这是打印机将用于 raft 界面上方第一层对象的加速度。设置为零可禁用筏接口上方第" +"一层物体的加速度控制。" #: src/libslic3r/PrintConfig.cpp:1203 msgid "First layer bed temperature" -msgstr "首层床温" +msgstr "第一层床温" #: src/libslic3r/PrintConfig.cpp:1204 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." -msgstr "首层加热构建板温度。将此设置为零以禁用输出中的床温控制命令。" +msgstr "第一层加热构建板温度。将此设置为零以禁用输出中的床温控制命令。" #: src/libslic3r/PrintConfig.cpp:1214 msgid "" @@ -11521,9 +11520,9 @@ msgid "" "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%), 则将在首层高度上计算。如果设" -"置为零, 它将使用默认的挤出宽度。" +"将其设置为非零值, 以设置第一层的手动挤出宽度。您可以使用它强制挤出更多挤出物" +"以得到更好的附着力。如果以百分比表示 (例如 120%), 则将在第一层高度上计算。如" +"果设置为零, 它将使用默认的挤出宽度。" #: src/libslic3r/PrintConfig.cpp:1228 msgid "" @@ -11536,7 +11535,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1236 msgid "First layer speed" -msgstr "首层速度" +msgstr "第一层速度" #: src/libslic3r/PrintConfig.cpp:1237 msgid "" @@ -11544,12 +11543,12 @@ msgid "" "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%)它将缩放默认速度。" +"如果以 mm/s 表示为绝对值,则此速度将应用于第一层的所有打印移动,而不管其类型" +"如何。如果以百分比表示(例如:40%)它将缩放默认速度。" #: src/libslic3r/PrintConfig.cpp:1247 msgid "Speed of object first layer over raft interface" -msgstr "首层物体在筏板界面上的速度" +msgstr "第一层物体在筏板界面上的速度" #: src/libslic3r/PrintConfig.cpp:1248 msgid "" @@ -11558,12 +11557,12 @@ msgid "" "of their type. If expressed as a percentage (for example: 40%) it will scale " "the default speeds." msgstr "" -"如果以毫米/秒的绝对值表示,该速度将应用于raft界面上方首个对象层的所有打印移" -"动,无论其类型如何。如果以百分比(例如:40%)表示,它将缩放默认速度。" +"如果以毫米/秒的绝对值表示,该速度将应用于 raft 界面上方第一个对象层的所有打印" +"移动,无论其类型如何。如果以百分比(例如:40%)表示,它将缩放默认速度。" #: src/libslic3r/PrintConfig.cpp:1258 msgid "First layer nozzle temperature" -msgstr "首层喷嘴温度" +msgstr "第一层喷嘴温度" #: src/libslic3r/PrintConfig.cpp:1259 msgid "" @@ -11571,12 +11570,12 @@ msgid "" "manually during print, set this to zero to disable temperature control " "commands in the output G-code." msgstr "" -"首层的喷嘴温度。如果要在打印期间手动控制温度,请将其设置为零,以禁用输出G代码" -"中的温度控制命令。" +"第一层的喷嘴温度。如果要在打印期间手动控制温度,请将其设置为零,以禁用输出 G-" +"Code 中的温度控制命令。" #: src/libslic3r/PrintConfig.cpp:1267 msgid "Full fan speed at layer" -msgstr "风扇全速度层高" +msgstr "层的全风扇速度" #: src/libslic3r/PrintConfig.cpp:1268 msgid "" @@ -11586,9 +11585,9 @@ msgid "" "\"disable_fan_first_layers\", in which case the fan will be running at " "maximum allowed speed at layer \"disable_fan_first_layers\" + 1." msgstr "" -"风扇速度将从“禁用风扇层后”的零线性上升到“风扇全速度层”的最大。如果低于“禁用风" -"扇首层”,则“全风扇速度首层”将被忽略,在这种情况下,风扇将在“禁用风扇首层”+1层" -"以最大允许速度运行。" +"风扇速度将从“禁用第一层”的零线性上升到“全风扇速度层”的最大。如果低于“禁用风扇" +"第一层”,则“全风扇速度第一层”将被忽略,在这种情况下,风扇将在“禁用风扇第一" +"层”+1层以最大允许速度运行。" #: src/libslic3r/PrintConfig.cpp:1280 msgid "Fuzzy skin type." @@ -11614,7 +11613,7 @@ msgstr "每个蒙皮点可以偏移的最大距离(双向),垂直于周界 #: src/libslic3r/PrintConfig.cpp:1303 msgid "Fuzzy skin point distance" -msgstr "模糊皮肤分割点距离" +msgstr "模糊皮肤点距离" #: src/libslic3r/PrintConfig.cpp:1305 msgid "" @@ -11622,8 +11621,8 @@ msgid "" "points. Lowering the Fuzzy skin point distance will increase the number of " "randomly offset points on the perimeter wall." msgstr "" -"通过插入分割点,轮廓将被分割成多个部分。降低“模糊皮肤分割点距离”(Fuzzy skin " -"point distance)将增加轮廓上随机偏移的点的数量。" +"通过插入模糊皮肤点,周长将被分割成多个部分。降低“模糊皮肤点距离”(Fuzzy skin " +"point distance)将增加周界墙上随机偏移的点的数量。" #: src/libslic3r/PrintConfig.cpp:1313 msgid "Fill gaps" @@ -11633,7 +11632,7 @@ msgstr "填补空白" msgid "" "Enables filling of gaps between perimeters and between the inner most " "perimeters and infill." -msgstr "允许填充轮廓之间以及最内侧轮廓和填充之间的间隙。" +msgstr "允许填充周长之间以及最内侧周长和填充之间的间隙。" #: src/libslic3r/PrintConfig.cpp:1322 msgid "" @@ -11749,11 +11748,11 @@ msgid "" "anchor_length_max. Set this parameter to zero to disable anchoring " "perimeters connected to a single infill line." msgstr "" -"用附加轮廓的一小段将填充线连接到内部轮廓。如果以百分比(例如:15%)表示,则计" -"算填充拉伸宽度。PrusaSlicer试图将两条紧密的填充线连接到一个短的轮廓段。如果找" -"不到短于“填充”和“锚定”最大值的轮廓线段,则填充线仅在一侧连接到轮廓线段,并且" -"所取轮廓线段的长度仅限于此参数,但不超过“锚定长度”最大值。将此参数设置为零," -"以禁用连接到单个填充线的锚定轮廓。" +"用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计" +"算填充拉伸宽度。PrusaSlicer 试图将两条紧密的填充线连接到一个短的周长段。如果" +"找不到短于“填充”和“锚点”最大值的周长线段,则填充线仅在一侧连接到周长线段,并" +"且所取周长线段的长度仅限于此参数,但不超过“锚点长度”最大值。将此参数设置为" +"零,以禁用连接到单个填充线的锚点周长。" #: src/libslic3r/PrintConfig.cpp:1431 msgid "0 (no open anchors)" @@ -11794,10 +11793,10 @@ msgid "" "segment taken is limited to infill_anchor, but no longer than this " "parameter. Set this parameter to zero to disable anchoring." msgstr "" -"用附加轮廓的一小段将填充线连接到内部轮廓。如果以百分比(例如:15%)表示,则计" -"算填充拉伸宽度。PrusaSlicer试图将两条紧密的填充线连接到一个短的轮廓段。如果找" -"不到比此参数短的轮廓线段,则填充线仅在一侧连接到轮廓线段,并且所采用的轮廓线" -"段的长度仅限于infl_anchor,但不超过此参数。将此参数设置为零以禁用锚定。" +"用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计" +"算填充拉伸宽度。PrusaSlicer 试图将两条紧密的填充线连接到一个短的周长段。如果" +"找不到比此参数短的周长线段,则填充线仅在一侧连接到周长线段,并且所采用的周长" +"线段的长度仅限于 infl_anchor,但不超过此参数。将此参数设置为零以禁用锚点。" #: src/libslic3r/PrintConfig.cpp:1454 msgid "0 (not anchored)" @@ -11910,7 +11909,7 @@ msgstr "使用热打印头熨烫顶层,使表面光滑" #: src/libslic3r/PrintConfig.cpp:1560 src/libslic3r/PrintConfig.cpp:1562 msgid "Ironing Type" -msgstr "熨烫模式" +msgstr "熨烫类型" #: src/libslic3r/PrintConfig.cpp:1567 msgid "All top surfaces" @@ -12191,6 +12190,9 @@ msgid "" "extrusion width, 0.2 mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s " "(feedrate 60 mm/s) will take at least 2 seconds." msgstr "" +"该实验设置用于限制挤出速率的变化速度,以便从较低速度过渡到较高速度。1.8 mm³/" +"s² 的值可确保挤出速率从 1.8 mm³/s(挤出宽度 0.45 mm,挤出高度 0.2 mm,进给速" +"率 20 mm/s)变为 5.4 mm³/s(进给速率 60 mm/s) 至少需要 2 秒。" #: src/libslic3r/PrintConfig.cpp:1812 src/libslic3r/PrintConfig.cpp:1824 msgid "mm³/s²" @@ -12208,6 +12210,9 @@ msgid "" "extrusion width, 0.2 mm extrusion height, feedrate 60 mm/s) to 1.8 mm³/s " "(feedrate 20 mm/s) will take at least 2 seconds." msgstr "" +"该实验设置用于限制挤出速率的变化速度,以便从较高速度过渡到较低速度。1.8 mm³/" +"s² 的值可确保挤出速率从 5.4 mm³/s(挤出宽度 0.45 mm,挤出高度 0.2 mm,进给速" +"率 60 mm/s)变为 1.8 mm³/s(进给速率 20 mm/s) 至少需要 2 秒。" #: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1839 msgid "Min" @@ -12349,7 +12354,7 @@ msgstr "轮廓" msgid "" "This is the acceleration your printer will use for perimeters. Set zero to " "disable acceleration control for perimeters." -msgstr "这是打印机将用于轮廓的加速度。设置为零可禁用轮廓的加速控制。" +msgstr "这是打印机将用于周长的加速度。设置为零可禁用周长的加速控制。" #: src/libslic3r/PrintConfig.cpp:1964 msgid "Perimeter extruder" @@ -12439,42 +12444,42 @@ msgstr "打印机变体的版本。例如, 打印机版本可以通过喷嘴直 #: src/libslic3r/PrintConfig.cpp:2062 msgid "Raft contact Z distance" -msgstr "筏的 Z 接触距离" +msgstr "筏板接触Z距离" #: src/libslic3r/PrintConfig.cpp:2064 msgid "" "The vertical distance between object and raft. Ignored for soluble interface." -msgstr "物体与筏之间的垂直距离。对于可溶解的界面忽略。" +msgstr "物体与木筏之间的垂直距离。对于可溶解的界面忽略。" #: src/libslic3r/PrintConfig.cpp:2071 msgid "Raft expansion" -msgstr "水平扩展伐" +msgstr "筏式膨胀" #: src/libslic3r/PrintConfig.cpp:2073 msgid "Expansion of the raft in XY plane for better stability." -msgstr "在XY平面上扩展筏,以获得更好的稳定性。" +msgstr "在 XY 平面上扩展筏板,以获得更好的稳定性。" #: src/libslic3r/PrintConfig.cpp:2080 msgid "First layer density" -msgstr "首层密度" +msgstr "第一层密度" #: src/libslic3r/PrintConfig.cpp:2082 msgid "Density of the first raft or support layer." -msgstr "首层筏或支撑层的密度。" +msgstr "第一个筏板或支撑层的密度。" #: src/libslic3r/PrintConfig.cpp:2090 msgid "First layer expansion" -msgstr "首层扩展" +msgstr "第一层扩展" #: src/libslic3r/PrintConfig.cpp:2092 msgid "" "Expansion of the first raft or support layer to improve adhesion to print " "bed." -msgstr "扩展首层筏或支撑层,以提高与印刷床的附着力。" +msgstr "扩展第一层筏板或支撑层,以提高与印刷床的附着力。" #: src/libslic3r/PrintConfig.cpp:2099 msgid "Raft layers" -msgstr "筏层数" +msgstr "筏层" #: src/libslic3r/PrintConfig.cpp:2101 msgid "" @@ -12644,7 +12649,7 @@ msgstr "回抽速度 (仅适用于挤出机电机)。" #: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2223 msgid "Deretraction Speed" -msgstr "再回填速度" +msgstr "减速速度" #: src/libslic3r/PrintConfig.cpp:2224 msgid "" @@ -12652,7 +12657,7 @@ msgid "" "applies to the extruder motor). If left to zero, the retraction speed is " "used." msgstr "" -"回抽后将耗材装入挤出机的速度 (仅适用于挤出机电机)。如果保持为零, 则使用回抽速" +"收回后将耗材装入挤出机的速度 (仅适用于挤出机电机)。如果保持为零, 则使用回抽速" "度。" #: src/libslic3r/PrintConfig.cpp:2231 @@ -12701,12 +12706,12 @@ msgstr "接缝的首选方向 - 抖动" #: src/libslic3r/PrintConfig.cpp:2269 msgid "Distance from brim/object" -msgstr "与边缘/物体的距离" +msgstr "与裙边/物体的距离" #: src/libslic3r/PrintConfig.cpp:2270 msgid "" "Distance between skirt and brim (when draft shield is not used) or objects." -msgstr "裙边和帽沿之间的距离(不使用导流板时)或物体。" +msgstr "环绕和裙边之间的距离(不使用导流板时)或物体。" #: src/libslic3r/PrintConfig.cpp:2276 msgid "Skirt height" @@ -12777,7 +12782,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2319 msgid "Small perimeters" -msgstr "微小轮廓" +msgstr "小边界" #: src/libslic3r/PrintConfig.cpp:2321 msgid "" @@ -12812,7 +12817,7 @@ msgstr "打印实体填充时使用的挤出机。" #: src/libslic3r/PrintConfig.cpp:2348 msgid "Solid infill every" -msgstr "固体填充每" +msgstr "固体填充每个" #: src/libslic3r/PrintConfig.cpp:2350 msgid "" @@ -12864,7 +12869,7 @@ msgid "" "any number of bottom solid layers as well as skirt/brim loops. It won't work " "when printing more than one single object." msgstr "" -"打印单壁对象时,此功能将逐渐升高Z,以移除任何可见接缝。此选项需要单个轮廓、无" +"打印单壁对象时,此功能将逐渐升高Z,以移除任何可见接缝。此选项需要单个周长、无" "填充、无顶部实体层和无支撑材料。您仍然可以设置任意数量的底部实体层以及裙子/帽" "檐环。当打印多个对象时,它将不起作用。" @@ -12942,13 +12947,13 @@ msgstr "打印机将耗材多路复用到一个热端。" #: src/libslic3r/PrintConfig.cpp:2483 msgid "Prime all printing extruders" -msgstr "预装填所有打印用挤出机" +msgstr "装填所有印刷挤出机" #: src/libslic3r/PrintConfig.cpp:2484 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." -msgstr "如果启用, 所有打印用挤出机都将在打印开始时在打印平台的前缘进行预装填。" +msgstr "如果启用, 所有打印挤出机都将在打印开始时在构建板的前缘进行装填。" #: src/libslic3r/PrintConfig.cpp:2489 msgid "No sparse layers (EXPERIMENTAL)" @@ -13042,7 +13047,7 @@ msgid "" "plane." msgstr "使用此设置可旋转水平平面上的支撑材料模式。" -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13058,8 +13063,8 @@ msgid "" "this to 0 will also prevent Slic3r from using bridge flow and speed for the " "first object layer." msgstr "" -"对象与支撑材料界面之间的垂直距离。将此设置为 0 还会防止 Slic3r 对首个对象层使" -"用桥流和速度。" +"对象与支撑材料界面之间的垂直距离。将此设置为 0 还会防止 Slic3r 对第一个对象层" +"使用桥流和速度。" #: src/libslic3r/PrintConfig.cpp:2576 msgid "0 (soluble)" @@ -13094,7 +13099,7 @@ msgstr "和上面一样" #: src/libslic3r/PrintConfig.cpp:2601 msgid "Enforce support for the first" -msgstr "强制生成支撑,在前" +msgstr "强制支撑前" #: src/libslic3r/PrintConfig.cpp:2603 msgid "" @@ -13108,7 +13113,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2608 msgid "Enforce support for the first n layers" -msgstr "强制在前 n 层生成支撑" +msgstr "强制支撑前 n 层" #: src/libslic3r/PrintConfig.cpp:2614 msgid "Support material/raft/skirt extruder" @@ -13204,7 +13209,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2695 msgid "Interface pattern spacing" -msgstr "接触面图案间距" +msgstr "接触面模式间距" #: src/libslic3r/PrintConfig.cpp:2697 msgid "Spacing between interface lines. Set zero to get a solid interface." @@ -13246,7 +13251,7 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:2745 msgid "Pattern spacing" -msgstr "图案间距" +msgstr "模式间距" #: src/libslic3r/PrintConfig.cpp:2747 msgid "Spacing between support material lines." @@ -13266,12 +13271,12 @@ msgid "" "regular grid will create more stable supports, while snug support towers " "will save material and reduce object scarring." msgstr "" -"支撑塔的样式和形状。将支架投影到规则的网格中将创建更稳定的支架,而紧贴的支撑" +"支撑塔的样式和形状。将支架投影到规则的网格中将创建更稳定的支架,而舒适的支撑" "塔将节省材料并减少物体疤痕。" #: src/libslic3r/PrintConfig.cpp:2772 msgid "Snug" -msgstr "紧贴" +msgstr "舒适的" #: src/libslic3r/PrintConfig.cpp:2777 msgid "Synchronize with object layers" @@ -13283,7 +13288,7 @@ msgid "" "multi-material printers, where the extruder switch is expensive." msgstr "" "将支撑图层与对象打印图层同步。这对于多材料打印机非常有用, 因为在这种打印机" -"中, 挤出机切换非常耗时." +"中, 挤出机切换非常不划算。" #: src/libslic3r/PrintConfig.cpp:2785 msgid "Overhang threshold" @@ -13316,7 +13321,8 @@ msgstr "" msgid "" "Nozzle temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output G-code." -msgstr "首层之后各层的喷嘴温度。将其设置为零可禁用输出G代码中的温度控制命令。" +msgstr "" +"第一层之后各层的喷嘴温度。将其设置为零可禁用输出 G-Code 中的温度控制命令。" #: src/libslic3r/PrintConfig.cpp:2811 msgid "Nozzle temperature" @@ -13324,7 +13330,7 @@ msgstr "喷嘴温度" #: src/libslic3r/PrintConfig.cpp:2817 msgid "Thick bridges" -msgstr "加粗拉桥" +msgstr "厚桥" #: src/libslic3r/PrintConfig.cpp:2819 msgid "" @@ -13332,8 +13338,8 @@ msgid "" "look worse. If disabled, bridges look better but are reliable just for " "shorter bridged distances." msgstr "" -"如启用,桥接可能更可靠,可以拉更长的桥,但可能不美观。如果禁用,桥可能更美" -"观,且仅在较短的拉桥距离内更可靠。" +"如果启用,桥接器更可靠,可以桥接更长的距离,但可能看起来更糟。如果禁用,桥梁" +"看起来更好,但仅在较短的桥梁距离内更可靠。" #: src/libslic3r/PrintConfig.cpp:2825 msgid "Detect thin walls" @@ -13367,9 +13373,9 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" "此自定义代码在每次工具更改之前插入。可以使用所有 PrusaSlicer 设置的占位符变量" -"以及{toolchange_z}、{previous_extruder}和{next_extruder}。当包含更改为正确挤" -"出机的换刀命令时(如T{next_extruder}),PrusaSlicer 不会发出其他此类命令。因" -"此,可以在工具更改前后编写自定义行为脚本。" +"以及 {toolchange_z}、{previous_extruder} 和 {next_extruder}。当包含更改为正确" +"挤出机的换刀命令时(如 T{next_extruder}),PrusaSlicer 不会发出其他此类命令。" +"因此,可以在工具更改前后编写自定义行为脚本。" #: src/libslic3r/PrintConfig.cpp:2859 msgid "" @@ -13419,7 +13425,7 @@ msgstr "最小顶壳厚度" #: src/libslic3r/PrintConfig.cpp:2906 msgid "Speed for travel moves (jumps between distant extrusion points)." -msgstr "空驶速度(在远处挤出点之间跳跃)。" +msgstr "打印移动的速度(在远处挤出点之间跳跃)。" #: src/libslic3r/PrintConfig.cpp:2914 msgid "Z travel" @@ -13431,8 +13437,8 @@ msgid "" "When set to zero, the value is ignored and regular travel speed is used " "instead." msgstr "" -"沿Z轴移动的速度。\n" -"当设置为零时,该值将被忽略,而使用常规空驶速度。" +"沿 Z 轴移动的速度。\n" +"当设置为零时,该值将被忽略,而使用常规行驶速度。" #: src/libslic3r/PrintConfig.cpp:2923 msgid "Use firmware retraction" @@ -13471,9 +13477,9 @@ msgid "" "only supported in recent Marlin." msgstr "" "此实验设置使用以立方 mm 为单位的 E 值而不是线性 mm。如果您的固件不知道耗材直" -"径,您可以将诸如\"M200D[filament_diameter_0]T0\"这样的命令放入起始 G-Code " -"中,以便打开体积模式并使用与 Slic3r 中选择的耗材相关的耗材直径。这在最近马林" -"中才得到支持。" +"径,您可以将诸如 \"M200D[filament_diameter_0]T0\" 这样的命令放入起始 G-Code " +"中,以便打开体积模式并使用与 Slic3r 中选择的耗材相关的耗材直径。这在最近 " +"Marlin 中才得到支持。" #: src/libslic3r/PrintConfig.cpp:2948 msgid "Enable variable layer height feature" @@ -13624,39 +13630,45 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:3065 msgid "Perimeter generator" -msgstr "" +msgstr "轮廓生成器" #: src/libslic3r/PrintConfig.cpp:3067 msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" +"经典轮廓生成器产生具有恒定挤出宽度的轮廓,并且对于非常薄的区域使用间隙填充。 " +"Arachne 引擎产生具有可变挤出宽度的轮廓。这个设置也会影响回环填充。" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "经典" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" -msgstr "" +msgstr "Arachne" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" -msgstr "" +msgstr "轮廓过渡长度" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" +"当随着零件变薄而在不同数量的轮廓之间过渡时,会分配出一定的空间来分割或连接轮" +"廓段。如果用百分比表示(例如 100%),它将根据喷嘴直径计算出来。" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "轮廓过渡过滤器余量" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13667,12 +13679,16 @@ msgid "" "as a percentage (for example 25%), it will be computed based on the nozzle " "diameter." msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3104 -msgid "Perimeter transitioning threshold angle" -msgstr "" +"防止在多一个轮廓和少一个轮廓之间来回过渡。这个余量将挤压宽度的范围扩大到 [最" +"小轮廓宽度-余量, 2*最小轮廓宽度+余量]。增加这个余量可以减少转换的次数,从而减" +"少挤压开始/停止的次数和移动时间。然而,大的挤出宽度变化会导致挤出不足或过度挤" +"出的问题。如果用百分比表示(例如25%),将根据喷嘴直径计算。" #: src/libslic3r/PrintConfig.cpp:3106 +msgid "Perimeter transitioning threshold angle" +msgstr "轮廓过渡阈值角度" + +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13680,64 +13696,44 @@ msgid "" "remaining space. Reducing this setting reduces the number and length of " "these center perimeters, but may leave gaps or overextrude." msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3117 -msgid "Perimeter distribution count" -msgstr "" +"何时在偶数和奇数轮廓之间创建过渡。 角度大于此设置的楔形将没有过渡,并且不会在" +"中心打印轮廓以填充剩余空间。 减少此设置会减少这些中心轮廓的数量和长度,但可能" +"会留下间隙或过度拉伸。" #: src/libslic3r/PrintConfig.cpp:3119 +msgid "Perimeter distribution count" +msgstr "轮廓分布计数" + +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" +"从中心开始计算的轮廓数量,变化需要在这些轮廓上展开。较低的值意味着外部轮廓的" +"宽度不发生变化。" #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" -msgstr "" +msgstr "最小特征尺寸" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" +"薄型特征的最小厚度。比这个值薄的模型特征将不被打印,而比最小特征尺寸厚的特征" +"将被加宽到最小轮廓的宽度。如果以百分比表示(例如 25%),它将根据喷嘴直径计" +"算。" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" -msgstr "" +msgstr "最小轮廓宽度" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13745,64 +13741,67 @@ msgid "" "thick as the feature itself. If expressed as a percentage (for example 85%), " "it will be computed based on the nozzle diameter." msgstr "" +"将替换模型的细特征(根据最小特征尺寸)的轮廓宽度。 如果最小轮廓宽度小于特征的" +"厚度,则轮廓将变得与特征本身一样厚。 如果以百分比表示(例如 85%),它将根据喷" +"嘴直径计算。" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "显示宽度" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "显示宽度" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "显示高度" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "显示高度" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "像素点的数量" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "X 中的像素数" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Y 中的像素数" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "显示水平镜像" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "水平镜像" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "启用输出图像的水平镜像" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "显示垂直镜像" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "垂直镜像" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "启用输出图像的垂直镜像" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "显示方向" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -13811,55 +13810,55 @@ msgstr "" "在 SLA 打印机内设置实际的 LCD 显示方向。人像模式将翻转显示宽度和高度参数的含" "义, 输出图像将旋转 90 度。" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "景观" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "肖像" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "快" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "快速倾斜" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "快速倾斜的时间" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "慢" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "缓慢倾斜" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "缓慢倾斜的时间" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" -msgstr "" +msgstr "高粘性" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" -msgstr "" +msgstr "高粘性树脂倾斜" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" -msgstr "" +msgstr "超慢倾斜的时间" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "区域填充" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13869,59 +13868,59 @@ msgstr "" "如果打印区域超过指定值, \n" "然后缓慢倾斜将被使用,否则 - 快速倾斜" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "X 轴上的打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "打印机缩放 X 轴校正" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "Y 轴上的打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "打印机缩放 Y 轴校正" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "Z 轴上的打印机缩放校正" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "打印机缩放 Z 轴校正" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "打印机绝对校正" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "将根据校正的符号放大或收缩切片的 2D 多边形。" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "象脚最小宽度" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "大象脚补偿时要保持的最小特征宽度。" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "打印机伽玛校正" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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 " @@ -13930,155 +13929,155 @@ msgstr "" "这将对栅格化的 2D 多边形应用伽玛校正。伽玛值为零表示在中间的阈值阈值。此行为" "消除了抗锯齿,而不会丢失多边形中的孔。" -#: src/libslic3r/PrintConfig.cpp:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "SLA 材料类型" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "初始层高度" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "瓶容量" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "毫升" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "瓶重" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "公斤" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "克/毫升" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "钱/瓶" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "褪色图层" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "曝光时间所需的图层数从初始曝光时间到曝光时间逐渐淡入淡出" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "最短曝光时间" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "最大曝光时间" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "曝光时间" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "最短初始暴露时间" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "最大初始曝光时间" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "初始暴露时间" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "扩展校正" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "X 轴膨胀修正" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "Y 轴膨胀修正" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "Z 轴膨胀修正" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA 打印材料注释" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "您可以在此处放置有关 SLA 打印材料的注释。" -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "默认 SLA 材料配置文件" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "生成支撑" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "生成模型的支撑" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "针头前端直径" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "头部指向侧的直径" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "头部穿透" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "针头穿透模型表面的程度" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "针头宽度" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "从后球体中心到前球体中心的宽度" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "立柱直径" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "支撑柱的直径以 mm 为单位" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "小矿柱直径百分比" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 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:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "麦克斯在柱子上架桥" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "" "Maximum number of bridges that can be placed on a pillar. Bridges hold " "support point pinheads and connect to pillars as small branches." @@ -14086,11 +14085,11 @@ msgstr "" "可放置在支柱上的桥梁的最大数量。桥上有支撑点针头,并以小树枝的形式连接到柱子" "上。" -#: src/libslic3r/PrintConfig.cpp:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "立柱连接方式" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -14099,123 +14098,123 @@ msgstr "" "控制两个相邻支柱之间的桥接类型。可以是锯齿形、交叉(双锯齿形)或动态,根据两" "个支柱的距离,在前两个柱之间自动切换。" -#: src/libslic3r/PrintConfig.cpp:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "锯齿形" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "交叉" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "动态" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "支柱加宽系数" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" "将桥梁或柱子合并到另一个柱子中可以增加半径。零意味着没有增加,1意味着全增加。" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "支撑基直径" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "柱底直径以 mm 为单位" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "支撑基座高度" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "柱底锥的高度" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "支撑基部安全距离" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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 为单位)在零高程模式下有意义,在模型和焊盘之间插入根" -"据此参数的间隙。" +"柱基与模型的最小距离 (以 mm 为单位) 在零高程模式下有意义,在模型和焊盘之间插入" +"根据此参数的间隙。" -#: src/libslic3r/PrintConfig.cpp:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "临界角度" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "用于连接支撑杆和结的默认角度。" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "最大桥长" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "搭桥的最大长度" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "最大柱线链接距离" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 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:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "这是支撑点密度的相对度量。" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "支撑点的最小距离" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "不会将任何支撑点放置在比此阈值更近的位置。" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "使用垫" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "在支撑模型下添加一个垫" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "垫壁厚度" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "垫的厚度及其可选的腔壁。" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "垫墙高度" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -14225,19 +14224,19 @@ msgstr "" "定义垫腔深度。设置为零以禁用型腔。启用此功能时要小心,因为某些树脂可能在腔内产" "生极端的吸力效果,这使得从桶箔上剥下打印件变得困难。" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "垫裙边尺寸" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "焊盘应在包含的几何体周围延伸多远" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "最大合并距离" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -14246,92 +14245,92 @@ msgstr "" "某些对象可以使用几个较小的焊盘而不是单个大垫来配合。此参数定义两个较小焊盘的" "中心应有多远。如果他们更近,他们将被合并到一个垫子。" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "垫壁斜率" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "垫壁相对于床平面的斜率。90 度表示直壁。" -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "在对象周围创建垫盘并忽略支撑高程" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "到处都是物体" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "物体周围的力垫无处不在" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "垫对象间隙" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "在零高程模式下,对象底部和生成的垫盘之间的间隙。" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "垫对象连接器步长" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "连接对象和生成的焊盘的两个连接器杆之间的距离。" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "垫对象连接器宽度" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "连接对象和生成的焊盘的连接器杆的宽度。" -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "垫对象连接器穿透" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "微型连接器应该渗透到模型主体中多少。" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "启用空心化" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "挖空模型使其内部空旷" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "壁厚" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "中空模型的最小壁厚。" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "精确" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "性能与计算精度。较低的值可能会产生不需要的瑕疵。" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -14343,11 +14342,11 @@ msgstr "" "离),然后将其充气回指定的偏移量。更大的闭合距离使内部更圆。零度时,内部与外" "部最为相似。" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "打印速度" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " @@ -14356,143 +14355,143 @@ msgstr "" "当使用粘度更高的材料或一些中空零件时,可能需要较慢的打印速度。它会减缓倾斜运" "动,并在曝光前增加延迟。" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "导出 OBJ" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "将模型导出为 OBJ。" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "导出 SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "将模型切片并导出 SLA 打印图层为 PNG。" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "导出 3MF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "将模型导出为 3MF。" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "导出 AMF" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "将模型导出为 AMF。" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" -msgstr "导出 STL Export STL" +msgstr "导出 STL" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "将模型导出为 STL。" -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "切片模型并导出工具路径为 G-Code。" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "G-Code 查看器" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "可视化已经切片并保存的 G-Code" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "切片" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "根据 printer_technology 值将模型切片为 FFF 或 SLA。" -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "帮助" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "显示此帮助。" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "帮助(FFF 选项)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "显示打印/G-Code 配置选项的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "帮助(SLA 选项)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "显示 SLA 打印配置选项的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "输出模型信息" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "将有关模型的信息写入控制台。" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "保存配置文件" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "将配置保存到指定文件。" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "对齐 XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "将模型与给定点对齐。" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "在给定的 Z 处切割模型。" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "居中" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "将打印居中,以给定的中心为中心。" -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "不自动布局" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "在合并之前,不要重新布局给定的模型并保留其原始 XY 坐标。" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "确保在床上" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." @@ -14500,89 +14499,89 @@ msgstr "" "当物体部分位于床下方时,将其抬到床上方。默认情况下,使用 --no-sure-on-bed 禁" "用。" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "复制" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "生成乘以此数量的副本。" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "按网格复制" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "通过创建网格来创建副本。" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 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:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "围绕 Z 轴的旋转角度(以度表示)。" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "围绕 X 旋转" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "围绕 X 轴的旋转角度(以度表示)。" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "围绕 Y 旋转" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "围绕 Y 轴的旋转角度(以度表示)。" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "缩放因子或百分比。" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "检测给定模型中的未连接部件,并将它们拆分为单独的对象。" -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "缩放至合适" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "缩放以适合给定的空间。" -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "忽略不存在的配置文件" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "如果提供给 --load 的文件不存在,不会报错失败。" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "从配置文件和项目文件(3MF、AMF)加载配置时的转发兼容性规则。" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14593,47 +14592,47 @@ msgstr "" "的 PrusaSlicer 可能会扩展支持的固件版本列表。人们可能会决定退出,或者用默认值" "悄悄地或详细地替换未知值。" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "对未知的配置值进行保护" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "通过用默认值详细替换未知配置值来启用读取。" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "通过用默认值替换未知配置值来启用读取。" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "加载配置文件" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 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:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "输出文件" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 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:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "单实例模式" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 msgid "" "If enabled, the command line arguments are sent to an existing instance of " "GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides " @@ -14642,11 +14641,11 @@ msgstr "" "如果启用,命令行参数将发送到 GUI PrusaSlicer 的现有实例,或者激活现有的 " "PrusaSlicer 窗口。覆盖应用程序首选项中的“单实例”配置值。" -#: src/libslic3r/PrintConfig.cpp:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "数据目录" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14655,24 +14654,24 @@ msgstr "" "在给定目录加载和存储设置。这对于维护不同的配置文件或包括网络存储中的配置非常" "有用。" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "日志级别" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 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 "" "设置日志敏感度。0:致命、1:错误、2:警告、3:信息、4:调试、5:跟踪\n" -"例如。loglevel=2记录致命、错误和警告级别的消息。" +"例如。loglevel=2 记录致命、错误和警告级别的消息。" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "使用软件渲染器渲染" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -14819,7 +14818,7 @@ msgid "" "every." msgstr "" "组合内嵌\n" -"您是否知道可以使用设置组合内嵌间隔以比轮廓更高的层高打印内嵌,以节省打" +"您是否知道可以使用设置组合内嵌间隔以比周长更高的层高打印内嵌,以节省打" "印时间。" #: resources/data/hints.ini: [hint:Variable layer height] @@ -14853,7 +14852,7 @@ msgid "" msgstr "" "每个模型的层高不同\n" "您知道可以在制版机上以不同的层高打印每个模型吗?在三维视图中的模型上单击鼠标" -"右键,选择“层”和“轮廓”,然后调整右侧面板中的值。请阅读文档中的更多内容。" +"右键,选择“层”和“周长”,然后调整右侧面板中的值。请阅读文档中的更多内容。" #: resources/data/hints.ini: [hint:Solid infill threshold area] msgid "" @@ -14976,7 +14975,7 @@ msgid "" "a>feature. (Requires Advanced or Expert mode.)" msgstr "" "接缝绘制\n" -"您是否知道可以直接在对象上绘制,并选择每个轮廓循环的起点/终点的位置?尝试" +"您是否知道可以直接在对象上绘制,并选择每个周长循环的起点/终点的位置?尝试" "接缝绘制功能。(需要高级或专家模式。)" #: resources/data/hints.ini: [hint:Insert Pause] @@ -15056,6 +15055,9 @@ msgid "" "surfaces, save a lot of the filament, and decrease the print time? Read more " "in the documentation." msgstr "" +"闪电填充\n" +"您是否知道可以使用闪电填充来仅支撑顶部表面,从而节约许多耗材和减少打印时间?" +"请阅读文档中的更多内容。" #: resources/data/hints.ini: [hint:Fullscreen mode] msgid "" @@ -15064,7 +15066,7 @@ msgid "" "F11 hotkey." msgstr "" "全屏模式\n" -"您知道可以将PrusaSlicer切换到全屏模式吗?使用F11热键。" +"您知道可以将 PrusaSlicer 切换到全屏模式吗?使用F11热键。" #: ../src/common/debugrpt.cpp:586 msgid "" diff --git a/resources/localization/zh_TW/PrusaSlicer_zh_TW.po b/resources/localization/zh_TW/PrusaSlicer_zh_TW.po index 56cc367000..53d6cc448a 100644 --- a/resources/localization/zh_TW/PrusaSlicer_zh_TW.po +++ b/resources/localization/zh_TW/PrusaSlicer_zh_TW.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-07-12 14:41+0200\n" +"POT-Creation-Date: 2022-08-12 10:25+0200\n" "PO-Revision-Date: 2019-05-22 10:35+0800\n" "Last-Translator: Jiang Yue , patched traditional " "chinese by Cheng-Hsien Ho \n" @@ -20,54 +20,54 @@ msgstr "" "X-Poedit-SearchPath-1: xs/xrc/slic3r/GUI\n" "X-Poedit-SearchPath-2: xs/xrc/slic3r\n" -#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:303 +#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:305 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:267 +#: src/slic3r/GUI/AboutDialog.cpp:141 src/slic3r/GUI/AboutDialog.cpp:269 msgid "Copyright" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:141 +#: src/slic3r/GUI/AboutDialog.cpp:143 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:210 +#: src/slic3r/GUI/AboutDialog.cpp:212 #, c-format, boost-format msgid "About %s" msgstr "關於 %s" -#: src/slic3r/GUI/AboutDialog.cpp:242 src/slic3r/GUI/AboutDialog.cpp:367 +#: src/slic3r/GUI/AboutDialog.cpp:244 src/slic3r/GUI/AboutDialog.cpp:369 #: src/slic3r/GUI/GUI_App.cpp:262 msgid "Version" msgstr "版本" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:269 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:271 src/slic3r/GUI/GUI_App.cpp:268 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:270 src/slic3r/GUI/GUI_App.cpp:268 +#: src/slic3r/GUI/AboutDialog.cpp:272 src/slic3r/GUI/GUI_App.cpp:268 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:271 +#: src/slic3r/GUI/AboutDialog.cpp:273 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:272 +#: src/slic3r/GUI/AboutDialog.cpp:274 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/AboutDialog.cpp:308 +#: src/slic3r/GUI/AboutDialog.cpp:310 msgid "Copy Version Info" msgstr "" @@ -191,7 +191,7 @@ msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:31 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:218 src/slic3r/GUI/Plater.cpp:204 -#: src/slic3r/GUI/Tab.cpp:2764 +#: src/slic3r/GUI/Tab.cpp:2762 msgid "Size" msgstr "尺寸" @@ -249,19 +249,18 @@ msgstr "G-code 0,0 座標相對於矩形框左前角落的距離。" #: src/libslic3r/PrintConfig.cpp:2995 src/libslic3r/PrintConfig.cpp:3002 #: src/libslic3r/PrintConfig.cpp:3016 src/libslic3r/PrintConfig.cpp:3040 #: src/libslic3r/PrintConfig.cpp:3050 src/libslic3r/PrintConfig.cpp:3060 -#: src/libslic3r/PrintConfig.cpp:3083 src/libslic3r/PrintConfig.cpp:3161 -#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3408 -#: src/libslic3r/PrintConfig.cpp:3568 src/libslic3r/PrintConfig.cpp:3577 -#: src/libslic3r/PrintConfig.cpp:3586 src/libslic3r/PrintConfig.cpp:3596 -#: src/libslic3r/PrintConfig.cpp:3661 src/libslic3r/PrintConfig.cpp:3671 -#: src/libslic3r/PrintConfig.cpp:3683 src/libslic3r/PrintConfig.cpp:3703 -#: src/libslic3r/PrintConfig.cpp:3713 src/libslic3r/PrintConfig.cpp:3723 -#: src/libslic3r/PrintConfig.cpp:3741 src/libslic3r/PrintConfig.cpp:3756 -#: src/libslic3r/PrintConfig.cpp:3770 src/libslic3r/PrintConfig.cpp:3781 -#: src/libslic3r/PrintConfig.cpp:3794 src/libslic3r/PrintConfig.cpp:3839 -#: src/libslic3r/PrintConfig.cpp:3849 src/libslic3r/PrintConfig.cpp:3858 -#: src/libslic3r/PrintConfig.cpp:3868 src/libslic3r/PrintConfig.cpp:3884 -#: src/libslic3r/PrintConfig.cpp:3908 +#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3381 +#: src/libslic3r/PrintConfig.cpp:3541 src/libslic3r/PrintConfig.cpp:3550 +#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3569 +#: src/libslic3r/PrintConfig.cpp:3634 src/libslic3r/PrintConfig.cpp:3644 +#: src/libslic3r/PrintConfig.cpp:3656 src/libslic3r/PrintConfig.cpp:3676 +#: src/libslic3r/PrintConfig.cpp:3686 src/libslic3r/PrintConfig.cpp:3696 +#: src/libslic3r/PrintConfig.cpp:3714 src/libslic3r/PrintConfig.cpp:3729 +#: src/libslic3r/PrintConfig.cpp:3743 src/libslic3r/PrintConfig.cpp:3754 +#: src/libslic3r/PrintConfig.cpp:3767 src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3822 src/libslic3r/PrintConfig.cpp:3831 +#: src/libslic3r/PrintConfig.cpp:3841 src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3881 msgid "mm" msgstr "毫米" @@ -294,7 +293,7 @@ msgid "Load shape from STL..." msgstr "從STL文件加載形狀..." #: src/slic3r/GUI/BedShapeDialog.cpp:249 src/slic3r/GUI/GCodeViewer.cpp:3709 -#: src/slic3r/GUI/MainFrame.cpp:2143 +#: src/slic3r/GUI/MainFrame.cpp:2147 msgid "Settings" msgstr "設置" @@ -307,7 +306,7 @@ msgid "Load..." msgstr "" #: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/BedShapeDialog.cpp:362 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Remove" msgstr "移除" @@ -506,19 +505,19 @@ msgstr "" msgid "Infill" msgstr "填充" -#: src/slic3r/GUI/ConfigManipulation.cpp:338 +#: src/slic3r/GUI/ConfigManipulation.cpp:336 msgid "Head penetration should not be greater than the head width." msgstr "頭部滲透不應大於頭部寬度。" -#: src/slic3r/GUI/ConfigManipulation.cpp:340 +#: src/slic3r/GUI/ConfigManipulation.cpp:338 msgid "Invalid Head penetration" msgstr "無效的頭部滲透" -#: src/slic3r/GUI/ConfigManipulation.cpp:351 +#: src/slic3r/GUI/ConfigManipulation.cpp:349 msgid "Pinhead diameter should be smaller than the pillar diameter." msgstr "針頭直徑應小於柱直徑。" -#: src/slic3r/GUI/ConfigManipulation.cpp:353 +#: src/slic3r/GUI/ConfigManipulation.cpp:351 msgid "Invalid pinhead diameter" msgstr "針頭直徑無效" @@ -627,7 +626,7 @@ msgid "Standard" msgstr "標準" #: src/slic3r/GUI/ConfigWizard.cpp:331 src/slic3r/GUI/ConfigWizard.cpp:651 -#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3832 +#: src/slic3r/GUI/Preferences.cpp:434 src/slic3r/GUI/Tab.cpp:3830 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1154 msgid "All" msgstr "所有" @@ -867,7 +866,7 @@ msgstr "" msgid "Firmware Type" msgstr "固件類型" -#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2365 +#: src/slic3r/GUI/ConfigWizard.cpp:1357 src/slic3r/GUI/Tab.cpp:2363 msgid "Firmware" msgstr "固件" @@ -1159,7 +1158,7 @@ msgstr "" #: src/slic3r/GUI/DesktopIntegrationDialog.cpp:486 #: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:97 -#: src/slic3r/GUI/MainFrame.cpp:1338 +#: src/slic3r/GUI/MainFrame.cpp:1342 msgid "Undo" msgstr "回復" @@ -1768,7 +1767,7 @@ msgstr "確認" msgid "Cancelling..." msgstr "正在取消...." -#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/GalleryDialog.cpp:69 src/slic3r/GUI/MainFrame.cpp:1404 msgid "Shape Gallery" msgstr "" @@ -1784,7 +1783,7 @@ msgstr "" msgid "Add selected shape(s) to the bed" msgstr "" -#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4151 +#: src/slic3r/GUI/GalleryDialog.cpp:117 src/slic3r/GUI/Tab.cpp:4149 msgid "Add" msgstr "加入" @@ -1794,7 +1793,7 @@ msgstr "" #: src/slic3r/GUI/GalleryDialog.cpp:118 src/slic3r/GUI/GalleryDialog.cpp:508 #: src/slic3r/GUI/GLCanvas3D.cpp:4490 src/slic3r/GUI/GUI_Factories.cpp:444 -#: src/slic3r/GUI/Tab.cpp:3750 +#: src/slic3r/GUI/Tab.cpp:3748 msgid "Delete" msgstr "刪除" @@ -1975,8 +1974,8 @@ msgstr "" msgid "Extrusion" msgstr "" -#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1869 -#: src/slic3r/GUI/Tab.cpp:2811 +#: src/slic3r/GUI/GCodeViewer.cpp:3614 src/slic3r/GUI/Tab.cpp:1867 +#: src/slic3r/GUI/Tab.cpp:2809 msgid "Retraction" msgstr "回縮" @@ -2031,7 +2030,7 @@ msgstr "列印設置" #: src/slic3r/GUI/GCodeViewer.cpp:3700 src/slic3r/GUI/GCodeViewer.cpp:3726 #: src/slic3r/GUI/GUI.cpp:339 src/slic3r/GUI/Plater.cpp:819 -#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:1970 +#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:1968 msgid "Filament" msgstr "線材" @@ -2253,7 +2252,7 @@ msgid "Add..." msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4499 src/slic3r/GUI/KBShortcutsDialog.cpp:96 -#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4157 +#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:4155 msgid "Delete all" msgstr "" @@ -2300,7 +2299,7 @@ msgid "Next Undo action: %1%" msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:4738 src/slic3r/GUI/KBShortcutsDialog.cpp:98 -#: src/slic3r/GUI/MainFrame.cpp:1341 +#: src/slic3r/GUI/MainFrame.cpp:1345 msgid "Redo" msgstr "重做" @@ -2340,7 +2339,7 @@ msgid "Selection-Remove from rectangle" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:50 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4471 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:160 src/libslic3r/PrintConfig.cpp:4446 msgid "Cut" msgstr "切割" @@ -2595,7 +2594,7 @@ msgid "Quality" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:34 -#: src/libslic3r/PrintConfig.cpp:3900 +#: src/libslic3r/PrintConfig.cpp:3873 msgid "Closing distance" msgstr "" @@ -2698,7 +2697,7 @@ msgstr "" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:543 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 -#: src/libslic3r/PrintConfig.cpp:4525 +#: src/libslic3r/PrintConfig.cpp:4500 msgid "Rotate" msgstr "旋轉" @@ -2715,7 +2714,7 @@ msgstr "套用" #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:579 -#: src/libslic3r/PrintConfig.cpp:4540 +#: src/libslic3r/PrintConfig.cpp:4515 msgid "Scale" msgstr "縮放" @@ -2766,7 +2765,7 @@ msgid "Simplification is currently only allowed when a single part is selected" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp:157 -#: src/slic3r/GUI/MainFrame.cpp:1165 src/slic3r/GUI/MainFrame.cpp:1622 +#: src/slic3r/GUI/MainFrame.cpp:1169 src/slic3r/GUI/MainFrame.cpp:1626 #: src/slic3r/GUI/PrintHostDialogs.cpp:373 msgid "Error" msgstr "錯誤" @@ -2850,7 +2849,7 @@ msgid "Minimal points distance" msgstr "" #: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/libslic3r/PrintConfig.cpp:3730 +#: src/libslic3r/PrintConfig.cpp:3703 msgid "Support points density" msgstr "支撐點密度" @@ -3614,7 +3613,7 @@ msgid "Speed" msgstr "速度" #: src/slic3r/GUI/GUI_Factories.cpp:133 src/slic3r/GUI/Tab.cpp:1620 -#: src/slic3r/GUI/Tab.cpp:2303 src/libslic3r/PrintConfig.cpp:792 +#: src/slic3r/GUI/Tab.cpp:2301 src/libslic3r/PrintConfig.cpp:792 #: src/libslic3r/PrintConfig.cpp:1465 src/libslic3r/PrintConfig.cpp:1965 #: src/libslic3r/PrintConfig.cpp:2341 src/libslic3r/PrintConfig.cpp:2615 #: src/libslic3r/PrintConfig.cpp:2643 @@ -3637,52 +3636,51 @@ msgstr "環邊和裙邊" #: src/slic3r/GUI/GUI_Factories.cpp:138 src/slic3r/GUI/Tab.cpp:1491 #: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1642 -#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2030 -#: src/slic3r/GUI/Tab.cpp:2401 src/slic3r/GUI/Tab.cpp:4728 +#: src/slic3r/GUI/Tab.cpp:1646 src/slic3r/GUI/Tab.cpp:2028 +#: src/slic3r/GUI/Tab.cpp:2399 src/slic3r/GUI/Tab.cpp:4726 #: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:494 #: src/libslic3r/PrintConfig.cpp:1414 src/libslic3r/PrintConfig.cpp:1501 #: src/libslic3r/PrintConfig.cpp:1548 src/libslic3r/PrintConfig.cpp:2498 #: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:3046 -#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090 -#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3118 -#: src/libslic3r/PrintConfig.cpp:3127 src/libslic3r/PrintConfig.cpp:3142 -#: src/libslic3r/PrintConfig.cpp:3157 src/libslic3r/PrintConfig.cpp:3168 -#: src/libslic3r/PrintConfig.cpp:3365 +#: src/libslic3r/PrintConfig.cpp:3081 src/libslic3r/PrintConfig.cpp:3092 +#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3120 +#: src/libslic3r/PrintConfig.cpp:3129 src/libslic3r/PrintConfig.cpp:3141 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Advanced" msgstr "進階" #: src/slic3r/GUI/GUI_Factories.cpp:140 src/slic3r/GUI/Plater.cpp:428 -#: src/slic3r/GUI/Tab.cpp:4662 src/slic3r/GUI/Tab.cpp:4663 -#: src/libslic3r/PrintConfig.cpp:3559 src/libslic3r/PrintConfig.cpp:3566 -#: src/libslic3r/PrintConfig.cpp:3575 src/libslic3r/PrintConfig.cpp:3584 -#: src/libslic3r/PrintConfig.cpp:3594 src/libslic3r/PrintConfig.cpp:3604 -#: src/libslic3r/PrintConfig.cpp:3641 src/libslic3r/PrintConfig.cpp:3648 -#: src/libslic3r/PrintConfig.cpp:3659 src/libslic3r/PrintConfig.cpp:3669 -#: src/libslic3r/PrintConfig.cpp:3678 src/libslic3r/PrintConfig.cpp:3691 -#: src/libslic3r/PrintConfig.cpp:3701 src/libslic3r/PrintConfig.cpp:3710 -#: src/libslic3r/PrintConfig.cpp:3720 src/libslic3r/PrintConfig.cpp:3731 -#: src/libslic3r/PrintConfig.cpp:3739 +#: src/slic3r/GUI/Tab.cpp:4660 src/slic3r/GUI/Tab.cpp:4661 +#: src/libslic3r/PrintConfig.cpp:3532 src/libslic3r/PrintConfig.cpp:3539 +#: src/libslic3r/PrintConfig.cpp:3548 src/libslic3r/PrintConfig.cpp:3557 +#: src/libslic3r/PrintConfig.cpp:3567 src/libslic3r/PrintConfig.cpp:3577 +#: src/libslic3r/PrintConfig.cpp:3614 src/libslic3r/PrintConfig.cpp:3621 +#: src/libslic3r/PrintConfig.cpp:3632 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:3651 src/libslic3r/PrintConfig.cpp:3664 +#: src/libslic3r/PrintConfig.cpp:3674 src/libslic3r/PrintConfig.cpp:3683 +#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3704 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Supports" msgstr "支撐" #: src/slic3r/GUI/GUI_Factories.cpp:141 src/slic3r/GUI/Plater.cpp:575 -#: src/slic3r/GUI/Tab.cpp:4703 src/slic3r/GUI/Tab.cpp:4704 -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3747 -#: src/libslic3r/PrintConfig.cpp:3754 src/libslic3r/PrintConfig.cpp:3768 -#: src/libslic3r/PrintConfig.cpp:3779 src/libslic3r/PrintConfig.cpp:3789 -#: src/libslic3r/PrintConfig.cpp:3811 src/libslic3r/PrintConfig.cpp:3822 -#: src/libslic3r/PrintConfig.cpp:3829 src/libslic3r/PrintConfig.cpp:3836 -#: src/libslic3r/PrintConfig.cpp:3847 src/libslic3r/PrintConfig.cpp:3856 -#: src/libslic3r/PrintConfig.cpp:3865 +#: src/slic3r/GUI/Tab.cpp:4701 src/slic3r/GUI/Tab.cpp:4702 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3720 +#: src/libslic3r/PrintConfig.cpp:3727 src/libslic3r/PrintConfig.cpp:3741 +#: src/libslic3r/PrintConfig.cpp:3752 src/libslic3r/PrintConfig.cpp:3762 +#: src/libslic3r/PrintConfig.cpp:3784 src/libslic3r/PrintConfig.cpp:3795 +#: src/libslic3r/PrintConfig.cpp:3802 src/libslic3r/PrintConfig.cpp:3809 +#: src/libslic3r/PrintConfig.cpp:3820 src/libslic3r/PrintConfig.cpp:3829 +#: src/libslic3r/PrintConfig.cpp:3838 msgid "Pad" msgstr "墊" -#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4721 -#: src/slic3r/GUI/Tab.cpp:4722 src/libslic3r/SLA/Hollowing.cpp:73 +#: src/slic3r/GUI/GUI_Factories.cpp:142 src/slic3r/GUI/Tab.cpp:4719 +#: src/slic3r/GUI/Tab.cpp:4720 src/libslic3r/SLA/Hollowing.cpp:73 #: src/libslic3r/SLA/Hollowing.cpp:85 src/libslic3r/SLA/Hollowing.cpp:105 -#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3875 -#: src/libslic3r/PrintConfig.cpp:3882 src/libslic3r/PrintConfig.cpp:3892 -#: src/libslic3r/PrintConfig.cpp:3901 +#: src/libslic3r/SLA/Hollowing.cpp:114 src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3855 src/libslic3r/PrintConfig.cpp:3865 +#: src/libslic3r/PrintConfig.cpp:3874 msgid "Hollowing" msgstr "" @@ -3824,7 +3822,7 @@ msgid "Revert conversion from meters" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:859 src/slic3r/GUI/GUI_ObjectList.cpp:2133 -#: src/libslic3r/PrintConfig.cpp:4516 +#: src/libslic3r/PrintConfig.cpp:4491 msgid "Merge" msgstr "合併" @@ -3885,7 +3883,7 @@ msgid "Split the selected object into individual parts" msgstr "" #: src/slic3r/GUI/GUI_Factories.cpp:944 src/slic3r/GUI/GUI_Factories.cpp:954 -#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4545 +#: src/slic3r/GUI/GUI_Factories.cpp:975 src/libslic3r/PrintConfig.cpp:4520 msgid "Split" msgstr "拆分" @@ -4507,11 +4505,11 @@ msgstr "高度" msgid "Width" msgstr "寬度" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2015 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/Tab.cpp:2013 msgid "Fan speed" msgstr "風扇速度" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1990 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1988 msgid "Temperature" msgstr "溫度" @@ -4792,7 +4790,7 @@ msgstr "" msgid "Attention!" msgstr "注意!" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:18 src/slic3r/GUI/MainFrame.cpp:1107 msgid "Keyboard Shortcuts" msgstr "鍵盤快捷鍵" @@ -4829,7 +4827,7 @@ msgid "Load Config from ini/amf/3mf/gcode and merge" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:87 src/slic3r/GUI/Plater.cpp:913 -#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4416 +#: src/slic3r/GUI/Plater.cpp:6530 src/libslic3r/PrintConfig.cpp:4391 msgid "Export G-code" msgstr "導出 G-code" @@ -5172,13 +5170,13 @@ msgstr "" msgid "Objects List" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 src/slic3r/GUI/MainFrame.cpp:1525 msgid "Open a G-code file" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1355 -#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1526 -#: src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 src/slic3r/GUI/MainFrame.cpp:1359 +#: src/slic3r/GUI/MainFrame.cpp:1363 src/slic3r/GUI/MainFrame.cpp:1530 +#: src/slic3r/GUI/MainFrame.cpp:1534 msgid "Reload the plater from disk" msgstr "" @@ -5215,7 +5213,7 @@ msgid "Show/Hide G-code window" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:230 src/slic3r/GUI/Plater.cpp:4467 -#: src/slic3r/GUI/Tab.cpp:2831 +#: src/slic3r/GUI/Tab.cpp:2829 msgid "Preview" msgstr "預覽" @@ -5293,7 +5291,7 @@ msgid "Keyboard shortcuts" msgstr "" #: src/slic3r/GUI/MainFrame.cpp:75 src/slic3r/GUI/MainFrame.cpp:89 -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open a new PrusaSlicer instance" msgstr "" @@ -5301,11 +5299,11 @@ msgstr "" msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1308 msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:89 src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open PrusaSlicer" msgstr "" @@ -5331,13 +5329,13 @@ msgid "Print Settings" msgstr "列印設置" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:339 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:535 msgid "Material Settings" msgstr "材料設置" #: src/slic3r/GUI/MainFrame.cpp:286 src/slic3r/GUI/MainFrame.cpp:337 -#: src/slic3r/GUI/MainFrame.cpp:2099 src/slic3r/GUI/MainFrame.cpp:2100 +#: src/slic3r/GUI/MainFrame.cpp:2103 src/slic3r/GUI/MainFrame.cpp:2104 #: src/slic3r/GUI/Tab.hpp:461 msgid "Filament Settings" msgstr "耗材絲設置" @@ -5420,621 +5418,621 @@ msgstr "關於對話框" msgid "Show Tip of the Day" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1100 +#: src/slic3r/GUI/MainFrame.cpp:1104 msgid "" "Opens Tip of the day notification in bottom right corner or shows another " "tip if already opened." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1103 +#: src/slic3r/GUI/MainFrame.cpp:1107 msgid "Show the list of the keyboard shortcuts" msgstr "顯示鍵盤快捷鍵的列表" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:1117 +#: src/slic3r/GUI/MainFrame.cpp:1121 msgid "Iso View" msgstr "Iso 視圖" #. 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:1121 src/libslic3r/PrintConfig.cpp:2885 +#: src/slic3r/GUI/MainFrame.cpp:1125 src/libslic3r/PrintConfig.cpp:2885 #: src/libslic3r/PrintConfig.cpp:2894 msgid "Top" msgstr "頂部" -#: src/slic3r/GUI/MainFrame.cpp:1121 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Top View" msgstr "頂視圖" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" #. TRN To be shown in Print Settings "Top solid layers" -#: src/slic3r/GUI/MainFrame.cpp:1124 src/libslic3r/PrintConfig.cpp:445 +#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:445 #: src/libslic3r/PrintConfig.cpp:454 msgid "Bottom" msgstr "底部" -#: src/slic3r/GUI/MainFrame.cpp:1124 +#: src/slic3r/GUI/MainFrame.cpp:1128 msgid "Bottom View" msgstr "底部視圖" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front" msgstr "前面" -#: src/slic3r/GUI/MainFrame.cpp:1126 +#: src/slic3r/GUI/MainFrame.cpp:1130 msgid "Front View" msgstr "正視圖" -#: src/slic3r/GUI/MainFrame.cpp:1128 src/libslic3r/PrintConfig.cpp:2242 +#: src/slic3r/GUI/MainFrame.cpp:1132 src/libslic3r/PrintConfig.cpp:2242 msgid "Rear" msgstr "背面" -#: src/slic3r/GUI/MainFrame.cpp:1128 +#: src/slic3r/GUI/MainFrame.cpp:1132 msgid "Rear View" msgstr "後視圖" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left" msgstr "左" -#: src/slic3r/GUI/MainFrame.cpp:1130 +#: src/slic3r/GUI/MainFrame.cpp:1134 msgid "Left View" msgstr "左視圖" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right" msgstr "右" -#: src/slic3r/GUI/MainFrame.cpp:1132 +#: src/slic3r/GUI/MainFrame.cpp:1136 msgid "Right View" msgstr "右視圖" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1145 +#: src/slic3r/GUI/MainFrame.cpp:1149 msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "&Open Project" msgstr "&打開項目" -#: src/slic3r/GUI/MainFrame.cpp:1148 +#: src/slic3r/GUI/MainFrame.cpp:1152 msgid "Open a project file" msgstr "打開項目文件" -#: src/slic3r/GUI/MainFrame.cpp:1153 +#: src/slic3r/GUI/MainFrame.cpp:1157 msgid "Recent projects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1165 +#: src/slic3r/GUI/MainFrame.cpp:1169 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:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Save Project" msgstr "&保存項目" -#: src/slic3r/GUI/MainFrame.cpp:1190 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "Save current project file" msgstr "將當前項目文件另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save Project &as" msgstr "保存項目 &爲" -#: src/slic3r/GUI/MainFrame.cpp:1194 src/slic3r/GUI/MainFrame.cpp:1196 +#: src/slic3r/GUI/MainFrame.cpp:1198 src/slic3r/GUI/MainFrame.cpp:1200 msgid "Save current project file as" msgstr "將當前項目文件另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Import STL/OBJ/AM&F/3MF" msgstr "導入 STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:1204 +#: src/slic3r/GUI/MainFrame.cpp:1208 msgid "Load a model" msgstr "加載模型" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Import STL (Imperial Units)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1208 +#: src/slic3r/GUI/MainFrame.cpp:1212 msgid "Load an model saved with imperial units" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Import SL1 / SL1S Archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1212 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Load an SL1 / Sl1S archive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Import &Config" msgstr "導入&配置" -#: src/slic3r/GUI/MainFrame.cpp:1217 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Load exported configuration file" msgstr "加載導出的配置文件" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Import Config from &Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1220 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Load configuration from project file" msgstr "從項目文件加載配置" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Import Config &Bundle" msgstr "導入配置&組" -#: src/slic3r/GUI/MainFrame.cpp:1224 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Load presets from a bundle" msgstr "從包加載預設" -#: src/slic3r/GUI/MainFrame.cpp:1227 +#: src/slic3r/GUI/MainFrame.cpp:1231 msgid "&Import" msgstr "&導入" -#: src/slic3r/GUI/MainFrame.cpp:1230 src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1586 msgid "Export &G-code" msgstr "導出 &G-code" -#: src/slic3r/GUI/MainFrame.cpp:1230 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Export current plate as G-code" msgstr "將當佈局板導出爲 G-code" -#: src/slic3r/GUI/MainFrame.cpp:1234 src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1238 src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1234 +#: src/slic3r/GUI/MainFrame.cpp:1238 msgid "Send to print current plate as G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export G-code to SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1238 +#: src/slic3r/GUI/MainFrame.cpp:1242 msgid "Export current plate as G-code to SD card / Flash drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export Plate as &STL" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1242 +#: src/slic3r/GUI/MainFrame.cpp:1246 msgid "Export current plate as STL" msgstr "將當前佈局板導出爲 STL" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export Plate as STL &Including Supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1245 +#: src/slic3r/GUI/MainFrame.cpp:1249 msgid "Export current plate as STL including supports" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export &Toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1253 src/slic3r/GUI/MainFrame.cpp:1534 +#: src/slic3r/GUI/MainFrame.cpp:1257 src/slic3r/GUI/MainFrame.cpp:1538 msgid "Export toolpaths as OBJ" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export &Config" msgstr "導出&配置" -#: src/slic3r/GUI/MainFrame.cpp:1257 +#: src/slic3r/GUI/MainFrame.cpp:1261 msgid "Export current configuration to file" msgstr "將當前配置導出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export Config &Bundle" msgstr "導出配置&包" -#: src/slic3r/GUI/MainFrame.cpp:1260 +#: src/slic3r/GUI/MainFrame.cpp:1264 msgid "Export all presets to file" msgstr "將所有預設導出到文件" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export Config Bundle With Physical Printers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1263 +#: src/slic3r/GUI/MainFrame.cpp:1267 msgid "Export all presets including physical printers to file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1266 +#: src/slic3r/GUI/MainFrame.cpp:1270 msgid "&Export" msgstr "導出(&E)" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Ejec&t SD Card / Flash Drive" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1268 +#: src/slic3r/GUI/MainFrame.cpp:1272 msgid "Eject SD card / Flash drive after the G-code was exported to it." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Quick Slice" msgstr "快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1276 +#: src/slic3r/GUI/MainFrame.cpp:1280 msgid "Slice a file into a G-code" msgstr "將文件切片成 G-code" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Quick Slice and Save As" msgstr "快速切片並另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1282 +#: src/slic3r/GUI/MainFrame.cpp:1286 msgid "Slice a file into a G-code, save as" msgstr "將文件切片成 G-code, 並另存爲" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat Last Quick Slice" msgstr "重複上一個快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1288 +#: src/slic3r/GUI/MainFrame.cpp:1292 msgid "Repeat last quick slice" msgstr "重複上一個快速切片" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "(Re)Slice No&w" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1296 +#: src/slic3r/GUI/MainFrame.cpp:1300 msgid "Start new slicing process" msgstr "開始新的切片流程" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "&Repair STL file" msgstr "&修復 STL 文件" -#: src/slic3r/GUI/MainFrame.cpp:1300 +#: src/slic3r/GUI/MainFrame.cpp:1304 msgid "Automatically repair an STL file" msgstr "自動修復 STL 文件" -#: src/slic3r/GUI/MainFrame.cpp:1304 +#: src/slic3r/GUI/MainFrame.cpp:1308 msgid "&G-code Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 msgid "&Quit" msgstr "&退出" -#: src/slic3r/GUI/MainFrame.cpp:1307 src/slic3r/GUI/MainFrame.cpp:1541 +#: src/slic3r/GUI/MainFrame.cpp:1311 src/slic3r/GUI/MainFrame.cpp:1545 #, c-format, boost-format msgid "Quit %s" msgstr "結束 %s" -#: src/slic3r/GUI/MainFrame.cpp:1322 +#: src/slic3r/GUI/MainFrame.cpp:1326 msgid "&Select All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1323 +#: src/slic3r/GUI/MainFrame.cpp:1327 msgid "Selects all objects" msgstr "選擇所有對象" -#: src/slic3r/GUI/MainFrame.cpp:1325 +#: src/slic3r/GUI/MainFrame.cpp:1329 msgid "D&eselect All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1326 +#: src/slic3r/GUI/MainFrame.cpp:1330 msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1329 +#: src/slic3r/GUI/MainFrame.cpp:1333 msgid "&Delete Selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1330 +#: src/slic3r/GUI/MainFrame.cpp:1334 msgid "Deletes the current selection" msgstr "刪除當前所選內容" -#: src/slic3r/GUI/MainFrame.cpp:1332 +#: src/slic3r/GUI/MainFrame.cpp:1336 msgid "Delete &All" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1333 +#: src/slic3r/GUI/MainFrame.cpp:1337 msgid "Deletes all objects" msgstr "刪除所有對象" -#: src/slic3r/GUI/MainFrame.cpp:1337 +#: src/slic3r/GUI/MainFrame.cpp:1341 msgid "&Undo" msgstr "回復(&U)" -#: src/slic3r/GUI/MainFrame.cpp:1340 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "&Redo" msgstr "重做(&R)" -#: src/slic3r/GUI/MainFrame.cpp:1345 +#: src/slic3r/GUI/MainFrame.cpp:1349 msgid "&Copy" msgstr "複製(&C)" -#: src/slic3r/GUI/MainFrame.cpp:1346 +#: src/slic3r/GUI/MainFrame.cpp:1350 msgid "Copy selection to clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1348 +#: src/slic3r/GUI/MainFrame.cpp:1352 msgid "&Paste" msgstr "貼上(&P)" -#: src/slic3r/GUI/MainFrame.cpp:1349 +#: src/slic3r/GUI/MainFrame.cpp:1353 msgid "Paste clipboard" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1354 src/slic3r/GUI/MainFrame.cpp:1358 -#: src/slic3r/GUI/MainFrame.cpp:1525 src/slic3r/GUI/MainFrame.cpp:1529 +#: src/slic3r/GUI/MainFrame.cpp:1358 src/slic3r/GUI/MainFrame.cpp:1362 +#: src/slic3r/GUI/MainFrame.cpp:1529 src/slic3r/GUI/MainFrame.cpp:1533 msgid "Re&load from Disk" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1364 +#: src/slic3r/GUI/MainFrame.cpp:1368 msgid "Searc&h" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1365 +#: src/slic3r/GUI/MainFrame.cpp:1369 msgid "Search in settings" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "&Plater Tab" msgstr "&佈局器 選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1373 +#: src/slic3r/GUI/MainFrame.cpp:1377 msgid "Show the plater" msgstr "顯示平臺佈局器" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "P&rint Settings Tab" msgstr "&列印設置選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1378 +#: src/slic3r/GUI/MainFrame.cpp:1382 msgid "Show the print settings" msgstr "顯示列印設置" -#: src/slic3r/GUI/MainFrame.cpp:1381 src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1385 src/slic3r/GUI/MainFrame.cpp:1589 msgid "&Filament Settings Tab" msgstr "&線材設置選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1381 +#: src/slic3r/GUI/MainFrame.cpp:1385 msgid "Show the filament settings" msgstr "顯示耗材設置" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Print&er Settings Tab" msgstr "&印表機設置選項卡" -#: src/slic3r/GUI/MainFrame.cpp:1385 +#: src/slic3r/GUI/MainFrame.cpp:1389 msgid "Show the printer settings" msgstr "顯示印表機設置" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:1391 +#: src/slic3r/GUI/MainFrame.cpp:1395 msgid "Show the 3D editing view" msgstr "顯示3D 編輯視圖" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Pre&view" msgstr "預覽" -#: src/slic3r/GUI/MainFrame.cpp:1394 +#: src/slic3r/GUI/MainFrame.cpp:1398 msgid "Show the 3D slices preview" msgstr "顯示3D 切片預覽" -#: src/slic3r/GUI/MainFrame.cpp:1400 +#: src/slic3r/GUI/MainFrame.cpp:1404 msgid "Open the dialog to modify shape gallery" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Print &Host Upload Queue" msgstr "列印&主機上載隊列" -#: src/slic3r/GUI/MainFrame.cpp:1412 +#: src/slic3r/GUI/MainFrame.cpp:1416 msgid "Display the Print Host Upload Queue window" msgstr "顯示 \"列印主機上載隊列\" 窗口" -#: src/slic3r/GUI/MainFrame.cpp:1416 +#: src/slic3r/GUI/MainFrame.cpp:1420 msgid "Open New Instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1563 +#: src/slic3r/GUI/MainFrame.cpp:1424 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1566 msgid "Compare Presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1420 +#: src/slic3r/GUI/MainFrame.cpp:1424 msgid "Compare presets" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show &Labels" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1430 +#: src/slic3r/GUI/MainFrame.cpp:1434 msgid "Show object/instance labels in 3D scene" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 +#: src/slic3r/GUI/MainFrame.cpp:1437 msgid "&Collapse Sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1433 src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/MainFrame.cpp:1437 src/slic3r/GUI/Plater.cpp:2320 msgid "Collapse sidebar" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "&Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1442 msgid "Fullscreen" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1453 src/slic3r/GUI/MainFrame.cpp:1556 +#: src/slic3r/GUI/MainFrame.cpp:1457 src/slic3r/GUI/MainFrame.cpp:1560 msgid "&File" msgstr "&文件" -#: src/slic3r/GUI/MainFrame.cpp:1454 +#: src/slic3r/GUI/MainFrame.cpp:1458 msgid "&Edit" msgstr "&編輯" -#: src/slic3r/GUI/MainFrame.cpp:1455 +#: src/slic3r/GUI/MainFrame.cpp:1459 msgid "&Window" msgstr "&窗口" -#: src/slic3r/GUI/MainFrame.cpp:1456 src/slic3r/GUI/MainFrame.cpp:1557 +#: src/slic3r/GUI/MainFrame.cpp:1460 src/slic3r/GUI/MainFrame.cpp:1561 msgid "&View" msgstr "&視圖" -#: src/slic3r/GUI/MainFrame.cpp:1459 src/slic3r/GUI/MainFrame.cpp:1560 +#: src/slic3r/GUI/MainFrame.cpp:1463 src/slic3r/GUI/MainFrame.cpp:1564 msgid "&Help" msgstr "&幫助" -#: src/slic3r/GUI/MainFrame.cpp:1521 +#: src/slic3r/GUI/MainFrame.cpp:1525 msgid "&Open G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1537 +#: src/slic3r/GUI/MainFrame.cpp:1541 msgid "Open &PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1582 +#: src/slic3r/GUI/MainFrame.cpp:1586 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1583 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1585 +#: src/slic3r/GUI/MainFrame.cpp:1589 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1609 +#: src/slic3r/GUI/MainFrame.cpp:1613 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "選擇要切片的文件(STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:1621 +#: src/slic3r/GUI/MainFrame.cpp:1625 msgid "No previously sliced file." msgstr "沒有預切片的文件。" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid "Previously sliced file (" msgstr "預切片文件 (" -#: src/slic3r/GUI/MainFrame.cpp:1628 +#: src/slic3r/GUI/MainFrame.cpp:1632 msgid ") not found." msgstr ") 無法找到。" -#: src/slic3r/GUI/MainFrame.cpp:1629 +#: src/slic3r/GUI/MainFrame.cpp:1633 msgid "File Not Found" msgstr "文件未找到" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 #, c-format, boost-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/MainFrame.cpp:1664 +#: src/slic3r/GUI/MainFrame.cpp:1668 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/MainFrame.cpp:1676 +#: src/slic3r/GUI/MainFrame.cpp:1680 msgid "Save zip file as:" msgstr "將 zip 文件另存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1685 src/slic3r/GUI/Plater.cpp:3316 +#: src/slic3r/GUI/MainFrame.cpp:1689 src/slic3r/GUI/Plater.cpp:3316 #: src/slic3r/GUI/Plater.cpp:6051 src/slic3r/GUI/Tab.cpp:1663 -#: src/slic3r/GUI/Tab.cpp:4729 +#: src/slic3r/GUI/Tab.cpp:4727 msgid "Slicing" msgstr "切片" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:1687 +#: src/slic3r/GUI/MainFrame.cpp:1691 #, c-format, boost-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1710 +#: src/slic3r/GUI/MainFrame.cpp:1714 #, boost-format msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1713 +#: src/slic3r/GUI/MainFrame.cpp:1717 msgid "Slicing Done!" msgstr "切片完成!" -#: src/slic3r/GUI/MainFrame.cpp:1729 +#: src/slic3r/GUI/MainFrame.cpp:1733 msgid "Select the STL file to repair:" msgstr "選擇要修復的 STL 文件:" -#: src/slic3r/GUI/MainFrame.cpp:1739 +#: src/slic3r/GUI/MainFrame.cpp:1743 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "將 OBJ 文件 (不像 STL 那樣容易發生座標錯誤) 保存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1750 +#: src/slic3r/GUI/MainFrame.cpp:1754 msgid "Your file was repaired." msgstr "您的文件已修復。" -#: src/slic3r/GUI/MainFrame.cpp:1750 src/libslic3r/PrintConfig.cpp:4521 +#: src/slic3r/GUI/MainFrame.cpp:1754 src/libslic3r/PrintConfig.cpp:4496 msgid "Repair" msgstr "修復" -#: src/slic3r/GUI/MainFrame.cpp:1764 +#: src/slic3r/GUI/MainFrame.cpp:1768 msgid "Save configuration as:" msgstr "將配置另存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1781 +#: src/slic3r/GUI/MainFrame.cpp:1785 msgid "Loading of a configuration file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1783 src/slic3r/GUI/MainFrame.cpp:1848 +#: src/slic3r/GUI/MainFrame.cpp:1787 src/slic3r/GUI/MainFrame.cpp:1852 msgid "Select configuration to load:" msgstr "選擇要加載的配置:" -#: src/slic3r/GUI/MainFrame.cpp:1812 +#: src/slic3r/GUI/MainFrame.cpp:1816 msgid "Exporting configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1813 +#: src/slic3r/GUI/MainFrame.cpp:1817 msgid "" "Some presets are modified and the unsaved changes will not be exported into " "configuration bundle." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1822 +#: src/slic3r/GUI/MainFrame.cpp:1826 msgid "Save presets bundle as:" msgstr "將預設包保存爲:" -#: src/slic3r/GUI/MainFrame.cpp:1845 +#: src/slic3r/GUI/MainFrame.cpp:1849 msgid "Loading of a configuration bundle" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:1875 +#: src/slic3r/GUI/MainFrame.cpp:1879 #, c-format, boost-format msgid "%d presets successfully imported." msgstr "%d 預設已成功導入。" @@ -6251,8 +6249,8 @@ msgstr "" msgid "Instance %d" msgstr "" -#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4567 -#: src/slic3r/GUI/Tab.cpp:4658 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:105 src/slic3r/GUI/Tab.cpp:4565 +#: src/slic3r/GUI/Tab.cpp:4656 msgid "Layers" msgstr "圖層" @@ -6322,7 +6320,7 @@ msgstr "" msgid "Add preset for this printer device" msgstr "" -#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2254 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:210 src/slic3r/GUI/Tab.cpp:2252 msgid "Print Host upload" msgstr "列印主機上傳隊列" @@ -6470,7 +6468,7 @@ msgid "Select what kind of support do you need" msgstr "選擇您需要的支持類型" #: src/slic3r/GUI/Plater.cpp:433 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:3640 +#: src/libslic3r/PrintConfig.cpp:3613 msgid "Support on build plate only" msgstr "僅在熱牀上生成支撐" @@ -6566,7 +6564,7 @@ msgid "(including spool)" msgstr "" #: src/slic3r/GUI/Plater.cpp:1411 src/libslic3r/PrintConfig.cpp:1067 -#: src/libslic3r/PrintConfig.cpp:3434 src/libslic3r/PrintConfig.cpp:3435 +#: src/libslic3r/PrintConfig.cpp:3407 src/libslic3r/PrintConfig.cpp:3408 msgid "Cost" msgstr "單價" @@ -7028,10 +7026,10 @@ msgstr "" msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2289 -#: src/slic3r/GUI/Tab.cpp:2516 src/slic3r/GUI/Tab.cpp:2623 +#: src/slic3r/GUI/Preferences.cpp:106 src/slic3r/GUI/Tab.cpp:2287 +#: src/slic3r/GUI/Tab.cpp:2514 src/slic3r/GUI/Tab.cpp:2621 #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "General" msgstr "常規" @@ -7471,7 +7469,7 @@ msgid "Add/Remove presets" msgstr "" #: src/slic3r/GUI/PresetComboBoxes.cpp:702 -#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:742 src/slic3r/GUI/Tab.cpp:3245 msgid "Add physical printer" msgstr "" @@ -7483,7 +7481,7 @@ msgstr "" msgid "Change extruder color" msgstr "" -#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3247 +#: src/slic3r/GUI/PresetComboBoxes.cpp:730 src/slic3r/GUI/Tab.cpp:3245 msgid "Edit physical printer" msgstr "" @@ -7780,11 +7778,11 @@ msgstr "完全不存在" #: src/slic3r/GUI/RammingChart.cpp:90 src/slic3r/GUI/WipeTowerDialog.cpp:114 #: src/libslic3r/PrintConfig.cpp:951 src/libslic3r/PrintConfig.cpp:995 -#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3292 -#: src/libslic3r/PrintConfig.cpp:3301 src/libslic3r/PrintConfig.cpp:3310 -#: src/libslic3r/PrintConfig.cpp:3451 src/libslic3r/PrintConfig.cpp:3459 -#: src/libslic3r/PrintConfig.cpp:3467 src/libslic3r/PrintConfig.cpp:3474 -#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3490 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:3265 +#: src/libslic3r/PrintConfig.cpp:3274 src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3424 src/libslic3r/PrintConfig.cpp:3432 +#: src/libslic3r/PrintConfig.cpp:3440 src/libslic3r/PrintConfig.cpp:3447 +#: src/libslic3r/PrintConfig.cpp:3455 src/libslic3r/PrintConfig.cpp:3463 msgid "s" msgstr "s" @@ -7893,12 +7891,12 @@ msgid "Just switch to \"%1%\" preset" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2651 +#: src/slic3r/GUI/Tab.cpp:2649 msgid "Stealth" msgstr "" #: src/slic3r/GUI/Search.cpp:90 src/slic3r/GUI/Search.cpp:336 -#: src/slic3r/GUI/Tab.cpp:2645 +#: src/slic3r/GUI/Tab.cpp:2643 msgid "Normal" msgstr "正常" @@ -8149,7 +8147,7 @@ msgstr "" msgid "symbolic profile name" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4656 +#: src/slic3r/GUI/Tab.cpp:1447 src/slic3r/GUI/Tab.cpp:4654 msgid "Layers and perimeters" msgstr "層和輪廓" @@ -8237,7 +8235,7 @@ msgstr "交疊" msgid "Flow" msgstr "流量" -#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1699 +#: src/slic3r/GUI/Tab.cpp:1671 src/slic3r/GUI/Tab.cpp:1697 msgid "Other" msgstr "其他" @@ -8245,52 +8243,52 @@ msgstr "其他" msgid "Arachne perimeter generator" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:4733 +#: src/slic3r/GUI/Tab.cpp:1682 src/slic3r/GUI/Tab.cpp:4731 msgid "Output options" msgstr "輸出選項" -#: src/slic3r/GUI/Tab.cpp:1685 +#: src/slic3r/GUI/Tab.cpp:1683 msgid "Sequential printing" msgstr "順序列印" -#: src/slic3r/GUI/Tab.cpp:1687 +#: src/slic3r/GUI/Tab.cpp:1685 msgid "Extruder clearance" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1692 src/slic3r/GUI/Tab.cpp:4734 +#: src/slic3r/GUI/Tab.cpp:1690 src/slic3r/GUI/Tab.cpp:4732 msgid "Output file" msgstr "輸出文件" -#: src/slic3r/GUI/Tab.cpp:1711 src/libslic3r/PrintConfig.cpp:2010 +#: src/slic3r/GUI/Tab.cpp:1709 src/libslic3r/PrintConfig.cpp:2010 msgid "Post-processing scripts" msgstr "後處理腳本" -#: src/slic3r/GUI/Tab.cpp:1723 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2109 src/slic3r/GUI/Tab.cpp:2110 -#: src/slic3r/GUI/Tab.cpp:2497 src/slic3r/GUI/Tab.cpp:2498 -#: src/slic3r/GUI/Tab.cpp:2570 src/slic3r/GUI/Tab.cpp:2571 -#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4584 -#: src/slic3r/GUI/Tab.cpp:4585 +#: src/slic3r/GUI/Tab.cpp:1721 src/slic3r/GUI/Tab.cpp:1722 +#: src/slic3r/GUI/Tab.cpp:2107 src/slic3r/GUI/Tab.cpp:2108 +#: src/slic3r/GUI/Tab.cpp:2495 src/slic3r/GUI/Tab.cpp:2496 +#: src/slic3r/GUI/Tab.cpp:2568 src/slic3r/GUI/Tab.cpp:2569 +#: src/slic3r/GUI/Tab.cpp:3954 src/slic3r/GUI/Tab.cpp:4582 +#: src/slic3r/GUI/Tab.cpp:4583 msgid "Notes" msgstr "備註" -#: src/slic3r/GUI/Tab.cpp:1730 src/slic3r/GUI/Tab.cpp:2117 -#: src/slic3r/GUI/Tab.cpp:2504 src/slic3r/GUI/Tab.cpp:2577 -#: src/slic3r/GUI/Tab.cpp:4592 src/slic3r/GUI/Tab.cpp:4739 +#: src/slic3r/GUI/Tab.cpp:1728 src/slic3r/GUI/Tab.cpp:2115 +#: src/slic3r/GUI/Tab.cpp:2502 src/slic3r/GUI/Tab.cpp:2575 +#: src/slic3r/GUI/Tab.cpp:4590 src/slic3r/GUI/Tab.cpp:4737 msgid "Dependencies" msgstr "依賴" -#: src/slic3r/GUI/Tab.cpp:1731 src/slic3r/GUI/Tab.cpp:2118 -#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2578 -#: src/slic3r/GUI/Tab.cpp:4593 src/slic3r/GUI/Tab.cpp:4740 +#: src/slic3r/GUI/Tab.cpp:1729 src/slic3r/GUI/Tab.cpp:2116 +#: src/slic3r/GUI/Tab.cpp:2503 src/slic3r/GUI/Tab.cpp:2576 +#: src/slic3r/GUI/Tab.cpp:4591 src/slic3r/GUI/Tab.cpp:4738 msgid "Profile dependencies" msgstr "配置文件依賴" -#: src/slic3r/GUI/Tab.cpp:1770 +#: src/slic3r/GUI/Tab.cpp:1768 msgid "Post processing scripts shall modify G-code file in place." msgstr "" -#: src/slic3r/GUI/Tab.cpp:1849 +#: src/slic3r/GUI/Tab.cpp:1847 #, c-format, boost-format msgid "" "The following line %s contains reserved keywords.\n" @@ -8302,82 +8300,82 @@ msgid_plural "" "printing time estimation." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:1854 +#: src/slic3r/GUI/Tab.cpp:1852 msgid "Found reserved keywords in" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1868 +#: src/slic3r/GUI/Tab.cpp:1866 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1991 +#: src/slic3r/GUI/Tab.cpp:1989 msgid "Nozzle" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1996 +#: src/slic3r/GUI/Tab.cpp:1994 msgid "Bed" msgstr "牀" -#: src/slic3r/GUI/Tab.cpp:2001 +#: src/slic3r/GUI/Tab.cpp:1999 msgid "Cooling" msgstr "冷卻" -#: src/slic3r/GUI/Tab.cpp:2003 src/libslic3r/PrintConfig.cpp:1912 +#: src/slic3r/GUI/Tab.cpp:2001 src/libslic3r/PrintConfig.cpp:1912 #: src/libslic3r/PrintConfig.cpp:2962 msgid "Enable" msgstr "使能" -#: src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:2012 msgid "Fan settings" msgstr "風扇設置" -#: src/slic3r/GUI/Tab.cpp:2025 +#: src/slic3r/GUI/Tab.cpp:2023 msgid "Cooling thresholds" msgstr "冷卻閾值" -#: src/slic3r/GUI/Tab.cpp:2031 +#: src/slic3r/GUI/Tab.cpp:2029 msgid "Filament properties" msgstr "耗材絲特性" -#: src/slic3r/GUI/Tab.cpp:2038 +#: src/slic3r/GUI/Tab.cpp:2036 msgid "Print speed override" msgstr "列印速度覆蓋" -#: src/slic3r/GUI/Tab.cpp:2048 +#: src/slic3r/GUI/Tab.cpp:2046 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2051 +#: src/slic3r/GUI/Tab.cpp:2049 msgid "Toolchange parameters with single extruder MM printers" msgstr "單擠出機 MM 印表機的工具更換參數" -#: src/slic3r/GUI/Tab.cpp:2064 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Ramming settings" msgstr "衝壓設置" -#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:2409 -#: src/slic3r/GUI/Tab.cpp:4263 src/libslic3r/GCode.cpp:733 +#: src/slic3r/GUI/Tab.cpp:2086 src/slic3r/GUI/Tab.cpp:2407 +#: src/slic3r/GUI/Tab.cpp:4261 src/libslic3r/GCode.cpp:733 #: src/libslic3r/PrintConfig.cpp:2468 msgid "Custom G-code" msgstr "自定義 G-code" -#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:2410 +#: src/slic3r/GUI/Tab.cpp:2087 src/slic3r/GUI/Tab.cpp:2408 #: src/libslic3r/GCode.cpp:707 src/libslic3r/PrintConfig.cpp:2418 #: src/libslic3r/PrintConfig.cpp:2433 msgid "Start G-code" msgstr "起始G代碼" -#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2420 +#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2418 #: src/libslic3r/GCode.cpp:708 src/libslic3r/PrintConfig.cpp:684 #: src/libslic3r/PrintConfig.cpp:694 msgid "End G-code" msgstr "結尾G代碼" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2150 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2256 +#: src/slic3r/GUI/Tab.cpp:2254 msgid "" "Note: All parameters from this group are moved to the Physical Printer " "settings (see changelog).\n" @@ -8390,20 +8388,20 @@ msgid "" "physical_printer directory." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2290 src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2288 src/slic3r/GUI/Tab.cpp:2515 msgid "Size and coordinates" msgstr "尺寸和座標" -#: src/slic3r/GUI/Tab.cpp:2299 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1674 +#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/UnsavedChangesDialog.cpp:1287 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1677 msgid "Capabilities" msgstr "權限" -#: src/slic3r/GUI/Tab.cpp:2304 +#: src/slic3r/GUI/Tab.cpp:2302 msgid "Number of extruders of the printer." msgstr "印表機擠出機的數量。" -#: src/slic3r/GUI/Tab.cpp:2333 +#: src/slic3r/GUI/Tab.cpp:2331 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -8411,64 +8409,64 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2335 src/slic3r/GUI/Tab.cpp:2779 #: src/libslic3r/PrintConfig.cpp:1876 msgid "Nozzle diameter" msgstr "噴嘴直徑" -#: src/slic3r/GUI/Tab.cpp:2430 src/libslic3r/GCode.cpp:709 +#: src/slic3r/GUI/Tab.cpp:2428 src/libslic3r/GCode.cpp:709 #: src/libslic3r/PrintConfig.cpp:424 msgid "Before layer change G-code" msgstr "層改變前的G代碼" -#: src/slic3r/GUI/Tab.cpp:2440 src/libslic3r/GCode.cpp:710 +#: src/slic3r/GUI/Tab.cpp:2438 src/libslic3r/GCode.cpp:710 #: src/libslic3r/PrintConfig.cpp:1602 msgid "After layer change G-code" msgstr "層變化後G代碼" -#: src/slic3r/GUI/Tab.cpp:2450 src/libslic3r/GCode.cpp:711 +#: src/slic3r/GUI/Tab.cpp:2448 src/libslic3r/GCode.cpp:711 #: src/libslic3r/PrintConfig.cpp:2845 msgid "Tool change G-code" msgstr "切換工具G代碼" -#: src/slic3r/GUI/Tab.cpp:2460 src/libslic3r/GCode.cpp:712 +#: src/slic3r/GUI/Tab.cpp:2458 src/libslic3r/GCode.cpp:712 msgid "Between objects G-code (for sequential printing)" msgstr "模型對象之間的 G-code (用於順序列印)" -#: src/slic3r/GUI/Tab.cpp:2470 src/libslic3r/GCode.cpp:713 +#: src/slic3r/GUI/Tab.cpp:2468 src/libslic3r/GCode.cpp:713 msgid "Color Change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2479 src/libslic3r/GCode.cpp:714 +#: src/slic3r/GUI/Tab.cpp:2477 src/libslic3r/GCode.cpp:714 #: src/libslic3r/PrintConfig.cpp:2459 msgid "Pause Print G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2488 src/libslic3r/GCode.cpp:715 +#: src/slic3r/GUI/Tab.cpp:2486 src/libslic3r/GCode.cpp:715 msgid "Template Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/Tab.cpp:2522 msgid "Display" msgstr "顯示" -#: src/slic3r/GUI/Tab.cpp:2539 +#: src/slic3r/GUI/Tab.cpp:2537 msgid "Tilt" msgstr "傾斜" -#: src/slic3r/GUI/Tab.cpp:2540 +#: src/slic3r/GUI/Tab.cpp:2538 msgid "Tilt time" msgstr "傾斜時間" -#: src/slic3r/GUI/Tab.cpp:2547 src/slic3r/GUI/Tab.cpp:4574 +#: src/slic3r/GUI/Tab.cpp:2545 src/slic3r/GUI/Tab.cpp:4572 msgid "Corrections" msgstr "修正" -#: src/slic3r/GUI/Tab.cpp:2560 src/slic3r/GUI/Tab.cpp:4570 +#: src/slic3r/GUI/Tab.cpp:2558 src/slic3r/GUI/Tab.cpp:4568 msgid "Exposure" msgstr "曝光" -#: src/slic3r/GUI/Tab.cpp:2621 src/slic3r/GUI/Tab.cpp:2708 +#: src/slic3r/GUI/Tab.cpp:2619 src/slic3r/GUI/Tab.cpp:2706 #: src/libslic3r/PrintConfig.cpp:1631 src/libslic3r/PrintConfig.cpp:1666 #: src/libslic3r/PrintConfig.cpp:1683 src/libslic3r/PrintConfig.cpp:1700 #: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1726 @@ -8477,67 +8475,67 @@ msgstr "曝光" msgid "Machine limits" msgstr "機器限制" -#: src/slic3r/GUI/Tab.cpp:2644 +#: src/slic3r/GUI/Tab.cpp:2642 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2650 +#: src/slic3r/GUI/Tab.cpp:2648 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2659 +#: src/slic3r/GUI/Tab.cpp:2657 msgid "Maximum feedrates" msgstr "最大進給率" -#: src/slic3r/GUI/Tab.cpp:2664 +#: src/slic3r/GUI/Tab.cpp:2662 msgid "Maximum accelerations" msgstr "最大加速度" -#: src/slic3r/GUI/Tab.cpp:2673 +#: src/slic3r/GUI/Tab.cpp:2671 msgid "Jerk limits" msgstr "抖動限制" -#: src/slic3r/GUI/Tab.cpp:2679 +#: src/slic3r/GUI/Tab.cpp:2677 msgid "Minimum feedrates" msgstr "最小進給率" -#: src/slic3r/GUI/Tab.cpp:2733 src/slic3r/GUI/Tab.cpp:2742 +#: src/slic3r/GUI/Tab.cpp:2731 src/slic3r/GUI/Tab.cpp:2740 msgid "Single extruder MM setup" msgstr "單擠出機 MM 設置" -#: src/slic3r/GUI/Tab.cpp:2743 +#: src/slic3r/GUI/Tab.cpp:2741 msgid "Single extruder multimaterial parameters" msgstr "單擠出機多材料參數" -#: src/slic3r/GUI/Tab.cpp:2778 +#: src/slic3r/GUI/Tab.cpp:2776 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:2803 +#: src/slic3r/GUI/Tab.cpp:2801 msgid "Layer height limits" msgstr "層高度限制" -#: src/slic3r/GUI/Tab.cpp:2808 +#: src/slic3r/GUI/Tab.cpp:2806 msgid "Position (for multi-extruder printers)" msgstr "位置 (適用於多擠出機印表機)" -#: src/slic3r/GUI/Tab.cpp:2814 +#: src/slic3r/GUI/Tab.cpp:2812 msgid "Only lift Z" msgstr "僅提升 Z" -#: src/slic3r/GUI/Tab.cpp:2827 +#: src/slic3r/GUI/Tab.cpp:2825 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "禁用工具時的回縮 (多擠出機設置的高級設置)" -#: src/slic3r/GUI/Tab.cpp:2834 +#: src/slic3r/GUI/Tab.cpp:2832 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3011 +#: src/slic3r/GUI/Tab.cpp:3009 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -8547,51 +8545,51 @@ msgstr "" "\n" "要禁用它以啓用固件回抽嗎?" -#: src/slic3r/GUI/Tab.cpp:3013 +#: src/slic3r/GUI/Tab.cpp:3011 msgid "Firmware Retraction" msgstr "固件回縮" -#: src/slic3r/GUI/Tab.cpp:3318 +#: src/slic3r/GUI/Tab.cpp:3316 msgid "New printer preset selected" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3624 +#: src/slic3r/GUI/Tab.cpp:3622 msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "remove" msgstr "移除" -#: src/slic3r/GUI/Tab.cpp:3701 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "delete" msgstr "刪除" -#: src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "It's a last preset for this physical printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3715 +#: src/slic3r/GUI/Tab.cpp:3713 #, boost-format msgid "" "Are you sure you want to delete \"%1%\" preset from the physical printer " "\"%2%\"?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3727 +#: src/slic3r/GUI/Tab.cpp:3725 msgid "" "The physical printer below is based on the preset, you are going to delete." msgid_plural "" "The physical printers below are based on the preset, you are going to delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3732 +#: src/slic3r/GUI/Tab.cpp:3730 msgid "Note, that the selected preset will be deleted from this printer too." msgid_plural "" "Note, that the selected preset will be deleted from these printers too." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3737 +#: src/slic3r/GUI/Tab.cpp:3735 msgid "" "The physical printer below is based only on the preset, you are going to " "delete." @@ -8600,91 +8598,91 @@ msgid_plural "" "delete." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3742 +#: src/slic3r/GUI/Tab.cpp:3740 msgid "" "Note, that this printer will be deleted after deleting the selected preset." msgid_plural "" "Note, that these printers will be deleted after deleting the selected preset." msgstr[0] "" -#: src/slic3r/GUI/Tab.cpp:3747 +#: src/slic3r/GUI/Tab.cpp:3745 #, boost-format msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3752 +#: src/slic3r/GUI/Tab.cpp:3750 #, boost-format msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3835 src/slic3r/GUI/Tab.cpp:4197 +#: src/slic3r/GUI/Tab.cpp:3833 src/slic3r/GUI/Tab.cpp:4195 msgid "Set" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3954 +#: src/slic3r/GUI/Tab.cpp:3952 msgid "Find" msgstr "尋找" -#: src/slic3r/GUI/Tab.cpp:3955 +#: src/slic3r/GUI/Tab.cpp:3953 msgid "Replace with" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4044 +#: src/slic3r/GUI/Tab.cpp:4042 msgid "Regular expression" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4048 +#: src/slic3r/GUI/Tab.cpp:4046 msgid "Case insensitive" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4050 msgid "Whole word" msgstr "整個字" -#: src/slic3r/GUI/Tab.cpp:4056 +#: src/slic3r/GUI/Tab.cpp:4054 msgid "Match single line" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4159 +#: src/slic3r/GUI/Tab.cpp:4157 msgid "Are you sure you want to delete all substitutions?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4291 +#: src/slic3r/GUI/Tab.cpp:4289 msgid "" "Machine limits will be emitted to G-code and used to estimate print time." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4294 +#: src/slic3r/GUI/Tab.cpp:4292 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:4298 +#: src/slic3r/GUI/Tab.cpp:4296 msgid "" "Machine limits are not set, therefore the print time estimate may not be " "accurate." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4320 +#: src/slic3r/GUI/Tab.cpp:4318 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4322 +#: src/slic3r/GUI/Tab.cpp:4320 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:4324 +#: src/slic3r/GUI/Tab.cpp:4322 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:4326 +#: src/slic3r/GUI/Tab.cpp:4324 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -8692,23 +8690,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4331 +#: src/slic3r/GUI/Tab.cpp:4329 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:4333 +#: src/slic3r/GUI/Tab.cpp:4331 msgid "" "for the left button: indicates a non-system (or non-default) preset,\n" "for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4336 +#: src/slic3r/GUI/Tab.cpp:4334 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:4338 +#: src/slic3r/GUI/Tab.cpp:4336 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -8716,13 +8714,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4348 +#: src/slic3r/GUI/Tab.cpp:4346 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:4350 +#: src/slic3r/GUI/Tab.cpp:4348 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" @@ -8730,17 +8728,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4353 +#: src/slic3r/GUI/Tab.cpp:4351 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4356 +#: src/slic3r/GUI/Tab.cpp:4354 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:4358 +#: src/slic3r/GUI/Tab.cpp:4356 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" @@ -8750,26 +8748,26 @@ msgstr "" "\"後退箭頭\" 圖標表示設置已更改, 與當前選項組的上次保存的預設不相等。\n" "單擊可將當前選項組的所有設置重置爲上次保存的預設。" -#: src/slic3r/GUI/Tab.cpp:4364 +#: src/slic3r/GUI/Tab.cpp:4362 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:4365 +#: src/slic3r/GUI/Tab.cpp:4363 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:4371 +#: src/slic3r/GUI/Tab.cpp:4369 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "白色子彈圖標表示該值與上次保存的預設中的值相同。" -#: src/slic3r/GUI/Tab.cpp:4372 +#: src/slic3r/GUI/Tab.cpp:4370 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -8778,42 +8776,42 @@ msgstr "" "\"後退箭頭\" 圖標表示該值已更改, 不等於上次保存的預設。\n" "單擊可將當前值重置爲上次保存的預設。" -#: src/slic3r/GUI/Tab.cpp:4526 src/slic3r/GUI/Tab.cpp:4528 +#: src/slic3r/GUI/Tab.cpp:4524 src/slic3r/GUI/Tab.cpp:4526 msgid "Material" msgstr "材料" -#: src/slic3r/GUI/Tab.cpp:4613 src/slic3r/GUI/Tab.cpp:4614 +#: src/slic3r/GUI/Tab.cpp:4611 src/slic3r/GUI/Tab.cpp:4612 msgid "Material printing profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:4666 +#: src/slic3r/GUI/Tab.cpp:4664 msgid "Support head" msgstr "支撐頭部寬度" -#: src/slic3r/GUI/Tab.cpp:4671 +#: src/slic3r/GUI/Tab.cpp:4669 msgid "Support pillar" msgstr "支撐支柱" -#: src/slic3r/GUI/Tab.cpp:4694 +#: src/slic3r/GUI/Tab.cpp:4692 msgid "Connection of the support sticks and junctions" msgstr "支撐杆和連接點的連接" -#: src/slic3r/GUI/Tab.cpp:4699 +#: src/slic3r/GUI/Tab.cpp:4697 msgid "Automatic generation" msgstr "自動生成" -#: src/slic3r/GUI/Tab.cpp:4774 +#: src/slic3r/GUI/Tab.cpp:4772 #, boost-format 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:4776 src/libslic3r/PrintConfig.cpp:3719 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3692 msgid "Object elevation" msgstr "對象高程" -#: src/slic3r/GUI/Tab.cpp:4776 src/libslic3r/PrintConfig.cpp:3821 +#: src/slic3r/GUI/Tab.cpp:4774 src/libslic3r/PrintConfig.cpp:3794 msgid "Pad around object" msgstr "" @@ -8896,7 +8894,7 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:936 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1696 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1699 msgid "" "Some fields are too long to fit. Right mouse click reveals the full text." msgstr "" @@ -8956,49 +8954,49 @@ msgid "" msgstr "" #: src/slic3r/GUI/UnsavedChangesDialog.cpp:1283 -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1670 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1673 msgid "Extruders count" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1453 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1456 msgid "Select presets to compare" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1502 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1505 msgid "Show all presets (including incompatible)" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1517 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1520 msgid "Left Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1518 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1521 msgid "Right Preset Value" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1627 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1630 msgid "One of the presets doesn't found" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1638 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1641 msgid "Compared presets has different printer technology" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1652 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1655 msgid "Presets are the same" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1660 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1663 msgid "" "Presets are different.\n" "Click this button to select the same preset for the right and left preset." msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef category" msgstr "" -#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1684 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1687 msgid "Undef group" msgstr "" @@ -9606,26 +9604,26 @@ msgid "" "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1734 +#: src/libslic3r/Format/3mf.cpp:1735 #, boost-format msgid "" "The selected 3mf file has been saved with a newer version of %1% and is not " "compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1745 +#: src/libslic3r/Format/3mf.cpp:1746 msgid "" "The selected 3MF contains FDM supports painted object using a newer version " "of PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1749 +#: src/libslic3r/Format/3mf.cpp:1750 msgid "" "The selected 3MF contains seam painted object using a newer version of " "PrusaSlicer and is not compatible." msgstr "" -#: src/libslic3r/Format/3mf.cpp:1753 +#: src/libslic3r/Format/3mf.cpp:1754 msgid "" "The selected 3MF contains multi-material painted object using a newer " "version of PrusaSlicer and is not compatible." @@ -10332,8 +10330,8 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:1097 #: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2260 #: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2792 -#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3110 -#: src/libslic3r/PrintConfig.cpp:3693 src/libslic3r/PrintConfig.cpp:3814 +#: src/libslic3r/PrintConfig.cpp:3009 src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3666 src/libslic3r/PrintConfig.cpp:3787 msgid "°" msgstr "°" @@ -10348,9 +10346,8 @@ msgstr "此項爲在列印所有橋和懸垂部位時的風扇速度。" #: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:1109 #: src/libslic3r/PrintConfig.cpp:1577 src/libslic3r/PrintConfig.cpp:1769 #: src/libslic3r/PrintConfig.cpp:1832 src/libslic3r/PrintConfig.cpp:2083 -#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3134 -#: src/libslic3r/PrintConfig.cpp:3149 src/libslic3r/PrintConfig.cpp:3318 -#: src/libslic3r/PrintConfig.cpp:3607 src/libslic3r/PrintConfig.cpp:3733 +#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3580 src/libslic3r/PrintConfig.cpp:3706 msgid "%" msgstr "%" @@ -10549,8 +10546,8 @@ msgstr "" msgid "Default print profile" msgstr "默認 SLA 列印配置文件" -#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3537 -#: src/libslic3r/PrintConfig.cpp:3548 +#: src/libslic3r/PrintConfig.cpp:652 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3521 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -10685,8 +10682,9 @@ msgstr "" #: src/libslic3r/PrintConfig.cpp:1478 src/libslic3r/PrintConfig.cpp:1505 #: src/libslic3r/PrintConfig.cpp:1979 src/libslic3r/PrintConfig.cpp:2365 #: src/libslic3r/PrintConfig.cpp:2539 src/libslic3r/PrintConfig.cpp:2628 -#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3098 -#: src/libslic3r/PrintConfig.cpp:3173 +#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:3085 +#: src/libslic3r/PrintConfig.cpp:3100 src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3146 msgid "mm or %" msgstr "mm 或 %" @@ -10762,7 +10760,7 @@ msgid "Extruder Color" msgstr "擠出頭顏色" #: src/libslic3r/PrintConfig.cpp:827 src/libslic3r/PrintConfig.cpp:890 -#: src/libslic3r/PrintConfig.cpp:3389 +#: src/libslic3r/PrintConfig.cpp:3362 msgid "This is only used in the Slic3r interface as a visual help." msgstr "僅提供Slic3r界面的視覺幫助。" @@ -10852,7 +10850,7 @@ msgstr "" msgid "approximate seconds" msgstr "秒(大約)" -#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3388 +#: src/libslic3r/PrintConfig.cpp:889 src/libslic3r/PrintConfig.cpp:3361 msgid "Color" msgstr "顏色" @@ -11014,8 +11012,8 @@ msgstr "" "在這裏輸入你的材料直徑。需要較高精度,所以請使用卡尺,沿着材料長絲做多次測" "量,計算平均值。" -#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3427 -#: src/libslic3r/PrintConfig.cpp:3428 +#: src/libslic3r/PrintConfig.cpp:1024 src/libslic3r/PrintConfig.cpp:3400 +#: src/libslic3r/PrintConfig.cpp:3401 msgid "Density" msgstr "密度" @@ -11076,7 +11074,7 @@ msgstr "" msgid "g" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3532 +#: src/libslic3r/PrintConfig.cpp:1088 src/libslic3r/PrintConfig.cpp:3505 msgid "(Unknown)" msgstr "" @@ -12653,7 +12651,7 @@ msgid "" "plane." msgstr "使用該參數對支撐材料的樣子在水平面上進行旋轉。" -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3642 +#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:3615 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -13213,33 +13211,35 @@ msgstr "" msgid "" "Classic perimeter generator produces perimeters with constant extrusion " "width and for very thin areas is used gap-fill. Arachne engine produces " -"perimeters with variable extrusion width." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3073 -msgid "Classic" +"perimeters with variable extrusion width. This setting also affects the " +"Concentric infill." msgstr "" #: src/libslic3r/PrintConfig.cpp:3074 +msgid "Classic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3075 msgid "Arachne" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3079 +#: src/libslic3r/PrintConfig.cpp:3080 msgid "Perimeter transition length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3082 msgid "" "When transitioning between different numbers of perimeters as the part " "becomes thinner, a certain amount of space is allotted to split or join the " -"perimeter segments." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3089 -msgid "Perimeter transitioning filter margin" +"perimeter segments. If expressed as a percentage (for example 100%), it will " +"be computed based on the nozzle diameter." msgstr "" #: src/libslic3r/PrintConfig.cpp:3091 +msgid "Perimeter transitioning filter margin" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3093 msgid "" "Prevent transitioning back and forth between one extra perimeter and one " "less. This margin extends the range of extrusion widths which follow to " @@ -13251,11 +13251,11 @@ msgid "" "diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3106 msgid "Perimeter transitioning threshold angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3108 msgid "" "When to create transitions between even and odd numbers of perimeters. A " "wedge shape with an angle greater than this setting will not have " @@ -13264,63 +13264,35 @@ msgid "" "these center perimeters, but may leave gaps or overextrude." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3119 msgid "Perimeter distribution count" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3121 msgid "" "The number of perimeters, counted from the center, over which the variation " "needs to be spread. Lower values mean that the outer perimeters don't change " "in width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3126 -msgid "Split middle perimeter threshold" -msgstr "" - #: src/libslic3r/PrintConfig.cpp:3128 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which the middle perimeter (if there is one) will be split into two. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3141 -msgid "Add middle perimeter threshold" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3143 -msgid "" -"The smallest extrusion width, as a factor of the normal extrusion width, " -"above which a middle perimeter (if there wasn't one already) will be added. " -"Reduce this setting to use more, thinner perimeters. Increase to use fewer, " -"wider perimeters. Note that this applies -as if- the entire shape should be " -"filled with perimeter, so the middle here refers to the middle of the object " -"between two outer edges of the shape, even if there actually is infill or " -"other extrusion types in the print instead of the perimeter." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3156 msgid "Minimum feature size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3130 msgid "" "Minimum thickness of thin features. Model features that are thinner than " "this value will not be printed, while features thicker than the Minimum " -"feature size will be widened to the Minimum perimeter width." +"feature size will be widened to the Minimum perimeter width. If expressed as " +"a percentage (for example 25%), it will be computed based on the nozzle " +"diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3167 +#: src/libslic3r/PrintConfig.cpp:3140 msgid "Minimum perimeter width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3142 msgid "" "Width of the perimeter that will replace thin features (according to the " "Minimum feature size) of the model. If the Minimum perimeter width is " @@ -13329,63 +13301,63 @@ msgid "" "it will be computed based on the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3237 +#: src/libslic3r/PrintConfig.cpp:3210 msgid "Display width" msgstr "顯示寬度" -#: src/libslic3r/PrintConfig.cpp:3238 +#: src/libslic3r/PrintConfig.cpp:3211 msgid "Width of the display" msgstr "顯示寬度" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3216 msgid "Display height" msgstr "顯示高度" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3217 msgid "Height of the display" msgstr "顯示高度" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3222 msgid "Number of pixels in" msgstr "像素點的數量" -#: src/libslic3r/PrintConfig.cpp:3251 +#: src/libslic3r/PrintConfig.cpp:3224 msgid "Number of pixels in X" msgstr "X 中的像素數" -#: src/libslic3r/PrintConfig.cpp:3257 +#: src/libslic3r/PrintConfig.cpp:3230 msgid "Number of pixels in Y" msgstr "Y 中的像素數" -#: src/libslic3r/PrintConfig.cpp:3262 +#: src/libslic3r/PrintConfig.cpp:3235 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3236 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3237 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3269 +#: src/libslic3r/PrintConfig.cpp:3242 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3270 +#: src/libslic3r/PrintConfig.cpp:3243 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3244 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3276 +#: src/libslic3r/PrintConfig.cpp:3249 msgid "Display orientation" msgstr "顯示方向" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3250 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 " @@ -13394,55 +13366,55 @@ msgstr "" "在 SLA 印表機內設置實際的 LCD 顯示方向。人像模式將翻轉顯示寬度和高度參數的含" "義, 輸出圖像將旋轉90度。" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3256 msgid "Landscape" msgstr "景觀" -#: src/libslic3r/PrintConfig.cpp:3284 +#: src/libslic3r/PrintConfig.cpp:3257 msgid "Portrait" msgstr "肖像" -#: src/libslic3r/PrintConfig.cpp:3289 src/libslic3r/PrintConfig.cpp:3924 +#: src/libslic3r/PrintConfig.cpp:3262 src/libslic3r/PrintConfig.cpp:3897 msgid "Fast" msgstr "快" -#: src/libslic3r/PrintConfig.cpp:3290 +#: src/libslic3r/PrintConfig.cpp:3263 msgid "Fast tilt" msgstr "快速傾斜" -#: src/libslic3r/PrintConfig.cpp:3291 +#: src/libslic3r/PrintConfig.cpp:3264 msgid "Time of the fast tilt" msgstr "快速傾斜的時間" -#: src/libslic3r/PrintConfig.cpp:3298 src/libslic3r/PrintConfig.cpp:3923 +#: src/libslic3r/PrintConfig.cpp:3271 src/libslic3r/PrintConfig.cpp:3896 msgid "Slow" msgstr "慢" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3272 msgid "Slow tilt" msgstr "緩慢傾斜" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3273 msgid "Time of the slow tilt" msgstr "緩慢傾斜的時間" -#: src/libslic3r/PrintConfig.cpp:3307 src/libslic3r/PrintConfig.cpp:3925 +#: src/libslic3r/PrintConfig.cpp:3280 src/libslic3r/PrintConfig.cpp:3898 msgid "High viscosity" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3308 +#: src/libslic3r/PrintConfig.cpp:3281 msgid "Tilt for high viscosity resin" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3309 +#: src/libslic3r/PrintConfig.cpp:3282 msgid "Time of the super slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3316 +#: src/libslic3r/PrintConfig.cpp:3289 msgid "Area fill" msgstr "區域填充" -#: src/libslic3r/PrintConfig.cpp:3317 +#: src/libslic3r/PrintConfig.cpp:3290 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" @@ -13452,345 +13424,345 @@ msgstr "" "如果列印區域超過指定的值,\n" "然後一個緩慢的傾斜將被使用, 否則-一個快速傾斜" -#: src/libslic3r/PrintConfig.cpp:3324 src/libslic3r/PrintConfig.cpp:3325 -#: src/libslic3r/PrintConfig.cpp:3326 +#: src/libslic3r/PrintConfig.cpp:3297 src/libslic3r/PrintConfig.cpp:3298 +#: src/libslic3r/PrintConfig.cpp:3299 msgid "Printer scaling correction" msgstr "印表機縮放校正" -#: src/libslic3r/PrintConfig.cpp:3332 src/libslic3r/PrintConfig.cpp:3334 +#: src/libslic3r/PrintConfig.cpp:3305 src/libslic3r/PrintConfig.cpp:3307 msgid "Printer scaling correction in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3333 +#: src/libslic3r/PrintConfig.cpp:3306 msgid "Printer scaling X axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3340 src/libslic3r/PrintConfig.cpp:3342 +#: src/libslic3r/PrintConfig.cpp:3313 src/libslic3r/PrintConfig.cpp:3315 msgid "Printer scaling correction in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3341 +#: src/libslic3r/PrintConfig.cpp:3314 msgid "Printer scaling Y axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3348 src/libslic3r/PrintConfig.cpp:3350 +#: src/libslic3r/PrintConfig.cpp:3321 src/libslic3r/PrintConfig.cpp:3323 msgid "Printer scaling correction in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3349 +#: src/libslic3r/PrintConfig.cpp:3322 msgid "Printer scaling Z axis correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3356 src/libslic3r/PrintConfig.cpp:3357 +#: src/libslic3r/PrintConfig.cpp:3329 src/libslic3r/PrintConfig.cpp:3330 msgid "Printer absolute correction" msgstr "印表機絕對校正" -#: src/libslic3r/PrintConfig.cpp:3358 +#: src/libslic3r/PrintConfig.cpp:3331 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "將根據校正的符號對切片的2D 多邊形進行放大或收縮。" -#: src/libslic3r/PrintConfig.cpp:3364 +#: src/libslic3r/PrintConfig.cpp:3337 msgid "Elephant foot minimum width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3366 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "" "Minimum width of features to maintain when doing elephant foot compensation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3373 src/libslic3r/PrintConfig.cpp:3374 +#: src/libslic3r/PrintConfig.cpp:3346 src/libslic3r/PrintConfig.cpp:3347 msgid "Printer gamma correction" msgstr "印表機伽瑪校正" -#: src/libslic3r/PrintConfig.cpp:3375 +#: src/libslic3r/PrintConfig.cpp:3348 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:3394 src/libslic3r/PrintConfig.cpp:3395 +#: src/libslic3r/PrintConfig.cpp:3367 src/libslic3r/PrintConfig.cpp:3368 msgid "SLA material type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3406 src/libslic3r/PrintConfig.cpp:3407 +#: src/libslic3r/PrintConfig.cpp:3379 src/libslic3r/PrintConfig.cpp:3380 msgid "Initial layer height" msgstr "初始圖層高度" -#: src/libslic3r/PrintConfig.cpp:3413 src/libslic3r/PrintConfig.cpp:3414 +#: src/libslic3r/PrintConfig.cpp:3386 src/libslic3r/PrintConfig.cpp:3387 msgid "Bottle volume" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3415 +#: src/libslic3r/PrintConfig.cpp:3388 msgid "ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3420 src/libslic3r/PrintConfig.cpp:3421 +#: src/libslic3r/PrintConfig.cpp:3393 src/libslic3r/PrintConfig.cpp:3394 msgid "Bottle weight" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3422 +#: src/libslic3r/PrintConfig.cpp:3395 msgid "kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3429 +#: src/libslic3r/PrintConfig.cpp:3402 msgid "g/ml" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3436 +#: src/libslic3r/PrintConfig.cpp:3409 msgid "money/bottle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3441 +#: src/libslic3r/PrintConfig.cpp:3414 msgid "Faded layers" msgstr "淡入淡出的圖層" -#: src/libslic3r/PrintConfig.cpp:3442 +#: src/libslic3r/PrintConfig.cpp:3415 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "曝光時間所需的層數從最初的曝光時間消失到曝光時間" -#: src/libslic3r/PrintConfig.cpp:3449 src/libslic3r/PrintConfig.cpp:3450 +#: src/libslic3r/PrintConfig.cpp:3422 src/libslic3r/PrintConfig.cpp:3423 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3457 src/libslic3r/PrintConfig.cpp:3458 +#: src/libslic3r/PrintConfig.cpp:3430 src/libslic3r/PrintConfig.cpp:3431 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3465 src/libslic3r/PrintConfig.cpp:3466 +#: src/libslic3r/PrintConfig.cpp:3438 src/libslic3r/PrintConfig.cpp:3439 msgid "Exposure time" msgstr "曝光時間" -#: src/libslic3r/PrintConfig.cpp:3472 src/libslic3r/PrintConfig.cpp:3473 +#: src/libslic3r/PrintConfig.cpp:3445 src/libslic3r/PrintConfig.cpp:3446 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3480 src/libslic3r/PrintConfig.cpp:3481 +#: src/libslic3r/PrintConfig.cpp:3453 src/libslic3r/PrintConfig.cpp:3454 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3488 src/libslic3r/PrintConfig.cpp:3489 +#: src/libslic3r/PrintConfig.cpp:3461 src/libslic3r/PrintConfig.cpp:3462 msgid "Initial exposure time" msgstr "初始曝光時間" -#: src/libslic3r/PrintConfig.cpp:3495 src/libslic3r/PrintConfig.cpp:3496 +#: src/libslic3r/PrintConfig.cpp:3468 src/libslic3r/PrintConfig.cpp:3469 msgid "Correction for expansion" msgstr "擴展的更正" -#: src/libslic3r/PrintConfig.cpp:3502 src/libslic3r/PrintConfig.cpp:3503 +#: src/libslic3r/PrintConfig.cpp:3475 src/libslic3r/PrintConfig.cpp:3476 msgid "Correction for expansion in X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3510 +#: src/libslic3r/PrintConfig.cpp:3482 src/libslic3r/PrintConfig.cpp:3483 msgid "Correction for expansion in Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3516 src/libslic3r/PrintConfig.cpp:3517 +#: src/libslic3r/PrintConfig.cpp:3489 src/libslic3r/PrintConfig.cpp:3490 msgid "Correction for expansion in Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3523 +#: src/libslic3r/PrintConfig.cpp:3496 msgid "SLA print material notes" msgstr "SLA 列印材料註釋" -#: src/libslic3r/PrintConfig.cpp:3524 +#: src/libslic3r/PrintConfig.cpp:3497 msgid "You can put your notes regarding the SLA print material here." msgstr "您可以在此處放置有關 sla 列印材料的註釋." -#: src/libslic3r/PrintConfig.cpp:3536 src/libslic3r/PrintConfig.cpp:3547 +#: src/libslic3r/PrintConfig.cpp:3509 src/libslic3r/PrintConfig.cpp:3520 msgid "Default SLA material profile" msgstr "默認 SLA 材料配置文件" -#: src/libslic3r/PrintConfig.cpp:3558 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Generate supports" msgstr "生成支撐" -#: src/libslic3r/PrintConfig.cpp:3560 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Generate supports for the models" msgstr "生成模型的支撐" -#: src/libslic3r/PrintConfig.cpp:3565 +#: src/libslic3r/PrintConfig.cpp:3538 msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3567 +#: src/libslic3r/PrintConfig.cpp:3540 msgid "Diameter of the pointing side of the head" msgstr "頭部指向側的直徑" -#: src/libslic3r/PrintConfig.cpp:3574 +#: src/libslic3r/PrintConfig.cpp:3547 msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3576 +#: src/libslic3r/PrintConfig.cpp:3549 msgid "How much the pinhead has to penetrate the model surface" msgstr "針頭穿透模型表面的程度" -#: src/libslic3r/PrintConfig.cpp:3583 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3585 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Width from the back sphere center to the front sphere center" msgstr "從後球體中心到前球體中心的寬度" -#: src/libslic3r/PrintConfig.cpp:3593 +#: src/libslic3r/PrintConfig.cpp:3566 msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3595 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Diameter in mm of the support pillars" msgstr "支撐柱直徑 (毫米)" -#: src/libslic3r/PrintConfig.cpp:3603 +#: src/libslic3r/PrintConfig.cpp:3576 msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3605 +#: src/libslic3r/PrintConfig.cpp:3578 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:3614 +#: src/libslic3r/PrintConfig.cpp:3587 msgid "Max bridges on a pillar" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3616 +#: src/libslic3r/PrintConfig.cpp:3589 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:3624 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Pillar connection mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3625 +#: src/libslic3r/PrintConfig.cpp:3598 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:3633 +#: src/libslic3r/PrintConfig.cpp:3606 msgid "Zig-Zag" msgstr "鋸齒形" -#: src/libslic3r/PrintConfig.cpp:3634 +#: src/libslic3r/PrintConfig.cpp:3607 msgid "Cross" msgstr "交叉" -#: src/libslic3r/PrintConfig.cpp:3635 +#: src/libslic3r/PrintConfig.cpp:3608 msgid "Dynamic" msgstr "動態" -#: src/libslic3r/PrintConfig.cpp:3647 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Pillar widening factor" msgstr "支柱加寬係數" -#: src/libslic3r/PrintConfig.cpp:3649 +#: src/libslic3r/PrintConfig.cpp:3622 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." msgstr "" "將橋樑或柱子合併到另一個柱子中可以增加半徑。零意味着沒有增加,1意味着全增加。" -#: src/libslic3r/PrintConfig.cpp:3658 +#: src/libslic3r/PrintConfig.cpp:3631 msgid "Support base diameter" msgstr "支撐底座直徑" -#: src/libslic3r/PrintConfig.cpp:3660 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Diameter in mm of the pillar base" msgstr "柱底座直徑 (毫米)" -#: src/libslic3r/PrintConfig.cpp:3668 +#: src/libslic3r/PrintConfig.cpp:3641 msgid "Support base height" msgstr "支撐基座高度" -#: src/libslic3r/PrintConfig.cpp:3670 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "The height of the pillar base cone" msgstr "柱基錐的高度" -#: src/libslic3r/PrintConfig.cpp:3677 +#: src/libslic3r/PrintConfig.cpp:3650 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3680 +#: src/libslic3r/PrintConfig.cpp:3653 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:3690 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "Critical angle" msgstr "臨界角度" -#: src/libslic3r/PrintConfig.cpp:3692 +#: src/libslic3r/PrintConfig.cpp:3665 msgid "The default angle for connecting support sticks and junctions." msgstr "連接支撐杆和連接點的默認角度。" -#: src/libslic3r/PrintConfig.cpp:3700 +#: src/libslic3r/PrintConfig.cpp:3673 msgid "Max bridge length" msgstr "最大橋長" -#: src/libslic3r/PrintConfig.cpp:3702 +#: src/libslic3r/PrintConfig.cpp:3675 msgid "The max length of a bridge" msgstr "橋的最大長度" -#: src/libslic3r/PrintConfig.cpp:3709 +#: src/libslic3r/PrintConfig.cpp:3682 msgid "Max pillar linking distance" msgstr "最大柱連接距離" -#: src/libslic3r/PrintConfig.cpp:3711 +#: src/libslic3r/PrintConfig.cpp:3684 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:3721 +#: src/libslic3r/PrintConfig.cpp:3694 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:3732 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "This is a relative measure of support points density." msgstr "這是支持點密度的相對度量。" -#: src/libslic3r/PrintConfig.cpp:3738 +#: src/libslic3r/PrintConfig.cpp:3711 msgid "Minimal distance of the support points" msgstr "支撐點的最小距離" -#: src/libslic3r/PrintConfig.cpp:3740 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "No support points will be placed closer than this threshold." msgstr "沒有任何支助點將被放置在比這一閾值更近的地方。" -#: src/libslic3r/PrintConfig.cpp:3746 +#: src/libslic3r/PrintConfig.cpp:3719 msgid "Use pad" msgstr "使用墊" -#: src/libslic3r/PrintConfig.cpp:3748 +#: src/libslic3r/PrintConfig.cpp:3721 msgid "Add a pad underneath the supported model" msgstr "在支撐模型下添加一個墊" -#: src/libslic3r/PrintConfig.cpp:3753 +#: src/libslic3r/PrintConfig.cpp:3726 msgid "Pad wall thickness" msgstr "墊壁厚度" -#: src/libslic3r/PrintConfig.cpp:3755 +#: src/libslic3r/PrintConfig.cpp:3728 msgid "The thickness of the pad and its optional cavity walls." msgstr "墊片的厚度及其可選的空腔壁。" -#: src/libslic3r/PrintConfig.cpp:3763 +#: src/libslic3r/PrintConfig.cpp:3736 msgid "Pad wall height" msgstr "墊壁高度" -#: src/libslic3r/PrintConfig.cpp:3764 +#: src/libslic3r/PrintConfig.cpp:3737 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 " @@ -13798,19 +13770,19 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3777 +#: src/libslic3r/PrintConfig.cpp:3750 msgid "Pad brim size" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3778 +#: src/libslic3r/PrintConfig.cpp:3751 msgid "How far should the pad extend around the contained geometry" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3788 +#: src/libslic3r/PrintConfig.cpp:3761 msgid "Max merge distance" msgstr "最大合併距離" -#: src/libslic3r/PrintConfig.cpp:3790 +#: src/libslic3r/PrintConfig.cpp:3763 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 " @@ -13819,92 +13791,92 @@ msgstr "" "有些物體可以與幾個較小的墊子在一起, 而不是一個大的墊子。此參數定義兩個較小墊" "的中心應該有多遠。如果它們更接近, 它們將被合併成一個墊子。" -#: src/libslic3r/PrintConfig.cpp:3810 +#: src/libslic3r/PrintConfig.cpp:3783 msgid "Pad wall slope" msgstr "墊壁坡度" -#: src/libslic3r/PrintConfig.cpp:3812 +#: src/libslic3r/PrintConfig.cpp:3785 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "墊壁相對於牀面的斜率。90度意味着直牆。" -#: src/libslic3r/PrintConfig.cpp:3823 +#: src/libslic3r/PrintConfig.cpp:3796 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3828 +#: src/libslic3r/PrintConfig.cpp:3801 msgid "Pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3830 +#: src/libslic3r/PrintConfig.cpp:3803 msgid "Force pad around object everywhere" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3835 +#: src/libslic3r/PrintConfig.cpp:3808 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3837 +#: src/libslic3r/PrintConfig.cpp:3810 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3846 +#: src/libslic3r/PrintConfig.cpp:3819 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3848 +#: src/libslic3r/PrintConfig.cpp:3821 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3855 +#: src/libslic3r/PrintConfig.cpp:3828 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3857 +#: src/libslic3r/PrintConfig.cpp:3830 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3864 +#: src/libslic3r/PrintConfig.cpp:3837 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3867 +#: src/libslic3r/PrintConfig.cpp:3840 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3874 +#: src/libslic3r/PrintConfig.cpp:3847 msgid "Enable hollowing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3876 +#: src/libslic3r/PrintConfig.cpp:3849 msgid "Hollow out a model to have an empty interior" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3881 +#: src/libslic3r/PrintConfig.cpp:3854 msgid "Wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3883 +#: src/libslic3r/PrintConfig.cpp:3856 msgid "Minimum wall thickness of a hollowed model." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3891 +#: src/libslic3r/PrintConfig.cpp:3864 msgid "Accuracy" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3893 +#: src/libslic3r/PrintConfig.cpp:3866 msgid "" "Performance vs accuracy of calculation. Lower values may produce unwanted " "artifacts." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3903 +#: src/libslic3r/PrintConfig.cpp:3876 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 " @@ -13913,183 +13885,183 @@ msgid "" "most." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3915 +#: src/libslic3r/PrintConfig.cpp:3888 msgid "Print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3917 +#: src/libslic3r/PrintConfig.cpp:3890 msgid "" "A slower printing profile might be necessary when using materials with " "higher viscosity or with some hollowed parts. It slows down the tilt " "movement and adds a delay before exposure." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4383 +#: src/libslic3r/PrintConfig.cpp:4358 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4384 +#: src/libslic3r/PrintConfig.cpp:4359 msgid "Export the model(s) as OBJ." msgstr "將模型導出爲 OBJ。" -#: src/libslic3r/PrintConfig.cpp:4395 +#: src/libslic3r/PrintConfig.cpp:4370 msgid "Export SLA" msgstr "導出 SLA" -#: src/libslic3r/PrintConfig.cpp:4396 +#: src/libslic3r/PrintConfig.cpp:4371 msgid "Slice the model and export SLA printing layers as PNG." msgstr "將模型切片, 並將 SLA 列印圖層導出爲 PNG。" -#: src/libslic3r/PrintConfig.cpp:4401 +#: src/libslic3r/PrintConfig.cpp:4376 msgid "Export 3MF" msgstr "導出 3MF" -#: src/libslic3r/PrintConfig.cpp:4402 +#: src/libslic3r/PrintConfig.cpp:4377 msgid "Export the model(s) as 3MF." msgstr "將模型導出爲3MF。" -#: src/libslic3r/PrintConfig.cpp:4406 +#: src/libslic3r/PrintConfig.cpp:4381 msgid "Export AMF" msgstr "導出 AMF" -#: src/libslic3r/PrintConfig.cpp:4407 +#: src/libslic3r/PrintConfig.cpp:4382 msgid "Export the model(s) as AMF." msgstr "將模型導出爲 AMF。" -#: src/libslic3r/PrintConfig.cpp:4411 +#: src/libslic3r/PrintConfig.cpp:4386 msgid "Export STL" msgstr "導出STL Export STL" -#: src/libslic3r/PrintConfig.cpp:4412 +#: src/libslic3r/PrintConfig.cpp:4387 msgid "Export the model(s) as STL." msgstr "將模型導出爲 STL。" -#: src/libslic3r/PrintConfig.cpp:4417 +#: src/libslic3r/PrintConfig.cpp:4392 msgid "Slice the model and export toolpaths as G-code." msgstr "將模型切片並將刀具路徑導出爲 G 代碼。" -#: src/libslic3r/PrintConfig.cpp:4422 +#: src/libslic3r/PrintConfig.cpp:4397 msgid "G-code viewer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4423 +#: src/libslic3r/PrintConfig.cpp:4398 msgid "Visualize an already sliced and saved G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4428 +#: src/libslic3r/PrintConfig.cpp:4403 msgid "Slice" msgstr "切片" -#: src/libslic3r/PrintConfig.cpp:4429 +#: src/libslic3r/PrintConfig.cpp:4404 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "根據印表機技術配置值將模型切片爲 FFF 或 SLA。" -#: src/libslic3r/PrintConfig.cpp:4434 +#: src/libslic3r/PrintConfig.cpp:4409 msgid "Help" msgstr "幫助" -#: src/libslic3r/PrintConfig.cpp:4435 +#: src/libslic3r/PrintConfig.cpp:4410 msgid "Show this help." msgstr "顯示此幫助。" -#: src/libslic3r/PrintConfig.cpp:4440 +#: src/libslic3r/PrintConfig.cpp:4415 msgid "Help (FFF options)" msgstr "幫助 (FFF 選項)" -#: src/libslic3r/PrintConfig.cpp:4441 +#: src/libslic3r/PrintConfig.cpp:4416 msgid "Show the full list of print/G-code configuration options." msgstr "顯示列印代碼配置選項的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4445 +#: src/libslic3r/PrintConfig.cpp:4420 msgid "Help (SLA options)" msgstr "幫助 (SLA 選項)" -#: src/libslic3r/PrintConfig.cpp:4446 +#: src/libslic3r/PrintConfig.cpp:4421 msgid "Show the full list of SLA print configuration options." msgstr "顯示 SLA 列印配置選項的完整列表。" -#: src/libslic3r/PrintConfig.cpp:4450 +#: src/libslic3r/PrintConfig.cpp:4425 msgid "Output Model Info" msgstr "輸出模型信息" -#: src/libslic3r/PrintConfig.cpp:4451 +#: src/libslic3r/PrintConfig.cpp:4426 msgid "Write information about the model to the console." msgstr "給控制檯寫入模型的信息。" -#: src/libslic3r/PrintConfig.cpp:4455 +#: src/libslic3r/PrintConfig.cpp:4430 msgid "Save config file" msgstr "保存配置文件" -#: src/libslic3r/PrintConfig.cpp:4456 +#: src/libslic3r/PrintConfig.cpp:4431 msgid "Save configuration to the specified file." msgstr "將配置參數保存到指定文件。" -#: src/libslic3r/PrintConfig.cpp:4466 +#: src/libslic3r/PrintConfig.cpp:4441 msgid "Align XY" msgstr "對齊 XY" -#: src/libslic3r/PrintConfig.cpp:4467 +#: src/libslic3r/PrintConfig.cpp:4442 msgid "Align the model to the given point." msgstr "將模型對齊到給定點。" -#: src/libslic3r/PrintConfig.cpp:4472 +#: src/libslic3r/PrintConfig.cpp:4447 msgid "Cut model at the given Z." msgstr "在給定Z處切割模型。" -#: src/libslic3r/PrintConfig.cpp:4493 +#: src/libslic3r/PrintConfig.cpp:4468 msgid "Center" msgstr "居中" -#: src/libslic3r/PrintConfig.cpp:4494 +#: src/libslic3r/PrintConfig.cpp:4469 msgid "Center the print around the given center." msgstr "將列印內容集中在給定的中心周圍。" -#: src/libslic3r/PrintConfig.cpp:4498 +#: src/libslic3r/PrintConfig.cpp:4473 msgid "Don't arrange" msgstr "不要排列布局" -#: src/libslic3r/PrintConfig.cpp:4499 +#: src/libslic3r/PrintConfig.cpp:4474 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "在合併之前, 不要重新排列給定的模型, 並保留其原始 XY 座標。" -#: src/libslic3r/PrintConfig.cpp:4502 +#: src/libslic3r/PrintConfig.cpp:4477 msgid "Ensure on bed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4503 +#: src/libslic3r/PrintConfig.cpp:4478 msgid "" "Lift the object above the bed when it is partially below. Enabled by " "default, use --no-ensure-on-bed to disable." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4507 +#: src/libslic3r/PrintConfig.cpp:4482 msgid "Duplicate" msgstr "複製" -#: src/libslic3r/PrintConfig.cpp:4508 +#: src/libslic3r/PrintConfig.cpp:4483 msgid "Multiply copies by this factor." msgstr "按此倍數增加副本。" -#: src/libslic3r/PrintConfig.cpp:4512 +#: src/libslic3r/PrintConfig.cpp:4487 msgid "Duplicate by grid" msgstr "按網格複製" -#: src/libslic3r/PrintConfig.cpp:4513 +#: src/libslic3r/PrintConfig.cpp:4488 msgid "Multiply copies by creating a grid." msgstr "通過創建網格將副本增加。" -#: src/libslic3r/PrintConfig.cpp:4517 +#: src/libslic3r/PrintConfig.cpp:4492 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:4522 +#: src/libslic3r/PrintConfig.cpp:4497 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)." @@ -14097,59 +14069,59 @@ msgstr "" "嘗試修復任何非流形網格 (每當我們需要對模型進行切片以執行請求的操作時, 都會隱" "式添加此選項)。" -#: src/libslic3r/PrintConfig.cpp:4526 +#: src/libslic3r/PrintConfig.cpp:4501 msgid "Rotation angle around the Z axis in degrees." msgstr "圍繞 Z 軸的旋轉角度 (以度爲單位)。" -#: src/libslic3r/PrintConfig.cpp:4530 +#: src/libslic3r/PrintConfig.cpp:4505 msgid "Rotate around X" msgstr "繞X軸旋轉" -#: src/libslic3r/PrintConfig.cpp:4531 +#: src/libslic3r/PrintConfig.cpp:4506 msgid "Rotation angle around the X axis in degrees." msgstr "圍繞 X 軸的旋轉角度 (以度爲單位)。" -#: src/libslic3r/PrintConfig.cpp:4535 +#: src/libslic3r/PrintConfig.cpp:4510 msgid "Rotate around Y" msgstr "繞Y軸旋轉" -#: src/libslic3r/PrintConfig.cpp:4536 +#: src/libslic3r/PrintConfig.cpp:4511 msgid "Rotation angle around the Y axis in degrees." msgstr "圍繞 Y 軸的旋轉角度 (以度爲單位)。" -#: src/libslic3r/PrintConfig.cpp:4541 +#: src/libslic3r/PrintConfig.cpp:4516 msgid "Scaling factor or percentage." msgstr "縮放因子或百分比。" -#: src/libslic3r/PrintConfig.cpp:4546 +#: src/libslic3r/PrintConfig.cpp:4521 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "檢測給定模型中未連接的部件, 並將其拆分爲單獨的對象。" -#: src/libslic3r/PrintConfig.cpp:4549 +#: src/libslic3r/PrintConfig.cpp:4524 msgid "Scale to Fit" msgstr "縮放到合適大小" -#: src/libslic3r/PrintConfig.cpp:4550 +#: src/libslic3r/PrintConfig.cpp:4525 msgid "Scale to fit the given volume." msgstr "縮放到適合於給定體積。" -#: src/libslic3r/PrintConfig.cpp:4559 +#: src/libslic3r/PrintConfig.cpp:4534 msgid "Ignore non-existent config files" msgstr "忽略不存在的配置文件" -#: src/libslic3r/PrintConfig.cpp:4560 +#: src/libslic3r/PrintConfig.cpp:4535 msgid "Do not fail if a file supplied to --load does not exist." msgstr "如果提供給—load 的文件不存在, 不要報錯。" -#: src/libslic3r/PrintConfig.cpp:4563 +#: src/libslic3r/PrintConfig.cpp:4538 msgid "" "Forward-compatibility rule when loading configurations from config files and " "project files (3MF, AMF)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4564 +#: src/libslic3r/PrintConfig.cpp:4539 msgid "" "This version of PrusaSlicer may not understand configurations produced by " "the newest PrusaSlicer versions. For example, newer PrusaSlicer may extend " @@ -14157,58 +14129,58 @@ msgid "" "substitute an unknown value with a default silently or verbosely." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4571 +#: src/libslic3r/PrintConfig.cpp:4546 msgid "Bail out on unknown configuration values" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4572 +#: src/libslic3r/PrintConfig.cpp:4547 msgid "" "Enable reading unknown configuration values by verbosely substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4573 +#: src/libslic3r/PrintConfig.cpp:4548 msgid "" "Enable reading unknown configuration values by silently substituting them " "with defaults." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4577 +#: src/libslic3r/PrintConfig.cpp:4552 msgid "Load config file" msgstr "加載配置文件" -#: src/libslic3r/PrintConfig.cpp:4578 +#: src/libslic3r/PrintConfig.cpp:4553 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:4581 +#: src/libslic3r/PrintConfig.cpp:4556 msgid "Output File" msgstr "輸出文件" -#: src/libslic3r/PrintConfig.cpp:4582 +#: src/libslic3r/PrintConfig.cpp:4557 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:4586 +#: src/libslic3r/PrintConfig.cpp:4561 msgid "Single instance mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4587 +#: src/libslic3r/PrintConfig.cpp:4562 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:4598 +#: src/libslic3r/PrintConfig.cpp:4573 msgid "Data directory" msgstr "數據目錄" -#: src/libslic3r/PrintConfig.cpp:4599 +#: src/libslic3r/PrintConfig.cpp:4574 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -14217,22 +14189,22 @@ msgstr "" "在給定目錄中加載和存儲設置。這對於維護不同的配置文件或包括來自網絡存儲的配置" "非常有用。" -#: src/libslic3r/PrintConfig.cpp:4602 +#: src/libslic3r/PrintConfig.cpp:4577 msgid "Logging level" msgstr "日誌級別" -#: src/libslic3r/PrintConfig.cpp:4603 +#: src/libslic3r/PrintConfig.cpp:4578 msgid "" "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" "trace\n" "For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:4609 +#: src/libslic3r/PrintConfig.cpp:4584 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:4610 +#: src/libslic3r/PrintConfig.cpp:4585 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx index 8f7dd0e8c7..471ca8c560 100644 --- a/resources/profiles/Creality.idx +++ b/resources/profiles/Creality.idx @@ -1,4 +1,6 @@ min_slic3r_version = 2.5.0-alpha0 +0.2.1 Added Ender 3 Neo and Ender 3 S1 Plus. Various updates. +0.2.0 Added alternative nozzle support 0.1.5 Added Ender-3 S1 Pro min_slic3r_version = 2.4.1 0.1.4 Added Ender-3 Pro. Added M25 support for some printers. diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index ce39cd6d61..82c1c0bd64 100644 --- a/resources/profiles/Creality.ini +++ b/resources/profiles/Creality.ini @@ -5,7 +5,7 @@ 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.1.5 +config_version = 0.2.1 # Where to get the updates from? 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% @@ -16,7 +16,7 @@ config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/Prus [printer_model:ENDER3] name = Creality Ender-3 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3_bed.stl @@ -25,7 +25,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER3BLTOUCH] name = Creality Ender-3 BLTouch -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3_bed.stl @@ -34,7 +34,16 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER3PRO] name = Creality Ender-3 Pro -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = ENDER +bed_model = ender3_bed.stl +bed_texture = ender3.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + +[printer_model:ENDER3NEO] +name = Creality Ender-3 Neo +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3_bed.stl @@ -43,7 +52,16 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER3V2] name = Creality Ender-3 V2 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = ENDER +bed_model = ender3v2_bed.stl +bed_texture = ender3v2.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + +[printer_model:ENDER3V2NEO] +name = Creality Ender-3 V2 Neo +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3v2_bed.stl @@ -52,7 +70,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER3S1] name = Creality Ender-3 S1 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3v2_bed.stl @@ -61,16 +79,34 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER3S1PRO] name = Creality Ender-3 S1 Pro -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3v2_bed.stl bed_texture = ender3v2.svg default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY +[printer_model:ENDER3S1PLUS] +name = Creality Ender-3 S1 Plus +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = ENDER +bed_model = cr10v2_bed.stl +bed_texture = cr10spro.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + [printer_model:ENDER3MAX] name = Creality Ender-3 Max -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = ENDER +bed_model = cr10v2_bed.stl +bed_texture = cr10spro.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + +[printer_model:ENDER3MAXNEO] +name = Creality Ender-3 Max Neo +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = cr10v2_bed.stl @@ -79,7 +115,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER4] name = Creality Ender-4 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3v2_bed.stl @@ -88,7 +124,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER5] name = Creality Ender-5 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender3_bed.stl @@ -97,7 +133,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER5PLUS] name = Creality Ender-5 Plus -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender5plus_bed.stl @@ -106,7 +142,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER6] name = Creality Ender-6 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender6_bed.stl @@ -115,7 +151,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER7] name = Creality Ender-7 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender7_bed.stl @@ -124,7 +160,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER2] name = Creality Ender-2 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender2_bed.stl @@ -133,7 +169,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:ENDER2PRO] name = Creality Ender-2 Pro -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = ENDER bed_model = ender2pro_bed.stl @@ -142,7 +178,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR5PRO] name = Creality CR-5 Pro -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr5pro_bed.stl @@ -151,7 +187,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR5PROH] name = Creality CR-5 Pro H -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr5pro_bed.stl @@ -160,7 +196,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR6SE] name = Creality CR-6 SE -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr6se_bed.stl @@ -169,7 +205,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR6MAX] name = Creality CR-6 Max -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10s4_bed.stl @@ -178,7 +214,16 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10SMART] name = Creality CR-10 SMART -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 +technology = FFF +family = CR +bed_model = cr10v2_bed.stl +bed_texture = cr10spro.svg +default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + +[printer_model:CR10SMARTPRO] +name = Creality CR-10 SMART Pro +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10v2_bed.stl @@ -187,7 +232,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10MINI] name = Creality CR-10 Mini -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10mini_bed.stl @@ -196,7 +241,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10MAX] name = Creality CR-10 Max -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10max_bed.stl @@ -205,7 +250,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10] name = Creality CR-10 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10_bed.stl @@ -214,7 +259,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10V2] name = Creality CR-10 V2 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10v2_bed.stl @@ -223,7 +268,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10V3] name = Creality CR-10 V3 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10v2_bed.stl @@ -232,7 +277,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10S] name = Creality CR-10 S -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10_bed.stl @@ -241,7 +286,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10SPRO] name = Creality CR-10 S Pro -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10v2_bed.stl @@ -250,7 +295,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10SPROV2] name = Creality CR-10 S Pro V2 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10v2_bed.stl @@ -259,7 +304,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10S4] name = Creality CR-10 S4 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10s4_bed.stl @@ -268,7 +313,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR10S5] name = Creality CR-10 S5 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr10s5_bed.stl @@ -277,7 +322,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR20] name = Creality CR-20 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = ender3_bed.stl @@ -286,7 +331,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR20PRO] name = Creality CR-20 Pro -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = ender3_bed.stl @@ -295,7 +340,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR200B] name = Creality CR-200B -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr200b_bed.stl @@ -304,7 +349,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:CR8] name = Creality CR-8 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = CR bed_model = cr8_bed.stl @@ -313,7 +358,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ #[printer_model:CRX] #name = Creality CR-X -#variants = 0.4 +#variants = 0.4; 0.3; 0.5; 0.6 #technology = FFF #family = CR-X #bed_model = cr10v2_bed.stl @@ -322,7 +367,7 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ #[printer_model:CRXPRO] #name = Creality CR-X Pro -#variants = 0.4 +#variants = 0.4; 0.3; 0.5; 0.6 #technology = FFF #family = CR-X #bed_model = cr10v2_bed.stl @@ -331,13 +376,15 @@ default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @ [printer_model:SERMOOND1] name = Creality Sermoon-D1 -variants = 0.4 +variants = 0.4; 0.3; 0.5; 0.6 technology = FFF family = SERMOON bed_model = sermoond1_bed.stl bed_texture = sermoond1.svg default_materials = Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Creality PLA @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY; AzureFilm PLA @CREALITY; Devil Design PLA @CREALITY; Devil Design PLA Matt @CREALITY; Devil Design PLA Galaxy @CREALITY; Extrudr PLA NX2 @CREALITY; Real Filament PLA @CREALITY; Velleman PLA @CREALITY; 3DJAKE ecoPLA @CREALITY; 3DJAKE ecoPLA Matt @CREALITY; 3DJAKE ecoPLA Tough @CREALITY; 123-3D Jupiter PLA @CREALITY; Verbatim PLA @CREALITY + + # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -358,26 +405,22 @@ elefant_foot_compensation = 0.1 ensure_vertical_shell_thickness = 1 external_fill_pattern = rectilinear external_perimeters_first = 0 -external_perimeter_extrusion_width = 0.45 external_perimeter_speed = 25 extra_perimeters = 0 extruder_clearance_height = 34 extruder_clearance_radius = 47 -extrusion_width = 0.45 fill_angle = 45 fill_density = 15% 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% +infill_overlap = 23% infill_speed = 50 interface_shells = 0 max_print_speed = 100 @@ -390,9 +433,7 @@ overhangs = 0 only_retract_when_crossing_perimeters = 0 ooze_prevention = 0 output_filename_format = {input_filename_base}_{print_time}_{digits(layer_height,1,2)}mm_{temperature[0]}C_{filament_type[0]}_{printer_model}.gcode -perimeters = 2 perimeter_extruder = 1 -perimeter_extrusion_width = 0.45 perimeter_speed = 40 post_process = print_settings_id = @@ -407,13 +448,11 @@ small_perimeter_speed = 25 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.38 support_material_interface_extruder = 0 support_material_angle = 0 support_material_buildplate_only = 0 @@ -431,7 +470,6 @@ support_material_threshold = 40 support_material_with_sheath = 0 support_material_xy_spacing = 60% thin_walls = 0 -top_infill_extrusion_width = 0.4 top_solid_infill_speed = 30 travel_speed = 150 wipe_tower = 0 @@ -442,10 +480,11 @@ 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 bridge_flow_ratio = 0.70 @@ -453,7 +492,6 @@ bridge_flow_ratio = 0.70 [print:*0.10mm*] inherits = *common* layer_height = 0.10 -perimeters = 3 bottom_solid_layers = 7 top_solid_layers = 9 bridge_flow_ratio = 0.70 @@ -461,7 +499,6 @@ bridge_flow_ratio = 0.70 [print:*0.12mm*] inherits = *common* layer_height = 0.12 -perimeters = 3 bottom_solid_layers = 6 top_solid_layers = 7 bridge_flow_ratio = 0.70 @@ -482,50 +519,228 @@ top_solid_layers = 5 [print:*0.24mm*] inherits = *common* layer_height = 0.24 -top_infill_extrusion_width = 0.45 bottom_solid_layers = 3 top_solid_layers = 4 [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* +[print:*0.36mm*] +inherits = *common* +layer_height = 0.36 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[print:*0.44mm*] +inherits = *common* +layer_height = 0.44 +bottom_solid_layers = 3 +top_solid_layers = 4 + + + +[print:*0.3nozzle*] +perimeters = 4 +support_material_interface_spacing = 0.15 +support_material_spacing = 1 +first_layer_height = 0.2 +extrusion_width = 0.33 +external_perimeter_extrusion_width = 0.31 +first_layer_extrusion_width = 0.31 +infill_extrusion_width = 0.33 +perimeter_extrusion_width = 0.33 +solid_infill_extrusion_width = 0.33 +top_infill_extrusion_width = 0.30 +support_material_extrusion_width = 0.27 + +[print:*0.4nozzle*] +perimeters = 3 +support_material_interface_spacing = 0.2 +support_material_spacing = 1 +first_layer_height = 0.2 +extrusion_width = 0.44 +external_perimeter_extrusion_width = 0.42 +first_layer_extrusion_width = 0.42 +infill_extrusion_width = 0.44 +perimeter_extrusion_width = 0.44 +solid_infill_extrusion_width = 0.44 +top_infill_extrusion_width = 0.40 +support_material_extrusion_width = 0.36 + +[print:*0.5nozzle*] +perimeters = 2 +support_material_interface_spacing = 0.2 +support_material_spacing = 1.1 +first_layer_height = 0.2 +extrusion_width = 0.55 +external_perimeter_extrusion_width = 0.52 +first_layer_extrusion_width = 0.52 +infill_extrusion_width = 0.55 +perimeter_extrusion_width = 0.55 +solid_infill_extrusion_width = 0.55 +top_infill_extrusion_width = 0.50 +support_material_extrusion_width = 0.45 + +[print:*0.6nozzle*] +perimeters = 2 +support_material_interface_spacing = 0.3 +support_material_spacing = 1.2 +first_layer_height = 0.3 +extrusion_width = 0.66 +external_perimeter_extrusion_width = 0.63 +first_layer_extrusion_width = 0.63 +infill_extrusion_width = 0.66 +perimeter_extrusion_width = 0.66 +solid_infill_extrusion_width = 0.66 +top_infill_extrusion_width = 0.60 +support_material_extrusion_width = 0.54 + + + +[print:0.08 mm SUPERDETAIL (0.3 mm nozzle) @CREALITY] +inherits = *0.08mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 + +[print:0.08 mm SUPERDETAIL (0.4 mm nozzle) @CREALITY] +inherits = *0.08mm*; *0.4nozzle* +renamed_from = "0.08mm SUPERDETAIL @CREALITY" compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 -[print:0.10mm HIGHDETAIL @CREALITY] -inherits = *0.10mm* -renamed_from = "0.10mm HIGHDETAIL @ENDER3" +[print:0.08 mm SUPERDETAIL (0.5 mm nozzle) @CREALITY] +inherits = *0.08mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.08 mm SUPERDETAIL (0.6 mm nozzle) @CREALITY] +inherits = *0.08mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.10 mm HIGHDETAIL (0.3 mm nozzle) @CREALITY] +inherits = *0.10mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 + +[print:0.10 mm HIGHDETAIL (0.4 mm nozzle) @CREALITY] +inherits = *0.10mm*; *0.4nozzle* +renamed_from = "0.10mm HIGHDETAIL @CREALITY"; "0.10mm HIGHDETAIL @ENDER3" compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 -[print:0.12mm DETAIL @CREALITY] -inherits = *0.12mm* -renamed_from = "0.12mm DETAIL @ENDER3" +[print:0.10 mm HIGHDETAIL (0.5 mm nozzle) @CREALITY] +inherits = *0.10mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.10 mm HIGHDETAIL (0.6 mm nozzle) @CREALITY] +inherits = *0.10mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.12 mm DETAIL (0.3 mm nozzle) @CREALITY] +inherits = *0.12mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 + +[print:0.12 mm DETAIL (0.4 mm nozzle) @CREALITY] +inherits = *0.12mm*; *0.4nozzle* +renamed_from = "0.12mm DETAIL @CREALITY"; "0.12mm DETAIL @ENDER3" compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 -[print:0.16mm OPTIMAL @CREALITY] -inherits = *0.16mm* -renamed_from = "0.15mm OPTIMAL @ENDER3"; "0.15mm OPTIMAL @CREALITY" +[print:0.12 mm DETAIL (0.5 mm nozzle) @CREALITY] +inherits = *0.12mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.12 mm DETAIL (0.6 mm nozzle) @CREALITY] +inherits = *0.12mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.16 mm OPTIMAL (0.3 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 + +[print:0.16 mm OPTIMAL (0.4 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.4nozzle* +renamed_from = "0.15mm OPTIMAL @CREALITY"; "0.15mm OPTIMAL @ENDER3" compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 -[print:0.20mm NORMAL @CREALITY] -inherits = *0.20mm* -renamed_from = "0.20mm NORMAL @ENDER3" +[print:0.16 mm OPTIMAL (0.5 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.16 mm OPTIMAL (0.6 mm nozzle) @CREALITY] +inherits = *0.16mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.20 mm NORMAL (0.3 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.3nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.3 + +[print:0.20 mm NORMAL (0.4 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.4nozzle* +renamed_from = "0.20mm NORMAL @CREALITY"; "0.20mm NORMAL @ENDER3" compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 -[print:0.24mm DRAFT @CREALITY] -inherits = *0.24mm* -renamed_from = "0.24mm DRAFT @ENDER3" +[print:0.20 mm NORMAL (0.5 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.20 mm NORMAL (0.6 mm nozzle) @CREALITY] +inherits = *0.20mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.24 mm DRAFT (0.4 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.4nozzle* +renamed_from = "0.24mm DRAFT @CREALITY"; "0.24mm DRAFT @ENDER3" compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 -[print:0.28mm SUPERDRAFT @CREALITY] -inherits = *0.28mm* +[print:0.24 mm DRAFT (0.5 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.24 mm DRAFT (0.6 mm nozzle) @CREALITY] +inherits = *0.24mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.28 mm SUPERDRAFT (0.4 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.4nozzle* +renamed_from = "0.28mm SUPERDRAFT @CREALITY" compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.4 +[print:0.28 mm SUPERDRAFT (0.5 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.28 mm SUPERDRAFT (0.6 mm nozzle) @CREALITY] +inherits = *0.28mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.36 mm CHUNKY (0.5 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.5nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.5 + +[print:0.36 mm CHUNKY (0.6 mm nozzle) @CREALITY] +inherits = *0.36mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + +[print:0.44 mm SUPERCHUNKY (0.6 mm nozzle) @CREALITY] +inherits = *0.44mm*; *0.6nozzle* +compatible_printers_condition = printer_model=~/(ENDER|CR|SERMOON).*/ and nozzle_diameter[0]==0.6 + + + # When submitting new filaments please print the following temperature tower at 0.1mm layer height: # https://www.thingiverse.com/thing:2615842 # Pay particular attention to bridging, overhangs and retractions. @@ -860,7 +1075,21 @@ first_layer_temperature = 210 first_layer_bed_temperature = 60 filament_cost = 22.99 filament_density = 1.24 -filament_colour = #001ca8 +filament_colour = #001CA8 + +[filament:Geeetech Matte PLA @CREALITY] +inherits = *PLA* +filament_vendor = Geeetech +temperature = 200 +bed_temperature = 60 +first_layer_temperature = 205 +first_layer_bed_temperature = 60 +filament_cost = 26.99 +filament_density = 1.36 +filament_colour = #FF4640 +filament_spool_weight = 180 + + # Common printer preset [printer:*common*] @@ -891,17 +1120,12 @@ machine_max_jerk_z = 0.4 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 layer_gcode = ;AFTER_LAYER_CHANGE\n;{layer_z} -max_layer_height = 0.28 -min_layer_height = 0.08 max_print_height = 250 -nozzle_diameter = 0.4 printer_notes = printer_settings_id = -printer_variant = 0.4 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 @@ -918,8 +1142,7 @@ variable_layer_height = 1 wipe = 1 z_offset = 0 printer_model = -default_print_profile = 0.16mm OPTIMAL @CREALITY -default_filament_profile = Generic PLA @CREALITY +default_filament_profile = "Generic PLA @CREALITY" start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors @@ -943,6 +1166,21 @@ pause_print_gcode = M25 ; pause print [printer:*descendingz*] end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; move print head out of the way\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed close to the bottom\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors +[printer:*bowdencapricorn*] +retract_length = 4 + +[printer:*bowden*] +retract_length = 5 + +[printer:*bowdenlong*] +retract_length = 6 + +[printer:*bowdenallmetalhotend*] +retract_length = 3 + +[printer:*directdriveextruder*] +retract_length = 1 + [printer:*spriteextruder*] retract_length = 0.8 retract_speed = 30 @@ -950,90 +1188,298 @@ deretract_speed = 30 retract_before_travel = 1 retract_before_wipe = 0% -# Intended for printers with dual extruders and a single hotend/nozzle, like the CR-X series -[printer:*dualextruder*] -single_extruder_multi_material = 1 -cooling_tube_length = 5 -cooling_tube_retraction = 91.5 -extra_loading_move = -2 -parking_pos_retraction = 92 -deretract_speed = 40,40 -extruder_colour = #FCE94F;#729FCF -extruder_offset = 0x0,0x0 -max_layer_height = 0.28,0.28 -min_layer_height = 0.08,0.08 -nozzle_diameter = 0.4,0.4 -retract_before_travel = 2,2 -retract_before_wipe = 70%,70% -retract_layer_change = 1,1 -retract_length = 5,5 -retract_length_toolchange = 1,1 -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 = 60,60 -wipe = 1,1 -[printer:Creality Ender-3] -inherits = *common* -renamed_from = "Creality ENDER-3" + +[printer:*0.3nozzle*] +nozzle_diameter = 0.3 +printer_variant = 0.3 +min_layer_height = 0.08 +max_layer_height = 0.24 +retract_lift_above = 0.2 +default_print_profile = "0.12 mm DETAIL (0.3 mm nozzle) @CREALITY" + +[printer:*0.4nozzle*] +nozzle_diameter = 0.4 +printer_variant = 0.4 +min_layer_height = 0.08 +max_layer_height = 0.32 +retract_lift_above = 0.2 +default_print_profile = "0.16 mm OPTIMAL (0.4 mm nozzle) @CREALITY" + +[printer:*0.5nozzle*] +nozzle_diameter = 0.5 +printer_variant = 0.5 +min_layer_height = 0.08 +max_layer_height = 0.40 +retract_lift_above = 0.2 +default_print_profile = "0.20 mm NORMAL (0.5 mm nozzle) @CREALITY" + +[printer:*0.6nozzle*] +nozzle_diameter = 0.6 +printer_variant = 0.6 +min_layer_height = 0.08 +max_layer_height = 0.48 +retract_lift_above = 0.3 +default_print_profile = "0.24 mm DRAFT (0.6 mm nozzle) @CREALITY" + + + +[printer:*ENDER3*] +inherits = *common*; *bowden* bed_shape = 3x3,228x3,228x228,3x228 max_print_height = 250 printer_model = ENDER3 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 -[printer:Creality Ender-3 BLTouch] -inherits = Creality Ender-3; *fastabl* -renamed_from = "Creality ENDER-3 BLTouch" +[printer:Creality Ender-3 (0.3 mm nozzle)] +inherits = *ENDER3*; *0.3nozzle* + +[printer:Creality Ender-3 (0.4 mm nozzle)] +inherits = *ENDER3*; *0.4nozzle* +renamed_from = "Creality Ender-3"; "Creality ENDER-3" + +[printer:Creality Ender-3 (0.5 mm nozzle)] +inherits = *ENDER3*; *0.5nozzle* + +[printer:Creality Ender-3 (0.6 mm nozzle)] +inherits = *ENDER3*; *0.6nozzle* + + + +[printer:*ENDER3BLTOUCH*] +inherits = *ENDER3*; *fastabl* printer_model = ENDER3BLTOUCH -[printer:Creality Ender-3 Pro] -inherits = Creality Ender-3; *pauseprint* +[printer:Creality Ender-3 BLTouch (0.3 mm nozzle)] +inherits = *ENDER3BLTOUCH*; *0.3nozzle* + +[printer:Creality Ender-3 BLTouch (0.4 mm nozzle)] +inherits = *ENDER3BLTOUCH*; *0.4nozzle* +renamed_from = "Creality Ender-3 BLTouch"; "Creality ENDER-3 BLTouch" + +[printer:Creality Ender-3 BLTouch (0.5 mm nozzle)] +inherits = *ENDER3BLTOUCH*; *0.5nozzle* + +[printer:Creality Ender-3 BLTouch (0.6 mm nozzle)] +inherits = *ENDER3BLTOUCH*; *0.6nozzle* + + + + +[printer:*ENDER3PRO*] +inherits = *ENDER3*; *pauseprint* printer_model = ENDER3PRO 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_ENDER3PRO\nPRINTER_HAS_BOWDEN -[printer:Creality Ender-3 V2] -inherits = *common*; *pauseprint* -renamed_from = "Creality Ender-3V2" +[printer:Creality Ender-3 Pro (0.3 mm nozzle)] +inherits = *ENDER3PRO*; *0.3nozzle* + +[printer:Creality Ender-3 Pro (0.4 mm nozzle)] +inherits = *ENDER3PRO*; *0.4nozzle* +renamed_From = "Creality Ender-3 Pro" + +[printer:Creality Ender-3 Pro (0.5 mm nozzle)] +inherits = *ENDER3PRO*; *0.5nozzle* + +[printer:Creality Ender-3 Pro (0.6 mm nozzle)] +inherits = *ENDER3PRO*; *0.6nozzle* + + + +[printer:*ENDER3NEO*] +inherits = *ENDER3*; *fastabl* +printer_model = ENDER3NEO +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_ENDER3NEO\nPRINTER_HAS_BOWDEN + +[printer:Creality Ender-3 Neo (0.3 mm nozzle)] +inherits = *ENDER3NEO*; *0.3nozzle* + +[printer:Creality Ender-3 Neo (0.4 mm nozzle)] +inherits = *ENDER3NEO*; *0.4nozzle* + +[printer:Creality Ender-3 Neo (0.5 mm nozzle)] +inherits = *ENDER3NEO*; *0.5nozzle* + +[printer:Creality Ender-3 Neo (0.6 mm nozzle)] +inherits = *ENDER3NEO*; *0.6nozzle* + + + +[printer:*ENDER3V2*] +inherits = *common*; *bowden*; *pauseprint* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 250 printer_model = ENDER3V2 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_ENDER3V2\nPRINTER_HAS_BOWDEN -[printer:Creality Ender-3 S1] -inherits = *common*; *pauseprint*; *spriteextruder* +[printer:Creality Ender-3 V2 (0.3 mm nozzle)] +inherits = *ENDER3V2*; *0.3nozzle* + +[printer:Creality Ender-3 V2 (0.4 mm nozzle)] +inherits = *ENDER3V2*; *0.4nozzle* +renamed_From = "Creality Ender-3 V2"; "Creality Ender-3V2" + +[printer:Creality Ender-3 V2 (0.5 mm nozzle)] +inherits = *ENDER3V2*; *0.5nozzle* + +[printer:Creality Ender-3 V2 (0.6 mm nozzle)] +inherits = *ENDER3V2*; *0.6nozzle* + + + +[printer:*ENDER3V2NEO*] +inherits = *common*; *bowden*; *fastabl* +bed_shape = 5x0,215x0,215x220,5x220 +max_print_height = 250 +printer_model = ENDER3V2NEO +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_ENDER3V2NEO\nPRINTER_HAS_BOWDEN + +[printer:Creality Ender-3 V2 Neo (0.3 mm nozzle)] +inherits = *ENDER3V2NEO*; *0.3nozzle* + +[printer:Creality Ender-3 V2 Neo (0.4 mm nozzle)] +inherits = *ENDER3V2NEO*; *0.4nozzle* + +[printer:Creality Ender-3 V2 Neo (0.5 mm nozzle)] +inherits = *ENDER3V2NEO*; *0.5nozzle* + +[printer:Creality Ender-3 V2 Neo (0.6 mm nozzle)] +inherits = *ENDER3V2NEO*; *0.6nozzle* + + + +[printer:*ENDER3S1*] +inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 270 printer_model = ENDER3S1 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_ENDER3S1 -[printer:Creality Ender-3 S1 Pro] -inherits = *common*; *pauseprint*; *spriteextruder* +[printer:Creality Ender-3 S1 (0.3 mm nozzle)] +inherits = *ENDER3S1*; *0.3nozzle* + +[printer:Creality Ender-3 S1 (0.4 mm nozzle)] +inherits = *ENDER3S1*; *0.4nozzle* +renamed_From = "Creality Ender-3 S1" + +[printer:Creality Ender-3 S1 (0.5 mm nozzle)] +inherits = *ENDER3S1*; *0.5nozzle* + +[printer:Creality Ender-3 S1 (0.6 mm nozzle)] +inherits = *ENDER3S1*; *0.6nozzle* + + + +[printer:*ENDER3S1PRO*] +inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 270 printer_model = ENDER3S1PRO 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_ENDER3S1PRO -[printer:Creality Ender-3 Max] -inherits = *common*; *pauseprint* -retract_length = 6 +[printer:Creality Ender-3 S1 Pro (0.3 mm nozzle)] +inherits = *ENDER3S1PRO*; *0.3nozzle* + +[printer:Creality Ender-3 S1 Pro (0.4 mm nozzle)] +inherits = *ENDER3S1PRO*; *0.4nozzle* +renamed_From = "Creality Ender-3 S1 Pro" + +[printer:Creality Ender-3 S1 Pro (0.5 mm nozzle)] +inherits = *ENDER3S1PRO*; *0.5nozzle* + +[printer:Creality Ender-3 S1 Pro (0.6 mm nozzle)] +inherits = *ENDER3S1PRO*; *0.6nozzle* + + + +[printer:*ENDER3S1PLUS*] +inherits = *common*; *slowabl*; *spriteextruder*; *pauseprint* +bed_shape = 5x5,295x5,295x295,5x295 +max_print_height = 300 +printer_model = ENDER3S1PLUS +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_ENDER3S1PLUS + +[printer:Creality Ender-3 S1 Plus (0.3 mm nozzle)] +inherits = *ENDER3S1PLUS*; *0.3nozzle* + +[printer:Creality Ender-3 S1 Plus (0.4 mm nozzle)] +inherits = *ENDER3S1PLUS*; *0.4nozzle* + +[printer:Creality Ender-3 S1 Plus (0.5 mm nozzle)] +inherits = *ENDER3S1PLUS*; *0.5nozzle* + +[printer:Creality Ender-3 S1 Plus (0.6 mm nozzle)] +inherits = *ENDER3S1PLUS*; *0.6nozzle* + + + +[printer:*ENDER3MAX*] +inherits = *common*; *bowdenlong*; *pauseprint* bed_shape = 5x5,295x5,295x295,5x295 max_print_height = 340 printer_model = ENDER3MAX 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_ENDER3MAX\nPRINTER_HAS_BOWDEN -[printer:Creality Ender-4] -inherits = *common*; *descendingz* +[printer:Creality Ender-3 Max (0.3 mm nozzle)] +inherits = *ENDER3MAX*; *0.3nozzle* + +[printer:Creality Ender-3 Max (0.4 mm nozzle)] +inherits = *ENDER3MAX*; *0.4nozzle* +renamed_From = "Creality Ender-3 Max" + +[printer:Creality Ender-3 Max (0.5 mm nozzle)] +inherits = *ENDER3MAX*; *0.5nozzle* + +[printer:Creality Ender-3 Max (0.6 mm nozzle)] +inherits = *ENDER3MAX*; *0.6nozzle* + + + +[printer:*ENDER3MAXNEO*] +inherits = *common*; *bowdenlong*; *slowabl* +bed_shape = 5x5,295x5,295x295,5x295 +max_print_height = 320 +printer_model = ENDER3MAXNEO +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_ENDER3MAXNEO\nPRINTER_HAS_BOWDEN + +[printer:Creality Ender-3 Max Neo (0.3 mm nozzle)] +inherits = *ENDER3MAXNEO*; *0.3nozzle* + +[printer:Creality Ender-3 Max Neo (0.4 mm nozzle)] +inherits = *ENDER3MAXNEO*; *0.4nozzle* + +[printer:Creality Ender-3 Max Neo (0.5 mm nozzle)] +inherits = *ENDER3MAXNEO*; *0.5nozzle* + +[printer:Creality Ender-3 Max Neo (0.6 mm nozzle)] +inherits = *ENDER3MAXNEO*; *0.6nozzle* + + + +[printer:*ENDER4*] +inherits = *common*; *bowden*; *descendingz* bed_shape = 5x0,215x0,215x220,5x220 max_print_height = 300 printer_model = ENDER4 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_ENDER4\nPRINTER_HAS_BOWDEN -[printer:Creality Ender-5] -inherits = *common*; *descendingz* -retract_length = 6 +[printer:Creality Ender-4 (0.3 mm nozzle)] +inherits = *ENDER4*; *0.3nozzle* + +[printer:Creality Ender-4 (0.4 mm nozzle)] +inherits = *ENDER4*; *0.4nozzle* +renamed_From = "Creality Ender-4" + +[printer:Creality Ender-4 (0.5 mm nozzle)] +inherits = *ENDER4*; *0.5nozzle* + +[printer:Creality Ender-4 (0.6 mm nozzle)] +inherits = *ENDER4*; *0.6nozzle* + + + +[printer:*ENDER5*] +inherits = *common*; *bowdenlong*; *descendingz* bed_shape = 5x2.5,225x2.5,225x222.5,5x222.5 max_print_height = 300 printer_model = ENDER5 @@ -1041,9 +1487,23 @@ printer_notes = Don't remove the following keywords! These keywords are used in machine_max_acceleration_e = 1000 machine_max_feedrate_z = 5 -[printer:Creality Ender-5 Plus] -inherits = *common*; *slowabl*; *descendingz* -retract_length = 6 +[printer:Creality Ender-5 (0.3 mm nozzle)] +inherits = *ENDER5*; *0.3nozzle* + +[printer:Creality Ender-5 (0.4 mm nozzle)] +inherits = *ENDER5*; *0.4nozzle* +renamed_From = "Creality Ender-5" + +[printer:Creality Ender-5 (0.5 mm nozzle)] +inherits = *ENDER5*; *0.5nozzle* + +[printer:Creality Ender-5 (0.6 mm nozzle)] +inherits = *ENDER5*; *0.6nozzle* + + + +[printer:*ENDER5PLUS*] +inherits = *common*; *bowdenlong*; *slowabl*; *descendingz* bed_shape = 5x5,355x5,355x355,5x355 max_print_height = 400 printer_model = ENDER5PLUS @@ -1053,199 +1513,559 @@ machine_max_feedrate_z = 5 machine_max_feedrate_x = 300 machine_max_feedrate_y = 300 -[printer:Creality Ender-6] -inherits = *common*; *descendingz* +[printer:Creality Ender-5 Plus (0.3 mm nozzle)] +inherits = *ENDER5PLUS*; *0.3nozzle* + +[printer:Creality Ender-5 Plus (0.4 mm nozzle)] +inherits = *ENDER5PLUS*; *0.4nozzle* +renamed_From = "Creality Ender-5 Plus" + +[printer:Creality Ender-5 Plus (0.5 mm nozzle)] +inherits = *ENDER5PLUS*; *0.5nozzle* + +[printer:Creality Ender-5 Plus (0.6 mm nozzle)] +inherits = *ENDER5PLUS*; *0.6nozzle* + + + +[printer:*ENDER6*] +inherits = *common*; *bowden*; *descendingz* bed_shape = 5x5,255x5,255x255,5x255 max_print_height = 400 printer_model = ENDER6 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_ENDER6\nPRINTER_HAS_BOWDEN -[printer:Creality Ender-7] -inherits = *common*; *descendingz* +[printer:Creality Ender-6 (0.3 mm nozzle)] +inherits = *ENDER6*; *0.3nozzle* + +[printer:Creality Ender-6 (0.4 mm nozzle)] +inherits = *ENDER6*; *0.4nozzle* +renamed_From = "Creality Ender-6" + +[printer:Creality Ender-6 (0.5 mm nozzle)] +inherits = *ENDER6*; *0.5nozzle* + +[printer:Creality Ender-6 (0.6 mm nozzle)] +inherits = *ENDER6*; *0.6nozzle* + + + +[printer:*ENDER7*] +inherits = *common*; *bowden*; *descendingz* bed_shape = 5x5,245x5,245x245,5x245 max_print_height = 300 printer_model = ENDER7 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_ENDER7\nPRINTER_HAS_BOWDEN -[printer:Creality Ender-2] -inherits = *common* -renamed_from = "Creality ENDER-2" +[printer:Creality Ender-7 (0.3 mm nozzle)] +inherits = *ENDER7*; *0.3nozzle* + +[printer:Creality Ender-7 (0.4 mm nozzle)] +inherits = *ENDER7*; *0.4nozzle* +renamed_From = "Creality Ender-7" + +[printer:Creality Ender-7 (0.5 mm nozzle)] +inherits = *ENDER7*; *0.5nozzle* + +[printer:Creality Ender-7 (0.6 mm nozzle)] +inherits = *ENDER7*; *0.6nozzle* + + + +[printer:*ENDER2*] +inherits = *common*; *bowden* bed_shape = 0x0,150x0,150x150,0x150 max_print_height = 200 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 -[printer:Creality Ender-2 Pro] -inherits = *common* -renamed_from = "Creality ENDER-2 Pro" +[printer:Creality Ender-2 (0.3 mm nozzle)] +inherits = *ENDER2*; *0.3nozzle* + +[printer:Creality Ender-2 (0.4 mm nozzle)] +inherits = *ENDER2*; *0.4nozzle* +renamed_From = "Creality Ender-2"; "Creality ENDER-2" + +[printer:Creality Ender-2 (0.5 mm nozzle)] +inherits = *ENDER2*; *0.5nozzle* + +[printer:Creality Ender-2 (0.6 mm nozzle)] +inherits = *ENDER2*; *0.6nozzle* + + + +[printer:*ENDER2PRO*] +inherits = *common*; *bowden* bed_shape = 2.5x2.5,160x2.5,160x160,2.5x160 max_print_height = 180 printer_model = ENDER2PRO 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_ENDER2PRO\nPRINTER_HAS_BOWDEN -[printer:Creality CR-5 Pro] -inherits = *common*; *slowabl*; *descendingz* -retract_length = 6 +[printer:Creality Ender-2 Pro (0.3 mm nozzle)] +inherits = *ENDER2PRO*; *0.3nozzle* + +[printer:Creality Ender-2 Pro (0.4 mm nozzle)] +inherits = *ENDER2PRO*; *0.4nozzle* +renamed_From = "Creality Ender-2 Pro"; "Creality ENDER-2 Pro" + +[printer:Creality Ender-2 Pro (0.5 mm nozzle)] +inherits = *ENDER2PRO*; *0.5nozzle* + +[printer:Creality Ender-2 Pro (0.6 mm nozzle)] +inherits = *ENDER2PRO*; *0.6nozzle* + + + +[printer:*CR5PRO*] +inherits = *common*; *bowdenlong*; *slowabl*; *descendingz* bed_shape = 5x5,295x5,295x220,5x220 max_print_height = 380 printer_model = CR5PRO 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_CR5PRO\nPRINTER_HAS_BOWDEN -[printer:Creality CR-5 Pro H] -inherits = *common*; *slowabl*; *descendingz* -retract_length = 3 +[printer:Creality CR-5 Pro (0.3 mm nozzle)] +inherits = *CR5PRO*; *0.3nozzle* + +[printer:Creality CR-5 Pro (0.4 mm nozzle)] +inherits = *CR5PRO*; *0.4nozzle* +renamed_From = "Creality CR-5 Pro" + +[printer:Creality CR-5 Pro (0.5 mm nozzle)] +inherits = *CR5PRO*; *0.5nozzle* + +[printer:Creality CR-5 Pro (0.6 mm nozzle)] +inherits = *CR5PRO*; *0.6nozzle* + + + +[printer:*CR5PROH*] +inherits = *common*; *bowdenallmetalhotend*; *slowabl*; *descendingz* bed_shape = 5x5,295x5,295x220,5x220 max_print_height = 380 printer_model = CR5PROH 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_CR5PROH\nPRINTER_HAS_BOWDEN -[printer:Creality CR-6 SE] -inherits = *common*; *straingauge*; *pauseprint* +[printer:Creality CR-5 Pro H (0.3 mm nozzle)] +inherits = *CR5PROH*; *0.3nozzle* + +[printer:Creality CR-5 Pro H (0.4 mm nozzle)] +inherits = *CR5PROH*; *0.4nozzle* +renamed_From = "Creality CR-5 Pro H" + +[printer:Creality CR-5 Pro H (0.5 mm nozzle)] +inherits = *CR5PROH*; *0.5nozzle* + +[printer:Creality CR-5 Pro H (0.6 mm nozzle)] +inherits = *CR5PROH*; *0.6nozzle* + + + +[printer:*CR6SE*] +inherits = *common*; *bowden*; *straingauge*; *pauseprint* bed_shape = 5x0,230x0,230x235,5x235 printer_model = CR6SE 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_CR6SE\nPRINTER_HAS_BOWDEN -[printer:Creality CR-6 Max] -inherits = *common*; *straingauge* -retract_length = 6 +[printer:Creality CR-6 SE (0.3 mm nozzle)] +inherits = *CR6SE*; *0.3nozzle* + +[printer:Creality CR-6 SE (0.4 mm nozzle)] +inherits = *CR6SE*; *0.4nozzle* +renamed_From = "Creality CR-6 SE" + +[printer:Creality CR-6 SE (0.5 mm nozzle)] +inherits = *CR6SE*; *0.5nozzle* + +[printer:Creality CR-6 SE (0.6 mm nozzle)] +inherits = *CR6SE*; *0.6nozzle* + + + +[printer:*CR6MAX*] +inherits = *common*; *bowdenlong*; *straingauge* bed_shape = 5x5,395x5,395x395,5x395 max_print_height = 400 printer_model = CR6MAX 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_CR6MAX\nPRINTER_HAS_BOWDEN -[printer:Creality CR-10 SMART] -inherits = *common*; *straingauge* -retract_length = 6 +[printer:Creality CR-6 Max (0.3 mm nozzle)] +inherits = *CR6MAX*; *0.3nozzle* + +[printer:Creality CR-6 Max (0.4 mm nozzle)] +inherits = *CR6MAX*; *0.4nozzle* +renamed_From = "Creality CR-6 Max" + +[printer:Creality CR-6 Max (0.5 mm nozzle)] +inherits = *CR6MAX*; *0.5nozzle* + +[printer:Creality CR-6 Max (0.6 mm nozzle)] +inherits = *CR6MAX*; *0.6nozzle* + + + +[printer:*CR10SMART*] +inherits = *common*; *bowdenlong*; *straingauge* bed_shape = 5x5,295x5,295x295,5x295 max_print_height = 400 printer_model = CR10SMART 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_CR10SMART\nPRINTER_HAS_BOWDEN -[printer:Creality CR-10 Mini] -inherits = *common* -retract_length = 6 +[printer:Creality CR-10 SMART (0.3 mm nozzle)] +inherits = *CR10SMART*; *0.3nozzle* + +[printer:Creality CR-10 SMART (0.4 mm nozzle)] +inherits = *CR10SMART*; *0.4nozzle* +renamed_From = "Creality CR-10 SMART" + +[printer:Creality CR-10 SMART (0.5 mm nozzle)] +inherits = *CR10SMART*; *0.5nozzle* + +[printer:Creality CR-10 SMART (0.6 mm nozzle)] +inherits = *CR10SMART*; *0.6nozzle* + + + +[printer:*CR10SMARTPRO*] +inherits = *common*; *slowabl*; *spriteextruder* +bed_shape = 5x5,295x5,295x295,5x295 +max_print_height = 400 +printer_model = CR10SMARTPRO +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_CR10SMARTPRO\nPRINTER_HAS_BOWDEN + +[printer:Creality CR-10 SMART Pro (0.3 mm nozzle)] +inherits = *CR10SMARTPRO*; *0.3nozzle* + +[printer:Creality CR-10 SMART Pro (0.4 mm nozzle)] +inherits = *CR10SMARTPRO*; *0.4nozzle* + +[printer:Creality CR-10 SMART Pro (0.5 mm nozzle)] +inherits = *CR10SMARTPRO*; *0.5nozzle* + +[printer:Creality CR-10 SMART Pro (0.6 mm nozzle)] +inherits = *CR10SMARTPRO*; *0.6nozzle* + + + +[printer:*CR10MINI*] +inherits = *common*; *bowdenlong* bed_shape = 2.5x5,302.5x5,302.5x225,2.5x225 max_print_height = 300 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 -[printer:Creality CR-10 Max] -inherits = *common*; *slowabl* -retract_length = 6 +[printer:Creality CR-10 Mini (0.3 mm nozzle)] +inherits = *CR10MINI*; *0.3nozzle* + +[printer:Creality CR-10 Mini (0.4 mm nozzle)] +inherits = *CR10MINI*; *0.4nozzle* +renamed_From = "Creality CR-10 Mini" + +[printer:Creality CR-10 Mini (0.5 mm nozzle)] +inherits = *CR10MINI*; *0.5nozzle* + +[printer:Creality CR-10 Mini (0.6 mm nozzle)] +inherits = *CR10MINI*; *0.6nozzle* + + + +[printer:*CR10MAX*] +inherits = *common*; *bowdenlong*; *slowabl* bed_shape = 5x5,445x5,445x445,5x445 max_print_height = 470 printer_model = CR10MAX 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_CR10MAX\nPRINTER_HAS_BOWDEN -[printer:Creality CR-10] -inherits = *common* -retract_length = 6 +[printer:Creality CR-10 Max (0.3 mm nozzle)] +inherits = *CR10MAX*; *0.3nozzle* + +[printer:Creality CR-10 Max (0.4 mm nozzle)] +inherits = *CR10MAX*; *0.4nozzle* +renamed_From = "Creality CR-10 Max" + +[printer:Creality CR-10 Max (0.5 mm nozzle)] +inherits = *CR10MAX*; *0.5nozzle* + +[printer:Creality CR-10 Max (0.6 mm nozzle)] +inherits = *CR10MAX*; *0.6nozzle* + + + +[printer:*CR10*] +inherits = *common*; *bowdenlong* bed_shape = 5x5,305x5,305x305,5x305 max_print_height = 400 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 -[printer:Creality CR-10 V2] -inherits = *common* -retract_length = 6 +[printer:Creality CR-10 (0.3 mm nozzle)] +inherits = *CR10*; *0.3nozzle* + +[printer:Creality CR-10 (0.4 mm nozzle)] +inherits = *CR10*; *0.4nozzle* +renamed_From = "Creality CR-10" + +[printer:Creality CR-10 (0.5 mm nozzle)] +inherits = *CR10*; *0.5nozzle* + +[printer:Creality CR-10 (0.6 mm nozzle)] +inherits = *CR10*; *0.6nozzle* + + + +[printer:*CR10V2*] +inherits = *common*; *bowdenlong* bed_shape = 5x5,305x5,305x305,5x305 max_print_height = 400 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 -[printer:Creality CR-10 V3] -inherits = *common* -retract_length = 1 +[printer:Creality CR-10 V2 (0.3 mm nozzle)] +inherits = *CR10V2*; *0.3nozzle* + +[printer:Creality CR-10 V2 (0.4 mm nozzle)] +inherits = *CR10V2*; *0.4nozzle* +renamed_From = "Creality CR-10 V2" + +[printer:Creality CR-10 V2 (0.5 mm nozzle)] +inherits = *CR10V2*; *0.5nozzle* + +[printer:Creality CR-10 V2 (0.6 mm nozzle)] +inherits = *CR10V2*; *0.6nozzle* + + + +[printer:*CR10V3*] +inherits = *common*; *directdriveextruder* bed_shape = 5x5,305x5,305x305,5x305 max_print_height = 400 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 -[printer:Creality CR-10 S] -inherits = *common* -retract_length = 6 +[printer:Creality CR-10 V3 (0.3 mm nozzle)] +inherits = *CR10V3*; *0.3nozzle* + +[printer:Creality CR-10 V3 (0.4 mm nozzle)] +inherits = *CR10V3*; *0.4nozzle* +renamed_From = "Creality CR-10 V3" + +[printer:Creality CR-10 V3 (0.5 mm nozzle)] +inherits = *CR10V3*; *0.5nozzle* + +[printer:Creality CR-10 V3 (0.6 mm nozzle)] +inherits = *CR10V3*; *0.6nozzle* + + + +[printer:*CR10S*] +inherits = *common*; *bowdenlong* bed_shape = 5x5,305x5,305x305,5x305 max_print_height = 400 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 -[printer:Creality CR-10 S Pro] -inherits = *common*; *slowabl* -retract_length = 6 +[printer:Creality CR-10 S (0.3 mm nozzle)] +inherits = *CR10S*; *0.3nozzle* + +[printer:Creality CR-10 S (0.4 mm nozzle)] +inherits = *CR10S*; *0.4nozzle* +renamed_From = "Creality CR-10 S" + +[printer:Creality CR-10 S (0.5 mm nozzle)] +inherits = *CR10S*; *0.5nozzle* + +[printer:Creality CR-10 S (0.6 mm nozzle)] +inherits = *CR10S*; *0.6nozzle* + + + +[printer:*CR10SPRO*] +inherits = *common*; *bowdenlong*; *slowabl* bed_shape = 5x5,295x5,295x295,5x295 max_print_height = 400 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 -[printer:Creality CR-10 S Pro V2] -inherits = *common*; *slowabl* -retract_length = 6 +[printer:Creality CR-10 S Pro (0.3 mm nozzle)] +inherits = *CR10SPRO*; *0.3nozzle* + +[printer:Creality CR-10 S Pro (0.4 mm nozzle)] +inherits = *CR10SPRO*; *0.4nozzle* +renamed_From = "Creality CR-10 S Pro" + +[printer:Creality CR-10 S Pro (0.5 mm nozzle)] +inherits = *CR10SPRO*; *0.5nozzle* + +[printer:Creality CR-10 S Pro (0.6 mm nozzle)] +inherits = *CR10SPRO*; *0.6nozzle* + + + +[printer:*CR10SPROV2*] +inherits = *common*; *bowdenlong*; *slowabl* bed_shape = 5x5,305x5,305x305,5x305 max_print_height = 400 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 -[printer:Creality CR-10 S4] -inherits = *common* -retract_length = 6 +[printer:Creality CR-10 S Pro V2 (0.3 mm nozzle)] +inherits = *CR10SPROV2*; *0.3nozzle* + +[printer:Creality CR-10 S Pro V2 (0.4 mm nozzle)] +inherits = *CR10SPROV2*; *0.4nozzle* +renamed_From = "Creality CR-10 S Pro V2" + +[printer:Creality CR-10 S Pro V2 (0.5 mm nozzle)] +inherits = *CR10SPROV2*; *0.5nozzle* + +[printer:Creality CR-10 S Pro V2 (0.6 mm nozzle)] +inherits = *CR10SPROV2*; *0.6nozzle* + + + +[printer:*CR10S4*] +inherits = *common*; *bowdenlong* bed_shape = 5x5,395x5,395x395,5x395 max_print_height = 400 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 -[printer:Creality CR-10 S5] -inherits = *common* -retract_length = 6 +[printer:Creality CR-10 S4 (0.3 mm nozzle)] +inherits = *CR10S4*; *0.3nozzle* + +[printer:Creality CR-10 S4 (0.4 mm nozzle)] +inherits = *CR10S4*; *0.4nozzle* +renamed_From = "Creality CR-10 S4" + +[printer:Creality CR-10 S4 (0.5 mm nozzle)] +inherits = *CR10S4*; *0.5nozzle* + +[printer:Creality CR-10 S4 (0.6 mm nozzle)] +inherits = *CR10S4*; *0.6nozzle* + + + +[printer:*CR10S5*] +inherits = *common*; *bowdenlong* bed_shape = 5x5,505x5,505x505,5x505 max_print_height = 500 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 -[printer:Creality CR-20] -inherits = *common* +[printer:Creality CR-10 S5 (0.3 mm nozzle)] +inherits = *CR10S5*; *0.3nozzle* + +[printer:Creality CR-10 S5 (0.4 mm nozzle)] +inherits = *CR10S5*; *0.4nozzle* +renamed_From = "Creality CR-10 S5" + +[printer:Creality CR-10 S5 (0.5 mm nozzle)] +inherits = *CR10S5*; *0.5nozzle* + +[printer:Creality CR-10 S5 (0.6 mm nozzle)] +inherits = *CR10S5*; *0.6nozzle* + + + +[printer:*CR20*] +inherits = *common*; *bowden* 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 = *common*; *fastabl* -retract_length = 4 +[printer:Creality CR-20 (0.3 mm nozzle)] +inherits = *CR20*; *0.3nozzle* + +[printer:Creality CR-20 (0.4 mm nozzle)] +inherits = *CR20*; *0.4nozzle* +renamed_From = "Creality CR-20" + +[printer:Creality CR-20 (0.5 mm nozzle)] +inherits = *CR20*; *0.5nozzle* + +[printer:Creality CR-20 (0.6 mm nozzle)] +inherits = *CR20*; *0.6nozzle* + + + +[printer:*CR20PRO*] +inherits = *common*; *bowdencapricorn*; *fastabl* 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 -[printer:Creality CR-200B] -inherits = *common*; *descendingz* +[printer:Creality CR-20 Pro (0.3 mm nozzle)] +inherits = *CR20PRO*; *0.3nozzle* + +[printer:Creality CR-20 Pro (0.4 mm nozzle)] +inherits = *CR20PRO*; *0.4nozzle* +renamed_From = "Creality CR-20 Pro" + +[printer:Creality CR-20 Pro (0.5 mm nozzle)] +inherits = *CR20PRO*; *0.5nozzle* + +[printer:Creality CR-20 Pro (0.6 mm nozzle)] +inherits = *CR20PRO*; *0.6nozzle* + + + +[printer:*CR200B*] +inherits = *common*; *bowden*; *descendingz* bed_shape = 5x5,195x5,195x195,5x195 max_print_height = 200 printer_model = CR200B 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_CR200B\nPRINTER_HAS_BOWDEN -[printer:Creality CR-8] -inherits = *common* +[printer:Creality CR-200B (0.3 mm nozzle)] +inherits = *CR200B*; *0.3nozzle* + +[printer:Creality CR-200B (0.4 mm nozzle)] +inherits = *CR200B*; *0.4nozzle* +renamed_From = "Creality CR-200B" + +[printer:Creality CR-200B (0.5 mm nozzle)] +inherits = *CR200B*; *0.5nozzle* + +[printer:Creality CR-200B (0.6 mm nozzle)] +inherits = *CR200B*; *0.6nozzle* + + + +[printer:*CR8*] +inherits = *common*; *bowden* bed_shape = 5x5,215x5,215x215,5x215 max_print_height = 210 printer_model = CR8 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_CR8\nPRINTER_HAS_BOWDEN -#[printer:Creality CR-X] -#inherits = *common*; *dualextruder* -#retract_length = 6,6 -#bed_shape = 5x5,295x5,295x295,5x295 -#max_print_height = 400 -#printer_model = CRX -#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_CRX\nPRINTER_HAS_BOWDEN +[printer:Creality CR-8 (0.3 mm nozzle)] +inherits = *CR8*; *0.3nozzle* -#[printer:Creality CR-X Pro] -#inherits = *common*; *dualextruder*; *slowabl* -#retract_length = 6,6 -#bed_shape = 5x5,295x5,295x295,5x295 -#max_print_height = 400 -#printer_model = CRXPRO -#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_CRXPRO\nPRINTER_HAS_BOWDEN +[printer:Creality CR-8 (0.4 mm nozzle)] +inherits = *CR8*; *0.4nozzle* +renamed_From = "Creality CR-8" -[printer:Creality Sermoon-D1] -inherits = *common*; *descendingz* -retract_length = 1 +[printer:Creality CR-8 (0.5 mm nozzle)] +inherits = *CR8*; *0.5nozzle* + +[printer:Creality CR-8 (0.6 mm nozzle)] +inherits = *CR8*; *0.6nozzle* + + + +[printer:*SERMOOND1*] +inherits = *common*; *directdriveextruder*; *descendingz* bed_shape = 5x5,275x5,275x255,5x255 max_print_height = 310 printer_model = SERMOOND1 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_SERMOOND1\nPRINTER_HAS_BOWDEN + +[printer:Creality Sermoon-D1 (0.3 mm nozzle)] +inherits = *SERMOOND1*; *0.3nozzle* + +[printer:Creality Sermoon-D1 (0.4 mm nozzle)] +inherits = *SERMOOND1*; *0.4nozzle* +renamed_From = "Creality Sermoon-D1" + +[printer:Creality Sermoon-D1 (0.5 mm nozzle)] +inherits = *SERMOOND1*; *0.5nozzle* + +[printer:Creality Sermoon-D1 (0.6 mm nozzle)] +inherits = *SERMOOND1*; *0.6nozzle* diff --git a/resources/profiles/Creality/CR10SMARTPRO_thumbnail.png b/resources/profiles/Creality/CR10SMARTPRO_thumbnail.png new file mode 100644 index 0000000000..e9ab084f0f Binary files /dev/null and b/resources/profiles/Creality/CR10SMARTPRO_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER3MAXNEO_thumbnail.png b/resources/profiles/Creality/ENDER3MAXNEO_thumbnail.png new file mode 100644 index 0000000000..49b3221e6b Binary files /dev/null and b/resources/profiles/Creality/ENDER3MAXNEO_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER3NEO_thumbnail.png b/resources/profiles/Creality/ENDER3NEO_thumbnail.png new file mode 100644 index 0000000000..809e186d5b Binary files /dev/null and b/resources/profiles/Creality/ENDER3NEO_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER3S1PLUS_thumbnail.png b/resources/profiles/Creality/ENDER3S1PLUS_thumbnail.png new file mode 100644 index 0000000000..ae7024f842 Binary files /dev/null and b/resources/profiles/Creality/ENDER3S1PLUS_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER3V2NEO_thumbnail.png b/resources/profiles/Creality/ENDER3V2NEO_thumbnail.png new file mode 100644 index 0000000000..4d56ca7a46 Binary files /dev/null and b/resources/profiles/Creality/ENDER3V2NEO_thumbnail.png differ diff --git a/resources/profiles/Elegoo.idx b/resources/profiles/Elegoo.idx new file mode 100644 index 0000000000..cf0da371b1 --- /dev/null +++ b/resources/profiles/Elegoo.idx @@ -0,0 +1,2 @@ +min_slic3r_version = 2.5.0-alpha3 +1.0.0 Initial version diff --git a/resources/profiles/Elegoo.ini b/resources/profiles/Elegoo.ini new file mode 100644 index 0000000000..a39d33f3f5 --- /dev/null +++ b/resources/profiles/Elegoo.ini @@ -0,0 +1,510 @@ +# PrusaSlicer print profiles for the Elegoo printers. +# By Andrew Suzuki (andrewsuzuki.com), adapted from Creality.ini + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = Elegoo +# 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.0 +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Elegoo/ + +# 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:NEPTUNE1] +name = Elegoo Neptune-1 +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE2] +name = Elegoo Neptune-2 +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE2D] +name = Elegoo Neptune-2D +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE2S] +name = Elegoo Neptune-2S +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNE3] +name = Elegoo Neptune-3 +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +[printer_model:NEPTUNEX] +name = Elegoo Neptune-X +variants = 0.4 +technology = FFF +family = NEPTUNE +bed_model = +bed_texture = +default_materials = Generic PLA @ELEGOO; Generic PETG @ELEGOO; Generic ABS @ELEGOO + +# 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 +bridge_angle = 0 +bridge_flow_ratio = 0.95 +bridge_speed = 25 +brim_width = 0 +clip_multipart_objects = 1 +compatible_printers = +complete_objects = 0 +dont_support_bridges = 1 +elefant_foot_compensation = 0.1 +ensure_vertical_shell_thickness = 1 +external_fill_pattern = rectilinear +external_perimeters_first = 0 +external_perimeter_extrusion_width = 0.45 +external_perimeter_speed = 25 +extra_perimeters = 0 +extruder_clearance_height = 25 +extruder_clearance_radius = 45 +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% +infill_speed = 50 +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 = 0 +only_retract_when_crossing_perimeters = 0 +ooze_prevention = 0 +output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode +perimeters = 2 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.45 +perimeter_speed = 40 +post_process = +print_settings_id = +raft_layers = 0 +resolution = 0 +seam_position = nearest +single_extruder_multi_material_priming = 0 +skirts = 1 +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 +solid_infill_speed = 40 +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 = 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.4 +top_solid_infill_speed = 30 +travel_speed = 150 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 170 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[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* +layer_height = 0.12 +perimeters = 3 +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* +layer_height = 0.20 +bottom_solid_layers = 4 +top_solid_layers = 5 + +[print:*0.24mm*] +inherits = *common* +layer_height = 0.24 +top_infill_extrusion_width = 0.45 +bottom_solid_layers = 3 +top_solid_layers = 4 + +[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 @ELEGOO] +inherits = *0.08mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.10mm HIGHDETAIL @ELEGOO] +inherits = *0.10mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.12mm DETAIL @ELEGOO] +inherits = *0.12mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.16mm OPTIMAL @ELEGOO] +inherits = *0.16mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.20mm NORMAL @ELEGOO] +inherits = *0.20mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.24mm DRAFT @ELEGOO] +inherits = *0.24mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +[print:0.28mm SUPERDRAFT @ELEGOO] +inherits = *0.28mm* +compatible_printers_condition = printer_model=~/(NEPTUNE).*/ and nozzle_diameter[0]==0.4 + +# When submitting new filaments please print the following temperature tower at 0.1mm layer height: +# https://www.thingiverse.com/thing:2615842 +# Pay particular attention to bridging, overhangs and retractions. +# Also print the following bed adhesion test at 0.1 layer height as well: +# https://www.prusaprinters.org/prints/4634-bed-adhesion-warp-test +# At least for PLA, please keep bed temp at 60, as many Elegoo printers do not have any ABL +# So having some leeway to get good bed adhesion is not a luxury for many users + +[filament:*common*] +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_ELEGOO.*/ + +[filament:*PLA*] +inherits = *common* +bed_temperature = 60 +fan_below_layer_time = 100 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 15 +filament_type = PLA +filament_density = 1.24 +filament_cost = 20 +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 = 205 + +[filament:*PET*] +inherits = *common* +bed_temperature = 70 +cooling = 1 +disable_fan_first_layers = 3 +fan_below_layer_time = 20 +filament_colour = #DDDDDD +filament_max_volumetric_speed = 8 +filament_type = PETG +filament_density = 1.27 +filament_cost = 20 +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 = #DDDDDD +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 @ELEGOO] +inherits = *PLA* +filament_vendor = Generic + +[filament:Generic PETG @ELEGOO] +inherits = *PET* +filament_vendor = Generic + +[filament:Generic ABS @ELEGOO] +inherits = *ABS* +first_layer_bed_temperature = 90 +bed_temperature = 90 +filament_vendor = Generic + +# Common printer preset +[printer:*common*] +printer_technology = FFF +before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n +bed_shape = 0x0,235x0,235x235,0x235 +between_objects_gcode = +pause_print_gcode = +deretract_speed = 0 +extruder_colour = #FCE94F +extruder_offset = 0x0 +gcode_flavor = marlin +silent_mode = 0 +remaining_times = 0 +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 500 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 500 +machine_max_acceleration_y = 500 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 10 +machine_max_jerk_e = 5 +machine_max_jerk_x = 8 +machine_max_jerk_y = 8 +machine_max_jerk_z = 0.4 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z] +max_layer_height = 0.3 +min_layer_height = 0.07 +max_print_height = 250 +nozzle_diameter = 0.4 +printer_notes = +printer_settings_id = +retract_before_travel = 1 +retract_before_wipe = 0% +retract_layer_change = 1 +retract_length = 1 +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 = 35 +single_extruder_multi_material = 0 +thumbnails = 16x16,220x124 +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 = 0.16mm OPTIMAL @ELEGOO +default_filament_profile = Generic PLA @ELEGOO + +[printer:Elegoo Neptune-2] +inherits = *common* +printer_model = NEPTUNE2 +printer_variant = 0.4 +max_layer_height = 0.28 +min_layer_height = 0.08 +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_ELEGOO\nPRINTER_MODEL_NEPTUNE2\nPRINTER_HAS_BOWDEN +max_print_height = 250 +machine_max_acceleration_e = 5000 +machine_max_acceleration_extruding = 500 +machine_max_acceleration_retracting = 1000 +machine_max_acceleration_x = 500 +machine_max_acceleration_y = 500 +machine_max_acceleration_z = 100 +machine_max_feedrate_e = 60 +machine_max_feedrate_x = 500 +machine_max_feedrate_y = 500 +machine_max_feedrate_z = 10 +machine_max_jerk_e = 5 +machine_max_jerk_x = 8 +machine_max_jerk_y = 8 +machine_max_jerk_z = 0.4 +machine_min_extruding_rate = 0 +machine_min_travel_rate = 0 +nozzle_diameter = 0.4 +retract_before_travel = 2 +retract_length = 5 +retract_speed = 60 +deretract_speed = 40 +retract_before_wipe = 70% +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + + +# Intended for printers with a smaller bed +# [printer:*fastabl*] +# start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 + +# Intended for printers with a larger bed +# [printer:*slowabl*] +# start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nG28 ; home all axis\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 + +# Intended for printers with vendor official firmware verified to support M25 +# [printer:*pauseprint*] +# pause_print_gcode = M25 ; pause print + +# Intended for printers where the Z-axis lowers the print bed during printing +# [printer:*invertedz*] +# end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +# Intended for printers with dual extruders and a single hotend/nozzle +[printer:*dualextruder*] +single_extruder_multi_material = 1 +cooling_tube_length = 23 +cooling_tube_retraction = 35 +extra_loading_move = -2 +parking_pos_retraction = 80 +deretract_speed = 40,40 +extruder_colour = #0080C0;#FFFF9F +extruder_offset = 0x0,0x0 +max_layer_height = 0.28,0.28 +min_layer_height = 0.08,0.08 +nozzle_diameter = 0.4,0.4 +retract_before_travel = 2,2 +retract_before_wipe = 70%,70% +retract_layer_change = 1,1 +retract_length = 5,5 +retract_length_toolchange = 1,1 +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 = 60,60 +wipe = 1,1 +start_gcode = T[initial_tool] ; set active extruder\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM140 S{first_layer_bed_temperature[0]} ; set final bed temp\nM104 S150 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\n;G29 ; auto bed levelling - remove ; at beginning of line to enable\n;M420 S1 ; enable mesh - remove ; at beginning of line to enable\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S{first_layer_temperature[0]} ; set final nozzle temp\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp to stabilize\nM109 S{first_layer_temperature[0]} ; wait for nozzle temp to stabilize\nG1 Z0.28 F240 ; move down to prime nozzle\nG92 E0 ; reset extruder\nG1 E90 ; load filament\nG92 E0 ; reset extruder\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000 ; move over for second prime line\nG92 E0 ; reset extruder\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 ; reset extruder +end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600 ; Move print head up{endif}\nG1 X5 Y{print_bed_max[1]*0.8} F{travel_speed*60} ; present print\nG1 E-80 F2000 ; unload filament\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600 ; Move print head further up{endif}\n{if max_layer_z < max_print_height*0.6}G1 Z{max_print_height*0.6} F600 ; Move print head further up{endif}\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors + +# Copy of Creality CR-X config for the Neptune 2D (dual extruder, single hotend) + +[printer:Elegoo Neptune-2D] +inherits = Elegoo Neptune-2; *dualextruder* +retract_length = 6,6 +printer_model = NEPTUNE2D +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_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN + +[printer:Elegoo Neptune-2S] +inherits = Elegoo Neptune-2 +printer_model = NEPTUNE2S +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_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN + +[printer:Elegoo Neptune-X] +inherits = Elegoo Neptune-2 +max_print_height = 300 +printer_model = NEPTUNEX +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_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN + +[printer:Elegoo Neptune-3] +inherits = Elegoo Neptune-2 +max_print_height = 280 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S120 ; set temporary nozzle temp to prevent oozing during homing and auto bed leveling\nM140 S[first_layer_bed_temperature] ; set final bed temp\nG4 S10 ; allow partial nozzle warmup\nG28 ; home all axis\nG29 ; run abl mesh\nM420 S1 ; load mesh\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set final nozzle temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp to stabilize\nM109 S[first_layer_temperature] ; wait for nozzle temp to stabilize\nG1 Z0.28 F240\nG92 E0\nG1 Y140 E10 F1500 ; prime the nozzle\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E10 F1200 ; prime the nozzle\nG92 E0 +printer_model = NEPTUNE3 +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_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN + +[printer:Elegoo Neptune-1] +inherits = Elegoo Neptune-2 +bed_shape = 0x0,210x0,210x210,0x210 +max_print_height = 200 +printer_model = NEPTUNE1 +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_ELEGOO\nPRINTER_MODEL_NEPTUNE2D\nPRINTER_HAS_BOWDEN diff --git a/resources/profiles/Elegoo/NEPTUNE1_thumbnail.png b/resources/profiles/Elegoo/NEPTUNE1_thumbnail.png new file mode 100644 index 0000000000..26a4651b95 Binary files /dev/null and b/resources/profiles/Elegoo/NEPTUNE1_thumbnail.png differ diff --git a/resources/profiles/Elegoo/NEPTUNE2D_thumbnail.png b/resources/profiles/Elegoo/NEPTUNE2D_thumbnail.png new file mode 100644 index 0000000000..7ad372fc00 Binary files /dev/null and b/resources/profiles/Elegoo/NEPTUNE2D_thumbnail.png differ diff --git a/resources/profiles/Elegoo/NEPTUNE2S_thumbnail.png b/resources/profiles/Elegoo/NEPTUNE2S_thumbnail.png new file mode 100644 index 0000000000..0bff9e0e88 Binary files /dev/null and b/resources/profiles/Elegoo/NEPTUNE2S_thumbnail.png differ diff --git a/resources/profiles/Elegoo/NEPTUNE2_thumbnail.png b/resources/profiles/Elegoo/NEPTUNE2_thumbnail.png new file mode 100644 index 0000000000..cd1a44b99d Binary files /dev/null and b/resources/profiles/Elegoo/NEPTUNE2_thumbnail.png differ diff --git a/resources/profiles/Elegoo/NEPTUNE3_thumbnail.png b/resources/profiles/Elegoo/NEPTUNE3_thumbnail.png new file mode 100644 index 0000000000..f331ac7c27 Binary files /dev/null and b/resources/profiles/Elegoo/NEPTUNE3_thumbnail.png differ diff --git a/resources/profiles/Elegoo/NEPTUNEX_thumbnail.png b/resources/profiles/Elegoo/NEPTUNEX_thumbnail.png new file mode 100644 index 0000000000..329338b7e1 Binary files /dev/null and b/resources/profiles/Elegoo/NEPTUNEX_thumbnail.png differ diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index ce0505857c..dae1399b23 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,6 +1,10 @@ min_slic3r_version = 2.5.0-alpha0 +1.5.1 Renamed filament type "NYLON" to "PA". Updated Adura X profile. Updated PETG fan settings for Prusa MINI (removed fan ramp up). +1.5.0 Updated arachne parameters. Added profiles for Jessie filaments. +1.5.0-alpha1 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments. 1.5.0-alpha0 Added parameters for Arachne perimeter generator. Changed default seam position. Updated output filename format. min_slic3r_version = 2.4.0-rc +1.4.7 Added filament profile for Prusament PA11 Carbon Fiber. Added profiles for multiple 3D-Fuel filaments. 1.4.6 Added SLA materials. Updated filament profiles. 1.4.5 Added MMU2/S profiles for 0.25mm nozzle. Updated FW version. Enabled g-code thumbnails for MK3 family printers. Updated end g-code. 1.4.4 Added multiple Fiberlogy filament profiles. Updated Extrudr filament profiles. diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index 1760743ea5..17d8486c79 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,7 +5,7 @@ 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.5.0-alpha0 +config_version = 1.5.1 # Where to get the updates from? 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% @@ -30,7 +30,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB; Prusament PA11 Carbon Fiber [printer_model:MK3] name = Original Prusa i3 MK3 @@ -39,7 +39,7 @@ technology = FFF family = MK3 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB; Prusament PA11 Carbon Fiber [printer_model:MK3SMMU2S] name = Original Prusa i3 MK3S && MK3S+ MMU2S @@ -66,7 +66,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB; Prusament PA11 Carbon Fiber @MK2 [printer_model:MK2.5] name = Original Prusa i3 MK2.5 @@ -75,7 +75,7 @@ technology = FFF family = MK2.5 bed_model = mk3_bed.stl bed_texture = mk3.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB; Prusament PA11 Carbon Fiber @MK2 [printer_model:MK2.5SMMU2S] name = Original Prusa i3 MK2.5S MMU2S @@ -102,7 +102,7 @@ technology = FFF family = MK2 bed_model = mk2_bed.stl bed_texture = mk2.svg -default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB +default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PC Blend Carbon Fiber; Prusament PVB; Prusament PA11 Carbon Fiber @MK2 [printer_model:MK2SMM] name = Original Prusa i3 MK2S MMU1 @@ -243,14 +243,11 @@ bottom_solid_min_thickness = 0.5 gcode_label_objects = 1 infill_anchor = 2.5 infill_anchor_max = 12 -wall_add_middle_threshold = 75% -wall_split_middle_threshold = 50% wall_transition_angle = 10 wall_transition_filter_deviation = 25% wall_transition_length = 0.4 wall_distribution_count = 1 min_bead_width = 85% -min_feature_size = 0.1 [print:*MK3*] fill_pattern = grid @@ -297,14 +294,11 @@ thick_bridges = 0 bridge_flow_ratio = 1 bridge_speed = 20 wipe_tower_bridging = 6 -wall_add_middle_threshold = 85% -wall_split_middle_threshold = 70% wall_transition_angle = 10 wall_transition_filter_deviation = 25% wall_transition_length = 0.25 wall_distribution_count = 1 min_bead_width = 85% -min_feature_size = 0.0625 [print:*0.25nozzleMK3*] inherits = *0.25nozzle* @@ -353,14 +347,11 @@ bottom_solid_min_thickness = 0.6 thick_bridges = 1 bridge_flow_ratio = 0.95 bridge_speed = 25 -wall_add_middle_threshold = 85% -wall_split_middle_threshold = 70% wall_transition_angle = 10 wall_transition_filter_deviation = 25% wall_transition_length = 0.6 wall_distribution_count = 1 min_bead_width = 85% -min_feature_size = 0.15 [print:*0.6nozzleMK3*] inherits = *0.6nozzle* @@ -422,14 +413,11 @@ bottom_solid_min_thickness = 0.8 single_extruder_multi_material_priming = 0 thick_bridges = 1 overhangs = 0 -wall_add_middle_threshold = 85% -wall_split_middle_threshold = 70% wall_transition_angle = 10 wall_transition_filter_deviation = 25% wall_transition_length = 0.8 wall_distribution_count = 1 min_bead_width = 85% -min_feature_size = 0.2 [print:*soluble_support*] overhangs = 1 @@ -926,6 +914,7 @@ top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% perimeters = 3 +wipe_tower_bridging = 5 [print:0.15mm QUALITY @MK3] inherits = *0.15mm*; *MK3* @@ -1620,9 +1609,9 @@ filament_retract_lift = 0.2 compatible_printers_condition = printer_model=="MK2SMM" [filament:*PETMINI*] -# inherits = *PET* +full_fan_speed_layer = 0 filament_retract_length = nil -filament_retract_speed = 40 +filament_retract_speed = 45 filament_deretract_speed = 25 filament_retract_lift = nil filament_retract_before_travel = 1 @@ -1631,9 +1620,9 @@ compatible_printers_condition = printer_model=="MINI" start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{elsif nozzle_diameter[0]==0.8}0.06{else}0.2{endif} ; Filament gcode" [filament:*PETMINI06*] -# inherits = *PET* +full_fan_speed_layer = 0 filament_retract_length = nil -filament_retract_speed = 40 +filament_retract_speed = 45 filament_deretract_speed = 25 filament_retract_lift = nil filament_retract_before_travel = 1 @@ -1642,7 +1631,6 @@ start_filament_gcode = "M900 K0.12 ; Filament gcode" filament_max_volumetric_speed = 13 [filament:*ABSMINI*] -# inherits = *ABS* bed_temperature = 100 first_layer_bed_temperature = 100 filament_retract_length = 2.7 @@ -2057,6 +2045,28 @@ disable_fan_first_layers = 6 compatible_printers_condition = nozzle_diameter[0]>=0.4 and nozzle_diameter[0]!=0.8 and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material) start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0" +[filament:Prusament PA11 Carbon Fiber] +inherits = Prusament PC Blend Carbon Fiber +filament_cost = 151.24 +filament_density = 1.11 +filament_type = PA +filament_max_volumetric_speed = 6.5 +extrusion_multiplier = 1.05 +first_layer_temperature = 275 +temperature = 285 +first_layer_bed_temperature = 90 +bed_temperature = 115 +fan_below_layer_time = 10 +compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and nozzle_diameter[0]>=0.4 and nozzle_diameter[0]!=0.8 and printer_model!="MINI" and ! single_extruder_multi_material + +[filament:Prusament PA11 Carbon Fiber @MK2] +inherits = Prusament PA11 Carbon Fiber +first_layer_bed_temperature = 90 +bed_temperature = 110 +disable_fan_first_layers = 6 +compatible_printers_condition = nozzle_diameter[0]>=0.4 and nozzle_diameter[0]!=0.8 and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material) +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0" + [filament:Fillamentum CPE] inherits = *PET* filament_vendor = Fillamentum @@ -2376,10 +2386,10 @@ inherits = *PET* filament_vendor = addnorth filament_cost = 29.99 filament_density = 1.27 -filament_type = NYLON +filament_type = PA extrusion_multiplier = 0.98 -bed_temperature = 60 -first_layer_bed_temperature = 60 +bed_temperature = 115 +first_layer_bed_temperature = 105 first_layer_temperature = 265 temperature = 270 fan_always_on = 0 @@ -2396,7 +2406,7 @@ filament_retract_lift = 0.4 filament_max_volumetric_speed = 4 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0" filament_spool_weight = 0 -compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model!="MINI" 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 = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and nozzle_diameter[0]>=0.4 and printer_model!="MINI" and printer_model!="MK2SMM" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) [filament:addnorth Adura X @MINI] inherits = addnorth Adura X @@ -2404,14 +2414,24 @@ filament_retract_length = nil filament_retract_lift = nil filament_retract_speed = 40 filament_deretract_speed = 25 +bed_temperature = 60 +first_layer_bed_temperature = 60 compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI" [filament:addnorth Adura X @MMU1] inherits = addnorth Adura X filament_retract_length = nil filament_retract_lift = nil +bed_temperature = 60 +first_layer_bed_temperature = 60 compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MK2SMM" +[filament:addnorth Adura X @MK2] +inherits = addnorth Adura X +bed_temperature = 110 +first_layer_bed_temperature = 105 +compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material) + [filament:addnorth E-PLA] inherits = *PLA* filament_vendor = addnorth @@ -2684,6 +2704,75 @@ filament_cost = 25.4 filament_density = 1.24 compatible_printers_condition = nozzle_diameter[0]!=0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) +[filament:3D-Fuel Standard PLA] +inherits = *PLA* +filament_vendor = 3D-Fuel +filament_cost = 22.14 +filament_density = 1.24 +filament_max_volumetric_speed = 10 +first_layer_temperature = 210 +temperature = 200 + +[filament:3D-Fuel EasiPrint PLA] +inherits = 3D-Fuel Standard PLA +filament_cost = 30.44 + +[filament:3D-Fuel Pro PLA] +inherits = *PLA* +filament_vendor = 3D-Fuel +filament_cost = 26.57 +filament_density = 1.22 +filament_max_volumetric_speed = 12 +first_layer_temperature = 220 +temperature = 215 +filament_retract_lift = 0 + +[filament:3D-Fuel Buzzed] +inherits = 3D-Fuel Standard PLA +filament_cost = 44.27 +filament_retract_lift = 0 +first_layer_temperature = 210 +temperature = 195 +filament_max_volumetric_speed = 8 + +[filament:3D-Fuel Wound up] +inherits = 3D-Fuel Buzzed +filament_cost = 44.27 +filament_retract_lift = nil +first_layer_temperature = 215 +temperature = 210 +filament_max_volumetric_speed = 8 + +[filament:3D-Fuel Workday ABS] +inherits = *ABSC* +filament_vendor = 3D-Fuel +filament_cost = 23.25 +filament_density = 1.04 + +[filament:3D-Fuel Workday ABS @MINI] +inherits = 3D-Fuel Workday ABS; *ABSMINI* + +[filament:Jessie PLA] +inherits = *PLA* +filament_vendor = Printed Solid +filament_cost = 21 +filament_density = 1.24 +filament_max_volumetric_speed = 12 + +[filament:Jessie PETG] +inherits = *PET* +filament_vendor = Printed Solid +filament_cost = 22 +filament_density = 1.27 +first_layer_temperature = 240 +first_layer_bed_temperature = 85 +temperature = 245 +bed_temperature = 90 +filament_max_volumetric_speed = 7 + +[filament:Jessie PETG @MINI] +inherits = Jessie PETG; *PETMINI* + [filament:Devil Design PLA] inherits = *PLA* filament_vendor = Devil Design @@ -2941,7 +3030,7 @@ bed_temperature = 115 fan_always_on = 0 cooling = 0 bridge_fan_speed = 25 -filament_type = NYLON +filament_type = PA filament_max_volumetric_speed = 8 compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) @@ -4085,7 +4174,7 @@ filament_cost = 27.65 [filament:Fiberlogy Nylon PA12] inherits = Fiberlogy ASA -filament_type = NYLON +filament_type = PA filament_density = 1.01 filament_cost = 48 first_layer_bed_temperature = 105 @@ -4318,7 +4407,7 @@ inherits = *common* filament_vendor = Taulman filament_cost = 40 filament_density = 1.13 -bed_temperature = 90 +bed_temperature = 110 bridge_fan_speed = 40 cooling = 0 disable_fan_first_layers = 3 @@ -4327,13 +4416,22 @@ fan_below_layer_time = 20 filament_colour = #DEE0E6 filament_max_volumetric_speed = 7 filament_soluble = 0 -filament_type = NYLON -first_layer_bed_temperature = 60 -first_layer_temperature = 240 +filament_type = PA +first_layer_bed_temperature = 90 +first_layer_temperature = 260 +temperature = 260 max_fan_speed = 0 min_fan_speed = 0 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0" +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:Taulman Bridge @MINI] +inherits = Taulman Bridge +bed_temperature = 90 +first_layer_bed_temperature = 60 +first_layer_temperature = 240 temperature = 250 +compatible_printers_condition = printer_model=="MINI" [filament:Fillamentum Nylon FX256] inherits = *common* @@ -4352,7 +4450,7 @@ slowdown_below_layer_time = 20 filament_colour = #DEE0E6 filament_max_volumetric_speed = 6 filament_soluble = 0 -filament_type = NYLON +filament_type = PA first_layer_bed_temperature = 90 first_layer_temperature = 250 max_fan_speed = 0 @@ -4365,10 +4463,10 @@ inherits = *common* filament_vendor = Fiberthree filament_cost = 200.84 filament_density = 1.2 -bed_temperature = 70 -first_layer_bed_temperature = 75 -first_layer_temperature = 270 -temperature = 270 +bed_temperature = 90 +first_layer_bed_temperature = 90 +first_layer_temperature = 285 +temperature = 285 bridge_fan_speed = 30 cooling = 1 disable_fan_first_layers = 3 @@ -4379,7 +4477,7 @@ slowdown_below_layer_time = 10 filament_colour = #DEE0E6 filament_max_volumetric_speed = 5 filament_soluble = 0 -filament_type = NYLON +filament_type = PA max_fan_speed = 20 min_fan_speed = 20 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" @@ -4395,10 +4493,10 @@ inherits = *common* filament_vendor = Fiberthree filament_cost = 208.1 filament_density = 1.25 -bed_temperature = 70 -first_layer_bed_temperature = 75 -first_layer_temperature = 275 -temperature = 275 +bed_temperature = 90 +first_layer_bed_temperature = 90 +first_layer_temperature = 285 +temperature = 285 bridge_fan_speed = 30 cooling = 1 disable_fan_first_layers = 3 @@ -4409,7 +4507,7 @@ slowdown_below_layer_time = 10 filament_colour = #DEE0E6 filament_max_volumetric_speed = 5 filament_soluble = 0 -filament_type = NYLON +filament_type = PA max_fan_speed = 0 min_fan_speed = 0 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0" @@ -4695,6 +4793,10 @@ compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0. [filament:Fiberthree F3 PA Pure Pro @MINI] inherits = Fiberthree F3 PA Pure Pro filament_max_volumetric_speed = 4 +first_layer_temperature = 280 +temperature = 280 +first_layer_bed_temperature = 75 +bed_temperature = 70 filament_retract_length = nil filament_retract_speed = nil filament_retract_lift = nil @@ -4704,6 +4806,10 @@ compatible_printers_condition = printer_model=="MINI" [filament:Fiberthree F3 PA-CF Pro @MINI] inherits = Fiberthree F3 PA-CF Pro +first_layer_temperature = 280 +temperature = 280 +first_layer_bed_temperature = 75 +bed_temperature = 70 filament_max_volumetric_speed = 4 filament_retract_length = nil filament_retract_speed = nil @@ -5083,6 +5189,16 @@ filament_max_volumetric_speed = 13 filament_retract_lift = 0.25 compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and nozzle_diameter[0]==0.8 and printer_model!="MINI" and ! single_extruder_multi_material +[filament:Prusament PA11 Carbon Fiber @0.8 nozzle] +inherits = Prusament PA11 Carbon Fiber +filament_max_volumetric_speed = 11 +compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and nozzle_diameter[0]==0.8 and printer_model!="MINI" and ! single_extruder_multi_material + +[filament:Prusament PA11 Carbon Fiber @0.8 nozzle MK2] +inherits = Prusament PA11 Carbon Fiber @MK2 +filament_max_volumetric_speed = 11 +compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MK2SMM" and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material) + [filament:Prusament PC Blend @0.8 nozzle MK2] inherits = Prusament PC Blend @MK2 filament_max_volumetric_speed = 13 @@ -8839,7 +8955,7 @@ inherits = Original Prusa i3 MK2S printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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{if filament_settings_id[initial_tool]=~/.*Prusament PA11.*/}\nG1 Z0.3 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E9 F1000 ; intro line\n{else}\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\n{endif}\nG92 E0 [printer:Original Prusa i3 MK2.5 0.25 nozzle] inherits = Original Prusa i3 MK2S 0.25 nozzle @@ -8853,7 +8969,8 @@ inherits = Original Prusa i3 MK2S 0.6 nozzle printer_model = MK2.5 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 +deretract_speed = 25 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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{if filament_settings_id[initial_tool]=~/.*Prusament PA11.*/}\nG1 Z0.3 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E9 F1000 ; intro line\n{else}\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\n{endif}\nG92 E0 [printer:Original Prusa i3 MK2.5 0.8 nozzle] inherits = Original Prusa i3 MK2S 0.6 nozzle @@ -8862,10 +8979,13 @@ nozzle_diameter = 0.8 printer_variant = 0.8 max_layer_height = 0.6 min_layer_height = 0.2 -retract_length = 1 +retract_length = 0.7 +retract_speed = 35 +deretract_speed = 20 +retract_lift = 0.25 remaining_times = 1 machine_max_jerk_e = 4.5 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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{if filament_settings_id[initial_tool]=~/.*Prusament PA11.*/}\nG1 Z0.3 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E9 F1000 ; intro line\n{else}\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\n{endif}\nG92 E0 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle color_change_gcode = M600\nG1 E0.6 F1500 ; prime after color change @@ -8939,7 +9059,10 @@ max_layer_height = 0.6 min_layer_height = 0.2 nozzle_diameter = 0.8 printer_variant = 0.8 -retract_length = 1 +retract_length = 0.7 +retract_speed = 35 +deretract_speed = 20 +retract_lift = 0.25 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle @@ -8952,6 +9075,7 @@ max_layer_height = 0.35 min_layer_height = 0.1 nozzle_diameter = 0.6 printer_variant = 0.6 +deretract_speed = 25 default_print_profile = 0.20mm NORMAL @0.6 nozzle color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -8985,6 +9109,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 +deretract_speed = 25 default_print_profile = 0.20mm NORMAL @0.6 nozzle color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -8994,6 +9119,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 +deretract_speed = 25 default_print_profile = 0.20mm NORMAL @0.6 nozzle color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -9067,7 +9193,7 @@ remaining_times = 1 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 max_print_height = 210 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0\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} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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{if filament_settings_id[initial_tool]=~/.*Prusament PA11.*/}\nG1 Z0.3 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E9 F1000 ; intro line\n{else}\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\n{endif}\nG92 E0\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 thumbnails = 160x120 @@ -9089,7 +9215,8 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0\nM221 S{if layer_height<0.075}100{else}95{endif} +deretract_speed = 25 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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{if filament_settings_id[initial_tool]=~/.*Prusament PA11.*/}\nG1 Z0.3 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E9 F1000 ; intro line\n{else}\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\n{endif}\nG92 E0\nM221 S{if layer_height<0.075}100{else}95{endif} default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -9099,8 +9226,11 @@ nozzle_diameter = 0.8 max_layer_height = 0.6 min_layer_height = 0.2 printer_variant = 0.8 -retract_length = 1 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\nG92 E0\nM221 S95 +retract_length = 0.7 +retract_speed = 35 +deretract_speed = 20 +retract_lift = 0.25 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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{if filament_settings_id[initial_tool]=~/.*Prusament PA11.*/}\nG1 Z0.3 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E9 F1000 ; intro line\n{else}\nG1 Z0.2 F720\nG1 Y-3 F1000 ; go outside print area\nG92 E0\nG1 X60 E9 F1000 ; intro line\nG1 X100 E12.5 F1000 ; intro line\n{endif}\nG92 E0\nM221 S95 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle color_change_gcode = M600\nG1 E0.6 F1500 ; prime after color change @@ -9182,6 +9312,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +deretract_speed = 25 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -9193,7 +9324,10 @@ nozzle_diameter = 0.8 max_layer_height = 0.6 min_layer_height = 0.2 printer_variant = 0.8 -retract_length = 1 +retract_length = 0.7 +retract_speed = 35 +deretract_speed = 20 +retract_lift = 0.25 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle @@ -9235,6 +9369,7 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 +deretract_speed = 25 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -9246,7 +9381,10 @@ nozzle_diameter = 0.8 max_layer_height = 0.6 min_layer_height = 0.2 printer_variant = 0.8 -retract_length = 1 +retract_length = 0.7 +retract_speed = 35 +deretract_speed = 20 +retract_lift = 0.25 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 F1000\nG1 Z0.4 F1000\n; select extruder\nTc\n; purge line\nG1 X55 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.40mm QUALITY @0.8 nozzle default_filament_profile = Prusament PLA @0.8 nozzle @@ -9283,6 +9421,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 +deretract_speed = 25 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E29 F1073\nG1 X5 E29 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -9293,6 +9432,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 +deretract_speed = 25 start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.11.0 ; 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 F1000\nG1 Z0.4 F1000\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55 E32 F1073\nG1 X5 E32 F1800\nG1 X55 E8 F2000\nG1 Z0.3 F1000\nG92 E0\nG1 X240 E25 F2200\nG1 Y-2 F1000\nG1 X55 E25 F1400\nG1 Z0.2 F1000\nG1 X5 E4 F1000\nG92 E0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0 default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 color_change_gcode = M600\nG1 E0.5 F1500 ; prime after color change @@ -9424,8 +9564,10 @@ max_layer_height = 0.55 min_layer_height = 0.2 default_print_profile = 0.40mm QUALITY @0.8 nozzle MINI default_filament_profile = Prusament PLA @0.8 nozzle -retract_length = 3.5 +retract_length = 3 retract_before_travel = 1.5 +retract_speed = 45 +deretract_speed = 20 [printer:Original Prusa SL1] printer_technology = SLA diff --git a/resources/profiles/gCreate.idx b/resources/profiles/gCreate.idx index 70770916c5..ad3382435f 100644 --- a/resources/profiles/gCreate.idx +++ b/resources/profiles/gCreate.idx @@ -1,3 +1,4 @@ min_slic3r_version = 2.4.0-alpha0 +1.0.1 Speed improvements, start gcode changes, added HIPS filament. 1.0.0 Initial version diff --git a/resources/profiles/gCreate.ini b/resources/profiles/gCreate.ini index 61d6047ce8..39cd17edcc 100644 --- a/resources/profiles/gCreate.ini +++ b/resources/profiles/gCreate.ini @@ -1,14 +1,14 @@ # Print profiles for the gCreate printers. # -# GTL Modified 210706 (at gCreate Shop) -# +# GTL Modified 220825 (at gCreate Shop) +# Speed improvements, start/end gCode changes [vendor] # Vendor name will be shown by the Config Wizard. name = gCreate # 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.0 +config_version = 1.0.1 # Where to get the updates from? config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/gCreate/ # changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% @@ -548,6 +548,7 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_GCREATE.*/ # Common filament preset across all PLA filaments [filament:*PLA*] inherits = *common* +extrusion_multiplier = 0.94 bed_temperature = 60 fan_below_layer_time = 15 filament_colour = #FF3232 @@ -749,11 +750,20 @@ filament_vendor = ProtoPasta temperature = 250 bed_temperature = 70 +[filament:Generic HIPS @GCREATE] +inherits = *PET* +filament_vendor = Generic +filament_density = 1.04 +temperature = 230 +first_layer_temperature = 235 +bed_temperature = 100 +first_layer_bed_temperature = 100 +filament_type = HIPS + [filament:Generic TPU 90A @GCREATE] inherits = *TPU90A* filament_vendor = Generic - [filament:Generic CF PETG @GCREATE] inherits = *CFPETG* filament_vendor = Generic @@ -770,8 +780,6 @@ filament_vendor = Generic inherits = *WOODFILLPLA* filament_vendor = ColorFabb - - [filament:Generic PVA @GCREATE - PLA and PVA Support] bed_temperature = 0 bridge_fan_speed = 75 @@ -830,8 +838,8 @@ machine_max_feedrate_x = 500 machine_max_feedrate_y = 500 machine_max_feedrate_z = 10 machine_max_jerk_e = 2.5 -machine_max_jerk_x = 3 -machine_max_jerk_y = 3 +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 @@ -893,7 +901,7 @@ retract_speed = 70 deretract_speed = 40 retract_before_wipe = 70% default_print_profile = 0.20mm - Standard Layers @GCREATE -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 +start_gcode = M420 Z20\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 ; home all\nG92 E0.0 end_gcode = M104 S0 T0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F3000 ; present print\n{if layer_z < max_print_height-10}G1 Z{z_offset+min(layer_z+70, max_print_height-10)} F600{endif} ; Move print head up\nM84 X Y E ; disable motors #[printer:*abl*] @@ -906,6 +914,7 @@ printer_model = GMAX2PRO max_layer_height = 0.7 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_GCREATE\nPRINTER_MODEL_GMAX2PRO +start_gcode = G90\nG28\nM420 Z20\nG1 Z5 F5000 bed_shape = 0x0,457x0,457x457,0x457 max_print_height = 610 @@ -929,7 +938,7 @@ printer_model = GMAX2DUAL2IN1 max_layer_height = 0.7 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_GCREATE\nPRINTER_MODEL_GMAX2DUAL2IN1 -start_gcode = G90 ;\n G28 ;\n G1 Z5 F5000 +start_gcode = G90\nG28\nM420 Z20\nG1 Z5 F5000 bed_shape = 0x0,457x0,457x457,0x457 max_print_height = 610 default_print_profile = 0.20mm - Standard Layers @GCREATE @@ -951,7 +960,7 @@ printer_model = GMAX2DUAL max_layer_height = 0.7 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_GCREATE\nPRINTER_MODEL_GMAX2DUAL -start_gcode = G90\nG28\nG1 Z5 F5000\nM218 T1 X20 Y0 ; Set second extruder offset +start_gcode = G90\nG28\nM420 Z20\nG1 Z5 F5000\nM218 T1 X20 Y0 ; Set second extruder offset end_gcode = M104 S0 T0 ; turn off temperature\nM104 S0 T1 ; turn off 2nd extruder\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 bed_shape = 0x0,457x0,457x457,0x457 max_print_height = 610 diff --git a/resources/shaders/110/gouraud.vs b/resources/shaders/110/gouraud.vs index 70f71f886b..3a451fa79c 100644 --- a/resources/shaders/110/gouraud.vs +++ b/resources/shaders/110/gouraud.vs @@ -1,77 +1,77 @@ -#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 LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SHININESS 5.0 - -#define INTENSITY_AMBIENT 0.3 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; -uniform mat4 volume_world_matrix; -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; -// Clipping plane - general orientation. Used by the SLA gizmo. -uniform vec4 clipping_plane; - -attribute vec3 v_position; -attribute vec3 v_normal; - -// x = diffuse, y = specular; -varying vec2 intensity; - -varying vec3 clipping_planes_dots; - -varying vec4 world_pos; -varying float world_normal_z; -varying vec3 eye_normal; - -void main() -{ - // First transform the normal into camera space and normalize the result. - eye_normal = normalize(normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - // Point in homogenous coordinates. - world_pos = volume_world_matrix * vec4(v_position, 1.0); - - // z component of normal vector in world coordinate used for slope shading - world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; - - gl_Position = projection_matrix * position; - // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. - clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); -} +#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 LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +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; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = diffuse, y = specular; +varying vec2 intensity; + +varying vec3 clipping_planes_dots; + +varying vec4 world_pos; +varying float world_normal_z; +varying vec3 eye_normal; + +void main() +{ + // First transform the normal into camera space and normalize the result. + eye_normal = normalize(view_normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Point in homogenous coordinates. + world_pos = volume_world_matrix * vec4(v_position, 1.0); + + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; + + gl_Position = projection_matrix * position; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/110/gouraud_light.vs b/resources/shaders/110/gouraud_light.vs index a03653b8a3..38ebb56928 100644 --- a/resources/shaders/110/gouraud_light.vs +++ b/resources/shaders/110/gouraud_light.vs @@ -1,45 +1,45 @@ -#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 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; - -attribute vec3 v_position; -attribute vec3 v_normal; - -// x = tainted, y = specular; -varying vec2 intensity; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(normal_matrix * v_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; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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 = projection_matrix * position; -} +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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 = projection_matrix * position; +} diff --git a/resources/shaders/110/gouraud_light_instanced.vs b/resources/shaders/110/gouraud_light_instanced.vs index 87748ce6f0..8148f74cad 100644 --- a/resources/shaders/110/gouraud_light_instanced.vs +++ b/resources/shaders/110/gouraud_light_instanced.vs @@ -1,50 +1,50 @@ -#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 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; - -// vertex attributes -attribute vec3 v_position; -attribute vec3 v_normal; -// instance attributes -attribute vec3 i_offset; -attribute vec2 i_scales; - -// x = tainted, y = specular; -varying vec2 intensity; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); - vec4 eye_position = view_model_matrix * world_position; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - gl_Position = projection_matrix * eye_position; -} +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +// vertex attributes +attribute vec3 v_position; +attribute vec3 v_normal; +// instance attributes +attribute vec3 i_offset; +attribute vec2 i_scales; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; +} diff --git a/resources/shaders/110/mm_gouraud.fs b/resources/shaders/110/mm_gouraud.fs index 78181e1d7e..06ca003d73 100644 --- a/resources/shaders/110/mm_gouraud.fs +++ b/resources/shaders/110/mm_gouraud.fs @@ -1,63 +1,63 @@ -#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 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); -const float EPSILON = 0.0001; - -uniform vec4 uniform_color; - -uniform bool volume_mirrored; - -uniform mat4 view_model_matrix; -uniform mat3 normal_matrix; - -varying vec3 clipping_planes_dots; -varying vec4 model_pos; - -void main() -{ - if (any(lessThan(clipping_planes_dots, ZERO))) - discard; - vec3 color = uniform_color.rgb; - float alpha = uniform_color.a; - - vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); -#ifdef FLIP_TRIANGLE_NORMALS - triangle_normal = -triangle_normal; -#endif - - if (volume_mirrored) - triangle_normal = -triangle_normal; - - // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(normal_matrix * triangle_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(eye_normal, LIGHT_TOP_DIR), 0.0); - - // x = diffuse, y = specular; - vec2 intensity = vec2(0.0); - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec3 position = (view_model_matrix * model_pos).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(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); -} +#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 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +uniform bool volume_mirrored; + +uniform mat4 view_model_matrix; +uniform mat3 view_normal_matrix; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); +#ifdef FLIP_TRIANGLE_NORMALS + triangle_normal = -triangle_normal; +#endif + + if (volume_mirrored) + triangle_normal = -triangle_normal; + + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * triangle_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + // x = diffuse, y = specular; + vec2 intensity = vec2(0.0); + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec3 position = (view_model_matrix * model_pos).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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/110/toolpaths_cog.vs b/resources/shaders/110/toolpaths_cog.vs index 38d2f79444..f37e796ab2 100644 --- a/resources/shaders/110/toolpaths_cog.vs +++ b/resources/shaders/110/toolpaths_cog.vs @@ -1,47 +1,47 @@ -#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 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; - -attribute vec3 v_position; -attribute vec3 v_normal; - -// x = tainted, y = specular; -varying vec2 intensity; -varying vec3 world_position; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(normal_matrix * v_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; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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; - - world_position = v_position; - gl_Position = projection_matrix * position; -} +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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; + + world_position = v_position; + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/110/variable_layer_height.vs b/resources/shaders/110/variable_layer_height.vs index e6c88fa809..1a04bbeec4 100644 --- a/resources/shaders/110/variable_layer_height.vs +++ b/resources/shaders/110/variable_layer_height.vs @@ -1,60 +1,60 @@ -#version 110 - -#define INTENSITY_CORRECTION 0.6 - -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 - -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SHININESS 5.0 - -#define INTENSITY_AMBIENT 0.3 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; -uniform mat4 volume_world_matrix; -uniform float object_max_z; - -attribute vec3 v_position; -attribute vec3 v_normal; -attribute vec2 v_tex_coord; - -// x = tainted, y = specular; -varying vec2 intensity; - -varying float object_z; - -void main() -{ - // ===================================================== - // NOTE: - // when object_max_z > 0.0 we are rendering the overlay - // when object_max_z == 0.0 we are rendering the volumes - // ===================================================== - - // First transform the normal into camera space and normalize the result. - vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(normal_matrix * v_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; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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); - - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - // Scaled to widths of the Z texture. - object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; - - gl_Position = projection_matrix * position; -} +#version 110 + +#define INTENSITY_CORRECTION 0.6 + +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 + +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +uniform float object_max_z; + +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec2 v_tex_coord; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + +void main() +{ + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + + // First transform the normal into camera space and normalize the result. + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Scaled to widths of the Z texture. + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/background.fs b/resources/shaders/140/background.fs index c21f3a70cd..4e595312ee 100644 --- a/resources/shaders/140/background.fs +++ b/resources/shaders/140/background.fs @@ -5,7 +5,9 @@ uniform vec4 bottom_color; in vec2 tex_coord; +out vec4 out_color; + void main() { - gl_FragColor = mix(bottom_color, top_color, tex_coord.y); + out_color = mix(bottom_color, top_color, tex_coord.y); } diff --git a/resources/shaders/140/dashed_thick_lines.fs b/resources/shaders/140/dashed_thick_lines.fs new file mode 100644 index 0000000000..7ea3c6d610 --- /dev/null +++ b/resources/shaders/140/dashed_thick_lines.fs @@ -0,0 +1,34 @@ +#version 150 + +// see as reference: https://github.com/mhalber/Lines/blob/master/geometry_shader_lines.h +// https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +const float aa_radius = 0.5; + +uniform float dash_size; +uniform float gap_size; +uniform vec4 uniform_color; + +in float line_width; +// x = v tex coord, y = s coord +in vec2 seg_params; + +out vec4 out_color; + +void main() +{ + float inv_stride = 1.0 / (dash_size + gap_size); + if (gap_size > 0.0 && fract(seg_params.y * inv_stride) > dash_size * inv_stride) + discard; + + // We render a quad that is fattened by r, giving total width of the line to be w+r. We want smoothing to happen + // around w, so that the edge is properly smoothed out. As such, in the smoothstep function we have: + // Far edge : 1.0 = (w+r) / (w+r) + // Close edge : 1.0 - (2r / (w+r)) = (w+r)/(w+r) - 2r/(w+r)) = (w-r) / (w+r) + // This way the smoothing is centered around 'w'. + + out_color = uniform_color; + float inv_line_width = 1.0 / line_width; + float aa = 1.0 - smoothstep(1.0 - (2.0 * aa_radius * inv_line_width), 1.0, abs(seg_params.x * inv_line_width)); + out_color.a *= aa; +} diff --git a/resources/shaders/140/dashed_thick_lines.gs b/resources/shaders/140/dashed_thick_lines.gs new file mode 100644 index 0000000000..c4897e9491 --- /dev/null +++ b/resources/shaders/140/dashed_thick_lines.gs @@ -0,0 +1,50 @@ +#version 150 + +// see as reference: https://github.com/mhalber/Lines/blob/master/geometry_shader_lines.h +// https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +layout(lines) in; +layout(triangle_strip, max_vertices = 4) out; + +const float aa_radius = 0.5; + +uniform vec2 viewport_size; +uniform float width; + +in float coord_s[]; + +out float line_width; +// x = v tex coord, y = s coord +out vec2 seg_params; + +void main() +{ + vec2 ndc_0 = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w; + vec2 ndc_1 = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w; + + vec2 dir = normalize((ndc_1 - ndc_0) * viewport_size); + vec2 normal_dir = vec2(-dir.y, dir.x); + + line_width = max(1.0, width) + 2.0 * aa_radius; + float half_line_width = 0.5 * line_width; + + vec2 normal = vec2(line_width / viewport_size[0], line_width / viewport_size[1]) * normal_dir; + + seg_params = vec2(-half_line_width, coord_s[0]); + gl_Position = vec4((ndc_0 + normal) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); + EmitVertex(); + + seg_params = vec2(-half_line_width, coord_s[0]); + gl_Position = vec4((ndc_0 - normal) * gl_in[0].gl_Position.w, gl_in[0].gl_Position.zw); + EmitVertex(); + + seg_params = vec2(half_line_width, coord_s[1]); + gl_Position = vec4((ndc_1 + normal) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); + EmitVertex(); + + seg_params = vec2(half_line_width, coord_s[1]); + gl_Position = vec4((ndc_1 - normal) * gl_in[1].gl_Position.w, gl_in[1].gl_Position.zw); + EmitVertex(); + + EndPrimitive(); +} diff --git a/resources/shaders/140/dashed_thick_lines.vs b/resources/shaders/140/dashed_thick_lines.vs new file mode 100644 index 0000000000..79a9fe38cd --- /dev/null +++ b/resources/shaders/140/dashed_thick_lines.vs @@ -0,0 +1,18 @@ +#version 150 + +// see as reference: https://github.com/mhalber/Lines/blob/master/geometry_shader_lines.h +// https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +// v_position.w = coordinate along the line +in vec4 v_position; + +out float coord_s; + +void main() +{ + coord_s = v_position.w; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position.xyz, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/140/flat.fs b/resources/shaders/140/flat.fs index e74124dcae..28642d53fe 100644 --- a/resources/shaders/140/flat.fs +++ b/resources/shaders/140/flat.fs @@ -2,7 +2,9 @@ uniform vec4 uniform_color; +out vec4 out_color; + void main() { - gl_FragColor = uniform_color; + out_color = uniform_color; } diff --git a/resources/shaders/140/flat_texture.fs b/resources/shaders/140/flat_texture.fs index dec946721e..bb6682367f 100644 --- a/resources/shaders/140/flat_texture.fs +++ b/resources/shaders/140/flat_texture.fs @@ -4,7 +4,9 @@ uniform sampler2D uniform_texture; in vec2 tex_coord; +out vec4 out_color; + void main() { - gl_FragColor = texture(uniform_texture, tex_coord); + out_color = texture(uniform_texture, tex_coord); } diff --git a/resources/shaders/140/gouraud.fs b/resources/shaders/140/gouraud.fs index 273779ca84..d87e336321 100644 --- a/resources/shaders/140/gouraud.fs +++ b/resources/shaders/140/gouraud.fs @@ -42,6 +42,8 @@ in vec4 world_pos; in float world_normal_z; in vec3 eye_normal; +out vec4 out_color; + void main() { if (any(lessThan(clipping_planes_dots, ZERO))) @@ -72,8 +74,8 @@ void main() #ifdef ENABLE_ENVIRONMENT_MAP if (use_environment_tex) - gl_FragColor = vec4(0.45 * texture(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); + out_color = vec4(0.45 * texture(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); else #endif - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); + out_color = vec4(vec3(intensity.y) + color * intensity.x, alpha); } diff --git a/resources/shaders/140/gouraud.vs b/resources/shaders/140/gouraud.vs index aaf251c42d..83aa27b921 100644 --- a/resources/shaders/140/gouraud.vs +++ b/resources/shaders/140/gouraud.vs @@ -1,77 +1,77 @@ -#version 140 - -#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 LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SHININESS 5.0 - -#define INTENSITY_AMBIENT 0.3 - -const vec3 ZERO = vec3(0.0, 0.0, 0.0); - -struct SlopeDetection -{ - bool actived; - float normal_z; - mat3 volume_world_normal_matrix; -}; - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; -uniform mat4 volume_world_matrix; -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; -// Clipping plane - general orientation. Used by the SLA gizmo. -uniform vec4 clipping_plane; - -in vec3 v_position; -in vec3 v_normal; - -// x = diffuse, y = specular; -out vec2 intensity; - -out vec3 clipping_planes_dots; - -out vec4 world_pos; -out float world_normal_z; -out vec3 eye_normal; - -void main() -{ - // First transform the normal into camera space and normalize the result. - eye_normal = normalize(normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - // Point in homogenous coordinates. - world_pos = volume_world_matrix * vec4(v_position, 1.0); - - // z component of normal vector in world coordinate used for slope shading - world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; - - gl_Position = projection_matrix * position; - // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. - clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); -} +#version 140 + +#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 LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +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; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +in vec3 v_position; +in vec3 v_normal; + +// x = diffuse, y = specular; +out vec2 intensity; + +out vec3 clipping_planes_dots; + +out vec4 world_pos; +out float world_normal_z; +out vec3 eye_normal; + +void main() +{ + // First transform the normal into camera space and normalize the result. + eye_normal = normalize(view_normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Point in homogenous coordinates. + world_pos = volume_world_matrix * vec4(v_position, 1.0); + + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; + + gl_Position = projection_matrix * position; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/140/gouraud_light.fs b/resources/shaders/140/gouraud_light.fs index de616e066a..0f918f4f69 100644 --- a/resources/shaders/140/gouraud_light.fs +++ b/resources/shaders/140/gouraud_light.fs @@ -6,7 +6,9 @@ uniform float emission_factor; // x = tainted, y = specular; in vec2 intensity; +out vec4 out_color; + void main() { - gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); + out_color = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); } diff --git a/resources/shaders/140/gouraud_light.vs b/resources/shaders/140/gouraud_light.vs index b75a844058..07ceee350f 100644 --- a/resources/shaders/140/gouraud_light.vs +++ b/resources/shaders/140/gouraud_light.vs @@ -1,45 +1,45 @@ -#version 140 - -#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 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; - -in vec3 v_position; -in vec3 v_normal; - -// x = tainted, y = specular; -out vec2 intensity; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(normal_matrix * v_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; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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 = projection_matrix * position; -} +#version 140 + +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +in vec3 v_position; +in vec3 v_normal; + +// x = tainted, y = specular; +out vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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 = projection_matrix * position; +} diff --git a/resources/shaders/140/gouraud_light_instanced.fs b/resources/shaders/140/gouraud_light_instanced.fs index de616e066a..0f918f4f69 100644 --- a/resources/shaders/140/gouraud_light_instanced.fs +++ b/resources/shaders/140/gouraud_light_instanced.fs @@ -6,7 +6,9 @@ uniform float emission_factor; // x = tainted, y = specular; in vec2 intensity; +out vec4 out_color; + void main() { - gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); + out_color = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); } diff --git a/resources/shaders/140/gouraud_light_instanced.vs b/resources/shaders/140/gouraud_light_instanced.vs index b6b9ab8be7..64178fb79b 100644 --- a/resources/shaders/140/gouraud_light_instanced.vs +++ b/resources/shaders/140/gouraud_light_instanced.vs @@ -1,50 +1,50 @@ -#version 140 - -#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 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; - -// vertex attributes -in vec3 v_position; -in vec3 v_normal; -// instance attributes -in vec3 i_offset; -in vec2 i_scales; - -// x = tainted, y = specular; -out vec2 intensity; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); - - intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; - vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); - vec4 eye_position = view_model_matrix * world_position; - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - gl_Position = projection_matrix * eye_position; -} +#version 140 + +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +// vertex attributes +in vec3 v_position; +in vec3 v_normal; +// instance attributes +in vec3 i_offset; +in vec2 i_scales; + +// x = tainted, y = specular; +out vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; +} diff --git a/resources/shaders/140/imgui.fs b/resources/shaders/140/imgui.fs index 4b2571749f..1666c814eb 100644 --- a/resources/shaders/140/imgui.fs +++ b/resources/shaders/140/imgui.fs @@ -5,7 +5,9 @@ uniform sampler2D Texture; in vec2 Frag_UV; in vec4 Frag_Color; +out vec4 out_color; + void main() { - gl_FragColor = Frag_Color * texture(Texture, Frag_UV.st); + out_color = Frag_Color * texture(Texture, Frag_UV.st); } \ No newline at end of file diff --git a/resources/shaders/140/mm_contour.fs b/resources/shaders/140/mm_contour.fs index e74124dcae..28642d53fe 100644 --- a/resources/shaders/140/mm_contour.fs +++ b/resources/shaders/140/mm_contour.fs @@ -2,7 +2,9 @@ uniform vec4 uniform_color; +out vec4 out_color; + void main() { - gl_FragColor = uniform_color; + out_color = uniform_color; } diff --git a/resources/shaders/140/mm_gouraud.fs b/resources/shaders/140/mm_gouraud.fs index e59d844f26..c810b7b4db 100644 --- a/resources/shaders/140/mm_gouraud.fs +++ b/resources/shaders/140/mm_gouraud.fs @@ -22,11 +22,13 @@ uniform vec4 uniform_color; uniform bool volume_mirrored; uniform mat4 view_model_matrix; -uniform mat3 normal_matrix; +uniform mat3 view_normal_matrix; in vec3 clipping_planes_dots; in vec4 model_pos; +out vec4 out_color; + void main() { if (any(lessThan(clipping_planes_dots, ZERO))) @@ -43,7 +45,7 @@ void main() triangle_normal = -triangle_normal; // First transform the normal into camera space and normalize the result. - vec3 eye_normal = normalize(normal_matrix * triangle_normal); + vec3 eye_normal = normalize(view_normal_matrix * triangle_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. @@ -59,5 +61,5 @@ void main() NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0); intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); + out_color = vec4(vec3(intensity.y) + color * intensity.x, alpha); } diff --git a/resources/shaders/140/printbed.fs b/resources/shaders/140/printbed.fs index 5f1bce657d..b10aa3f988 100644 --- a/resources/shaders/140/printbed.fs +++ b/resources/shaders/140/printbed.fs @@ -8,7 +8,8 @@ uniform bool transparent_background; uniform bool svg_source; in vec2 tex_coord; -out vec4 frag_color; + +out vec4 out_color; vec4 svg_color() { @@ -33,5 +34,5 @@ void main() { vec4 color = svg_source ? svg_color() : non_svg_color(); color.a = transparent_background ? color.a * 0.5 : color.a; - frag_color = color; + out_color = color; } \ No newline at end of file diff --git a/resources/shaders/140/toolpaths_cog.fs b/resources/shaders/140/toolpaths_cog.fs index 1c745dda99..010abe9711 100644 --- a/resources/shaders/140/toolpaths_cog.fs +++ b/resources/shaders/140/toolpaths_cog.fs @@ -11,9 +11,11 @@ uniform vec3 world_center; in vec2 intensity; in vec3 world_position; +out vec4 out_color; + void main() { vec3 delta = world_position - world_center; vec4 color = delta.x * delta.y * delta.z > 0.0 ? BLACK : WHITE; - gl_FragColor = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); + out_color = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); } diff --git a/resources/shaders/140/toolpaths_cog.vs b/resources/shaders/140/toolpaths_cog.vs index ef676a3751..a39595ebf5 100644 --- a/resources/shaders/140/toolpaths_cog.vs +++ b/resources/shaders/140/toolpaths_cog.vs @@ -1,47 +1,47 @@ -#version 140 - -#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 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; - -in vec3 v_position; -in vec3 v_normal; - -// x = tainted, y = specular; -out vec2 intensity; -out vec3 world_position; - -void main() -{ - // First transform the normal into camera space and normalize the result. - vec3 normal = normalize(normal_matrix * v_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; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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; - - world_position = v_position; - gl_Position = projection_matrix * position; -} +#version 140 + +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +in vec3 v_position; +in vec3 v_normal; + +// x = tainted, y = specular; +out vec2 intensity; +out vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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; + + world_position = v_position; + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/140/variable_layer_height.fs b/resources/shaders/140/variable_layer_height.fs index cf1fc309cc..658f812286 100644 --- a/resources/shaders/140/variable_layer_height.fs +++ b/resources/shaders/140/variable_layer_height.fs @@ -15,6 +15,8 @@ in vec2 intensity; in float object_z; +out vec4 out_color; + void main() { float object_z_row = z_to_texture_row * object_z; @@ -37,5 +39,5 @@ void main() color = mix(texture(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), texture(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); // Mix the final color. - gl_FragColor = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); + out_color = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); } diff --git a/resources/shaders/140/variable_layer_height.vs b/resources/shaders/140/variable_layer_height.vs index dd463b9c7a..2b656d3ca3 100644 --- a/resources/shaders/140/variable_layer_height.vs +++ b/resources/shaders/140/variable_layer_height.vs @@ -1,60 +1,60 @@ -#version 140 - -#define INTENSITY_CORRECTION 0.6 - -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 - -const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); -#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) -//#define LIGHT_FRONT_SHININESS 5.0 - -#define INTENSITY_AMBIENT 0.3 - -uniform mat4 view_model_matrix; -uniform mat4 projection_matrix; -uniform mat3 normal_matrix; -uniform mat4 volume_world_matrix; -uniform float object_max_z; - -in vec3 v_position; -in vec3 v_normal; -in vec2 v_tex_coord; - -// x = tainted, y = specular; -out vec2 intensity; - -out float object_z; - -void main() -{ - // ===================================================== - // NOTE: - // when object_max_z > 0.0 we are rendering the overlay - // when object_max_z == 0.0 we are rendering the volumes - // ===================================================== - - // First transform the normal into camera space and normalize the result. - vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(normal_matrix * v_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; - vec4 position = view_model_matrix * vec4(v_position, 1.0); - intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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); - - intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; - - // Scaled to widths of the Z texture. - object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; - - gl_Position = projection_matrix * position; -} +#version 140 + +#define INTENSITY_CORRECTION 0.6 + +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 + +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +uniform float object_max_z; + +in vec3 v_position; +in vec3 v_normal; +in vec2 v_tex_coord; + +// x = tainted, y = specular; +out vec2 intensity; + +out float object_z; + +void main() +{ + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + + // First transform the normal into camera space and normalize the result. + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Scaled to widths of the Z texture. + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/ES/background.fs b/resources/shaders/ES/background.fs new file mode 100644 index 0000000000..5f46e658ff --- /dev/null +++ b/resources/shaders/ES/background.fs @@ -0,0 +1,13 @@ +#version 100 + +precision highp float; + +uniform vec4 top_color; +uniform vec4 bottom_color; + +varying vec2 tex_coord; + +void main() +{ + gl_FragColor = mix(bottom_color, top_color, tex_coord.y); +} diff --git a/resources/shaders/ES/background.vs b/resources/shaders/ES/background.vs new file mode 100644 index 0000000000..6334c83b14 --- /dev/null +++ b/resources/shaders/ES/background.vs @@ -0,0 +1,12 @@ +#version 100 + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/dashed_lines.fs b/resources/shaders/ES/dashed_lines.fs new file mode 100644 index 0000000000..9aecd0240d --- /dev/null +++ b/resources/shaders/ES/dashed_lines.fs @@ -0,0 +1,20 @@ +#version 100 + +precision highp float; + +// see as reference: https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +uniform float dash_size; +uniform float gap_size; +uniform vec4 uniform_color; + +varying float coord_s; + +void main() +{ + float inv_stride = 1.0 / (dash_size + gap_size); + if (gap_size > 0.0 && fract(coord_s * inv_stride) > dash_size * inv_stride) + discard; + + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/dashed_lines.vs b/resources/shaders/ES/dashed_lines.vs new file mode 100644 index 0000000000..540715a11b --- /dev/null +++ b/resources/shaders/ES/dashed_lines.vs @@ -0,0 +1,17 @@ +#version 100 + +// see as reference: https://stackoverflow.com/questions/52928678/dashed-line-in-opengl3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +// v_position.w = coordinate along the line +attribute vec4 v_position; + +varying float coord_s; + +void main() +{ + coord_s = v_position.w; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position.xyz, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/ES/flat.fs b/resources/shaders/ES/flat.fs new file mode 100644 index 0000000000..f27e5d38cd --- /dev/null +++ b/resources/shaders/ES/flat.fs @@ -0,0 +1,10 @@ +#version 100 + +precision highp float; + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/flat.vs b/resources/shaders/ES/flat.vs new file mode 100644 index 0000000000..a835872392 --- /dev/null +++ b/resources/shaders/ES/flat.vs @@ -0,0 +1,11 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; + +void main() +{ + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/flat_clip.fs b/resources/shaders/ES/flat_clip.fs new file mode 100644 index 0000000000..8de7d1921e --- /dev/null +++ b/resources/shaders/ES/flat_clip.fs @@ -0,0 +1,17 @@ +#version 100 + +precision highp float; + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform vec4 uniform_color; + +varying vec3 clipping_planes_dots; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/flat_clip.vs b/resources/shaders/ES/flat_clip.vs new file mode 100644 index 0000000000..baf5a3385e --- /dev/null +++ b/resources/shaders/ES/flat_clip.vs @@ -0,0 +1,23 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat4 volume_world_matrix; + +// 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; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; + +varying vec3 clipping_planes_dots; + +void main() +{ + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + vec4 world_pos = volume_world_matrix * vec4(v_position, 1.0); + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); + + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/flat_texture.fs b/resources/shaders/ES/flat_texture.fs new file mode 100644 index 0000000000..ec41960f73 --- /dev/null +++ b/resources/shaders/ES/flat_texture.fs @@ -0,0 +1,12 @@ +#version 100 + +precision highp float; + +uniform sampler2D uniform_texture; + +varying vec2 tex_coord; + +void main() +{ + gl_FragColor = texture2D(uniform_texture, tex_coord); +} diff --git a/resources/shaders/ES/flat_texture.vs b/resources/shaders/ES/flat_texture.vs new file mode 100644 index 0000000000..e83cacd59c --- /dev/null +++ b/resources/shaders/ES/flat_texture.vs @@ -0,0 +1,15 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/gouraud.fs b/resources/shaders/ES/gouraud.fs new file mode 100644 index 0000000000..368a502795 --- /dev/null +++ b/resources/shaders/ES/gouraud.fs @@ -0,0 +1,81 @@ +#version 100 + +precision highp float; + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +struct PrintVolumeDetection +{ + // 0 = rectangle, 1 = circle, 2 = custom, 3 = invalid + int type; + // type = 0 (rectangle): + // x = min.x, y = min.y, z = max.x, w = max.y + // type = 1 (circle): + // x = center.x, y = center.y, z = radius + vec4 xy_data; + // x = min z, y = max z + vec2 z_data; +}; + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform vec4 uniform_color; +uniform SlopeDetection slope; + +#ifdef ENABLE_ENVIRONMENT_MAP + uniform sampler2D environment_tex; + uniform bool use_environment_tex; +#endif // ENABLE_ENVIRONMENT_MAP + +uniform PrintVolumeDetection print_volume; + +varying vec3 clipping_planes_dots; + +// x = diffuse, y = specular; +varying vec2 intensity; + +varying vec4 world_pos; +varying float world_normal_z; +varying vec3 eye_normal; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + if (slope.actived && world_normal_z < slope.normal_z - EPSILON) { + color = vec3(0.7, 0.7, 1.0); + alpha = 1.0; + } + + // if the fragment is outside the print volume -> use darker color + vec3 pv_check_min = ZERO; + vec3 pv_check_max = ZERO; + if (print_volume.type == 0) { + // rectangle + pv_check_min = world_pos.xyz - vec3(print_volume.xy_data.x, print_volume.xy_data.y, print_volume.z_data.x); + pv_check_max = world_pos.xyz - vec3(print_volume.xy_data.z, print_volume.xy_data.w, print_volume.z_data.y); + } + else if (print_volume.type == 1) { + // circle + float delta_radius = print_volume.xy_data.z - distance(world_pos.xy, print_volume.xy_data.xy); + pv_check_min = vec3(delta_radius, 0.0, world_pos.z - print_volume.z_data.x); + pv_check_max = vec3(0.0, 0.0, world_pos.z - print_volume.z_data.y); + } + color = (any(lessThan(pv_check_min, ZERO)) || any(greaterThan(pv_check_max, ZERO))) ? mix(color, ZERO, 0.3333) : color; + +#ifdef ENABLE_ENVIRONMENT_MAP + if (use_environment_tex) + gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, alpha); + else +#endif + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/ES/gouraud.vs b/resources/shaders/ES/gouraud.vs new file mode 100644 index 0000000000..431e48556b --- /dev/null +++ b/resources/shaders/ES/gouraud.vs @@ -0,0 +1,77 @@ +#version 100 + +#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 LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +struct SlopeDetection +{ + bool actived; + float normal_z; + mat3 volume_world_normal_matrix; +}; + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +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; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = diffuse, y = specular; +varying vec2 intensity; + +varying vec3 clipping_planes_dots; + +varying vec4 world_pos; +varying float world_normal_z; +varying vec3 eye_normal; + +void main() +{ + // First transform the normal into camera space and normalize the result. + eye_normal = normalize(view_normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Point in homogenous coordinates. + world_pos = volume_world_matrix * vec4(v_position, 1.0); + + // z component of normal vector in world coordinate used for slope shading + world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * v_normal)).z : 0.0; + + gl_Position = projection_matrix * position; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/ES/gouraud_light.fs b/resources/shaders/ES/gouraud_light.fs new file mode 100644 index 0000000000..a8de5879ca --- /dev/null +++ b/resources/shaders/ES/gouraud_light.fs @@ -0,0 +1,14 @@ +#version 100 + +precision highp float; + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/ES/gouraud_light.vs b/resources/shaders/ES/gouraud_light.vs new file mode 100644 index 0000000000..98bde435dd --- /dev/null +++ b/resources/shaders/ES/gouraud_light.vs @@ -0,0 +1,45 @@ +#version 100 + +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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 = projection_matrix * position; +} diff --git a/resources/shaders/ES/gouraud_light_instanced.fs b/resources/shaders/ES/gouraud_light_instanced.fs new file mode 100644 index 0000000000..d737137ee2 --- /dev/null +++ b/resources/shaders/ES/gouraud_light_instanced.fs @@ -0,0 +1,12 @@ +#version 100 + +uniform vec4 uniform_color; +uniform float emission_factor; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + gl_FragColor = vec4(vec3(intensity.y) + uniform_color.rgb * (intensity.x + emission_factor), uniform_color.a); +} diff --git a/resources/shaders/ES/gouraud_light_instanced.vs b/resources/shaders/ES/gouraud_light_instanced.vs new file mode 100644 index 0000000000..0aebd7a0b4 --- /dev/null +++ b/resources/shaders/ES/gouraud_light_instanced.vs @@ -0,0 +1,50 @@ +#version 100 + +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +// vertex attributes +attribute vec3 v_position; +attribute vec3 v_normal; +// instance attributes +attribute vec3 i_offset; +attribute vec2 i_scales; + +// x = tainted, y = specular; +varying vec2 intensity; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * v_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec4 world_position = vec4(v_position * vec3(vec2(1.5 * i_scales.x), 1.5 * i_scales.y) + i_offset - vec3(0.0, 0.0, 0.5 * i_scales.y), 1.0); + vec4 eye_position = view_model_matrix * world_position; + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(eye_position.xyz), 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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_Position = projection_matrix * eye_position; +} diff --git a/resources/shaders/ES/imgui.fs b/resources/shaders/ES/imgui.fs new file mode 100644 index 0000000000..2174f955d0 --- /dev/null +++ b/resources/shaders/ES/imgui.fs @@ -0,0 +1,13 @@ +#version 100 + +precision highp float; + +uniform sampler2D Texture; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st); +} \ No newline at end of file diff --git a/resources/shaders/ES/imgui.vs b/resources/shaders/ES/imgui.vs new file mode 100644 index 0000000000..7abb3f4052 --- /dev/null +++ b/resources/shaders/ES/imgui.vs @@ -0,0 +1,17 @@ +#version 100 + +uniform mat4 ProjMtx; + +attribute vec2 Position; +attribute vec2 UV; +attribute vec4 Color; + +varying vec2 Frag_UV; +varying vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0); +} \ No newline at end of file diff --git a/resources/shaders/ES/mm_contour.fs b/resources/shaders/ES/mm_contour.fs new file mode 100644 index 0000000000..f27e5d38cd --- /dev/null +++ b/resources/shaders/ES/mm_contour.fs @@ -0,0 +1,10 @@ +#version 100 + +precision highp float; + +uniform vec4 uniform_color; + +void main() +{ + gl_FragColor = uniform_color; +} diff --git a/resources/shaders/ES/mm_contour.vs b/resources/shaders/ES/mm_contour.vs new file mode 100644 index 0000000000..7142a5de69 --- /dev/null +++ b/resources/shaders/ES/mm_contour.vs @@ -0,0 +1,15 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform float offset; + +attribute vec3 v_position; + +void main() +{ + // Add small epsilon to z to solve z-fighting + vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); + clip_position.z -= offset * abs(clip_position.w); + gl_Position = clip_position; +} diff --git a/resources/shaders/ES/mm_gouraud.fs b/resources/shaders/ES/mm_gouraud.fs new file mode 100644 index 0000000000..4824753f1f --- /dev/null +++ b/resources/shaders/ES/mm_gouraud.fs @@ -0,0 +1,66 @@ +#version 100 +#extension GL_OES_standard_derivatives : enable + +precision highp float; + +#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 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); +const float EPSILON = 0.0001; + +uniform vec4 uniform_color; + +uniform bool volume_mirrored; + +uniform mat4 view_model_matrix; +uniform mat3 view_normal_matrix; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + if (any(lessThan(clipping_planes_dots, ZERO))) + discard; + vec3 color = uniform_color.rgb; + float alpha = uniform_color.a; + + vec3 triangle_normal = normalize(cross(dFdx(model_pos.xyz), dFdy(model_pos.xyz))); +#ifdef FLIP_TRIANGLE_NORMALS + triangle_normal = -triangle_normal; +#endif + + if (volume_mirrored) + triangle_normal = -triangle_normal; + + // First transform the normal into camera space and normalize the result. + vec3 eye_normal = normalize(view_normal_matrix * triangle_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(eye_normal, LIGHT_TOP_DIR), 0.0); + + // x = diffuse, y = specular; + vec2 intensity = vec2(0.0); + intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE; + vec3 position = (view_model_matrix * model_pos).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(eye_normal, LIGHT_FRONT_DIR), 0.0); + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, alpha); +} diff --git a/resources/shaders/ES/mm_gouraud.vs b/resources/shaders/ES/mm_gouraud.vs new file mode 100644 index 0000000000..8ad5fca68e --- /dev/null +++ b/resources/shaders/ES/mm_gouraud.vs @@ -0,0 +1,28 @@ +#version 100 + +const vec3 ZERO = vec3(0.0, 0.0, 0.0); + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +uniform mat4 volume_world_matrix; +// 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; +// Clipping plane - general orientation. Used by the SLA gizmo. +uniform vec4 clipping_plane; + +attribute vec3 v_position; + +varying vec3 clipping_planes_dots; +varying vec4 model_pos; + +void main() +{ + model_pos = vec4(v_position, 1.0); + // Point in homogenous coordinates. + vec4 world_pos = volume_world_matrix * model_pos; + + gl_Position = projection_matrix * view_model_matrix * model_pos; + // Fill in the scalars for fragment shader clipping. Fragments with any of these components lower than zero are discarded. + clipping_planes_dots = vec3(dot(world_pos, clipping_plane), world_pos.z - z_range.x, z_range.y - world_pos.z); +} diff --git a/resources/shaders/ES/printbed.fs b/resources/shaders/ES/printbed.fs new file mode 100644 index 0000000000..517536467f --- /dev/null +++ b/resources/shaders/ES/printbed.fs @@ -0,0 +1,38 @@ +#version 100 + +precision highp float; + +const vec3 back_color_dark = vec3(0.235, 0.235, 0.235); +const vec3 back_color_light = vec3(0.365, 0.365, 0.365); + +uniform sampler2D texture; +uniform bool transparent_background; +uniform bool svg_source; + +varying vec2 tex_coord; + +vec4 svg_color() +{ + // takes foreground from texture + vec4 fore_color = texture2D(texture, tex_coord); + + // calculates radial gradient + vec3 back_color = vec3(mix(back_color_light, back_color_dark, smoothstep(0.0, 0.5, length(abs(tex_coord.xy) - vec2(0.5))))); + + // blends foreground with background + return vec4(mix(back_color, fore_color.rgb, fore_color.a), transparent_background ? fore_color.a : 1.0); +} + +vec4 non_svg_color() +{ + // takes foreground from texture + vec4 color = texture2D(texture, tex_coord); + return vec4(color.rgb, transparent_background ? color.a * 0.25 : color.a); +} + +void main() +{ + vec4 color = svg_source ? svg_color() : non_svg_color(); + color.a = transparent_background ? color.a * 0.5 : color.a; + gl_FragColor = color; +} \ No newline at end of file diff --git a/resources/shaders/ES/printbed.vs b/resources/shaders/ES/printbed.vs new file mode 100644 index 0000000000..e83cacd59c --- /dev/null +++ b/resources/shaders/ES/printbed.vs @@ -0,0 +1,15 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; + +attribute vec3 v_position; +attribute vec2 v_tex_coord; + +varying vec2 tex_coord; + +void main() +{ + tex_coord = v_tex_coord; + gl_Position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); +} diff --git a/resources/shaders/ES/toolpaths_cog.fs b/resources/shaders/ES/toolpaths_cog.fs new file mode 100644 index 0000000000..f5e4404be9 --- /dev/null +++ b/resources/shaders/ES/toolpaths_cog.fs @@ -0,0 +1,21 @@ +#version 100 + +precision highp float; + +const vec4 BLACK = vec4(vec3(0.1), 1.0); +const vec4 WHITE = vec4(vec3(1.0), 1.0); + +const float emission_factor = 0.25; + +uniform vec3 world_center; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + vec3 delta = world_position - world_center; + vec4 color = delta.x * delta.y * delta.z > 0.0 ? BLACK : WHITE; + gl_FragColor = vec4(vec3(intensity.y) + color.rgb * (intensity.x + emission_factor), 1.0); +} diff --git a/resources/shaders/ES/toolpaths_cog.vs b/resources/shaders/ES/toolpaths_cog.vs new file mode 100644 index 0000000000..72b5835bdd --- /dev/null +++ b/resources/shaders/ES/toolpaths_cog.vs @@ -0,0 +1,47 @@ +#version 100 + +#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 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; + +attribute vec3 v_position; +attribute vec3 v_normal; + +// x = tainted, y = specular; +varying vec2 intensity; +varying vec3 world_position; + +void main() +{ + // First transform the normal into camera space and normalize the result. + vec3 normal = normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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; + + world_position = v_position; + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/ES/variable_layer_height.fs b/resources/shaders/ES/variable_layer_height.fs new file mode 100644 index 0000000000..ac96f31b7d --- /dev/null +++ b/resources/shaders/ES/variable_layer_height.fs @@ -0,0 +1,44 @@ +#version 100 +#extension GL_OES_standard_derivatives : enable + +precision highp float; + +#define M_PI 3.1415926535897932384626433832795 + +// 2D texture (1D texture split by the rows) of color along the object Z axis. +uniform sampler2D z_texture; +// Scaling from the Z texture rows coordinate to the normalized texture row coordinate. +uniform float z_to_texture_row; +uniform float z_texture_row_to_normalized; +uniform float z_cursor; +uniform float z_cursor_band_width; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + +void main() +{ + float object_z_row = z_to_texture_row * object_z; + // Index of the row in the texture. + float z_texture_row = floor(object_z_row); + // Normalized coordinate from 0. to 1. + float z_texture_col = object_z_row - z_texture_row; + float z_blend = 0.25 * cos(min(M_PI, abs(M_PI * (object_z - z_cursor) * 1.8 / z_cursor_band_width))) + 0.25; + // Calculate level of detail from the object Z coordinate. + // This makes the slowly sloping surfaces to be shown with high detail (with stripes), + // and the vertical surfaces to be shown with low detail (no stripes) + float z_in_cells = object_z_row * 190.; + // Gradient of Z projected on the screen. + float dx_vtc = dFdx(z_in_cells); + float dy_vtc = dFdy(z_in_cells); + float lod = clamp(0.5 * log2(max(dx_vtc * dx_vtc, dy_vtc * dy_vtc)), 0., 1.); + // Sample the Z texture. Texture coordinates are normalized to <0, 1>. + vec4 color = vec4(0.25, 0.25, 0.25, 1.0); + if (z_texture_row >= 0.0) + color = mix(texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row + 0.5 )), -10000.), + texture2D(z_texture, vec2(z_texture_col, z_texture_row_to_normalized * (z_texture_row * 2. + 1.)), 10000.), lod); + // Mix the final color. + gl_FragColor = vec4(vec3(intensity.y), 1.0) + intensity.x * mix(color, vec4(1.0, 1.0, 0.0, 1.0), z_blend); +} diff --git a/resources/shaders/ES/variable_layer_height.vs b/resources/shaders/ES/variable_layer_height.vs new file mode 100644 index 0000000000..8deaf8368c --- /dev/null +++ b/resources/shaders/ES/variable_layer_height.vs @@ -0,0 +1,60 @@ +#version 100 + +#define INTENSITY_CORRECTION 0.6 + +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 + +const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074); +#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SPECULAR (0.0 * INTENSITY_CORRECTION) +//#define LIGHT_FRONT_SHININESS 5.0 + +#define INTENSITY_AMBIENT 0.3 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform mat3 view_normal_matrix; +uniform mat4 volume_world_matrix; +uniform float object_max_z; + +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec2 v_tex_coord; + +// x = tainted, y = specular; +varying vec2 intensity; + +varying float object_z; + +void main() +{ + // ===================================================== + // NOTE: + // when object_max_z > 0.0 we are rendering the overlay + // when object_max_z == 0.0 we are rendering the volumes + // ===================================================== + + // First transform the normal into camera space and normalize the result. + vec3 normal = (object_max_z > 0.0) ? vec3(0.0, 0.0, 1.0) : normalize(view_normal_matrix * v_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; + vec4 position = view_model_matrix * vec4(v_position, 1.0); + intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position.xyz), 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); + + intensity.x += NdotL * LIGHT_FRONT_DIFFUSE; + + // Scaled to widths of the Z texture. + object_z = (object_max_z > 0.0) ? object_max_z * v_tex_coord.y : (volume_world_matrix * vec4(v_position, 1.0)).z; + + gl_Position = projection_matrix * position; +} diff --git a/resources/shaders/ES/wireframe.fs b/resources/shaders/ES/wireframe.fs new file mode 100644 index 0000000000..036ee88792 --- /dev/null +++ b/resources/shaders/ES/wireframe.fs @@ -0,0 +1,19 @@ +#version 100 +#extension GL_OES_standard_derivatives : enable + +// see for reference: https://stackoverflow.com/questions/7361582/opengl-debugging-single-pass-wireframe-rendering + +precision highp float; + +uniform vec4 uniform_color; + +varying vec3 barycentric; + +void main() +{ + float min_dist = min(min(barycentric.x, barycentric.y), barycentric.z); + if (min_dist > 0.5 * fwidth(min_dist)) + discard; + + gl_FragColor = uniform_color; +} \ No newline at end of file diff --git a/resources/shaders/ES/wireframe.vs b/resources/shaders/ES/wireframe.vs new file mode 100644 index 0000000000..00a5214f58 --- /dev/null +++ b/resources/shaders/ES/wireframe.vs @@ -0,0 +1,20 @@ +#version 100 + +uniform mat4 view_model_matrix; +uniform mat4 projection_matrix; +uniform float offset; + +attribute vec3 v_position; +attribute vec3 v_normal; +attribute vec3 v_extra; + +varying vec3 barycentric; + +void main() +{ + barycentric = v_extra; + // Add small epsilon to z to solve z-fighting + vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); + clip_position.z -= offset * abs(clip_position.w); + gl_Position = clip_position; +} \ No newline at end of file diff --git a/resources/shapes/OTHER_recycling_symbol.png b/resources/shapes/OTHER_recycling_symbol.png index 6383c5f737..b49a11964c 100644 Binary files a/resources/shapes/OTHER_recycling_symbol.png and b/resources/shapes/OTHER_recycling_symbol.png differ diff --git a/resources/shapes/OTHER_recycling_symbol.stl b/resources/shapes/OTHER_recycling_symbol.stl index 8188cb8e02..dfb68cf65d 100644 Binary files a/resources/shapes/OTHER_recycling_symbol.stl and b/resources/shapes/OTHER_recycling_symbol.stl differ diff --git a/resources/shapes/PETG_recycling_symbol.png b/resources/shapes/PETG_recycling_symbol.png index 58db040824..18c4091069 100644 Binary files a/resources/shapes/PETG_recycling_symbol.png and b/resources/shapes/PETG_recycling_symbol.png differ diff --git a/resources/shapes/PETG_recycling_symbol.stl b/resources/shapes/PETG_recycling_symbol.stl index 5654af6b0c..56e4e93021 100644 Binary files a/resources/shapes/PETG_recycling_symbol.stl and b/resources/shapes/PETG_recycling_symbol.stl differ diff --git a/resources/shapes/PLA_recycling_symbol.png b/resources/shapes/PLA_recycling_symbol.png index 4d12318723..b3f0e2a41a 100644 Binary files a/resources/shapes/PLA_recycling_symbol.png and b/resources/shapes/PLA_recycling_symbol.png differ diff --git a/resources/shapes/PLA_recycling_symbol.stl b/resources/shapes/PLA_recycling_symbol.stl index 7ff6b8e9cc..49f17c3cd5 100644 Binary files a/resources/shapes/PLA_recycling_symbol.stl and b/resources/shapes/PLA_recycling_symbol.stl differ diff --git a/sandboxes/aabb-evaluation/aabb-evaluation.cpp b/sandboxes/aabb-evaluation/aabb-evaluation.cpp index 1019ecf28b..c11af70e4e 100644 --- a/sandboxes/aabb-evaluation/aabb-evaluation.cpp +++ b/sandboxes/aabb-evaluation/aabb-evaluation.cpp @@ -6,8 +6,6 @@ #include #include -#include - #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable: 4244) @@ -42,53 +40,42 @@ void profile(const TriangleMesh &mesh) 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; + AABBTreeIndirect::Tree3f tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(mesh.its.vertices, mesh.its.indices); + 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; } - occlusion_output0(ivertex) = (double)num_hits/(double)num_samples; + 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.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; } - occlusion_output0(ivertex) = (double)num_hits/(double)num_samples; + 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; } } @@ -100,31 +87,23 @@ void profile(const TriangleMesh &mesh) 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; + AABBTreeIndirect::Tree3d tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(vertices, triangles); + 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; } - occlusion_output1(ivertex) = (double)num_hits/(double)num_samples; + 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; } } @@ -133,29 +112,23 @@ void profile(const TriangleMesh &mesh) 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; + AABB.init(V, F); + 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; } - occlusion_output2(ivertex) = (double)num_hits/(double)num_samples; + 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; } } @@ -166,37 +139,28 @@ void profile(const TriangleMesh &mesh) 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); - } + 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.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; } - occlusion_output3(ivertex) = (double)num_hits/(double)num_samples; + 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[]) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 801760b8cf..50eccfc849 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,13 +9,10 @@ add_subdirectory(boost) add_subdirectory(clipper) add_subdirectory(miniz) add_subdirectory(glu-libtess) -add_subdirectory(Shiny) add_subdirectory(semver) add_subdirectory(libigl) add_subdirectory(hints) add_subdirectory(qoi) - -# Adding libnest2d project for bin packing... add_subdirectory(libnest2d) find_package(Qhull 7.2 REQUIRED) @@ -30,6 +27,10 @@ endif() add_subdirectory(libslic3r) +if (SLIC3R_ENABLE_FORMAT_STEP) + add_subdirectory(occt_wrapper) +endif () + if (SLIC3R_GUI) add_subdirectory(imgui) add_subdirectory(hidapi) @@ -58,18 +59,26 @@ if (SLIC3R_GUI) "Hint: On Linux you can set -DSLIC3R_WX_STABLE=1 to use wxWidgets 3.0\n") endif () endif () + + include(${wxWidgets_USE_FILE}) else () - find_package(wxWidgets 3.1 REQUIRED COMPONENTS html adv gl core base) + find_package(wxWidgets 3.1 COMPONENTS html adv gl core base) + if (NOT wxWidgets_FOUND) + message(STATUS "Trying to find wxWidgets in CONFIG mode...") + find_package(wxWidgets 3.2 CONFIG REQUIRED COMPONENTS html adv gl core base) + slic3r_remap_configs(wx::wxhtml wx::wxadv wx::wxgl wx::wxcore wx::wxbase RelWithDebInfo Release) + else () + include(${wxWidgets_USE_FILE}) + endif () endif () if(UNIX) message(STATUS "wx-config path: ${wxWidgets_CONFIG_EXECUTABLE}") endif() - include(${wxWidgets_USE_FILE}) - find_package(JPEG QUIET) find_package(TIFF QUIET) + find_package(NanoSVG REQUIRED) string(REGEX MATCH "wxpng" WX_PNG_BUILTIN ${wxWidgets_LIBRARIES}) if (PNG_FOUND AND NOT WX_PNG_BUILTIN) @@ -105,7 +114,10 @@ if (SLIC3R_GUI) # 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) - + + if (UNIX AND NOT APPLE) + list(APPEND wxWidgets_LIBRARIES X11 wayland-client wayland-egl EGL) + endif () # list(REMOVE_ITEM wxWidgets_LIBRARIES oleacc) message(STATUS "wx libs: ${wxWidgets_LIBRARIES}") @@ -136,6 +148,7 @@ if (NOT WIN32 AND NOT APPLE) endif () target_link_libraries(PrusaSlicer libslic3r libcereal) + if (APPLE) # add_compile_options(-stdlib=libc++) # add_definitions(-DBOOST_THREAD_DONT_USE_CHRONO -DBOOST_NO_CXX11_RVALUE_REFERENCES -DBOOST_THREAD_USES_MOVE) diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index c79d088435..ecb1572185 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -33,6 +33,9 @@ #include "unix/fhs.hpp" // Generated by CMake from ../platform/unix/fhs.hpp.in #include "libslic3r/libslic3r.h" +#if ENABLE_GL_CORE_PROFILE +#include +#endif // ENABLE_GL_CORE_PROFILE #include "libslic3r/Config.hpp" #include "libslic3r/Geometry.hpp" #include "libslic3r/GCode/PostProcessor.hpp" @@ -117,6 +120,12 @@ int CLI::run(int argc, char **argv) // 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 +#if ENABLE_GL_CORE_PROFILE + std::pair opengl_version = { 0, 0 }; +#if ENABLE_OPENGL_DEBUG_OPTION + bool opengl_debug = false; +#endif // ENABLE_OPENGL_DEBUG_OPTION +#endif // ENABLE_GL_CORE_PROFILE const std::vector &load_configs = m_config.option("load", true)->values; const ForwardCompatibilitySubstitutionRule config_substitution_rule = m_config.option>("config_compatibility", true)->value; @@ -155,6 +164,44 @@ int CLI::run(int argc, char **argv) m_print_config.apply(config); } +#if ENABLE_GL_CORE_PROFILE + // search for special keys into command line parameters + auto it = std::find(m_actions.begin(), m_actions.end(), "gcodeviewer"); + if (it != m_actions.end()) { + start_gui = true; + start_as_gcodeviewer = true; + m_actions.erase(it); + } + + it = std::find(m_actions.begin(), m_actions.end(), "opengl-version"); + if (it != m_actions.end()) { + std::string opengl_version_str = m_config.opt_string("opengl-version"); + if (std::find(Slic3r::GUI::OpenGLVersions::core_str.begin(), Slic3r::GUI::OpenGLVersions::core_str.end(), opengl_version_str) == Slic3r::GUI::OpenGLVersions::core_str.end()) { + if (std::find(Slic3r::GUI::OpenGLVersions::precore_str.begin(), Slic3r::GUI::OpenGLVersions::precore_str.end(), opengl_version_str) == Slic3r::GUI::OpenGLVersions::precore_str.end()) { + boost::nowide::cerr << "Found invalid OpenGL version: " << opengl_version_str << std::endl; + opengl_version_str.clear(); + } + } + + if (!opengl_version_str.empty()) { + std::vector tokens; + boost::split(tokens, opengl_version_str, boost::is_any_of("."), boost::token_compress_on); + opengl_version.first = std::stoi(tokens[0].c_str()); + opengl_version.second = std::stoi(tokens[1].c_str()); + } + start_gui = true; + m_actions.erase(it); + } + + it = std::find(m_actions.begin(), m_actions.end(), "opengl-debug"); + if (it != m_actions.end()) { + start_gui = true; +#if ENABLE_OPENGL_DEBUG_OPTION + opengl_debug = true; +#endif // ENABLE_OPENGL_DEBUG_OPTION + m_actions.erase(it); + } +#else // are we starting as gcodeviewer ? for (auto it = m_actions.begin(); it != m_actions.end(); ++it) { if (*it == "gcodeviewer") { @@ -164,6 +211,7 @@ int CLI::run(int argc, char **argv) break; } } +#endif // ENABLE_GL_CORE_PROFILE // Read input file(s) if any. for (const std::string& file : m_input_files) @@ -613,6 +661,12 @@ int CLI::run(int argc, char **argv) params.extra_config = std::move(m_extra_config); params.input_files = std::move(m_input_files); params.start_as_gcodeviewer = start_as_gcodeviewer; +#if ENABLE_GL_CORE_PROFILE + params.opengl_version = opengl_version; +#if ENABLE_OPENGL_DEBUG_OPTION + params.opengl_debug = opengl_debug; +#endif // ENABLE_OPENGL_DEBUG_OPTION +#endif // ENABLE_GL_CORE_PROFILE return Slic3r::GUI::GUI_Run(params); #else // SLIC3R_GUI // No GUI support. Just print out a help. diff --git a/src/Shiny/CMakeLists.txt b/src/Shiny/CMakeLists.txt deleted file mode 100644 index abdb96a72e..0000000000 --- a/src/Shiny/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) -project(Shiny) - -add_library(Shiny STATIC - Shiny.h - ShinyConfig.h - ShinyData.h - ShinyMacros.h - ShinyManager.c - ShinyManager.h - ShinyNode.c - ShinyNode.h - ShinyNodePool.c - ShinyNodePool.h - ShinyNodeState.c - ShinyNodeState.h - ShinyOutput.c - ShinyOutput.h - ShinyPrereqs.h - ShinyTools.c - ShinyTools.h - ShinyVersion.h - ShinyZone.c - ShinyZone.h -) diff --git a/src/Shiny/Shiny.h b/src/Shiny/Shiny.h deleted file mode 100644 index a2905aef09..0000000000 --- a/src/Shiny/Shiny.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_H -#define SHINY_H - -/*---------------------------------------------------------------------------*/ - -#include "ShinyMacros.h" - -#ifdef SLIC3R_PROFILE -#include "ShinyManager.h" -#endif /* SLIC3R_PROFILE */ - -#endif /* SHINY_H */ diff --git a/src/Shiny/ShinyConfig.h b/src/Shiny/ShinyConfig.h deleted file mode 100644 index 54c632151b..0000000000 --- a/src/Shiny/ShinyConfig.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_CONFIG_H -#define SHINY_CONFIG_H - - -/*---------------------------------------------------------------------------*/ - -/* if SHINY_LOOKUP_RATE is defined to TRUE then Shiny will record the success of its hash function. This is useful for debugging. Default is FALSE. - */ -#ifndef SHINY_LOOKUP_RATE -// #define SHINY_LOOKUP_RATE FALSE -#endif - -/* if SHINY_HAS_ENABLED is defined to TRUE then Shiny can be enabled and disabled at runtime. TODO: bla bla... - */ -#ifndef SHINY_HAS_ENABLED -// #define SHINY_HAS_ENABLED FALSE -#endif - -/* TODO: - */ -#define SHINY_OUTPUT_MODE_FLAT 0x1 - -/* TODO: - */ -#define SHINY_OUTPUT_MODE_TREE 0x2 - -/* TODO: - */ -#define SHINY_OUTPUT_MODE_BOTH 0x3 - -/* TODO: - */ -#ifndef SHINY_OUTPUT_MODE -#define SHINY_OUTPUT_MODE SHINY_OUTPUT_MODE_BOTH -#endif - -#endif /* SHINY_CONFIG_H */ diff --git a/src/Shiny/ShinyData.h b/src/Shiny/ShinyData.h deleted file mode 100644 index d75d4f5bf4..0000000000 --- a/src/Shiny/ShinyData.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_DATA_H -#define SHINY_DATA_H - -#include "ShinyPrereqs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct { - uint32_t entryCount; - shinytick_t selfTicks; -} ShinyLastData; - - -/*---------------------------------------------------------------------------*/ - -typedef struct { - shinytick_t cur; - float avg; -} ShinyTickData; - -typedef struct { - uint32_t cur; - float avg; -} ShinyCountData; - -typedef struct { - ShinyCountData entryCount; - ShinyTickData selfTicks; - ShinyTickData childTicks; -} ShinyData; - -SHINY_INLINE shinytick_t ShinyData_totalTicksCur(const ShinyData *self) { - return self->selfTicks.cur + self->childTicks.cur; -} - -SHINY_INLINE float ShinyData_totalTicksAvg(const ShinyData *self) { - return self->selfTicks.avg + self->childTicks.avg; -} - -SHINY_INLINE void ShinyData_computeAverage(ShinyData *self, float a_damping) { - self->entryCount.avg = self->entryCount.cur + - a_damping * (self->entryCount.avg - self->entryCount.cur); - self->selfTicks.avg = self->selfTicks.cur + - a_damping * (self->selfTicks.avg - self->selfTicks.cur); - self->childTicks.avg = self->childTicks.cur + - a_damping * (self->childTicks.avg - self->childTicks.cur); -} - -SHINY_INLINE void ShinyData_copyAverage(ShinyData *self) { - self->entryCount.avg = (float) self->entryCount.cur; - self->selfTicks.avg = (float) self->selfTicks.cur; - self->childTicks.avg = (float) self->childTicks.cur; -} - -SHINY_INLINE void ShinyData_clearAll(ShinyData *self) { - self->entryCount.cur = 0; - self->entryCount.avg = 0; - self->selfTicks.cur = 0; - self->selfTicks.avg = 0; - self->childTicks.cur = 0; - self->childTicks.avg = 0; -} - -SHINY_INLINE void ShinyData_clearCurrent(ShinyData *self) { - self->entryCount.cur = 0; - self->selfTicks.cur = 0; - self->childTicks.cur = 0; -} - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_DATA_H */ diff --git a/src/Shiny/ShinyMacros.h b/src/Shiny/ShinyMacros.h deleted file mode 100644 index 79dfa43819..0000000000 --- a/src/Shiny/ShinyMacros.h +++ /dev/null @@ -1,281 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_MACROS_H -#define SHINY_MACROS_H - -#ifdef SLIC3R_PROFILE - -#include "ShinyManager.h" - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_UPDATE() \ - ShinyManager_update(&Shiny_instance) - -#define PROFILE_SET_DAMPING(floatfrom0to1) \ - Shiny_instance.damping = (floatfrom0to1); - -#define PROFILE_GET_DAMPING() \ - (Shiny_instance.damping) - -#define PROFILE_OUTPUT(filename) \ - ShinyManager_output(&Shiny_instance, (filename)) - -#define PROFILE_OUTPUT_STREAM(stream) \ - ShinyManager_outputToStream(&Shiny_instance, (stream)) - -#ifdef __cplusplus -#define PROFILE_GET_TREE_STRING() \ - ShinyManager_outputTreeToString(&Shiny_instance) - -#define PROFILE_GET_FLAT_STRING() \ - ShinyManager_outputFlatToString(&Shiny_instance) -#endif /* __cplusplus */ - -#define PROFILE_DESTROY() \ - ShinyManager_destroy(&Shiny_instance) - -#define PROFILE_CLEAR() \ - ShinyManager_clear(&Shiny_instance) - -#define PROFILE_SORT_ZONES() \ - ShinyManager_sortZones(&Shiny_instance) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_GET_TOTAL_TICKS_CUR() \ - ShinyData_totalTicksCur(&Shiny_instance.rootZone.data) - -#define PROFILE_GET_TOTAL_TICKS() \ - ShinyData_totalTicksAvg(&Shiny_instance.rootZone.data) - -#define PROFILE_GET_PROFILED_TICKS_CUR() \ - (Shiny_instance.rootZone.data.selfTicks.cur) - -#define PROFILE_GET_PROFILED_TICKS() \ - (Shiny_instance.rootZone.data.selfTicks.avg) - -#define PROFILE_GET_UNPROFILED_TICKS_CUR() \ - (Shiny_instance.rootZone.data.childTicks.cur) - -#define PROFILE_GET_UNPROFILED_TICKS() \ - (Shiny_instance.rootZone.data.childTicks.avg) - -#define PROFILE_GET_SHARED_TOTAL_TICKS_CUR(name) \ - ShinyData_totalTicksCur(&(_PROFILE_ID_ZONE_SHARED(name).data)) - -#define PROFILE_GET_SHARED_TOTAL_TICKS(name) \ - ShinyData_totalTicksAvg(&(_PROFILE_ID_ZONE_SHARED(name).data)) - -#define PROFILE_GET_SHARED_SELF_TICKS_CUR(name) \ - (_PROFILE_ID_ZONE_SHARED(name).data.selfTicks.cur) - -#define PROFILE_GET_SHARED_SELF_TICKS(name) \ - (_PROFILE_ID_ZONE_SHARED(name).data.selfTicks.avg) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_IS_SHARED_SELF_BELOW(name, floatfrom0to1) \ - ShinyManager_isZoneSelfTimeBelow( \ - &Shiny_instance, _PROFILE_ID_ZONE_SHARED(name), floatfrom0to1) - -#define PROFILE_IS_SHARED_TOTAL_BELOW(name, floatfrom0to1) \ - ShinyManager_isZoneTotalTimeBelow( \ - &Shiny_instance, _PROFILE_ID_ZONE_SHARED(name), floatfrom0to1) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_END() \ - ShinyManager_endCurNode(&Shiny_instance) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_BEGIN( name ) \ - \ - static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE(name), #name); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE(name)) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef __cplusplus -#define PROFILE_BLOCK( name ) \ - \ - _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \ - PROFILE_BEGIN(name) -#endif /* __cplusplus */ - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef __cplusplus -#define PROFILE_FUNC() \ - \ - _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \ - static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_FUNC(), __FUNCTION__); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_FUNC()) -#endif /* __cplusplus */ - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_CODE( code ) \ - \ - do { \ - static _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_CODE(), #code); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_CODE()); \ - { code; } \ - PROFILE_END(); \ - } while(0) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_SHARED_EXTERN( name ) \ - \ - _PROFILE_ZONE_DECLARE(extern, _PROFILE_ID_ZONE_SHARED(name)) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_SHARED_DEFINE( name ) \ - \ - _PROFILE_ZONE_DEFINE(_PROFILE_ID_ZONE_SHARED(name), #name) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#define PROFILE_SHARED_BEGIN( name ) \ - \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_SHARED(name)) - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef __cplusplus -#define PROFILE_SHARED_BLOCK( name ) \ - \ - _PROFILE_BLOCK_DEFINE(_PROFILE_ID_BLOCK()); \ - _PROFILE_ZONE_BEGIN(_PROFILE_ID_ZONE_SHARED(name)) -#endif /* __cplusplus */ - - -/*---------------------------------------------------------------------------*/ -/* public preprocessors */ - -#ifdef SHINY_HAS_ENABLED -#define PROFILE_SET_ENABLED( boolean ) \ - Shiny_instance.enabled = boolean -#endif - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessors */ - -#define _PROFILE_ID_ZONE( name ) __ShinyZone_##name -#define _PROFILE_ID_ZONE_FUNC() __ShinyZoneFunc -#define _PROFILE_ID_ZONE_CODE() __ShinyZoneCode -#define _PROFILE_ID_ZONE_SHARED( name ) name##__ShinyZoneShared -#define _PROFILE_ID_BLOCK() __ShinyBlock - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_ZONE_DEFINE( id, string ) \ - \ - ShinyZone id = { \ - NULL, SHINY_ZONE_STATE_HIDDEN, string, \ - { { 0, 0 }, { 0, 0 }, { 0, 0 } } \ - } - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_ZONE_DECLARE( prefix, id ) \ - \ - prefix ShinyZone id - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_BLOCK_DEFINE( id ) \ - \ - ShinyEndNodeOnDestruction SHINY_UNUSED id - - -/*---------------------------------------------------------------------------*/ -/* internal preprocessor */ - -#define _PROFILE_ZONE_BEGIN( id ) \ - \ - do { \ - static ShinyNodeCache cache = &_ShinyNode_dummy; \ - ShinyManager_lookupAndBeginNode(&Shiny_instance, &cache, &id); \ - } while(0) - -/*---------------------------------------------------------------------------*/ - -#else /* SLIC3R_PROFILE */ - -#define PROFILE_UPDATE() -#define PROFILE_SET_DAMPING(x) -#define PROFILE_GET_DAMPING() 0.0f -#define PROFILE_OUTPUT(x) -#define PROFILE_OUTPUT_STREAM(x) -#define PROFILE_CLEAR() -#define PROFILE_GET_TREE_STRING() std::string() -#define PROFILE_GET_FLAT_STRING() std::string() -#define PROFILE_DESTROY() -#define PROFILE_BEGIN(name) -#define PROFILE_BLOCK(name) -#define PROFILE_FUNC() -#define PROFILE_CODE(code) do { code; } while (0) -#define PROFILE_SHARED_GLOBAL(name) -#define PROFILE_SHARED_MEMBER(name) -#define PROFILE_SHARED_DEFINE(name) -#define PROFILE_SHARED_BEGIN(name) -#define PROFILE_SHARED_BLOCK(name) -#define PROFILE_SET_ENABLED(boolean) - -#endif /* SLIC3R_PROFILE */ - -#endif /* SHINY_MACROS_H */ diff --git a/src/Shiny/ShinyManager.c b/src/Shiny/ShinyManager.c deleted file mode 100644 index 6b28118513..0000000000 --- a/src/Shiny/ShinyManager.c +++ /dev/null @@ -1,445 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyManager.h" - -#include -#include -#include -#include - -/*---------------------------------------------------------------------------*/ - -#define TABLE_SIZE_INIT 256 - -/*---------------------------------------------------------------------------*/ - -ShinyManager Shiny_instance = { -#if SHINY_HAS_ENABLED == TRUE - /* enabled = */ false, -#endif - /* _lastTick = */ 0, - /* _curNode = */ &Shiny_instance.rootNode, - /* _tableMask = */ 0, - /* _nodeTable = */ _ShinyManager_dummyNodeTable, -#if SHINY_LOOKUP_RATE == TRUE - /* _lookupCount = */ 0, - /* _lookupSuccessCount = */ 0, -#endif - /* _tableSize = */ 1, - /* nodeCount = */ 1, - /* zoneCount = */ 1, - /* _lastZone = */ &Shiny_instance.rootZone, - /* _lastNodePool = */ NULL, - /* _firstNodePool = */ NULL, - /* rootNode = */ { - /* _last = */ { 0, 0 }, - /* zone = */ &Shiny_instance.rootZone, - /* parent = */ &Shiny_instance.rootNode, - /* nextSibling = */ NULL, - /* firstChild = */ NULL, - /* lastChild = */ NULL, - /* childCount = */ 0, - /* entryLevel = */ 0, - /* _cache = */ NULL, - /* data = */ { { 0, 0 }, { 0, 0 }, { 0, 0 } } - }, - /* rootZone = */ { - /* next = */ NULL, - /* _state = */ SHINY_ZONE_STATE_HIDDEN, - /* name = */ "", - /* data = */ { { 0, 0 }, { 0, 0 }, { 0, 0 } } - }, - /* damping = */ 0.f, // Damping disabled, every PROFILE_UPDATE will be performed from scratch. Original value: 0.9f - /* _initialized = */ FALSE, - /* _firstUpdate = */ TRUE -}; - -ShinyNode* _ShinyManager_dummyNodeTable[] = { NULL }; - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (push) -# pragma warning (disable: 4311) -#endif - -/* primary hash function */ -SHINY_INLINE uint32_t hash_value(void* a_pParent, void* a_pZone) { - uint32_t a = (uint32_t) a_pParent + (uint32_t) a_pZone; -// uint32_t a = *reinterpret_cast(&a_pParent) + *reinterpret_cast(&a_pZone); - - a = (a+0x7ed55d16) + (a<<12); - a = (a^0xc761c23c) ^ (a>>19); - return a; -} - -/* - * secondary hash used as index offset: force it to be odd - * so it's relatively prime to the power-of-two table size - */ -SHINY_INLINE uint32_t hash_offset(uint32_t a) { - return ((a << 8) + (a >> 4)) | 1; -} - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (pop) -#endif - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_preLoad(ShinyManager *self) { - if (!self->_initialized) { - _ShinyManager_init(self); - - _ShinyManager_createNodeTable(self, TABLE_SIZE_INIT); - _ShinyManager_createNodePool(self, TABLE_SIZE_INIT / 2); - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_update(ShinyManager *self) { -#if SHINY_HAS_ENABLED == TRUE - if (!enabled) return; -#endif - - _ShinyManager_appendTicksToCurNode(self); - ShinyZone_preUpdateChain(&self->rootZone); - - if (self->_firstUpdate || self->damping == 0) { - self->_firstUpdate = FALSE; - ShinyNode_updateTreeClean(&self->rootNode); - ShinyZone_updateChainClean(&self->rootZone); - - } else { - ShinyNode_updateTree(&self->rootNode, self->damping); - ShinyZone_updateChain(&self->rootZone, self->damping); - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_updateClean(ShinyManager *self) { -#if SHINY_HAS_ENABLED == TRUE - if (!enabled) return; -#endif - - _ShinyManager_appendTicksToCurNode(self); - ShinyZone_preUpdateChain(&self->rootZone); - - self->_firstUpdate = FALSE; - ShinyNode_updateTreeClean(&self->rootNode); - ShinyZone_updateChainClean(&self->rootZone); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_clear(ShinyManager *self) { - ShinyManager_destroy(self); - ShinyManager_preLoad(self); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_destroy(ShinyManager *self) { - ShinyManager_destroyNodes(self); - ShinyManager_resetZones(self); - _ShinyManager_uninit(self); -} - - -/*---------------------------------------------------------------------------*/ - -ShinyNode* _ShinyManager_lookupNode(ShinyManager *self, ShinyNodeCache *a_cache, ShinyZone *a_zone) { - uint32_t nHash = hash_value(self->_curNode, a_zone); - uint32_t nIndex = nHash & self->_tableMask; - ShinyNode* pNode = self->_nodeTable[nIndex]; - - _ShinyManager_incLookup(self); - _ShinyManager_incLookupSuccess(self); - - if (pNode) { - uint32_t nStep; - - if (ShinyNode_isEqual(pNode, self->_curNode, a_zone)) return pNode; /* found it! */ - - /* hash collision: */ - - /* compute a secondary hash function for stepping */ - nStep = hash_offset(nHash); - - for (;;) { - _ShinyManager_incLookup(self); - - nIndex = (nIndex + nStep) & self->_tableMask; - pNode = self->_nodeTable[nIndex]; - - if (!pNode) break; /* found empty slot */ - else if (ShinyNode_isEqual(pNode, self->_curNode, a_zone)) return pNode; /* found it! */ - } - - /* loop is guaranteed to end because the hash table is never full */ - } - - if (a_zone->_state == SHINY_ZONE_STATE_HIDDEN) { /* zone is not initialized */ - ShinyZone_init(a_zone, self->_lastZone); - - self->_lastZone = a_zone; - self->zoneCount++; - - if (self->_initialized == FALSE) { /* first time init */ - _ShinyManager_init(self); - - _ShinyManager_createNodeTable(self, TABLE_SIZE_INIT); - _ShinyManager_createNodePool(self, TABLE_SIZE_INIT / 2); - - /* initialization has invalidated nIndex - * we must compute nIndex again - */ - return _ShinyManager_createNode(self, a_cache, a_zone); - } - } - - /* Althouth nodeCount is not updated - * it includes rootNode so it adds up. - * - * check if we need to grow the table - * we keep it at most 1/2 full to be very fast - */ - if (self->_tableSize < 2 * self->nodeCount) { - - _ShinyManager_resizeNodeTable(self, 2 * self->_tableSize); - _ShinyManager_resizeNodePool(self, self->nodeCount - 1); - - /* resize has invalidated nIndex - * we must compute nIndex again - */ - return _ShinyManager_createNode(self, a_cache, a_zone); - } - - self->nodeCount++; - - { - ShinyNode* pNewNode = ShinyNodePool_newItem(self->_lastNodePool); - ShinyNode_init(pNewNode, self->_curNode, a_zone, a_cache); - - self->_nodeTable[nIndex] = pNewNode; - return pNewNode; - } -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_insertNode(ShinyManager *self, ShinyNode* a_pNode) { - uint32_t nHash = hash_value(a_pNode->parent, a_pNode->zone); - uint32_t nIndex = nHash & self->_tableMask; - - if (self->_nodeTable[nIndex]) { - uint32_t nStep = hash_offset(nHash); - - while (self->_nodeTable[nIndex]) - nIndex = (nIndex + nStep) & self->_tableMask; - } - - self->_nodeTable[nIndex] = a_pNode; -} - - -/*---------------------------------------------------------------------------*/ - -ShinyNode* _ShinyManager_createNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_pZone) { - ShinyNode* pNewNode = ShinyNodePool_newItem(self->_lastNodePool); - ShinyNode_init(pNewNode, self->_curNode, a_pZone, a_cache); - - self->nodeCount++; - _ShinyManager_insertNode(self, pNewNode); - return pNewNode; -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_createNodePool(ShinyManager *self, uint32_t a_nCount) { - self->_firstNodePool = ShinyNodePool_create(a_nCount); - self->_lastNodePool = self->_firstNodePool; -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_resizeNodePool(ShinyManager *self, uint32_t a_nCount) { - ShinyNodePool* pPool = ShinyNodePool_create(a_nCount); - self->_lastNodePool->nextPool = pPool; - self->_lastNodePool = pPool; -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_createNodeTable(ShinyManager *self, uint32_t a_nCount) { - self->_tableSize = a_nCount; - self->_tableMask = a_nCount - 1; - - self->_nodeTable = (ShinyNodeTable*) - malloc(sizeof(ShinyNode) * a_nCount); - - memset(self->_nodeTable, 0, a_nCount * sizeof(ShinyNode*)); -} - - -/*---------------------------------------------------------------------------*/ - -void _ShinyManager_resizeNodeTable(ShinyManager *self, uint32_t a_nCount) { - ShinyNodePool* pPool; - - free(self->_nodeTable); - _ShinyManager_createNodeTable(self, a_nCount); - - pPool = self->_firstNodePool; - while (pPool) { - - ShinyNode *pIter = ShinyNodePool_firstItem(pPool); - - while (pIter != pPool->_nextItem) - _ShinyManager_insertNode(self, pIter++); - - pPool = pPool->nextPool; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_resetZones(ShinyManager *self) { - ShinyZone_resetChain(&self->rootZone); - self->_lastZone = &self->rootZone; - self->zoneCount = 1; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_destroyNodes(ShinyManager *self) { - if (self->_firstNodePool) { - ShinyNodePool_destroy(self->_firstNodePool); - self->_firstNodePool = NULL; - } - - if (self->_nodeTable != _ShinyManager_dummyNodeTable) { - free(self->_nodeTable); - - self->_nodeTable = _ShinyManager_dummyNodeTable; - self->_tableSize = 1; - self->_tableMask = 0; - } - - self->_curNode = &self->rootNode; - self->nodeCount = 1; - - _ShinyManager_init(self); -} - - -/*---------------------------------------------------------------------------*/ - -const char* ShinyManager_getOutputErrorString(ShinyManager *self) { - if (self->_firstUpdate) return "!!! Profile data must first be updated !!!"; - else if (!self->_initialized) return "!!! No profiles where executed !!!"; - else return NULL; -} - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (push) -# pragma warning (disable: 4996) -#endif - -int ShinyManager_output(ShinyManager *self, const char *a_filename) { - if (!a_filename) { - ShinyManager_outputToStream(self, stdout); - - } else { - FILE *file = fopen(a_filename, "w"); - if (!file) return FALSE; - ShinyManager_outputToStream(self, file); - fclose(file); - } - - return TRUE; -} - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning (pop) -#endif - - -/*---------------------------------------------------------------------------*/ - -void ShinyManager_outputToStream(ShinyManager *self, FILE *a_stream) { - const char *error = ShinyManager_getOutputErrorString(self); - - if (error) { - fwrite(error, 1, strlen(error), a_stream); - fwrite("\n\n", 1, 2, a_stream); - return; - } - -#if SHINY_OUTPUT_MODE & SHINY_OUTPUT_MODE_FLAT - ShinyManager_sortZones(self); - - { - int size = ShinyPrintZonesSize(self->zoneCount); - char *buffer = (char*) malloc(size); - ShinyPrintZones(buffer, &self->rootZone); - fwrite(buffer, 1, size - 1, a_stream); - fwrite("\n\n", 1, 2, a_stream); - free(buffer); - } -#endif - -#if SHINY_OUTPUT_MODE & SHINY_OUTPUT_MODE_TREE - { - int size = ShinyPrintNodesSize(self->nodeCount); - char *buffer = (char*) malloc(size); - ShinyPrintNodes(buffer, &self->rootNode); - fwrite(buffer, 1, size - 1, a_stream); - fwrite("\n\n", 1, 2, a_stream); - free(buffer); - } -#endif -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyManager.h b/src/Shiny/ShinyManager.h deleted file mode 100644 index 403e0e8782..0000000000 --- a/src/Shiny/ShinyManager.h +++ /dev/null @@ -1,263 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_MANAGER_H -#define SHINY_MANAGER_H - -#include "ShinyZone.h" -#include "ShinyNode.h" -#include "ShinyNodePool.h" -#include "ShinyTools.h" -#include "ShinyOutput.h" - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct { -#ifdef SHINY_HAS_ENABLED - bool enabled; -#endif - - shinytick_t _lastTick; - - ShinyNode* _curNode; - - uint32_t _tableMask; /* = _tableSize - 1 */ - - ShinyNodeTable* _nodeTable; - -#ifdef SHINY_LOOKUP_RATE - uint64_t _lookupCount; - uint64_t _lookupSuccessCount; -#endif - - uint32_t _tableSize; - - uint32_t nodeCount; - uint32_t zoneCount; - - ShinyZone* _lastZone; - - ShinyNodePool* _lastNodePool; - ShinyNodePool* _firstNodePool; - - ShinyNode rootNode; - ShinyZone rootZone; - - float damping; - - int _initialized; - int _firstUpdate; -} ShinyManager; - - -/*---------------------------------------------------------------------------*/ - -extern ShinyNode* _ShinyManager_dummyNodeTable[]; - -extern ShinyManager Shiny_instance; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE void _ShinyManager_appendTicksToCurNode(ShinyManager *self) { - shinytick_t curTick; - ShinyGetTicks(&curTick); - - ShinyNode_appendTicks(self->_curNode, curTick - self->_lastTick); - self->_lastTick = curTick; -} - -SHINY_API ShinyNode* _ShinyManager_lookupNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_zone); - -SHINY_API void _ShinyManager_createNodeTable(ShinyManager *self, uint32_t a_count); -SHINY_API void _ShinyManager_resizeNodeTable(ShinyManager *self, uint32_t a_count); - -SHINY_API void _ShinyManager_createNodePool(ShinyManager *self, uint32_t a_count); -SHINY_API void _ShinyManager_resizeNodePool(ShinyManager *self, uint32_t a_count); - -SHINY_API ShinyNode* _ShinyManager_createNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_pZone); -SHINY_API void _ShinyManager_insertNode(ShinyManager *self, ShinyNode* a_pNode); - -SHINY_INLINE void _ShinyManager_init(ShinyManager *self) { - self->_initialized = TRUE; - - self->rootNode._last.entryCount = 1; - self->rootNode._last.selfTicks = 0; - ShinyGetTicks(&self->_lastTick); -} - -SHINY_INLINE void _ShinyManager_uninit(ShinyManager *self) { - self->_initialized = FALSE; - - ShinyNode_clear(&self->rootNode); - self->rootNode.parent = &self->rootNode; - self->rootNode.zone = &self->rootZone; -} - -#ifdef SHINY_LOOKUP_RATE -SHINY_INLINE void _ShinyManager_incLookup(ShinyManager *self) { self->_lookupCount++; } -SHINY_INLINE void _ShinyManager_incLookupSuccess(ShinyManager *self) { self->_lookupSuccessCount++; } -SHINY_INLINE float ShinyManager_lookupRate(const ShinyManager *self) { return ((float) self->_lookupSuccessCount) / ((float) self->_lookupCount); } - -#else -SHINY_INLINE void _ShinyManager_incLookup(ShinyManager * self) { self = self; } -SHINY_INLINE void _ShinyManager_incLookupSuccess(ShinyManager * self) { self = self; } -SHINY_INLINE float ShinyManager_lookupRate(const ShinyManager * self) { self = self; return -1; } -#endif - -SHINY_API void ShinyManager_resetZones(ShinyManager *self); -SHINY_API void ShinyManager_destroyNodes(ShinyManager *self); - -SHINY_INLINE float ShinyManager_tableUsage(const ShinyManager *self) { - return ((float) self->nodeCount) / ((float) self->_tableSize); -} - -SHINY_INLINE uint32_t ShinyManager_allocMemInBytes(const ShinyManager *self) { - return self->_tableSize * sizeof(ShinyNode*) - + (self->_firstNodePool)? ShinyNodePool_memoryUsageChain(self->_firstNodePool) : 0; -} - -SHINY_INLINE void ShinyManager_beginNode(ShinyManager *self, ShinyNode* a_node) { - ShinyNode_beginEntry(a_node); - - _ShinyManager_appendTicksToCurNode(self); - self->_curNode = a_node; -} - -SHINY_INLINE void ShinyManager_lookupAndBeginNode(ShinyManager *self, ShinyNodeCache* a_cache, ShinyZone* a_zone) { -#ifdef SHINY_HAS_ENABLED - if (!self->enabled) return; -#endif - - if (self->_curNode != (*a_cache)->parent) - *a_cache = _ShinyManager_lookupNode(self, a_cache, a_zone); - - ShinyManager_beginNode(self, *a_cache); -} - -SHINY_INLINE void ShinyManager_endCurNode(ShinyManager *self) { -#ifdef SHINY_HAS_ENABLED - if (!self->enabled) return; -#endif - - _ShinyManager_appendTicksToCurNode(self); - self->_curNode = self->_curNode->parent; -} - -/**/ - -SHINY_API void ShinyManager_preLoad(ShinyManager *self); - -SHINY_API void ShinyManager_updateClean(ShinyManager *self); -SHINY_API void ShinyManager_update(ShinyManager *self); - -SHINY_API void ShinyManager_clear(ShinyManager *self); -SHINY_API void ShinyManager_destroy(ShinyManager *self); - -SHINY_INLINE void ShinyManager_sortZones(ShinyManager *self) { - if (self->rootZone.next) - self->_lastZone = ShinyZone_sortChain(&self->rootZone.next); -} - -SHINY_API const char* ShinyManager_getOutputErrorString(ShinyManager *self); - -SHINY_API int ShinyManager_output(ShinyManager *self, const char *a_filename); -SHINY_API void ShinyManager_outputToStream(ShinyManager *self, FILE *stream); - -#if __cplusplus -} /* end of extern "C" */ - -SHINY_INLINE std::string ShinyManager_outputTreeToString(ShinyManager *self) { - const char* error = ShinyManager_getOutputErrorString(self); - if (error) return error; - else return ShinyNodesToString(&self->rootNode, self->nodeCount); -} - -SHINY_INLINE std::string ShinyManager_outputFlatToString(ShinyManager *self) { - const char* error = ShinyManager_getOutputErrorString(self); - if (error) return error; - - ShinyManager_sortZones(self); - return ShinyZonesToString(&self->rootZone, self->zoneCount); -} - -extern "C" { /* end of c++ */ -#endif - -SHINY_INLINE int ShinyManager_isZoneSelfTimeBelow(ShinyManager *self, ShinyZone* a_zone, float a_percentage) { - return a_percentage * (float) self->rootZone.data.childTicks.cur - <= (float) a_zone->data.selfTicks.cur; -} - -SHINY_INLINE int ShinyManager_isZoneTotalTimeBelow(ShinyManager *self, ShinyZone* a_zone, float a_percentage) { - return a_percentage * (float) self->rootZone.data.childTicks.cur - <= (float) ShinyData_totalTicksCur(&a_zone->data); -} - -/**/ - -SHINY_INLINE void ShinyManager_enumerateNodes(ShinyManager *self, void (*a_func)(const ShinyNode*)) { - ShinyNode_enumerateNodes(&self->rootNode, a_func); -} - -SHINY_INLINE void ShinyManager_enumerateZones(ShinyManager *self, void (*a_func)(const ShinyZone*)) { - ShinyZone_enumerateZones(&self->rootZone, a_func); -} - -#if __cplusplus -} /* end of extern "C" */ - -template void ShinyManager_enumerateNodes(ShinyManager *self, T* a_this, void (T::*a_func)(const ShinyNode*)) { - ShinyNode_enumerateNodes(&self->rootNode, a_this, a_func); -} - -template void ShinyManager_enumerateZones(ShinyManager *self, T* a_this, void (T::*a_func)(const ShinyZone*)) { - ShinyZone_enumerateZones(&self->rootZone, a_this, a_func); -} - -extern "C" { /* end of c++ */ -#endif - - -/*---------------------------------------------------------------------------*/ - -#if __cplusplus -} /* end of extern "C" */ - -class ShinyEndNodeOnDestruction { -public: - - SHINY_INLINE ~ShinyEndNodeOnDestruction() { - ShinyManager_endCurNode(&Shiny_instance); - } -}; -#endif - -#endif /* SHINY_MANAGER_H */ diff --git a/src/Shiny/ShinyNode.c b/src/Shiny/ShinyNode.c deleted file mode 100644 index 9d777073b0..0000000000 --- a/src/Shiny/ShinyNode.c +++ /dev/null @@ -1,129 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyNode.h" -#include "ShinyZone.h" -#include "ShinyNodeState.h" - -#include - -/*---------------------------------------------------------------------------*/ - -ShinyNode _ShinyNode_dummy = { - /* _last = */ { 0, 0 }, - /* zone = */ NULL, - /* parent = */ NULL, - /* nextSibling = */ NULL, - /* firstChild = */ NULL, - /* lastChild = */ NULL -}; - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_updateTree(ShinyNode* first, float a_damping) { - ShinyNodeState *top = NULL; - ShinyNode *node = first; - - for (;;) { - do { - top = ShinyNodeState_push(top, node); - node = node->firstChild; - } while (node); - - for (;;) { - node = ShinyNodeState_finishAndGetNext(top, a_damping); - top = ShinyNodeState_pop(top); - - if (node) break; - else if (!top) return; - } - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_updateTreeClean(ShinyNode* first) { - ShinyNodeState *top = NULL; - ShinyNode *node = first; - - for (;;) { - do { - top = ShinyNodeState_push(top, node); - node = node->firstChild; - } while (node); - - for (;;) { - node = ShinyNodeState_finishAndGetNextClean(top); - top = ShinyNodeState_pop(top); - - if (node) break; - else if (!top) return; - } - } -} - - -/*---------------------------------------------------------------------------*/ - -const ShinyNode* ShinyNode_findNextInTree(const ShinyNode* self) { - if (self->firstChild) { - return self->firstChild; - - } else if (self->nextSibling) { - return self->nextSibling; - - } else { - ShinyNode* pParent = self->parent; - - while (!ShinyNode_isRoot(pParent)) { - if (pParent->nextSibling) return pParent->nextSibling; - else pParent = pParent->parent; - } - - return NULL; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_clear(ShinyNode* self) { - memset(self, 0, sizeof(ShinyNode)); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNode_enumerateNodes(const ShinyNode* a_node, void (*a_func)(const ShinyNode*)) { - a_func(a_node); - - if (a_node->firstChild) ShinyNode_enumerateNodes(a_node->firstChild, a_func); - if (a_node->nextSibling) ShinyNode_enumerateNodes(a_node->nextSibling, a_func); -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyNode.h b/src/Shiny/ShinyNode.h deleted file mode 100644 index ee5fdb0de5..0000000000 --- a/src/Shiny/ShinyNode.h +++ /dev/null @@ -1,133 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_NODE_H -#define SHINY_NODE_H - -#include "ShinyData.h" -#include "ShinyTools.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyNode { - - ShinyLastData _last; - - struct _ShinyZone* zone; - struct _ShinyNode* parent; - struct _ShinyNode* nextSibling; - - struct _ShinyNode* firstChild; - struct _ShinyNode* lastChild; - - uint32_t childCount; - uint32_t entryLevel; - - ShinyNodeCache* _cache; - - ShinyData data; - -} ShinyNode; - - -/*---------------------------------------------------------------------------*/ - -extern ShinyNode _ShinyNode_dummy; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE void ShinyNode_addChild(ShinyNode* self, ShinyNode* a_child) { - if (self->childCount++) { - self->lastChild->nextSibling = a_child; - self->lastChild = a_child; - - } else { - self->lastChild = a_child; - self->firstChild = a_child; - } -} - -SHINY_INLINE void ShinyNode_init(ShinyNode* self, ShinyNode* a_parent, struct _ShinyZone* a_zone, ShinyNodeCache* a_cache) { - /* NOTE: all member variables are assumed to be zero when allocated */ - - self->zone = a_zone; - self->parent = a_parent; - - self->entryLevel = a_parent->entryLevel + 1; - ShinyNode_addChild(a_parent, self); - - self->_cache = a_cache; -} - -SHINY_API void ShinyNode_updateTree(ShinyNode* self, float a_damping); -SHINY_API void ShinyNode_updateTreeClean(ShinyNode* self); - -SHINY_INLINE void ShinyNode_destroy(ShinyNode* self) { - *(self->_cache) = &_ShinyNode_dummy; -} - -SHINY_INLINE void ShinyNode_appendTicks(ShinyNode* self, shinytick_t a_elapsedTicks) { - self->_last.selfTicks += a_elapsedTicks; -} - -SHINY_INLINE void ShinyNode_beginEntry(ShinyNode* self) { - self->_last.entryCount++; -} - -SHINY_INLINE int ShinyNode_isRoot(ShinyNode* self) { - return (self->entryLevel == 0); -} - -SHINY_INLINE int ShinyNode_isDummy(ShinyNode* self) { - return (self == &_ShinyNode_dummy); -} - -SHINY_INLINE int ShinyNode_isEqual(ShinyNode* self, const ShinyNode* a_parent, const struct _ShinyZone* a_zone) { - return (self->parent == a_parent && self->zone == a_zone); -} - -SHINY_API const ShinyNode* ShinyNode_findNextInTree(const ShinyNode* self); - -SHINY_API void ShinyNode_clear(ShinyNode* self); - -SHINY_API void ShinyNode_enumerateNodes(const ShinyNode* a_node, void (*a_func)(const ShinyNode*)); - -#if __cplusplus -} /* end of extern "C" */ - -template -void ShinyNode_enumerateNodes(const ShinyNode* a_node, T* a_this, void (T::*a_func)(const ShinyNode*)) { - (a_this->*a_func)(a_node); - - if (a_node->firstChild) ShinyNode_enumerateNodes(a_node->firstChild, a_this, a_func); - if (a_node->nextSibling) ShinyNode_enumerateNodes(a_node->nextSibling, a_this, a_func); -} -#endif /* __cplusplus */ - -#endif /* SHINY_NODE_H */ diff --git a/src/Shiny/ShinyNodePool.c b/src/Shiny/ShinyNodePool.c deleted file mode 100644 index f00293252c..0000000000 --- a/src/Shiny/ShinyNodePool.c +++ /dev/null @@ -1,77 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyNodePool.h" -#include "ShinyTools.h" - -#include -#include - -/*---------------------------------------------------------------------------*/ - -ShinyNodePool* ShinyNodePool_create(uint32_t a_items) { - ShinyNodePool* pPool = (ShinyNodePool*) - malloc(sizeof(ShinyNodePool) + sizeof(ShinyNode) * (a_items - 1)); - - pPool->nextPool = NULL; - pPool->_nextItem = &pPool->_items[0]; - pPool->endOfItems = &pPool->_items[a_items]; - - memset(&pPool->_items[0], 0, a_items * sizeof(ShinyNode)); - return pPool; -} - - -/*---------------------------------------------------------------------------*/ - -uint32_t ShinyNodePool_memoryUsageChain(ShinyNodePool *first) { - uint32_t bytes = (uint32_t) ((char*) first->endOfItems - (char*) first); - ShinyNodePool *pool = first->nextPool; - - while (pool) { - bytes += (uint32_t) ((char*) pool->endOfItems - (char*) pool); - pool = pool->nextPool; - } - - return bytes; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyNodePool_destroy(ShinyNodePool *self) { - ShinyNode* firstNode = ShinyNodePool_firstItem(self); - ShinyNode* lastNode = self->_nextItem; - - while (firstNode != lastNode) - ShinyNode_destroy(firstNode++); - - /* TODO: make this into a loop or a tail recursion */ - if (self->nextPool) ShinyNodePool_destroy(self->nextPool); - free(self); -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyNodePool.h b/src/Shiny/ShinyNodePool.h deleted file mode 100644 index 5e30a3306b..0000000000 --- a/src/Shiny/ShinyNodePool.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_NODE_POOL_H -#define SHINY_NODE_POOL_H - -#include "ShinyNode.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyNodePool { - - struct _ShinyNodePool* nextPool; - - ShinyNode *_nextItem; - ShinyNode *endOfItems; - - ShinyNode _items[1]; - -} ShinyNodePool; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE ShinyNode* ShinyNodePool_firstItem(ShinyNodePool *self) { - return &(self->_items[0]); -} - -SHINY_INLINE ShinyNode* ShinyNodePool_newItem(ShinyNodePool *self) { - return self->_nextItem++; -} - -ShinyNodePool* ShinyNodePool_create(uint32_t a_items); -void ShinyNodePool_destroy(ShinyNodePool *self); - -uint32_t ShinyNodePool_memoryUsageChain(ShinyNodePool *first); - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_NODE_POOL_H */ diff --git a/src/Shiny/ShinyNodeState.c b/src/Shiny/ShinyNodeState.c deleted file mode 100644 index fbf6dc8704..0000000000 --- a/src/Shiny/ShinyNodeState.c +++ /dev/null @@ -1,108 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyNodeState.h" -#include "ShinyNode.h" -#include "ShinyZone.h" - -#include - -/*---------------------------------------------------------------------------*/ - -ShinyNodeState* ShinyNodeState_push(ShinyNodeState *a_top, ShinyNode *a_node) { - ShinyZone *zone = a_node->zone; - ShinyNodeState *self = (ShinyNodeState*) malloc(sizeof(ShinyNodeState)); - self->node = a_node; - self->_prev = a_top; - - a_node->data.selfTicks.cur = a_node->_last.selfTicks; - a_node->data.entryCount.cur = a_node->_last.entryCount; - - zone->data.selfTicks.cur += a_node->_last.selfTicks; - zone->data.entryCount.cur += a_node->_last.entryCount; - - a_node->data.childTicks.cur = 0; - a_node->_last.selfTicks = 0; - a_node->_last.entryCount = 0; - - self->zoneUpdating = zone->_state != SHINY_ZONE_STATE_UPDATING; - if (self->zoneUpdating) { - zone->_state = SHINY_ZONE_STATE_UPDATING; - } else { - zone->data.childTicks.cur -= a_node->data.selfTicks.cur; - } - - return self; -} - -/*---------------------------------------------------------------------------*/ - -ShinyNodeState* ShinyNodeState_pop(ShinyNodeState *a_top) { - ShinyNodeState *prev = a_top->_prev; - free(a_top); - return prev; -} - -/*---------------------------------------------------------------------------*/ - -ShinyNode* ShinyNodeState_finishAndGetNext(ShinyNodeState *self, float a_damping) { - ShinyNode *node = self->node; - ShinyZone *zone = node->zone; - - if (self->zoneUpdating) { - zone->data.childTicks.cur += node->data.childTicks.cur; - zone->_state = SHINY_ZONE_STATE_INITIALIZED; - } - - ShinyData_computeAverage(&node->data, a_damping); - - if (!ShinyNode_isRoot(node)) - node->parent->data.childTicks.cur += node->data.selfTicks.cur + node->data.childTicks.cur; - - return node->nextSibling; -} - - -/*---------------------------------------------------------------------------*/ - -ShinyNode* ShinyNodeState_finishAndGetNextClean(ShinyNodeState *self) { - ShinyNode *node = self->node; - ShinyZone *zone = node->zone; - - if (self->zoneUpdating) { - zone->data.childTicks.cur += node->data.childTicks.cur; - zone->_state = SHINY_ZONE_STATE_INITIALIZED; - } - - ShinyData_copyAverage(&node->data); - - if (!ShinyNode_isRoot(node)) - node->parent->data.childTicks.cur += node->data.selfTicks.cur + node->data.childTicks.cur; - - return node->nextSibling; -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyNodeState.h b/src/Shiny/ShinyNodeState.h deleted file mode 100644 index 62fdd4ba86..0000000000 --- a/src/Shiny/ShinyNodeState.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_NODE_STATE_H -#define SHINY_NODE_STATE_H - -#include "ShinyNode.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyNodeState { - ShinyNode *node; - int zoneUpdating; - - struct _ShinyNodeState *_prev; -} ShinyNodeState; - - -/*---------------------------------------------------------------------------*/ - -ShinyNodeState* ShinyNodeState_push(ShinyNodeState *a_top, ShinyNode *a_node); -ShinyNodeState* ShinyNodeState_pop(ShinyNodeState *a_top); - -ShinyNode* ShinyNodeState_finishAndGetNext(ShinyNodeState *self, float a_damping); -ShinyNode* ShinyNodeState_finishAndGetNextClean(ShinyNodeState *self); - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_NODE_STATE_H */ diff --git a/src/Shiny/ShinyOutput.c b/src/Shiny/ShinyOutput.c deleted file mode 100644 index c2c624d589..0000000000 --- a/src/Shiny/ShinyOutput.c +++ /dev/null @@ -1,189 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyOutput.h" - -#include - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# pragma warning(disable: 4996) -# define snprintf _snprintf -# define TRAILING 0 - -#else -# define TRAILING 1 -#endif - -/*---------------------------------------------------------------------------*/ - -#define OUTPUT_WIDTH_CALL 6 -#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) -#define OUTPUT_WIDTH_NAME (OUTPUT_WIDTH_SUM - OUTPUT_WIDTH_DATA) - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printHeader(char *output, const char *a_title) { - snprintf(output, OUTPUT_WIDTH_SUM + TRAILING, - "%-*s %*s %*s %*s", - OUTPUT_WIDTH_NAME, a_title, - OUTPUT_WIDTH_CALL, "calls", - OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1, "self time", - OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1, "total time"); - - return output + OUTPUT_WIDTH_SUM; -} - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printData(char *output, const ShinyData *a_data, float a_topercent) { - float totalTicksAvg = ShinyData_totalTicksAvg(a_data); - const ShinyTimeUnit *selfUnit = ShinyGetTimeUnit(a_data->selfTicks.avg); - const ShinyTimeUnit *totalUnit = ShinyGetTimeUnit(totalTicksAvg); - - snprintf(output, OUTPUT_WIDTH_DATA + TRAILING, - " %*.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, - OUTPUT_WIDTH_TIME, totalTicksAvg * totalUnit->invTickFreq, totalUnit->suffix, - OUTPUT_WIDTH_PERC, totalTicksAvg * a_topercent); - - return output + OUTPUT_WIDTH_DATA; -} - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printNode(char* output, const ShinyNode *a_node, float a_topercent) { - int offset = a_node->entryLevel * 2; - - snprintf(output, OUTPUT_WIDTH_NAME + TRAILING, "%*s%-*s", - offset, "", OUTPUT_WIDTH_NAME - offset, a_node->zone->name); - - output += OUTPUT_WIDTH_NAME; - - output = printData(output, &a_node->data, a_topercent); - return output; -} - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE char* printZone(char* output, const ShinyZone *a_zone, float a_topercent) { - snprintf(output, OUTPUT_WIDTH_NAME + TRAILING, "%-*s", - OUTPUT_WIDTH_NAME, a_zone->name); - - output += OUTPUT_WIDTH_NAME; - - output = printData(output, &a_zone->data, a_topercent); - return output; -} - - -/*---------------------------------------------------------------------------*/ - -int ShinyPrintNodesSize(uint32_t a_count) { - return (1 + a_count) * (OUTPUT_WIDTH_SUM + 1); -} - - -/*---------------------------------------------------------------------------*/ - -int ShinyPrintZonesSize(uint32_t a_count) { - return (1 + a_count) * (OUTPUT_WIDTH_SUM + 1); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintANode(char* output, const ShinyNode *a_node, const ShinyNode *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - output = printNode(output, a_node, fTicksToPc); - (*output++) = '\0'; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintAZone(char* output, const ShinyZone *a_zone, const ShinyZone *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - output = printZone(output, a_zone, fTicksToPc); - (*output++) = '\0'; -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintNodes(char* output, const ShinyNode *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - const ShinyNode *node = a_root; - - output = printHeader(output, "call tree"); - (*output++) = '\n'; - - for (;;) { - output = printNode(output, node, fTicksToPc); - - node = ShinyNode_findNextInTree(node); - if (node) { - (*output++) = '\n'; - } else { - (*output++) = '\0'; - return; - } - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyPrintZones(char* output, const ShinyZone *a_root) { - float fTicksToPc = 100.0f / a_root->data.childTicks.avg; - const ShinyZone *zone = a_root; - - output = printHeader(output, "sorted list"); - (*output++) = '\n'; - - for (;;) { - output = printZone(output, zone, fTicksToPc); - - zone = zone->next; - if (zone) { - (*output++) = '\n'; - } else { - (*output++) = '\0'; - return; - } - } -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyOutput.h b/src/Shiny/ShinyOutput.h deleted file mode 100644 index 81c1783dbe..0000000000 --- a/src/Shiny/ShinyOutput.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_OUTPUT_H -#define SHINY_OUTPUT_H - -#include "ShinyNode.h" -#include "ShinyZone.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -SHINY_API int ShinyPrintNodesSize(uint32_t a_count); -SHINY_API int ShinyPrintZonesSize(uint32_t a_count); - -SHINY_API void ShinyPrintANode(char* output, const ShinyNode *a_node, const ShinyNode *a_root); -SHINY_API void ShinyPrintAZone(char* output, const ShinyZone *a_zone, const ShinyZone *a_root); - -SHINY_API void ShinyPrintNodes(char* output, const ShinyNode *a_root); -SHINY_API void ShinyPrintZones(char* output, const ShinyZone *a_root); - - -/*---------------------------------------------------------------------------*/ - -#if __cplusplus -} /* end of extern "C" */ -#include - -SHINY_INLINE std::string ShinyNodesToString(const ShinyNode *a_root, uint32_t a_count) { - std::string str; - str.resize(ShinyPrintNodesSize(a_count) - 1); - ShinyPrintNodes(&str[0], a_root); - return str; -} - -SHINY_INLINE std::string ShinyZonesToString(const ShinyZone *a_root, uint32_t a_count) { - std::string str; - str.resize(ShinyPrintZonesSize(a_count) - 1); - ShinyPrintZones(&str[0], a_root); - return str; -} -#endif /* __cplusplus */ - -#endif /* SHINY_OUTPUT_H */ diff --git a/src/Shiny/ShinyPrereqs.h b/src/Shiny/ShinyPrereqs.h deleted file mode 100644 index 5a3044dbce..0000000000 --- a/src/Shiny/ShinyPrereqs.h +++ /dev/null @@ -1,138 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_PREREQS_H -#define SHINY_PREREQS_H - - -#include - -/*---------------------------------------------------------------------------*/ - -#ifndef FALSE -#define FALSE 0x0 -#endif - -#ifndef TRUE -#define TRUE 0x1 -#endif - -#ifndef NULL -#define NULL 0 -#endif - -#include "ShinyConfig.h" -#include "ShinyVersion.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -#define SHINY_PLATFORM_WIN32 0x1 -#define SHINY_PLATFORM_POSIX 0x2 - -#if defined (_WIN32) -# define SHINY_PLATFORM SHINY_PLATFORM_WIN32 - -#else /* ASSUME: POSIX-compliant OS */ -# define SHINY_PLATFORM SHINY_PLATFORM_POSIX -#endif - - -/*---------------------------------------------------------------------------*/ - -#define SHINY_COMPILER_MSVC 0x1 -#define SHINY_COMPILER_GNUC 0x2 -#define SHINY_COMPILER_OTHER 0x3 - -#if defined (_MSC_VER) -# define SHINY_COMPILER SHINY_COMPILER_MSVC - -#elif defined (__GNUG__) -# define SHINY_COMPILER SHINY_COMPILER_GNUC - -#else -# define SHINY_COMPILER SHINY_COMPILER_OTHER -#endif - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_GNUC -#include -#include -#endif - - -/*---------------------------------------------------------------------------*/ - -struct _ShinyNode; -struct _ShinyZone; - -typedef struct _ShinyNode* ShinyNodeCache; -typedef struct _ShinyNode* ShinyNodeTable; - -/*---------------------------------------------------------------------------*/ - -#define SHINY_API - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC -# define SHINY_INLINE __inline -# define SHINY_UNUSED -#elif SHINY_COMPILER == SHINY_COMPILER_GNUC -# define SHINY_INLINE inline -# define SHINY_UNUSED __attribute__((unused)) -#elif SHINY_COMPILER == SHINY_COMPILER_OTHER -# define SHINY_INLINE inline -# define SHINY_UNUSED -#endif - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_COMPILER == SHINY_COMPILER_MSVC - typedef int int32_t; - typedef unsigned int uint32_t; - - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; - -/* -#elif defined(__CYGWIN__) - typedef u_int32_t uint32_t; - typedef u_int64_t uint64_t; -*/ -#endif - - typedef uint64_t shinytick_t; - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_PREREQS_H */ diff --git a/src/Shiny/ShinyTools.c b/src/Shiny/ShinyTools.c deleted file mode 100644 index 4058e22853..0000000000 --- a/src/Shiny/ShinyTools.c +++ /dev/null @@ -1,116 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyTools.h" - -#if SHINY_PLATFORM == SHINY_PLATFORM_WIN32 -#define WIN32_LEAN_AND_MEAN -#ifndef NOMINMAX - #define NOMINMAX -#endif /* NOMINMAX */ -#include - -#elif SHINY_PLATFORM == SHINY_PLATFORM_POSIX -#include -#endif - - -/*---------------------------------------------------------------------------*/ - -const ShinyTimeUnit* ShinyGetTimeUnit(float ticks) { - static ShinyTimeUnit units[4] = { 0 }; - - if (units[0].tickFreq == 0) { /* auto initialize first time */ - units[0].tickFreq = ShinyGetTickFreq() / 1.0f; - units[0].invTickFreq = ShinyGetTickInvFreq() * 1.0f; - units[0].suffix = "s"; - - units[1].tickFreq = ShinyGetTickFreq() / 1000.0f; - units[1].invTickFreq = ShinyGetTickInvFreq() * 1000.0f; - units[1].suffix = "ms"; - - units[2].tickFreq = ShinyGetTickFreq() / 1000000.0f; - units[2].invTickFreq = ShinyGetTickInvFreq() * 1000000.0f; - units[2].suffix = "us"; - - units[3].tickFreq = ShinyGetTickFreq() / 1000000000.0f; - units[3].invTickFreq = ShinyGetTickInvFreq() * 1000000000.0f; - units[3].suffix = "ns"; - } - - if (units[0].tickFreq < ticks) return &units[0]; - else if (units[1].tickFreq < ticks) return &units[1]; - else if (units[2].tickFreq < ticks) return &units[2]; - else return &units[3]; -} - - -/*---------------------------------------------------------------------------*/ - -#if SHINY_PLATFORM == SHINY_PLATFORM_WIN32 - -void ShinyGetTicks(shinytick_t *p) { - QueryPerformanceCounter((LARGE_INTEGER*)(p)); -} - -shinytick_t ShinyGetTickFreq(void) { - static shinytick_t freq = 0; - if (freq == 0) QueryPerformanceFrequency((LARGE_INTEGER*)(&freq)); - return freq; -} - -float ShinyGetTickInvFreq(void) { - static float invfreq = 0; - if (invfreq == 0) invfreq = 1.0f / ShinyGetTickFreq(); - return invfreq; -} - - -/*---------------------------------------------------------------------------*/ - -#elif SHINY_PLATFORM == SHINY_PLATFORM_POSIX - -//#include -//#include - -void ShinyGetTicks(shinytick_t *p) { - struct timeval time; - gettimeofday(&time, NULL); - - *p = time.tv_sec * 1000000 + time.tv_usec; -} - -shinytick_t ShinyGetTickFreq(void) { - return 1000000; -} - -float ShinyGetTickInvFreq(void) { - return 1.0f / 1000000.0f; -} - -#endif - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyTools.h b/src/Shiny/ShinyTools.h deleted file mode 100644 index 379703ee64..0000000000 --- a/src/Shiny/ShinyTools.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_TOOLS_H -#define SHINY_TOOLS_H - -#include "ShinyPrereqs.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -typedef struct { - float tickFreq; - float invTickFreq; - const char* suffix; -} ShinyTimeUnit; - - -/*---------------------------------------------------------------------------*/ - -SHINY_API const ShinyTimeUnit* ShinyGetTimeUnit(float ticks); - -SHINY_API void ShinyGetTicks(shinytick_t *p); - -SHINY_API shinytick_t ShinyGetTickFreq(void); - -SHINY_API float ShinyGetTickInvFreq(void); - -#if __cplusplus -} /* end of extern "C" */ -#endif - -#endif /* SHINY_TOOLS_H */ diff --git a/src/Shiny/ShinyVersion.h b/src/Shiny/ShinyVersion.h deleted file mode 100644 index fe6cd4a338..0000000000 --- a/src/Shiny/ShinyVersion.h +++ /dev/null @@ -1,37 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_VERSION_H -#define SHINY_VERSION_H - - -/*---------------------------------------------------------------------------*/ - -#define SHINY_VERSION "2.6 RC1" -#define SHINY_SHORTNAME "Shiny" -#define SHINY_FULLNAME "Shiny Profiler" -#define SHINY_COPYRIGHT "Copyright (C) 2007-2010 Aidin Abedi" -#define SHINY_DESCRIPTION "Shiny is a state of the art profiler designed to help finding bottlenecks in your project." - -#endif /* SHINY_VERSION_H */ diff --git a/src/Shiny/ShinyZone.c b/src/Shiny/ShinyZone.c deleted file mode 100644 index 99d90d9276..0000000000 --- a/src/Shiny/ShinyZone.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifdef SLIC3R_PROFILE - -#include "ShinyZone.h" - -#include - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_preUpdateChain(ShinyZone *first) { - ShinyZone* zone = first; - - while (zone) { - ShinyData_clearCurrent(&(zone->data)); - zone = zone->next; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_updateChain(ShinyZone *first, float a_damping) { - ShinyZone* zone = first; - - do { - ShinyData_computeAverage(&(zone->data), a_damping); - zone = zone->next; - } while (zone); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_updateChainClean(ShinyZone *first) { - ShinyZone* zone = first; - - do { - ShinyData_copyAverage(&(zone->data)); - zone = zone->next; - } while (zone); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_resetChain(ShinyZone *first) { - ShinyZone* zone = first, *temp; - - do { - zone->_state = SHINY_ZONE_STATE_HIDDEN; - temp = zone->next; - zone->next = NULL; - zone = temp; - } while (zone); -} - -/*---------------------------------------------------------------------------*/ - -/* A Linked-List Memory Sort - by Philip J. Erdelsky - pje@efgh.com - http://www.alumni.caltech.edu/~pje/ - - Modified by Aidin Abedi -*/ - -ShinyZone* ShinyZone_sortChain(ShinyZone **first) /* return ptr to last zone */ -{ - ShinyZone *p = *first; - - unsigned base; - unsigned long block_size; - - struct tape - { - ShinyZone *first, *last; - unsigned long count; - } tape[4]; - - /* Distribute the records alternately to tape[0] and tape[1]. */ - - tape[0].count = tape[1].count = 0L; - tape[0].first = NULL; - base = 0; - while (p != NULL) - { - ShinyZone *next = p->next; - p->next = tape[base].first; - tape[base].first = p; - tape[base].count++; - p = next; - base ^= 1; - } - - /* If the list is empty or contains only a single record, then */ - /* tape[1].count == 0L and this part is vacuous. */ - - for (base = 0, block_size = 1L; tape[base+1].count != 0L; - base ^= 2, block_size <<= 1) - { - int dest; - struct tape *tape0, *tape1; - tape0 = tape + base; - tape1 = tape + base + 1; - dest = base ^ 2; - tape[dest].count = tape[dest+1].count = 0; - for (; tape0->count != 0; dest ^= 1) - { - unsigned long n0, n1; - struct tape *output_tape = tape + dest; - n0 = n1 = block_size; - while (1) - { - ShinyZone *chosen_record; - struct tape *chosen_tape; - if (n0 == 0 || tape0->count == 0) - { - if (n1 == 0 || tape1->count == 0) - break; - chosen_tape = tape1; - n1--; - } - else if (n1 == 0 || tape1->count == 0) - { - chosen_tape = tape0; - n0--; - } - else if (ShinyZone_compare(tape1->first, tape0->first) > 0) - { - chosen_tape = tape1; - n1--; - } - else - { - chosen_tape = tape0; - n0--; - } - chosen_tape->count--; - chosen_record = chosen_tape->first; - chosen_tape->first = chosen_record->next; - if (output_tape->count == 0) - output_tape->first = chosen_record; - else - output_tape->last->next = chosen_record; - output_tape->last = chosen_record; - output_tape->count++; - } - } - } - - if (tape[base].count > 1L) { - ShinyZone* last = tape[base].last; - *first = tape[base].first; - last->next = NULL; - return last; - - } else { - return NULL; - } -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_clear(ShinyZone* self) { - memset(self, 0, sizeof(ShinyZone)); -} - - -/*---------------------------------------------------------------------------*/ - -void ShinyZone_enumerateZones(const ShinyZone* a_zone, void (*a_func)(const ShinyZone*)) { - a_func(a_zone); - - if (a_zone->next) ShinyZone_enumerateZones(a_zone->next, a_func); -} - -#endif /* SLIC3R_PROFILE */ diff --git a/src/Shiny/ShinyZone.h b/src/Shiny/ShinyZone.h deleted file mode 100644 index dde0d3624a..0000000000 --- a/src/Shiny/ShinyZone.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -The MIT License - -Copyright (c) 2007-2010 Aidin Abedi http://code.google.com/p/shinyprofiler/ - -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. -*/ - -#ifndef SHINY_ZONE_H -#define SHINY_ZONE_H - -#include "ShinyData.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/*---------------------------------------------------------------------------*/ - -#define SHINY_ZONE_STATE_HIDDEN 0 -#define SHINY_ZONE_STATE_INITIALIZED 1 -#define SHINY_ZONE_STATE_UPDATING 2 - - -/*---------------------------------------------------------------------------*/ - -typedef struct _ShinyZone { - struct _ShinyZone* next; - int _state; - const char* name; - ShinyData data; -} ShinyZone; - - -/*---------------------------------------------------------------------------*/ - -SHINY_INLINE void ShinyZone_init(ShinyZone *self, ShinyZone* a_prev) { - self->_state = SHINY_ZONE_STATE_INITIALIZED; - a_prev->next = self; -} - -SHINY_INLINE void ShinyZone_uninit(ShinyZone *self) { - self->_state = SHINY_ZONE_STATE_HIDDEN; - self->next = NULL; -} - -SHINY_API void ShinyZone_preUpdateChain(ShinyZone *first); -SHINY_API void ShinyZone_updateChain(ShinyZone *first, float a_damping); -SHINY_API void ShinyZone_updateChainClean(ShinyZone *first); - -SHINY_API void ShinyZone_resetChain(ShinyZone *first); - -SHINY_API ShinyZone* ShinyZone_sortChain(ShinyZone **first); - -SHINY_INLINE float ShinyZone_compare(ShinyZone *a, ShinyZone *b) { - return a->data.selfTicks.avg - b->data.selfTicks.avg; -} - -SHINY_API void ShinyZone_clear(ShinyZone* self); - -SHINY_API void ShinyZone_enumerateZones(const ShinyZone* a_zone, void (*a_func)(const ShinyZone*)); - -#if __cplusplus -} /* end of extern "C" */ - -template -void ShinyZone_enumerateZones(const ShinyZone* a_zone, T* a_this, void (T::*a_func)(const ShinyZone*)) { - (a_this->*a_func)(a_zone); - - if (a_zone->next) ShinyZone_enumerateZones(a_zone->next, a_this, a_func); -} -#endif /* __cplusplus */ - -#endif /* SHINY_ZONE_H */ diff --git a/src/clipper/CMakeLists.txt b/src/clipper/CMakeLists.txt index f625088209..3cb7cb6bbd 100644 --- a/src/clipper/CMakeLists.txt +++ b/src/clipper/CMakeLists.txt @@ -8,7 +8,3 @@ 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 84109398a7..2ca6438821 100644 --- a/src/clipper/clipper.cpp +++ b/src/clipper/clipper.cpp @@ -50,17 +50,6 @@ #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 CLIPPERLIB_NAMESPACE_PREFIX namespace CLIPPERLIB_NAMESPACE_PREFIX { #endif // CLIPPERLIB_NAMESPACE_PREFIX @@ -299,7 +288,6 @@ int PointInPolygon (const IntPoint &pt, OutPt *op) // This is potentially very expensive! O(n^2)! bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2) { - CLIPPERLIB_PROFILE_FUNC(); OutPt* op = OutPt1; do { @@ -602,9 +590,18 @@ bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) // ClipperBase class methods ... //------------------------------------------------------------------------------ -#ifndef CLIPPERLIB_INT32 +#ifdef CLIPPERLIB_INT32 +static inline void RangeTest(const IntPoint &pt) +{ +#ifndef NDEBUG + static constexpr const int32_t hi = 65536 * 16383; + if (pt.x() > hi || pt.y() > hi || -pt.x() > hi || -pt.y() > hi) + throw clipperException("Coordinate outside allowed range"); +#endif // NDEBUG +} +#else // CLIPPERLIB_INT32 // Called from ClipperBase::AddPath() to verify the scale of the input polygon coordinates. -inline void RangeTest(const IntPoint& Pt, bool& useFullRange) +static inline void RangeTest(const IntPoint& Pt, bool& useFullRange) { if (useFullRange) { @@ -759,7 +756,6 @@ TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward) bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) { - 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; @@ -783,7 +779,6 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed) bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, bool Closed, TEdge* edges) { - CLIPPERLIB_PROFILE_FUNC(); #ifdef use_lines if (!Closed && PolyTyp == ptClip) throw clipperException("AddPath: Open paths must be subject."); @@ -798,7 +793,10 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b try { edges[1].Curr = pg[1]; -#ifndef CLIPPERLIB_INT32 +#ifdef CLIPPERLIB_INT32 + RangeTest(pg[0]); + RangeTest(pg[highI]); +#else RangeTest(pg[0], m_UseFullRange); RangeTest(pg[highI], m_UseFullRange); #endif // CLIPPERLIB_INT32 @@ -806,7 +804,9 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b InitEdge(&edges[highI], &edges[0], &edges[highI-1], pg[highI]); for (int i = highI - 1; i >= 1; --i) { -#ifndef CLIPPERLIB_INT32 +#ifdef CLIPPERLIB_INT32 + RangeTest(pg[i]); +#else RangeTest(pg[i], m_UseFullRange); #endif // CLIPPERLIB_INT32 InitEdge(&edges[i], &edges[i+1], &edges[i-1], pg[i]); @@ -961,7 +961,6 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b void ClipperBase::Clear() { - CLIPPERLIB_PROFILE_FUNC(); m_MinimaList.clear(); m_edges.clear(); #ifndef CLIPPERLIB_INT32 @@ -975,7 +974,6 @@ void ClipperBase::Clear() // Sort the LML entries, initialize the left / right bound edges of each Local Minima. void ClipperBase::Reset() { - 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; }); @@ -1004,7 +1002,6 @@ void ClipperBase::Reset() // Returns (0,0,0,0) for an empty rectangle. IntRect ClipperBase::GetBounds() { - CLIPPERLIB_PROFILE_FUNC(); IntRect result; auto lm = m_MinimaList.begin(); if (lm == m_MinimaList.end()) @@ -1065,7 +1062,6 @@ Clipper::Clipper(int initOptions) : void Clipper::Reset() { - CLIPPERLIB_PROFILE_FUNC(); ClipperBase::Reset(); m_Scanbeam = std::priority_queue(); m_Maxima.clear(); @@ -1080,7 +1076,6 @@ void Clipper::Reset() bool Clipper::Execute(ClipType clipType, Paths &solution, PolyFillType subjFillType, PolyFillType clipFillType) { - CLIPPERLIB_PROFILE_FUNC(); if (m_HasOpenPaths) throw clipperException("Error: PolyTree struct is needed for open path clipping."); solution.clear(); @@ -1098,7 +1093,6 @@ bool Clipper::Execute(ClipType clipType, Paths &solution, bool Clipper::Execute(ClipType clipType, PolyTree& polytree, PolyFillType subjFillType, PolyFillType clipFillType) { - CLIPPERLIB_PROFILE_FUNC(); m_SubjFillType = subjFillType; m_ClipFillType = clipFillType; m_ClipType = clipType; @@ -1112,10 +1106,8 @@ bool Clipper::Execute(ClipType clipType, PolyTree& polytree, bool Clipper::ExecuteInternal() { - CLIPPERLIB_PROFILE_FUNC(); bool succeeded = true; try { - CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Process); Reset(); if (m_MinimaList.empty()) return true; cInt botY = m_Scanbeam.top(); @@ -1140,13 +1132,11 @@ bool Clipper::ExecuteInternal() if (succeeded) { - 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! { - 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); @@ -1156,7 +1146,6 @@ bool Clipper::ExecuteInternal() //unfortunately FixupOutPolygon() must be done after JoinCommonEdges() { - CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Fix_fixup); for (OutRec *outRec : m_PolyOuts) if (outRec->Pts) { if (outRec->IsOpen) @@ -1410,7 +1399,6 @@ bool Clipper::IsContributing(const TEdge& edge) const // Called from Clipper::InsertLocalMinimaIntoAEL() and Clipper::IntersectEdges(). OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt) { - CLIPPERLIB_PROFILE_FUNC(); OutPt* result; TEdge *e, *prevE; if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx )) @@ -1502,7 +1490,6 @@ void Clipper::CopyAELToSEL() // Called from Clipper::ExecuteInternal() void Clipper::InsertLocalMinimaIntoAEL(const cInt botY) { - CLIPPERLIB_PROFILE_FUNC(); while (!m_MinimaList.empty() && m_MinimaList.back().Y == botY) { TEdge* lb = m_MinimaList.back().LeftBound; @@ -2052,7 +2039,6 @@ OutPt* Clipper::GetLastOutPt(TEdge *e) void Clipper::ProcessHorizontals() { - CLIPPERLIB_PROFILE_FUNC(); TEdge* horzEdge = m_SortedEdges; while(horzEdge) { @@ -2429,7 +2415,6 @@ void Clipper::UpdateEdgeIntoAEL(TEdge *&e) bool Clipper::ProcessIntersections(const cInt topY) { - CLIPPERLIB_PROFILE_FUNC(); if( !m_ActiveEdges ) return true; try { BuildIntersectList(topY); @@ -2584,7 +2569,6 @@ void Clipper::DoMaxima(TEdge *e) void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY) { - CLIPPERLIB_PROFILE_FUNC(); TEdge* e = m_ActiveEdges; while( e ) { @@ -3195,7 +3179,6 @@ 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 { - CLIPPERLIB_PROFILE_FUNC(); //tests if NewOutRec contains the polygon before reassigning FirstLeft for (OutRec *outRec : m_PolyOuts) { @@ -3219,7 +3202,6 @@ void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) const void Clipper::JoinCommonEdges() { - CLIPPERLIB_PROFILE_FUNC(); for (Join &join : m_Joins) { OutRec *outRec1 = GetOutRec(join.OutPt1->Idx); @@ -3770,7 +3752,6 @@ 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() { - CLIPPERLIB_PROFILE_FUNC(); size_t i = 0; while (i < m_PolyOuts.size()) { diff --git a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp index d9f9478026..cce1fdc398 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits_nfp.hpp @@ -315,460 +315,6 @@ inline NfpResult nfpConvexOnly(const RawShape& sh, return {rsh, top_nfp}; } -template -NfpResult nfpSimpleSimple(const RawShape& cstationary, - const RawShape& cother) -{ - - // Algorithms are from the original algorithm proposed in paper: - // https://eprints.soton.ac.uk/36850/1/CORMSIS-05-05.pdf - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 1: Obtaining the minkowski sum - // ///////////////////////////////////////////////////////////////////////// - - // I guess this is not a full minkowski sum of the two input polygons by - // definition. This yields a subset that is compatible with the next 2 - // algorithms. - - using Result = NfpResult; - using Vertex = TPoint; - using Coord = TCoord; - using Edge = _Segment; - namespace sl = shapelike; - using std::signbit; - using std::sort; - using std::vector; - using std::ref; - using std::reference_wrapper; - - // TODO The original algorithms expects the stationary polygon in - // counter clockwise and the orbiter in clockwise order. - // So for preventing any further complication, I will make the input - // the way it should be, than make my way around the orientations. - - // Reverse the stationary contour to counter clockwise - auto stcont = sl::contour(cstationary); - { - std::reverse(sl::begin(stcont), sl::end(stcont)); - stcont.pop_back(); - auto it = std::min_element(sl::begin(stcont), sl::end(stcont), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - std::rotate(sl::begin(stcont), it, sl::end(stcont)); - sl::addVertex(stcont, sl::front(stcont)); - } - RawShape stationary; - sl::contour(stationary) = stcont; - - // Reverse the orbiter contour to counter clockwise - auto orbcont = sl::contour(cother); - { - std::reverse(orbcont.begin(), orbcont.end()); - - // Step 1: Make the orbiter reverse oriented - - orbcont.pop_back(); - auto it = std::min_element(orbcont.begin(), orbcont.end(), - [](const Vertex& v1, const Vertex& v2) { - return getY(v1) < getY(v2); - }); - - std::rotate(orbcont.begin(), it, orbcont.end()); - orbcont.emplace_back(orbcont.front()); - - for(auto &v : orbcont) v = -v; - - } - - // Copy the orbiter (contour only), we will have to work on it - RawShape orbiter; - sl::contour(orbiter) = orbcont; - - // An edge with additional data for marking it - struct MarkedEdge { - Edge e; Radians turn_angle = 0; bool is_turning_point = false; - MarkedEdge() = default; - MarkedEdge(const Edge& ed, Radians ta, bool tp): - e(ed), turn_angle(ta), is_turning_point(tp) {} - - // debug - std::string label; - }; - - // Container for marked edges - using EdgeList = vector; - - EdgeList A, B; - - // This is how an edge list is created from the polygons - auto fillEdgeList = [](EdgeList& L, const RawShape& ppoly, int dir) { - auto& poly = sl::contour(ppoly); - - L.reserve(sl::contourVertexCount(poly)); - - if(dir > 0) { - auto it = poly.begin(); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != poly.end()) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } else { - auto it = sl::rbegin(poly); - auto nextit = std::next(it); - - double turn_angle = 0; - bool is_turn_point = false; - - while(nextit != sl::rend(poly)) { - L.emplace_back(Edge(*it, *nextit), turn_angle, is_turn_point); - it++; nextit++; - } - } - - auto getTurnAngle = [](const Edge& e1, const Edge& e2) { - auto phi = e1.angleToXaxis(); - auto phi_prev = e2.angleToXaxis(); - auto turn_angle = phi-phi_prev; - if(turn_angle > Pi) turn_angle -= TwoPi; - if(turn_angle < -Pi) turn_angle += TwoPi; - return turn_angle; - }; - - auto eit = L.begin(); - auto enext = std::next(eit); - - eit->turn_angle = getTurnAngle(L.front().e, L.back().e); - - while(enext != L.end()) { - enext->turn_angle = getTurnAngle( enext->e, eit->e); - eit->is_turning_point = - signbit(enext->turn_angle) != signbit(eit->turn_angle); - ++eit; ++enext; - } - - L.back().is_turning_point = signbit(L.back().turn_angle) != - signbit(L.front().turn_angle); - - }; - - // Step 2: Fill the edgelists - fillEdgeList(A, stationary, 1); - fillEdgeList(B, orbiter, 1); - - int i = 1; - for(MarkedEdge& me : A) { - std::cout << "a" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - - me.label = "a"; me.label += std::to_string(i); - i++; - } - - i = 1; - for(MarkedEdge& me : B) { - std::cout << "b" << i << ":\n\t" - << getX(me.e.first()) << " " << getY(me.e.first()) << "\n\t" - << getX(me.e.second()) << " " << getY(me.e.second()) << "\n\t" - << "Turning point: " << (me.is_turning_point ? "yes" : "no") - << std::endl; - me.label = "b"; me.label += std::to_string(i); - i++; - } - - // A reference to a marked edge that also knows its container - struct MarkedEdgeRef { - reference_wrapper eref; - reference_wrapper> container; - Coord dir = 1; // Direction modifier - - inline Radians angleX() const { return eref.get().e.angleToXaxis(); } - inline const Edge& edge() const { return eref.get().e; } - inline Edge& edge() { return eref.get().e; } - inline bool isTurningPoint() const { - return eref.get().is_turning_point; - } - inline bool isFrom(const vector& cont ) { - return &(container.get()) == &cont; - } - inline bool eq(const MarkedEdgeRef& mr) { - return &(eref.get()) == &(mr.eref.get()); - } - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec): - eref(er), container(ec), dir(1) {} - - MarkedEdgeRef(reference_wrapper er, - reference_wrapper> ec, - Coord d): - eref(er), container(ec), dir(d) {} - }; - - using EdgeRefList = vector; - - // Comparing two marked edges - auto sortfn = [](const MarkedEdgeRef& e1, const MarkedEdgeRef& e2) { - return e1.angleX() < e2.angleX(); - }; - - EdgeRefList Aref, Bref; // We create containers for the references - Aref.reserve(A.size()); Bref.reserve(B.size()); - - // Fill reference container for the stationary polygon - std::for_each(A.begin(), A.end(), [&Aref](MarkedEdge& me) { - Aref.emplace_back( ref(me), ref(Aref) ); - }); - - // Fill reference container for the orbiting polygon - std::for_each(B.begin(), B.end(), [&Bref](MarkedEdge& me) { - Bref.emplace_back( ref(me), ref(Bref) ); - }); - - auto mink = [sortfn] // the Mink(Q, R, direction) sub-procedure - (const EdgeRefList& Q, const EdgeRefList& R, bool positive) - { - - // Step 1 "merge sort_list(Q) and sort_list(R) to form merge_list(Q,R)" - // Sort the containers of edge references and merge them. - // Q could be sorted only once and be reused here but we would still - // need to merge it with sorted(R). - - EdgeRefList merged; - EdgeRefList S, seq; - merged.reserve(Q.size() + R.size()); - - merged.insert(merged.end(), R.begin(), R.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - merged.insert(merged.end(), Q.begin(), Q.end()); - std::stable_sort(merged.begin(), merged.end(), sortfn); - - // Step 2 "set i = 1, k = 1, direction = 1, s1 = q1" - // we don't use i, instead, q is an iterator into Q. k would be an index - // into the merged sequence but we use "it" as an iterator for that - - // here we obtain references for the containers for later comparisons - const auto& Rcont = R.begin()->container.get(); - const auto& Qcont = Q.begin()->container.get(); - - // Set the initial direction - Coord dir = 1; - - // roughly i = 1 (so q = Q.begin()) and s1 = q1 so S[0] = q; - if(positive) { - auto q = Q.begin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.end();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.begin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } else { - auto q = Q.rbegin(); - S.emplace_back(*q); - - // Roughly step 3 - - std::cout << "merged size: " << merged.size() << std::endl; - auto mit = merged.begin(); - for(bool finish = false; !finish && q != Q.rend();) { - ++q; // "Set i = i + 1" - - while(!finish && mit != merged.end()) { - if(mit->isFrom(Rcont)) { - auto s = *mit; - s.dir = dir; - S.emplace_back(s); - } - - if(mit->eq(*q)) { - S.emplace_back(*q); - S.back().dir = -1; - if(mit->isTurningPoint()) dir = -dir; - if(q == Q.rbegin()) finish = true; - break; - } - - mit += dir; - // __nfp::advance(mit, merged, dir > 0); - } - } - } - - - // Step 4: - - // "Let starting edge r1 be in position si in sequence" - // whaaat? I guess this means the following: - auto it = S.begin(); - while(!it->eq(*R.begin())) ++it; - - // "Set j = 1, next = 2, direction = 1, seq1 = si" - // we don't use j, seq is expanded dynamically. - dir = 1; - auto next = std::next(R.begin()); seq.emplace_back(*it); - - // Step 5: - // "If all si edges have been allocated to seqj" should mean that - // we loop until seq has equal size with S - auto send = it; //it == S.begin() ? it : std::prev(it); - while(it != S.end()) { - ++it; if(it == S.end()) it = S.begin(); - if(it == send) break; - - if(it->isFrom(Qcont)) { - seq.emplace_back(*it); // "If si is from Q, j = j + 1, seqj = si" - - // "If si is a turning point in Q, - // direction = - direction, next = next + direction" - if(it->isTurningPoint()) { - dir = -dir; - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - if(it->eq(*next) /*&& dir == next->dir*/) { // "If si = direction.rnext" - // "j = j + 1, seqj = si, next = next + direction" - seq.emplace_back(*it); - next += dir; -// __nfp::advance(next, R, dir > 0); - } - } - - return seq; - }; - - std::vector seqlist; - seqlist.reserve(Bref.size()); - - EdgeRefList Bslope = Bref; // copy Bref, we will make a slope diagram - - // make the slope diagram of B - std::sort(Bslope.begin(), Bslope.end(), sortfn); - - auto slopeit = Bslope.begin(); // search for the first turning point - while(!slopeit->isTurningPoint() && slopeit != Bslope.end()) slopeit++; - - if(slopeit == Bslope.end()) { - // no turning point means convex polygon. - seqlist.emplace_back(mink(Aref, Bref, true)); - } else { - int dir = 1; - - auto firstturn = Bref.begin(); - while(!firstturn->eq(*slopeit)) ++firstturn; - - assert(firstturn != Bref.end()); - - EdgeRefList bgroup; bgroup.reserve(Bref.size()); - bgroup.emplace_back(*slopeit); - - auto b_it = std::next(firstturn); - while(b_it != firstturn) { - if(b_it == Bref.end()) b_it = Bref.begin(); - - while(!slopeit->eq(*b_it)) { - __nfp::advance(slopeit, Bslope, dir > 0); - } - - if(!slopeit->isTurningPoint()) { - bgroup.emplace_back(*slopeit); - } else { - if(!bgroup.empty()) { - if(dir > 0) bgroup.emplace_back(*slopeit); - for(auto& me : bgroup) { - std::cout << me.eref.get().label << ", "; - } - std::cout << std::endl; - seqlist.emplace_back(mink(Aref, bgroup, dir == 1 ? true : false)); - bgroup.clear(); - if(dir < 0) bgroup.emplace_back(*slopeit); - } else { - bgroup.emplace_back(*slopeit); - } - - dir *= -1; - } - ++b_it; - } - } - -// while(it != Bref.end()) // This is step 3 and step 4 in one loop -// if(it->isTurningPoint()) { -// R = {R.last, it++}; -// auto seq = mink(Q, R, orientation); - -// // TODO step 6 (should be 5 shouldn't it?): linking edges from A -// // I don't get this step - -// seqlist.insert(seqlist.end(), seq.begin(), seq.end()); -// orientation = !orientation; -// } else ++it; - -// if(seqlist.empty()) seqlist = mink(Q, {Bref.begin(), Bref.end()}, true); - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 2: breaking Minkowski sums into track line trips - // ///////////////////////////////////////////////////////////////////////// - - - // ///////////////////////////////////////////////////////////////////////// - // Algorithm 3: finding the boundary of the NFP from track line trips - // ///////////////////////////////////////////////////////////////////////// - - - for(auto& seq : seqlist) { - std::cout << "seqlist size: " << seq.size() << std::endl; - for(auto& s : seq) { - std::cout << (s.dir > 0 ? "" : "-") << s.eref.get().label << ", "; - } - std::cout << std::endl; - } - - auto& seq = seqlist.front(); - RawShape rsh; - Vertex top_nfp; - std::vector edgelist; edgelist.reserve(seq.size()); - for(auto& s : seq) { - edgelist.emplace_back(s.eref.get().e); - } - - __nfp::buildPolygon(edgelist, rsh, top_nfp); - - return Result(rsh, top_nfp); -} - // Specializable NFP implementation class. Specialize it if you have a faster // or better NFP implementation template @@ -793,8 +339,7 @@ inline NfpResult noFitPolygon(const RawShape& sh, return nfps(sh, other); } -} - -} +} // namespace nfp +} // namespace libnest2d #endif // GEOMETRIES_NOFITPOLYGON_HPP diff --git a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp index a067194dc9..b48466d1d6 100644 --- a/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/bottomleftplacer.hpp @@ -375,7 +375,7 @@ protected: sl::addVertex(rsh, item.vertex(static_cast(i))); }; - auto addOthers = [&addOthers_, &reverseAddOthers_]() { + auto addOthers = [&]() { if constexpr (!is_clockwise()) addOthers_(); else @@ -415,7 +415,6 @@ protected: }; -} -} +}} // namespace libnest2d::placers #endif //BOTTOMLEFT_HPP diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index c89302e798..8c879cde05 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -151,10 +151,8 @@ void AppConfig::set_defaults() if (get("order_volumes").empty()) set("order_volumes", "1"); -#if ENABLE_SHOW_NON_MANIFOLD_EDGES if (get("non_manifold_edges").empty()) set("non_manifold_edges", "1"); -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES if (get("clear_undo_redo_stack_on_new_project").empty()) set("clear_undo_redo_stack_on_new_project", "1"); @@ -187,6 +185,9 @@ void AppConfig::set_defaults() if (get("show_hints").empty()) set("show_hints", "1"); + if (get("allow_auto_color_change").empty()) + set("allow_auto_color_change", "1"); + if (get("allow_ip_resolve").empty()) set("allow_ip_resolve", "1"); diff --git a/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp b/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp index 494b7b0b67..c8a84c4011 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp @@ -21,7 +21,7 @@ DistributedBeadingStrategy::DistributedBeadingStrategy(const coord_t optimal_wid name = "DistributedBeadingStrategy"; } -DistributedBeadingStrategy::Beading DistributedBeadingStrategy::compute(coord_t thickness, coord_t bead_count) const +DistributedBeadingStrategy::Beading DistributedBeadingStrategy::compute(const coord_t thickness, const coord_t bead_count) const { Beading ret; @@ -40,18 +40,24 @@ DistributedBeadingStrategy::Beading DistributedBeadingStrategy::compute(coord_t for (coord_t bead_idx = 0; bead_idx < bead_count; bead_idx++) weights[bead_idx] = getWeight(bead_idx); - const float total_weight = std::accumulate(weights.cbegin(), weights.cend(), 0.f); + const float total_weight = std::accumulate(weights.cbegin(), weights.cend(), 0.f); + coord_t accumulated_width = 0; for (coord_t bead_idx = 0; bead_idx < bead_count; bead_idx++) { - const float weight_fraction = weights[bead_idx] / total_weight; + const float weight_fraction = weights[bead_idx] / total_weight; const coord_t splitup_left_over_weight = to_be_divided * weight_fraction; - const coord_t width = optimal_width + splitup_left_over_weight; + const coord_t width = (bead_idx == bead_count - 1) ? thickness - accumulated_width : optimal_width + splitup_left_over_weight; + + // Be aware that toolpath_locations is computed by dividing the width by 2, so toolpath_locations + // could be off by 1 because of rounding errors. if (bead_idx == 0) ret.toolpath_locations.emplace_back(width / 2); else ret.toolpath_locations.emplace_back(ret.toolpath_locations.back() + (ret.bead_widths.back() + width) / 2); ret.bead_widths.emplace_back(width); + accumulated_width += width; } ret.left_over = 0; + assert((accumulated_width + ret.left_over) == thickness); } else if (bead_count == 2) { const coord_t outer_width = thickness / 2; ret.bead_widths.emplace_back(outer_width); @@ -68,6 +74,13 @@ DistributedBeadingStrategy::Beading DistributedBeadingStrategy::compute(coord_t ret.left_over = thickness; } + assert(([&ret = std::as_const(ret), thickness]() -> bool { + coord_t total_bead_width = 0; + for (const coord_t &bead_width : ret.bead_widths) + total_bead_width += bead_width; + return (total_bead_width + ret.left_over) == thickness; + }())); + return ret; } diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp index 56d98ec5af..04dede5469 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp @@ -17,6 +17,7 @@ #include "Utils.hpp" #include "SVG.hpp" #include "Geometry/VoronoiVisualUtils.hpp" +#include "Geometry/VoronoiUtilsCgal.hpp" #include "../EdgeGrid.hpp" #define SKELETAL_TRAPEZOIDATION_BEAD_SEARCH_MAX 1000 //A limit to how long it'll keep searching for adjacent beads. Increasing will re-use beadings more often (saving performance), but search longer for beading (costing performance). @@ -43,6 +44,71 @@ template<> struct segment_traits namespace Slic3r::Arachne { +#ifdef ARACHNE_DEBUG +static void export_graph_to_svg(const std::string &path, + SkeletalTrapezoidationGraph &graph, + const Polygons &polys, + const std::vector> &edge_junctions = {}, + const bool beat_count = true, + const bool transition_middles = true, + const bool transition_ends = true) +{ + const std::vector colors = {"blue", "cyan", "red", "orange", "magenta", "pink", "purple", "green", "yellow"}; + coordf_t stroke_width = scale_(0.03); + BoundingBox bbox = get_extents(polys); + for (const auto &node : graph.nodes) + bbox.merge(node.p); + + bbox.offset(scale_(1.)); + + ::Slic3r::SVG svg(path.c_str(), bbox); + for (const auto &line : to_lines(polys)) + svg.draw(line, "gray", stroke_width); + + for (const auto &edge : graph.edges) + svg.draw(Line(edge.from->p, edge.to->p), (edge.data.centralIsSet() && edge.data.isCentral()) ? "blue" : "cyan", stroke_width); + + for (const auto &line_junction : edge_junctions) + for (const auto &extrusion_junction : *line_junction) + svg.draw(extrusion_junction.p, "orange", coord_t(stroke_width * 2.)); + + if (beat_count) { + for (const auto &node : graph.nodes) { + svg.draw(node.p, "red", coord_t(stroke_width * 1.6)); + svg.draw_text(node.p, std::to_string(node.data.bead_count).c_str(), "black", 1); + } + } + + if (transition_middles) { + for (auto &edge : graph.edges) { + if (std::shared_ptr> transitions = edge.data.getTransitions(); transitions) { + for (auto &transition : *transitions) { + Line edge_line = Line(edge.to->p, edge.from->p); + double edge_length = edge_line.length(); + Point pt = edge_line.a + (edge_line.vector().cast() * (double(transition.pos) / edge_length)).cast(); + svg.draw(pt, "magenta", coord_t(stroke_width * 1.5)); + svg.draw_text(pt, std::to_string(transition.lower_bead_count).c_str(), "black", 1); + } + } + } + } + + if (transition_ends) { + for (auto &edge : graph.edges) { + if (std::shared_ptr> transitions = edge.data.getTransitionEnds(); transitions) { + for (auto &transition : *transitions) { + Line edge_line = Line(edge.to->p, edge.from->p); + double edge_length = edge_line.length(); + Point pt = edge_line.a + (edge_line.vector().cast() * (double(transition.pos) / edge_length)).cast(); + svg.draw(pt, transition.is_lower_end ? "green" : "lime", coord_t(stroke_width * 1.5)); + svg.draw_text(pt, std::to_string(transition.lower_bead_count).c_str(), "black", 1); + } + } + } + } +} +#endif + SkeletalTrapezoidation::node_t& SkeletalTrapezoidation::makeNode(vd_t::vertex_type& vd_node, Point p) { auto he_node_it = vd_node_to_he_node.find(&vd_node); @@ -285,7 +351,6 @@ std::vector SkeletalTrapezoidation::discretize(const vd_t::edge_type& vd_ } } - bool SkeletalTrapezoidation::computePointCellRange(vd_t::cell_type& cell, Point& start_source_point, Point& end_source_point, vd_t::edge_type*& starting_vd_edge, vd_t::edge_type*& ending_vd_edge, const std::vector& segments) { if (cell.incident_edge()->is_infinite()) @@ -386,7 +451,23 @@ SkeletalTrapezoidation::SkeletalTrapezoidation(const Polygons& polys, const Bead constructFromPolygons(polys); } -bool detect_missing_voronoi_vertex(const Geometry::VoronoiDiagram &voronoi_diagram, const std::vector &segments) { +static bool has_finite_edge_with_non_finite_vertex(const Geometry::VoronoiDiagram &voronoi_diagram) +{ + for (const VoronoiUtils::vd_t::edge_type &edge : voronoi_diagram.edges()) { + if (edge.is_finite()) { + assert(edge.vertex0() != nullptr && edge.vertex1() != nullptr); + if (edge.vertex0() == nullptr || edge.vertex1() == nullptr || !VoronoiUtils::is_finite(*edge.vertex0()) || + !VoronoiUtils::is_finite(*edge.vertex1())) + return true; + } + } + return false; +} + +static bool detect_missing_voronoi_vertex(const Geometry::VoronoiDiagram &voronoi_diagram, const std::vector &segments) { + if (has_finite_edge_with_non_finite_vertex(voronoi_diagram)) + return true; + for (VoronoiUtils::vd_t::cell_type cell : voronoi_diagram.cells()) { if (!cell.incident_edge()) continue; // There is no spoon @@ -405,7 +486,8 @@ bool detect_missing_voronoi_vertex(const Geometry::VoronoiDiagram &voronoi_diagr VoronoiUtils::vd_t::edge_type *ending_vd_edge = nullptr; VoronoiUtils::vd_t::edge_type *edge = cell.incident_edge(); do { - if (edge->is_infinite()) continue; + if (edge->is_infinite() || edge->vertex0() == nullptr || edge->vertex1() == nullptr || !VoronoiUtils::is_finite(*edge->vertex0()) || !VoronoiUtils::is_finite(*edge->vertex1())) + continue; Vec2i64 v0 = VoronoiUtils::p(edge->vertex0()); Vec2i64 v1 = VoronoiUtils::p(edge->vertex1()); @@ -432,8 +514,71 @@ bool detect_missing_voronoi_vertex(const Geometry::VoronoiDiagram &voronoi_diagr return false; } +static bool has_missing_twin_edge(const SkeletalTrapezoidationGraph &graph) +{ + for (const auto &edge : graph.edges) + if (edge.twin == nullptr) + return true; + return false; +} + +inline static std::unordered_map try_to_fix_degenerated_voronoi_diagram_by_rotation( + Geometry::VoronoiDiagram &voronoi_diagram, + const Polygons &polys, + Polygons &polys_rotated, + std::vector &segments, + const double fix_angle) +{ + std::unordered_map vertex_mapping; + for (Polygon &poly : polys_rotated) + poly.rotate(fix_angle); + + assert(polys_rotated.size() == polys.size()); + for (size_t poly_idx = 0; poly_idx < polys.size(); ++poly_idx) { + assert(polys_rotated[poly_idx].size() == polys[poly_idx].size()); + for (size_t point_idx = 0; point_idx < polys[poly_idx].size(); ++point_idx) + vertex_mapping.insert({polys_rotated[poly_idx][point_idx], polys[poly_idx][point_idx]}); + } + + segments.clear(); + for (size_t poly_idx = 0; poly_idx < polys_rotated.size(); poly_idx++) + for (size_t point_idx = 0; point_idx < polys_rotated[poly_idx].size(); point_idx++) + segments.emplace_back(&polys_rotated, poly_idx, point_idx); + + voronoi_diagram.clear(); + construct_voronoi(segments.begin(), segments.end(), &voronoi_diagram); + +#ifdef ARACHNE_DEBUG_VORONOI + { + static int iRun = 0; + dump_voronoi_to_svg(debug_out_path("arachne_voronoi-diagram-rotated-%d.svg", iRun++).c_str(), voronoi_diagram, to_points(polys), to_lines(polys)); + } +#endif + + assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram)); + + return vertex_mapping; +} + +inline static void rotate_back_skeletal_trapezoidation_graph_after_fix(SkeletalTrapezoidationGraph &graph, + const double fix_angle, + const std::unordered_map &vertex_mapping) +{ + for (STHalfEdgeNode &node : graph.nodes) { + // If a mapping exists between a rotated point and an original point, use this mapping. Otherwise, rotate a point in the opposite direction. + if (auto node_it = vertex_mapping.find(node.p); node_it != vertex_mapping.end()) + node.p = node_it->second; + else + node.p.rotate(-fix_angle); + } +} + void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) { +#ifdef ARACHNE_DEBUG + this->outline = polys; +#endif + // Check self intersections. assert([&polys]() -> bool { EdgeGrid::Grid grid; @@ -450,39 +595,57 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) for (size_t point_idx = 0; point_idx < polys[poly_idx].size(); point_idx++) segments.emplace_back(&polys, poly_idx, point_idx); +#ifdef ARACHNE_DEBUG + { + static int iRun = 0; + BoundingBox bbox = get_extents(polys); + SVG svg(debug_out_path("arachne_voronoi-input-%d.svg", iRun++).c_str(), bbox); + svg.draw_outline(polys, "black", scaled(0.03f)); + } +#endif + Geometry::VoronoiDiagram voronoi_diagram; construct_voronoi(segments.begin(), segments.end(), &voronoi_diagram); - // Try to detect cases when some Voronoi vertex is missing. - // When any Voronoi vertex is missing, rotate input polygon and try again. - const bool has_missing_voronoi_vertex = detect_missing_voronoi_vertex(voronoi_diagram, segments); - const double fix_angle = PI / 6; +#ifdef ARACHNE_DEBUG_VORONOI + { + static int iRun = 0; + dump_voronoi_to_svg(debug_out_path("arachne_voronoi-diagram-%d.svg", iRun++).c_str(), voronoi_diagram, to_points(polys), to_lines(polys)); + } +#endif + + // Try to detect cases when some Voronoi vertex is missing and when + // the Voronoi diagram is not planar. + // When any Voronoi vertex is missing, or the Voronoi diagram is not + // planar, rotate the input polygon and try again. + const bool has_missing_voronoi_vertex = detect_missing_voronoi_vertex(voronoi_diagram, segments); + // Detection of non-planar Voronoi diagram detects at least GH issues #8474, #8514 and #8446. + const bool is_voronoi_diagram_planar = Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram); + const double fix_angle = PI / 6; + std::unordered_map vertex_mapping; + // polys_copy is referenced through items stored in the std::vector segments. Polygons polys_copy = polys; - if (has_missing_voronoi_vertex) { - BOOST_LOG_TRIVIAL(debug) << "Detected missing Voronoi vertex, input polygons will be rotated back and forth."; - for (Polygon &poly : polys_copy) - poly.rotate(fix_angle); + if (has_missing_voronoi_vertex || !is_voronoi_diagram_planar) { + if (has_missing_voronoi_vertex) + BOOST_LOG_TRIVIAL(warning) << "Detected missing Voronoi vertex, input polygons will be rotated back and forth."; + else if (!is_voronoi_diagram_planar) + BOOST_LOG_TRIVIAL(warning) << "Detected non-planar Voronoi diagram, input polygons will be rotated back and forth."; - assert(polys_copy.size() == polys.size()); - for (size_t poly_idx = 0; poly_idx < polys.size(); ++poly_idx) { - assert(polys_copy[poly_idx].size() == polys[poly_idx].size()); - for (size_t point_idx = 0; point_idx < polys[poly_idx].size(); ++point_idx) - vertex_mapping.insert({polys[poly_idx][point_idx], polys_copy[poly_idx][point_idx]}); - } + vertex_mapping = try_to_fix_degenerated_voronoi_diagram_by_rotation(voronoi_diagram, polys, polys_copy, segments, fix_angle); - segments.clear(); - for (size_t poly_idx = 0; poly_idx < polys_copy.size(); poly_idx++) - for (size_t point_idx = 0; point_idx < polys_copy[poly_idx].size(); point_idx++) - segments.emplace_back(&polys_copy, poly_idx, point_idx); - - voronoi_diagram.clear(); - construct_voronoi(segments.begin(), segments.end(), &voronoi_diagram); assert(!detect_missing_voronoi_vertex(voronoi_diagram, segments)); + assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram)); if (detect_missing_voronoi_vertex(voronoi_diagram, segments)) BOOST_LOG_TRIVIAL(error) << "Detected missing Voronoi vertex even after the rotation of input."; + else if (!Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(voronoi_diagram)) + BOOST_LOG_TRIVIAL(error) << "Detected non-planar Voronoi diagram even after the rotation of input."; } + bool degenerated_voronoi_diagram = has_missing_voronoi_vertex || !is_voronoi_diagram_planar; + +process_voronoi_diagram: + assert(this->graph.edges.empty() && this->graph.nodes.empty() && this->vd_edge_to_he_edge.empty() && this->vd_node_to_he_node.empty()); for (vd_t::cell_type cell : voronoi_diagram.cells()) { if (!cell.incident_edge()) continue; // There is no spoon @@ -538,16 +701,43 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys) prev_edge->to->data.distance_to_boundary = 0; } - if (has_missing_voronoi_vertex) { - for (node_t &node : graph.nodes) { - // If a mapping exists between a rotated point and an original point, use this mapping. Otherwise, rotate a point in the opposite direction. - if (auto node_it = vertex_mapping.find(node.p); node_it != vertex_mapping.end()) - node.p = node_it->second; - else - node.p.rotate(-fix_angle); - } + // For some input polygons, as in GH issues #8474 and #8514 resulting Voronoi diagram is degenerated because it is not planar. + // When this degenerated Voronoi diagram is processed, the resulting half-edge structure contains some edges that don't have + // a twin edge. Based on this, we created a fast mechanism that detects those causes and tries to recompute the Voronoi + // diagram on slightly rotated input polygons that usually make the Voronoi generator generate a non-degenerated Voronoi diagram. + if (!degenerated_voronoi_diagram && has_missing_twin_edge(this->graph)) { + BOOST_LOG_TRIVIAL(warning) << "Detected degenerated Voronoi diagram, input polygons will be rotated back and forth."; + degenerated_voronoi_diagram = true; + vertex_mapping = try_to_fix_degenerated_voronoi_diagram_by_rotation(voronoi_diagram, polys, polys_copy, segments, fix_angle); + + assert(!detect_missing_voronoi_vertex(voronoi_diagram, segments)); + if (detect_missing_voronoi_vertex(voronoi_diagram, segments)) + BOOST_LOG_TRIVIAL(error) << "Detected missing Voronoi vertex after the rotation of input."; + + assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram)); + + this->graph.edges.clear(); + this->graph.nodes.clear(); + this->vd_edge_to_he_edge.clear(); + this->vd_node_to_he_node.clear(); + + goto process_voronoi_diagram; } + if (degenerated_voronoi_diagram) { + assert(!has_missing_twin_edge(this->graph)); + + if (has_missing_twin_edge(this->graph)) + BOOST_LOG_TRIVIAL(error) << "Detected degenerated Voronoi diagram even after the rotation of input."; + } + + if (degenerated_voronoi_diagram) + rotate_back_skeletal_trapezoidation_graph_after_fix(this->graph, fix_angle, vertex_mapping); + +#ifdef ARACHNE_DEBUG + assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram)); +#endif + separatePointyQuadEndNodes(); graph.collapseSmallEdges(); @@ -594,45 +784,62 @@ void SkeletalTrapezoidation::separatePointyQuadEndNodes() // vvvvvvvvvvvvvvvvvvvvv // -#if 0 -static void export_graph_to_svg(const std::string &path, const SkeletalTrapezoidationGraph &graph, const Polygons &polys) -{ - const std::vector colors = {"blue", "cyan", "red", "orange", "magenta", "pink", "purple", "green", "yellow"}; - coordf_t stroke_width = scale_(0.05); - BoundingBox bbox; - for (const auto &node : graph.nodes) - bbox.merge(node.p); - - bbox.offset(scale_(1.)); - ::Slic3r::SVG svg(path.c_str(), bbox); - for (const auto &line : to_lines(polys)) - svg.draw(line, "red", stroke_width); - - for (const auto &edge : graph.edges) - svg.draw(Line(edge.from->p, edge.to->p), "cyan", scale_(0.01)); -} -#endif - void SkeletalTrapezoidation::generateToolpaths(std::vector &generated_toolpaths, bool filter_outermost_central_edges) { +#ifdef ARACHNE_DEBUG + static int iRun = 0; +#endif + p_generated_toolpaths = &generated_toolpaths; updateIsCentral(); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-updateIsCentral-final-%d.svg", iRun), this->graph, this->outline); +#endif + filterCentral(central_filter_dist); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-filterCentral-final-%d.svg", iRun), this->graph, this->outline); +#endif + if (filter_outermost_central_edges) filterOuterCentral(); updateBeadCount(); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-updateBeadCount-final-%d.svg", iRun), this->graph, this->outline); +#endif + filterNoncentralRegions(); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-filterNoncentralRegions-final-%d.svg", iRun), this->graph, this->outline); +#endif + generateTransitioningRibs(); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-generateTransitioningRibs-final-%d.svg", iRun), this->graph, this->outline); +#endif + generateExtraRibs(); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-generateExtraRibs-final-%d.svg", iRun), this->graph, this->outline); +#endif + generateSegments(); + +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-generateSegments-final-%d.svg", iRun), this->graph, this->outline); +#endif + +#ifdef ARACHNE_DEBUG + ++iRun; +#endif } void SkeletalTrapezoidation::updateIsCentral() @@ -844,11 +1051,24 @@ void SkeletalTrapezoidation::generateTransitioningRibs() filterTransitionMids(); +#ifdef ARACHNE_DEBUG + static int iRun = 0; + export_graph_to_svg(debug_out_path("ST-generateTransitioningRibs-mids-%d.svg", iRun++), this->graph, this->outline); +#endif + ptr_vector_t> edge_transition_ends; // We only map the half edge in the upward direction. mapped items are not sorted generateAllTransitionEnds(edge_transition_ends); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-generateTransitioningRibs-ends-%d.svg", iRun++), this->graph, this->outline); +#endif + applyTransitions(edge_transition_ends); // Note that the shared pointer lists will be out of scope and thus destroyed here, since the remaining refs are weak_ptr. + +#ifdef ARACHNE_DEBUG + ++iRun; +#endif } @@ -1568,17 +1788,38 @@ void SkeletalTrapezoidation::generateSegments() } } } - + +#ifdef ARACHNE_DEBUG + static int iRun = 0; + export_graph_to_svg(debug_out_path("ST-generateSegments-before-propagation-%d.svg", iRun), this->graph, this->outline); +#endif + propagateBeadingsUpward(upward_quad_mids, node_beadings); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-generateSegments-upward-propagation-%d.svg", iRun), this->graph, this->outline); +#endif + propagateBeadingsDownward(upward_quad_mids, node_beadings); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-generateSegments-downward-propagation-%d.svg", iRun), this->graph, this->outline); +#endif + ptr_vector_t edge_junctions; // junctions ordered high R to low R generateJunctions(node_beadings, edge_junctions); +#ifdef ARACHNE_DEBUG + export_graph_to_svg(debug_out_path("ST-generateSegments-junctions-%d.svg", iRun), this->graph, this->outline, edge_junctions); +#endif + connectJunctions(edge_junctions); - + generateLocalMaximaSingleBeads(); + +#ifdef ARACHNE_DEBUG + ++iRun; +#endif } SkeletalTrapezoidation::edge_t* SkeletalTrapezoidation::getQuadMaxRedgeTo(edge_t* quad_start_edge) @@ -1811,7 +2052,10 @@ void SkeletalTrapezoidation::generateJunctions(ptr_vector_t& for (junction_idx = (std::max(size_t(1), beading->toolpath_locations.size()) - 1) / 2; junction_idx < num_junctions; junction_idx--) { coord_t bead_R = beading->toolpath_locations[junction_idx]; - if (bead_R <= start_R) + // toolpath_locations computed inside DistributedBeadingStrategy could be off by 1 because of rounding errors. + // In GH issue #8472, these roundings errors caused missing the middle extrusion. + // Adding small epsilon should help resolve those cases. + if (bead_R <= start_R + 1) { // Junction coinciding with start node is used in this function call break; } diff --git a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp index 51b24bbcdf..819b71367b 100644 --- a/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp +++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.hpp @@ -18,6 +18,10 @@ #include "SkeletalTrapezoidationJoint.hpp" #include "libslic3r/Arachne/BeadingStrategy/BeadingStrategy.hpp" #include "SkeletalTrapezoidationGraph.hpp" +#include "../Geometry/Voronoi.hpp" + +//#define ARACHNE_DEBUG +//#define ARACHNE_DEBUG_VORONOI namespace Slic3r::Arachne { @@ -122,6 +126,10 @@ public: */ void generateToolpaths(std::vector &generated_toolpaths, bool filter_outermost_central_edges = false); +#ifdef ARACHNE_DEBUG + Polygons outline; +#endif + protected: /*! * Auxiliary for referencing one transition along an edge which may contain multiple transitions diff --git a/src/libslic3r/Arachne/WallToolPaths.cpp b/src/libslic3r/Arachne/WallToolPaths.cpp index 6204a0546a..dd2cda2713 100644 --- a/src/libslic3r/Arachne/WallToolPaths.cpp +++ b/src/libslic3r/Arachne/WallToolPaths.cpp @@ -24,30 +24,37 @@ namespace Slic3r::Arachne { WallToolPaths::WallToolPaths(const Polygons& outline, const coord_t bead_width_0, const coord_t bead_width_x, - const size_t inset_count, const coord_t wall_0_inset, const PrintObjectConfig &print_object_config, const PrintConfig &print_config) + const size_t inset_count, const coord_t wall_0_inset, const coordf_t layer_height, + const PrintObjectConfig &print_object_config, const PrintConfig &print_config) : outline(outline) , bead_width_0(bead_width_0) , bead_width_x(bead_width_x) , inset_count(inset_count) , wall_0_inset(wall_0_inset) + , layer_height(layer_height) , print_thin_walls(Slic3r::Arachne::fill_outline_gaps) , min_feature_size(scaled(print_object_config.min_feature_size.value)) , min_bead_width(scaled(print_object_config.min_bead_width.value)) , small_area_length(static_cast(bead_width_0) / 2.) + , wall_transition_filter_deviation(scaled(print_object_config.wall_transition_filter_deviation.value)) + , wall_transition_length(scaled(print_object_config.wall_transition_length.value)) , toolpaths_generated(false) , print_object_config(print_object_config) { - if (const auto &min_bead_width_opt = print_object_config.min_bead_width; min_bead_width_opt.percent) { - assert(!print_config.nozzle_diameter.empty()); - double min_nozzle_diameter = *std::min_element(print_config.nozzle_diameter.values.begin(), print_config.nozzle_diameter.values.end()); - this->min_bead_width = scaled(min_bead_width_opt.value * 0.01 * min_nozzle_diameter); - } + assert(!print_config.nozzle_diameter.empty()); + this->min_nozzle_diameter = float(*std::min_element(print_config.nozzle_diameter.values.begin(), print_config.nozzle_diameter.values.end())); - if (const auto &wall_transition_filter_deviation_opt = print_object_config.wall_transition_filter_deviation; wall_transition_filter_deviation_opt.percent) { - assert(!print_config.nozzle_diameter.empty()); - double min_nozzle_diameter = *std::min_element(print_config.nozzle_diameter.values.begin(), print_config.nozzle_diameter.values.end()); - this->wall_transition_filter_deviation = scaled(wall_transition_filter_deviation_opt.value * 0.01 * min_nozzle_diameter); - } + if (const auto &min_feature_size_opt = print_object_config.min_feature_size; min_feature_size_opt.percent) + this->min_feature_size = scaled(min_feature_size_opt.value * 0.01 * this->min_nozzle_diameter); + + if (const auto &min_bead_width_opt = print_object_config.min_bead_width; min_bead_width_opt.percent) + this->min_bead_width = scaled(min_bead_width_opt.value * 0.01 * this->min_nozzle_diameter); + + if (const auto &wall_transition_filter_deviation_opt = print_object_config.wall_transition_filter_deviation; wall_transition_filter_deviation_opt.percent) + this->wall_transition_filter_deviation = scaled(wall_transition_filter_deviation_opt.value * 0.01 * this->min_nozzle_diameter); + + if (const auto &wall_transition_length_opt = print_object_config.wall_transition_length; wall_transition_length_opt.percent) + this->wall_transition_length = scaled(wall_transition_length_opt.value * 0.01 * this->min_nozzle_diameter); } void simplify(Polygon &thiss, const int64_t smallest_line_segment_squared, const int64_t allowed_error_distance_squared) @@ -322,60 +329,46 @@ void removeSmallAreas(Polygons &thiss, const double min_area_size, const bool re }; auto new_end = thiss.end(); - if(remove_holes) - { - for(auto it = thiss.begin(); it < new_end; it++) - { - // All polygons smaller than target are removed by replacing them with a polygon from the back of the vector - if(fabs(ClipperLib::Area(to_path(*it))) < min_area_size) - { - new_end--; + if (remove_holes) { + for (auto it = thiss.begin(); it < new_end;) { + // All polygons smaller than target are removed by replacing them with a polygon from the back of the vector. + if (fabs(ClipperLib::Area(to_path(*it))) < min_area_size) { + --new_end; *it = std::move(*new_end); - it--; // wind back the iterator such that the polygon just swaped in is checked next + continue; // Don't increment the iterator such that the polygon just swapped in is checked next. } + ++it; } - } - else - { + } else { // For each polygon, computes the signed area, move small outlines at the end of the vector and keep pointer on small holes std::vector small_holes; - for(auto it = thiss.begin(); it < new_end; it++) { - double area = ClipperLib::Area(to_path(*it)); - if (fabs(area) < min_area_size) - { - if(area >= 0) - { - new_end--; - if(it < new_end) { + for (auto it = thiss.begin(); it < new_end;) { + if (double area = ClipperLib::Area(to_path(*it)); fabs(area) < min_area_size) { + if (area >= 0) { + --new_end; + if (it < new_end) { std::swap(*new_end, *it); - it--; - } - else - { // Don't self-swap the last Path + continue; + } else { // Don't self-swap the last Path break; } - } - else - { + } else { small_holes.push_back(*it); } } + ++it; } // Removes small holes that have their first point inside one of the removed outlines // Iterating in reverse ensures that unprocessed small holes won't be moved const auto removed_outlines_start = new_end; - for(auto hole_it = small_holes.rbegin(); hole_it < small_holes.rend(); hole_it++) - { - for(auto outline_it = removed_outlines_start; outline_it < thiss.end() ; outline_it++) - { - if(Polygon(*outline_it).contains(*hole_it->begin())) { + for (auto hole_it = small_holes.rbegin(); hole_it < small_holes.rend(); hole_it++) + for (auto outline_it = removed_outlines_start; outline_it < thiss.end(); outline_it++) + if (Polygon(*outline_it).contains(*hole_it->begin())) { new_end--; *hole_it = std::move(*new_end); break; } - } - } } thiss.resize(new_end-thiss.begin()); } @@ -481,7 +474,7 @@ const std::vector &WallToolPaths::generate() // The functions above could produce intersecting polygons that could cause a crash inside Arachne. // Applying Clipper union should be enough to get rid of this issue. // Clipper union also fixed an issue in Arachne that in post-processing Voronoi diagram, some edges - // didn't have twin edges (this probably isn't an issue in Boost Voronoi generator). + // didn't have twin edges. (a non-planar Voronoi diagram probably caused this). prepared_outline = union_(prepared_outline); if (area(prepared_outline) <= 0) { @@ -489,9 +482,12 @@ const std::vector &WallToolPaths::generate() return toolpaths; } - const coord_t wall_transition_length = scaled(this->print_object_config.wall_transition_length.value); - const double wall_split_middle_threshold = this->print_object_config.wall_split_middle_threshold.value / 100.; // For an uneven nr. of lines: When to split the middle wall into two. - const double wall_add_middle_threshold = this->print_object_config.wall_add_middle_threshold.value / 100.; // For an even nr. of lines: When to add a new middle in between the innermost two walls. + const float external_perimeter_extrusion_width = Flow::rounded_rectangle_extrusion_width_from_spacing(unscale(bead_width_0), float(this->layer_height)); + const float perimeter_extrusion_width = Flow::rounded_rectangle_extrusion_width_from_spacing(unscale(bead_width_x), float(this->layer_height)); + + const double wall_split_middle_threshold = std::clamp(2. * unscaled(this->min_bead_width) / external_perimeter_extrusion_width - 1., 0.01, 0.99); // For an uneven nr. of lines: When to split the middle wall into two. + const double wall_add_middle_threshold = std::clamp(unscaled(this->min_bead_width) / perimeter_extrusion_width, 0.01, 0.99); // For an even nr. of lines: When to add a new middle in between the innermost two walls. + const int wall_distribution_count = this->print_object_config.wall_distribution_count.value; const size_t max_bead_count = (inset_count < std::numeric_limits::max() / 2) ? 2 * inset_count : std::numeric_limits::max(); const auto beading_strat = BeadingStrategyFactory::makeStrategy @@ -619,6 +615,14 @@ void WallToolPaths::stitchToolPaths(std::vector &toolpaths, { continue; } + + // PolylineStitcher, in some cases, produced closed extrusion (polygons), + // but the endpoints differ by a small distance. So we reconnect them. + // FIXME Lukas H.: Investigate more deeply why it is happening. + if (wall_polygon.junctions.front().p != wall_polygon.junctions.back().p && + (wall_polygon.junctions.back().p - wall_polygon.junctions.front().p).cast().norm() < stitch_distance) { + wall_polygon.junctions.emplace_back(wall_polygon.junctions.front()); + } wall_polygon.is_closed = true; wall_lines.emplace_back(std::move(wall_polygon)); // add stitched polygons to result } diff --git a/src/libslic3r/Arachne/WallToolPaths.hpp b/src/libslic3r/Arachne/WallToolPaths.hpp index 9be1159b36..b0bed1241a 100644 --- a/src/libslic3r/Arachne/WallToolPaths.hpp +++ b/src/libslic3r/Arachne/WallToolPaths.hpp @@ -31,7 +31,7 @@ public: * \param inset_count The maximum number of parallel extrusion lines that make up the wall * \param wall_0_inset How far to inset the outer wall, to make it adhere better to other walls. */ - WallToolPaths(const Polygons& outline, coord_t bead_width_0, coord_t bead_width_x, size_t inset_count, coord_t wall_0_inset, const PrintObjectConfig &print_object_config, const PrintConfig &print_config); + WallToolPaths(const Polygons& outline, coord_t bead_width_0, coord_t bead_width_x, size_t inset_count, coord_t wall_0_inset, coordf_t layer_height, const PrintObjectConfig &print_object_config, const PrintConfig &print_config); /*! * Generates the Toolpaths @@ -110,14 +110,17 @@ private: coord_t bead_width_x; // toolpaths; //(0.05), SCALED_EPSILON)); + Slic3r::append(dst, thick_polyline_to_multi_path(thick_polyline, role, flow, scaled(0.05), float(SCALED_EPSILON)).paths); } } void extrusion_paths_append(ExtrusionPaths &dst, const Arachne::ExtrusionLine &extrusion, const ExtrusionRole role, const Flow &flow) { ThickPolyline thick_polyline = Arachne::to_thick_polyline(extrusion); - Slic3r::append(dst, thick_polyline_to_extrusion_paths(thick_polyline, role, flow, scaled(0.05), SCALED_EPSILON)); + Slic3r::append(dst, thick_polyline_to_multi_path(thick_polyline, role, flow, scaled(0.05), float(SCALED_EPSILON)).paths); } } // namespace Slic3r \ No newline at end of file diff --git a/src/libslic3r/Arachne/utils/VoronoiUtils.cpp b/src/libslic3r/Arachne/utils/VoronoiUtils.cpp index 3da556b470..82bd79523f 100644 --- a/src/libslic3r/Arachne/utils/VoronoiUtils.cpp +++ b/src/libslic3r/Arachne/utils/VoronoiUtils.cpp @@ -15,6 +15,7 @@ Vec2i64 VoronoiUtils::p(const vd_t::vertex_type *node) { const double x = node->x(); const double y = node->y(); + assert(std::isfinite(x) && std::isfinite(y)); assert(x <= double(std::numeric_limits::max()) && x >= std::numeric_limits::lowest()); assert(y <= double(std::numeric_limits::max()) && y >= std::numeric_limits::lowest()); return {int64_t(x + 0.5 - (x < 0)), int64_t(y + 0.5 - (y < 0))}; // Round to the nearest integer coordinates. diff --git a/src/libslic3r/Arachne/utils/VoronoiUtils.hpp b/src/libslic3r/Arachne/utils/VoronoiUtils.hpp index e736f98bcf..aa46936437 100644 --- a/src/libslic3r/Arachne/utils/VoronoiUtils.hpp +++ b/src/libslic3r/Arachne/utils/VoronoiUtils.hpp @@ -35,6 +35,11 @@ public: * The \p approximate_step_size is measured parallel to the \p source_segment, not along the parabola. */ static std::vector discretizeParabola(const Point &source_point, const Segment &source_segment, Point start, Point end, coord_t approximate_step_size, float transitioning_angle); + + static inline bool is_finite(const VoronoiUtils::vd_t::vertex_type &vertex) + { + return std::isfinite(vertex.x()) && std::isfinite(vertex.y()); + } }; } // namespace Slic3r::Arachne diff --git a/src/libslic3r/BoundingBox.hpp b/src/libslic3r/BoundingBox.hpp index de99b9c5a8..92c12d4e90 100644 --- a/src/libslic3r/BoundingBox.hpp +++ b/src/libslic3r/BoundingBox.hpp @@ -18,7 +18,7 @@ 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)) {} + min(pmin), max(pmax), defined(pmin.x() < pmax.x() && pmin.y() < pmax.y()) {} BoundingBoxBase(const PointClass &p1, const PointClass &p2, const PointClass &p3) : min(p1), max(p1), defined(false) { merge(p2); merge(p3); } @@ -37,7 +37,7 @@ public: this->min = this->min.cwiseMin(vec); this->max = this->max.cwiseMax(vec); } - this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1)); + this->defined = (this->min.x() < this->max.x()) && (this->min.y() < this->max.y()); } } @@ -58,15 +58,15 @@ public: BoundingBoxBase inflated(coordf_t delta) const throw() { BoundingBoxBase out(*this); out.offset(delta); return out; } PointClass center() const; bool contains(const PointClass &point) const { - return point(0) >= this->min(0) && point(0) <= this->max(0) - && point(1) >= this->min(1) && point(1) <= this->max(1); + return point.x() >= this->min.x() && point.x() <= this->max.x() + && point.y() >= this->min.y() && point.y() <= this->max.y(); } bool contains(const BoundingBoxBase &other) const { return contains(other.min) && contains(other.max); } bool overlap(const BoundingBoxBase &other) const { - return ! (this->max(0) < other.min(0) || this->min(0) > other.max(0) || - this->max(1) < other.min(1) || this->min(1) > other.max(1)); + return ! (this->max.x() < other.min.x() || this->min.x() > other.max.x() || + this->max.y() < other.min.y() || this->min.y() > other.max.y()); } bool operator==(const BoundingBoxBase &rhs) { return this->min == rhs.min && this->max == rhs.max; } bool operator!=(const BoundingBoxBase &rhs) { return ! (*this == rhs); } @@ -79,7 +79,7 @@ public: BoundingBox3Base() : BoundingBoxBase() {} BoundingBox3Base(const PointClass &pmin, const PointClass &pmax) : BoundingBoxBase(pmin, pmax) - { if (pmin(2) >= pmax(2)) BoundingBoxBase::defined = false; } + { if (pmin.z() >= pmax.z()) BoundingBoxBase::defined = false; } BoundingBox3Base(const PointClass &p1, const PointClass &p2, const PointClass &p3) : BoundingBoxBase(p1, p1) { merge(p2); merge(p3); } @@ -96,7 +96,7 @@ public: this->min = this->min.cwiseMin(vec); this->max = this->max.cwiseMax(vec); } - this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1)) && (this->min(2) < this->max(2)); + this->defined = (this->min.x() < this->max.x()) && (this->min.y() < this->max.y()) && (this->min.z() < this->max.z()); } BoundingBox3Base(const std::vector &points) @@ -116,15 +116,17 @@ public: coordf_t max_size() const; bool contains(const PointClass &point) const { - return BoundingBoxBase::contains(point) && point(2) >= this->min(2) && point(2) <= this->max(2); + return BoundingBoxBase::contains(point) && point.z() >= this->min.z() && point.z() <= this->max.z(); } bool contains(const BoundingBox3Base& other) const { return contains(other.min) && contains(other.max); } + // Intersects without boundaries. bool intersects(const BoundingBox3Base& other) const { - return (this->min(0) < other.max(0)) && (this->max(0) > other.min(0)) && (this->min(1) < other.max(1)) && (this->max(1) > other.min(1)) && (this->min(2) < other.max(2)) && (this->max(2) > other.min(2)); + return this->min.x() < other.max.x() && this->max.x() > other.min.x() && this->min.y() < other.max.y() && this->max.y() > other.min.y() && + this->min.z() < other.max.z() && this->max.z() > other.min.z(); } }; @@ -213,13 +215,13 @@ public: template inline bool empty(const BoundingBoxBase &bb) { - return ! bb.defined || bb.min(0) >= bb.max(0) || bb.min(1) >= bb.max(1); + return ! bb.defined || bb.min.x() >= bb.max.x() || bb.min.y() >= bb.max.y(); } template 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); + return ! bb.defined || bb.min.x() >= bb.max.x() || bb.min.y() >= bb.max.y() || bb.min.z() >= bb.max.z(); } inline BoundingBox scaled(const BoundingBoxf &bb) { return {scaled(bb.min), scaled(bb.max)}; } diff --git a/src/libslic3r/BranchingTree/BranchingTree.cpp b/src/libslic3r/BranchingTree/BranchingTree.cpp new file mode 100644 index 0000000000..6463a30de9 --- /dev/null +++ b/src/libslic3r/BranchingTree/BranchingTree.cpp @@ -0,0 +1,194 @@ +#include "BranchingTree.hpp" +#include "PointCloud.hpp" + +#include +#include +#include + +#include "libslic3r/SLA/SupportTreeUtils.hpp" + +namespace Slic3r { namespace branchingtree { + +void build_tree(PointCloud &nodes, Builder &builder) +{ + constexpr size_t initK = 5; + + auto ptsqueue = nodes.start_queue(); + auto &properties = nodes.properties(); + + struct NodeDistance + { + size_t node_id = Node::ID_NONE; + float dst_branching = NaNf; + float dst_euql = NaNf; + }; + auto distances = reserve_vector(initK); + double prev_dist_max = 0.; + size_t K = initK; + bool routed = true; + size_t node_id = Node::ID_NONE; + + while ((!ptsqueue.empty() && builder.is_valid()) || !routed) { + if (routed) { + node_id = ptsqueue.top(); + ptsqueue.pop(); + } + + Node node = nodes.get(node_id); + nodes.mark_unreachable(node_id); + + distances.clear(); + distances.reserve(K); + + float dmax = 0.; + nodes.foreach_reachable( + node.pos, + [&distances, &dmax](size_t id, float dst_branching, float dst_euql) { + distances.emplace_back(NodeDistance{id, dst_branching, dst_euql}); + dmax = std::max(dmax, dst_euql); + }, K, prev_dist_max); + + std::sort(distances.begin(), distances.end(), + [](auto &a, auto &b) { return a.dst_branching < b.dst_branching; }); + + if (distances.empty()) { + builder.report_unroutable(node); + K = initK; + prev_dist_max = 0.; + routed = true; + + continue; + } + + prev_dist_max = dmax; + K *= 2; + + auto closest_it = distances.begin(); + routed = false; + while (closest_it != distances.end() && !routed && builder.is_valid()) { + size_t closest_node_id = closest_it->node_id; + Node closest_node = nodes.get(closest_node_id); + + auto type = nodes.get_type(closest_node_id); + float w = nodes.get(node_id).weight + closest_it->dst_branching; + closest_node.Rmin = std::max(node.Rmin, closest_node.Rmin); + + switch (type) { + case BED: { + closest_node.weight = w; + if (closest_it->dst_branching > nodes.properties().max_branch_length()) { + auto hl_br_len = float(nodes.properties().max_branch_length()) / 2.f; + Node new_node {{node.pos.x(), node.pos.y(), node.pos.z() - hl_br_len}, node.Rmin}; + new_node.id = int(nodes.next_junction_id()); + new_node.weight = nodes.get(node_id).weight + hl_br_len; + new_node.left = node.id; + if ((routed = builder.add_bridge(node, new_node))) { + size_t new_idx = nodes.insert_junction(new_node); + ptsqueue.push(new_idx); + } + } + else if ((routed = builder.add_ground_bridge(node, closest_node))) { + closest_node.left = closest_node.right = node_id; + nodes.get(closest_node_id) = closest_node; + nodes.mark_unreachable(closest_node_id); + } + + break; + } + case MESH: { + closest_node.weight = w; + if ((routed = builder.add_mesh_bridge(node, closest_node))) { + closest_node.left = closest_node.right = node_id; + nodes.get(closest_node_id) = closest_node; + nodes.mark_unreachable(closest_node_id); + } + + break; + } + case LEAF: + case JUNCTION: { + auto max_slope = float(properties.max_slope()); + + if (auto mergept = find_merge_pt(node.pos, closest_node.pos, max_slope)) { + + float mergedist_closest = (*mergept - closest_node.pos).norm(); + float mergedist_node = (*mergept - node.pos).norm(); + float Wnode = nodes.get(node_id).weight; + float Wclosest = nodes.get(closest_node_id).weight; + float Wsum = std::max(Wnode, Wclosest); + float distsum = std::max(mergedist_closest, mergedist_node); + w = Wsum + distsum; + + if (mergedist_closest > EPSILON && mergedist_node > EPSILON) { + Node mergenode{*mergept, closest_node.Rmin}; + mergenode.weight = w; + mergenode.id = int(nodes.next_junction_id()); + + if ((routed = builder.add_merger(node, closest_node, mergenode))) { + mergenode.left = node_id; + mergenode.right = closest_node_id; + size_t new_idx = nodes.insert_junction(mergenode); + ptsqueue.push(new_idx); + size_t qid = nodes.get_queue_idx(closest_node_id); + + if (qid != PointCloud::Unqueued) + ptsqueue.remove(nodes.get_queue_idx(closest_node_id)); + + nodes.mark_unreachable(closest_node_id); + } + } else if (closest_node.pos.z() < node.pos.z() && + (closest_node.left == Node::ID_NONE || + closest_node.right == Node::ID_NONE)) { + closest_node.weight = w; + if ((routed = builder.add_bridge(node, closest_node))) { + if (closest_node.left == Node::ID_NONE) + closest_node.left = node_id; + else if (closest_node.right == Node::ID_NONE) + closest_node.right = node_id; + + nodes.get(closest_node_id) = closest_node; + } + } + } + + break; + } + case NONE:; + } + + ++closest_it; + } + + if (routed) { + prev_dist_max = 0.; + K = initK; + } + } +} + +void build_tree(const indexed_triangle_set &its, + const std::vector &support_roots, + Builder &builder, + const Properties &properties) +{ + PointCloud nodes(its, support_roots, properties); + + build_tree(nodes, builder); +} + +ExPolygon make_bed_poly(const indexed_triangle_set &its) +{ + auto bb = bounding_box(its); + + BoundingBox bbcrd{scaled(to_2d(bb.min)), scaled(to_2d(bb.max))}; + bbcrd.offset(scaled(10.)); + Point min = bbcrd.min, max = bbcrd.max; + ExPolygon ret = {{min.x(), min.y()}, + {max.x(), min.y()}, + {max.x(), max.y()}, + {min.x(), max.y()}}; + + return ret; +} + +}} // namespace Slic3r::branchingtree diff --git a/src/libslic3r/BranchingTree/BranchingTree.hpp b/src/libslic3r/BranchingTree/BranchingTree.hpp new file mode 100644 index 0000000000..c88410b3ab --- /dev/null +++ b/src/libslic3r/BranchingTree/BranchingTree.hpp @@ -0,0 +1,143 @@ +#ifndef SUPPORTTREEBRANCHING_HPP +#define SUPPORTTREEBRANCHING_HPP + +// For indexed_triangle_set +#include + +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/BoundingBox.hpp" + +namespace Slic3r { namespace branchingtree { + +// Branching tree input parameters. This is an in-line fillable structure with +// setters returning self references. +class Properties +{ + double m_max_slope = PI / 4.; + double m_ground_level = 0.; + double m_sampling_radius = .5; + double m_max_branch_len = 10.; + + ExPolygons m_bed_shape; + +public: + // Maximum slope for bridges of the tree + Properties &max_slope(double val) noexcept + { + m_max_slope = val; + return *this; + } + // Z level of the ground + Properties &ground_level(double val) noexcept + { + m_ground_level = val; + return *this; + } + // How far should sample points be in the mesh and the ground + Properties &sampling_radius(double val) noexcept + { + m_sampling_radius = val; + return *this; + } + // Shape of the print bed (ground) + Properties &bed_shape(ExPolygons bed) noexcept + { + m_bed_shape = std::move(bed); + return *this; + } + + Properties &max_branch_length(double val) noexcept + { + m_max_branch_len = val; + return *this; + } + + double max_slope() const noexcept { return m_max_slope; } + double ground_level() const noexcept { return m_ground_level; } + double sampling_radius() const noexcept { return m_sampling_radius; } + double max_branch_length() const noexcept { return m_max_branch_len; } + const ExPolygons &bed_shape() const noexcept { return m_bed_shape; } +}; + +// A junction of the branching tree with position and radius. +struct Node +{ + static constexpr int ID_NONE = -1; + + int id = ID_NONE, left = ID_NONE, right = ID_NONE; + + Vec3f pos; + float Rmin = 0.f; + + // Tracking the weight of each junction, which is essentially the sum of + // the lenghts of all branches emanating from this junction. + float weight = 0.f; + + Node(const Vec3f &p, float r_min = .0f) : pos{p}, Rmin{r_min}, weight{0.f} + {} +}; + +// An output interface for the branching tree generator function. Consider each +// method as a callback and implement the actions that need to be done. +class Builder +{ +public: + virtual ~Builder() = default; + + // A simple bridge from junction to junction. + virtual bool add_bridge(const Node &from, const Node &to) = 0; + + // An Y shaped structure with two starting points and a merge point below + // them. The angles will respect the max_slope setting. + virtual bool add_merger(const Node &node, + const Node &closest, + const Node &merge_node) = 0; + + // Add an anchor bridge to the ground (print bed) + virtual bool add_ground_bridge(const Node &from, + const Node &to) = 0; + + // Add an anchor bridge to the model body + virtual bool add_mesh_bridge(const Node &from, const Node &to) = 0; + + // Report nodes that can not be routed to an endpoint (model or ground) + virtual void report_unroutable(const Node &j) = 0; + + // If returns false, the tree building process shall stop + virtual bool is_valid() const { return true; } +}; + +// Build the actual tree. +// its: The input mesh +// support_leafs: The input support points +// builder: The output interface, describes how to build the tree +// properties: Parameters of the tree +// +// Notes: +// The original algorithm implicitly ensures that the generated tree avoids +// the model body. This implementation uses point sampling of the mesh thus an +// explicit check is needed if the part of the tree being inserted properly +// avoids the model. This can be done in the builder implementation. Each +// method can return a boolean indicating whether the given branch can or +// cannot be inserted. If a particular path is unavailable, the algorithm +// will try a few other paths as well. If all of them fail, one of the +// report_unroutable_* methods will be called as a last resort. +void build_tree(const indexed_triangle_set &its, + const std::vector &support_leafs, + Builder &builder, + const Properties &properties = {}); + +inline void build_tree(const indexed_triangle_set &its, + const std::vector &support_leafs, + Builder &&builder, + const Properties &properties = {}) +{ + build_tree(its, support_leafs, builder, properties); +} + +// Helper function to derive a bed polygon only from the model bounding box. +ExPolygon make_bed_poly(const indexed_triangle_set &its); + +}} // namespace Slic3r::branchingtree + +#endif // SUPPORTTREEBRANCHING_HPP diff --git a/src/libslic3r/BranchingTree/PointCloud.cpp b/src/libslic3r/BranchingTree/PointCloud.cpp new file mode 100644 index 0000000000..f1d7ae5212 --- /dev/null +++ b/src/libslic3r/BranchingTree/PointCloud.cpp @@ -0,0 +1,252 @@ +#include "PointCloud.hpp" + +#include "libslic3r/Geometry.hpp" +#include "libslic3r/Tesselate.hpp" + +#include + +namespace Slic3r { namespace branchingtree { + +std::optional find_merge_pt(const Vec3f &A, + const Vec3f &B, + float critical_angle) +{ + // The idea is that A and B both have their support cones. But searching + // for the intersection of these support cones is difficult and its enough + // to reduce this problem to 2D and search for the intersection of two + // rays that merge somewhere between A and B. The 2D plane is a vertical + // slice of the 3D scene where the 2D Y axis is equal to the 3D Z axis and + // the 2D X axis is determined by the XY direction of the AB vector. + // + // Z^ + // | A * + // | . . B * + // | . . . . + // | . . . . + // | . x . + // -------------------> XY + + // Determine the transformation matrix for the 2D projection: + Vec3f diff = {B.x() - A.x(), B.y() - A.y(), 0.f}; + Vec3f dir = diff.normalized(); // TODO: avoid normalization + + Eigen::Matrix tr2D; + tr2D.row(0) = Vec3f{dir.x(), dir.y(), dir.z()}; + tr2D.row(1) = Vec3f{0.f, 0.f, 1.f}; + + // Transform the 2 vectors A and B into 2D vector 'a' and 'b'. Here we can + // omit 'a', pretend that its the origin and use BA as the vector b. + Vec2f b = tr2D * (B - A); + + // Get the square sine of the ray emanating from 'a' towards 'b'. This ray might + // exceed the allowed angle but that is corrected subsequently. + // The sign of the original sine is also needed, hence b.y is multiplied by + // abs(b.y) + float b_sqn = b.squaredNorm(); + float sin2sig_a = b_sqn > EPSILON ? (b.y() * std::abs(b.y())) / b_sqn : 0.f; + + // sine2 from 'b' to 'a' is the opposite of sine2 from a to b + float sin2sig_b = -sin2sig_a; + + // Derive the allowed angles from the given critical angle. + // critical_angle is measured from the horizontal X axis. + // The rays need to go downwards which corresponds to negative angles + + float sincrit = std::sin(critical_angle); // sine of the critical angle + float sin2crit = -sincrit * sincrit; // signed sine squared + sin2sig_a = std::min(sin2sig_a, sin2crit); // Do the angle saturation of both rays + sin2sig_b = std::min(sin2sig_b, sin2crit); // + float sin2_a = std::abs(sin2sig_a); // Get cosine squared values + float sin2_b = std::abs(sin2sig_b); + float cos2_a = 1.f - sin2_a; + float cos2_b = 1.f - sin2_b; + + // Derive the new direction vectors. This is by square rooting the sin2 + // and cos2 values and restoring the original signs + Vec2f Da = {std::copysign(std::sqrt(cos2_a), b.x()), std::copysign(std::sqrt(sin2_a), sin2sig_a)}; + Vec2f Db = {-std::copysign(std::sqrt(cos2_b), b.x()), std::copysign(std::sqrt(sin2_b), sin2sig_b)}; + + // Determine where two rays ([0, 0], Da), (b, Db) intersect. + // Based on + // https://stackoverflow.com/questions/27459080/given-two-points-and-two-direction-vectors-find-the-point-where-they-intersect + // One ray is emanating from (0, 0) so the formula is simplified + double t1 = (Db.y() * b.x() - b.y() * Db.x()) / + (Da.x() * Db.y() - Da.y() * Db.x()); + + Vec2f mp = t1 * Da; + Vec3f Mp = A + tr2D.transpose() * mp; + + return t1 >= 0.f ? Mp : Vec3f{}; +} + +void to_eigen_mesh(const indexed_triangle_set &its, + Eigen::MatrixXd &V, + Eigen::MatrixXi &F) +{ + V.resize(its.vertices.size(), 3); + F.resize(its.indices.size(), 3); + for (unsigned int i = 0; i < its.indices.size(); ++i) + F.row(i) = its.indices[i]; + + for (unsigned int i = 0; i < its.vertices.size(); ++i) + V.row(i) = its.vertices[i].cast(); +} + +std::vector sample_mesh(const indexed_triangle_set &its, double radius) +{ + std::vector ret; + + double surface_area = 0.; + for (const Vec3i &face : its.indices) { + std::array tri = {its.vertices[face(0)], + its.vertices[face(1)], + its.vertices[face(2)]}; + + auto U = tri[1] - tri[0], V = tri[2] - tri[0]; + surface_area += 0.5 * U.cross(V).norm(); + } + + int N = surface_area / (PI * radius * radius); + + Eigen::MatrixXd B; + Eigen::MatrixXi FI; + Eigen::MatrixXd V; + Eigen::MatrixXi F; + to_eigen_mesh(its, V, F); + igl::random_points_on_mesh(N, V, F, B, FI); + + ret.reserve(size_t(N)); + for (int i = 0; i < FI.size(); i++) { + int face_id = FI(i); + + if (face_id < 0 || face_id >= int(its.indices.size())) + continue; + + Vec3i face = its.indices[face_id]; + + if (face(0) >= int(its.vertices.size()) || + face(1) >= int(its.vertices.size()) || + face(2) >= int(its.vertices.size())) + continue; + + Vec3f c = B.row(i)(0) * its.vertices[face(0)] + + B.row(i)(1) * its.vertices[face(1)] + + B.row(i)(2) * its.vertices[face(2)]; + + ret.emplace_back(c); + } + + return ret; +} + +std::vector sample_bed(const ExPolygons &bed, float z, double radius) +{ + std::vector ret; + + auto triangles = triangulate_expolygons_3d(bed, z); + indexed_triangle_set its; + its.vertices.reserve(triangles.size()); + + for (size_t i = 0; i < triangles.size(); i += 3) { + its.vertices.emplace_back(triangles[i].cast()); + its.vertices.emplace_back(triangles[i + 1].cast()); + its.vertices.emplace_back(triangles[i + 2].cast()); + + its.indices.emplace_back(i, i + 1, i + 2); + } + + return sample_mesh(its, radius); +} + +PointCloud::PointCloud(const indexed_triangle_set &M, + std::vector support_leafs, + const Properties &props) + : PointCloud{sample_mesh(M, props.sampling_radius()), + sample_bed(props.bed_shape(), + props.ground_level(), + props.sampling_radius()), + std::move(support_leafs), props} +{} + +PointCloud::PointCloud(std::vector meshpts, + std::vector bedpts, + std::vector support_leafs, + const Properties &props) + : m_leafs{std::move(support_leafs)} + , m_meshpoints{std::move(meshpts)} + , m_bedpoints{std::move(bedpts)} + , m_props{props} + , cos2bridge_slope{std::cos(props.max_slope()) * + std::abs(std::cos(props.max_slope()))} + , MESHPTS_BEGIN{m_bedpoints.size()} + , LEAFS_BEGIN{MESHPTS_BEGIN + m_meshpoints.size()} + , JUNCTIONS_BEGIN{LEAFS_BEGIN + m_leafs.size()} + , m_searchable_indices(JUNCTIONS_BEGIN + m_junctions.size(), true) + , m_queue_indices(JUNCTIONS_BEGIN + m_junctions.size(), Unqueued) + , m_reachable_cnt{JUNCTIONS_BEGIN + m_junctions.size()} +{ + for (size_t i = 0; i < m_bedpoints.size(); ++i) { + m_bedpoints[i].id = int(i); + m_ktree.insert({m_bedpoints[i].pos, i}); + } + + for (size_t i = 0; i < m_meshpoints.size(); ++i) { + Node &n = m_meshpoints[i]; + n.id = int(MESHPTS_BEGIN + i); + m_ktree.insert({n.pos, n.id}); + } + + for (size_t i = 0; i < m_leafs.size(); ++i) { + Node &n = m_leafs[i]; + n.id = int(LEAFS_BEGIN + i); + m_ktree.insert({n.pos, n.id}); + } +} + +float PointCloud::get_distance(const Vec3f &p, size_t node_id) const +{ + auto t = get_type(node_id); + auto ret = std::numeric_limits::infinity(); + const auto &node = get(node_id); + + switch (t) { + case MESH: + case BED: { + // Points of mesh or bed which are outside of the support cone of + // 'pos' must be discarded. + if (is_outside_support_cone(p, node.pos)) + ret = std::numeric_limits::infinity(); + else + ret = (node.pos - p).norm(); + + break; + } + case LEAF: + case JUNCTION:{ + auto mergept = find_merge_pt(p, node.pos, m_props.max_slope()); + double maxL2 = m_props.max_branch_length() * m_props.max_branch_length(); + + if (!mergept || mergept->z() < (m_props.ground_level() + 2 * node.Rmin)) + ret = std::numeric_limits::infinity(); + else if (double a = (node.pos - *mergept).squaredNorm(), + b = (p - *mergept).squaredNorm(); + a < maxL2 && b < maxL2) + ret = std::sqrt(b); + + break; + } + case NONE: + ; + } + + // Setting the ret val to infinity will effectively discard this + // connection of nodes. max_branch_length property is used here + // to discard node=>node and node=>mesh connections longer than this + // property. + if (t != BED && ret > m_props.max_branch_length()) + ret = std::numeric_limits::infinity(); + + return ret; +} + +}} // namespace Slic3r::branchingtree diff --git a/src/libslic3r/BranchingTree/PointCloud.hpp b/src/libslic3r/BranchingTree/PointCloud.hpp new file mode 100644 index 0000000000..f99b179902 --- /dev/null +++ b/src/libslic3r/BranchingTree/PointCloud.hpp @@ -0,0 +1,272 @@ +#ifndef POINTCLOUD_HPP +#define POINTCLOUD_HPP + +#include + +#include "BranchingTree.hpp" + +#include "libslic3r/Execution/Execution.hpp" +#include "libslic3r/MutablePriorityQueue.hpp" + +#include "libslic3r/BoostAdapter.hpp" +#include "boost/geometry/index/rtree.hpp" + +namespace Slic3r { namespace branchingtree { + +std::optional find_merge_pt(const Vec3f &A, + const Vec3f &B, + float max_slope); + +void to_eigen_mesh(const indexed_triangle_set &its, + Eigen::MatrixXd &V, + Eigen::MatrixXi &F); + +std::vector sample_mesh(const indexed_triangle_set &its, double radius); + +std::vector sample_bed(const ExPolygons &bed, + float z, + double radius = 1.); + +enum PtType { LEAF, MESH, BED, JUNCTION, NONE }; + +inline BoundingBox3Base get_support_cone_bb(const Vec3f &p, const Properties &props) +{ + double gnd = props.ground_level() - EPSILON; + double h = p.z() - gnd; + double phi = PI / 2 - props.max_slope(); + auto r = float(std::min(h * std::tan(phi), props.max_branch_length() * std::sin(phi))); + + Vec3f bb_min = {p.x() - r, p.y() - r, float(gnd)}; + Vec3f bb_max = {p.x() + r, p.y() + r, p.z()}; + + return {bb_min, bb_max}; +} + +// A cloud of points including support points, mesh points, junction points +// and anchor points on the bed. Junction points can be added or removed, all +// the other point types are established on creation and remain unchangeable. +class PointCloud { + std::vector m_leafs, m_junctions, m_meshpoints, m_bedpoints; + + const branchingtree::Properties &m_props; + + const double cos2bridge_slope; + const size_t MESHPTS_BEGIN, LEAFS_BEGIN, JUNCTIONS_BEGIN; + +private: + + // These vectors have the same size as there are indices for nodes to keep + // access complexity constant. WARN: there might be cache non-locality costs + std::vector m_searchable_indices; // searchable flag value of a node + std::vector m_queue_indices; // queue id of a node if queued + + size_t m_reachable_cnt; + + struct CoordFn + { + const PointCloud *self; + CoordFn(const PointCloud *s) : self{s} {} + float operator()(size_t nodeid, size_t dim) const + { + return self->get(nodeid).pos(int(dim)); + } + }; + + using PointIndexEl = std::pair; + + boost::geometry::index:: + rtree /* ? */> + m_ktree; + + bool is_outside_support_cone(const Vec3f &supp, const Vec3f &pt) const + { + Vec3d D = (pt - supp).cast(); + double dot_sq = -D.z() * std::abs(-D.z()); + + return dot_sq < D.squaredNorm() * cos2bridge_slope; + } + + template + static auto *get_node(PC &&pc, size_t id) + { + auto *ret = decltype(pc.m_bedpoints.data())(nullptr); + + switch(pc.get_type(id)) { + case BED: ret = &pc.m_bedpoints[id]; break; + case MESH: ret = &pc.m_meshpoints[id - pc.MESHPTS_BEGIN]; break; + case LEAF: ret = &pc.m_leafs [id - pc.LEAFS_BEGIN]; break; + case JUNCTION: ret = &pc.m_junctions[id - pc.JUNCTIONS_BEGIN]; break; + case NONE: assert(false); + } + + return ret; + } + +public: + + static constexpr auto Unqueued = size_t(-1); + + struct ZCompareFn + { + const PointCloud *self; + ZCompareFn(const PointCloud *s) : self{s} {} + bool operator()(size_t node_a, size_t node_b) const + { + return self->get(node_a).pos.z() > self->get(node_b).pos.z(); + } + }; + + PointCloud(const indexed_triangle_set &M, + std::vector support_leafs, + const Properties &props); + + PointCloud(std::vector meshpts, + std::vector bedpts, + std::vector support_leafs, + const Properties &props); + + PtType get_type(size_t node_id) const + { + PtType ret = NONE; + + if (node_id < MESHPTS_BEGIN && !m_bedpoints.empty()) ret = BED; + else if (node_id < LEAFS_BEGIN && !m_meshpoints.empty()) ret = MESH; + else if (node_id < JUNCTIONS_BEGIN && !m_leafs.empty()) ret = LEAF; + else if (node_id >= JUNCTIONS_BEGIN && !m_junctions.empty()) ret = JUNCTION; + + return ret; + } + + const Node &get(size_t node_id) const + { + return *get_node(*this, node_id); + } + + Node &get(size_t node_id) + { + return *get_node(*this, node_id); + } + + const Node *find(size_t node_id) const { return get_node(*this, node_id); } + Node *find(size_t node_id) { return get_node(*this, node_id); } + + // Return the original index of a leaf in the input array, if the given + // node id is indeed of type SUPP + int get_leaf_id(size_t node_id) const + { + return node_id >= LEAFS_BEGIN && node_id < JUNCTIONS_BEGIN ? + node_id - LEAFS_BEGIN : + Node::ID_NONE; + } + + size_t get_queue_idx(size_t node_id) const { return m_queue_indices[node_id]; } + + float get_distance(const Vec3f &p, size_t node) const; + + size_t next_junction_id() const + { + return JUNCTIONS_BEGIN + m_junctions.size(); + } + + size_t insert_junction(const Node &p) + { + size_t new_id = next_junction_id(); + m_junctions.emplace_back(p); + m_junctions.back().id = int(new_id); + m_ktree.insert({m_junctions.back().pos, new_id}); + m_searchable_indices.emplace_back(true); + m_queue_indices.emplace_back(Unqueued); + ++m_reachable_cnt; + + return new_id; + } + + const std::vector &get_junctions() const noexcept { return m_junctions; } + const std::vector &get_bedpoints() const noexcept { return m_bedpoints; } + const std::vector &get_meshpoints() const noexcept { return m_meshpoints; } + const std::vector &get_leafs() const noexcept { return m_leafs; } + const Properties & properties() const noexcept { return m_props; } + + void mark_unreachable(size_t node_id) + { + assert(node_id < m_searchable_indices.size()); + + m_searchable_indices[node_id] = false; + m_queue_indices[node_id] = Unqueued; + --m_reachable_cnt; + } + + size_t reachable_count() const { return m_reachable_cnt; } + + template + void foreach_reachable(const Vec3f &pos, + Fn &&visitor, + size_t k, + double min_dist = 0.) + { + // Fake output iterator + struct Output { + const PointCloud *self; + Vec3f p; + Fn &visitorfn; + + Output& operator *() { return *this; } + void operator=(const PointIndexEl &el) { + visitorfn(el.second, self->get_distance(p, el.second), + (p - el.first).squaredNorm()); + } + Output& operator++() { return *this; } + }; + + namespace bgi = boost::geometry::index; + float brln = 2 * m_props.max_branch_length(); + BoundingBox3Base bb{{pos.x() - brln, pos.y() - brln, + float(m_props.ground_level() - EPSILON)}, + {pos.x() + brln, pos.y() + brln, + m_ktree.bounds().max_corner().get()}}; + + // Extend upwards to find mergable junctions and support points + bb.max.z() = m_ktree.bounds().max_corner().get(); + + auto filter = bgi::satisfies( + [this, &pos, min_dist](const PointIndexEl &e) { + double D_branching = get_distance(pos, e.second); + double D_euql = (pos - e.first).squaredNorm() ; + return m_searchable_indices[e.second] && + !std::isinf(D_branching) && D_euql > min_dist; + }); + + m_ktree.query(bgi::intersects(bb) && filter && bgi::nearest(pos, k), + Output{this, pos, visitor}); + } + + auto start_queue() + { + auto ptsqueue = make_mutable_priority_queue( + [this](size_t el, size_t idx) { m_queue_indices[el] = idx; }, + ZCompareFn{this}); + + ptsqueue.reserve(m_leafs.size()); + size_t iend = LEAFS_BEGIN + m_leafs.size(); + for (size_t i = LEAFS_BEGIN; i < iend; ++i) + ptsqueue.push(i); + + return ptsqueue; + } +}; + +template void traverse(PC &&pc, size_t root, Fn &&fn) +{ + if (auto nodeptr = pc.find(root); nodeptr != nullptr) { + auto &nroot = *nodeptr; + fn(nroot); + if (nroot.left >= 0) traverse(pc, nroot.left, fn); + if (nroot.right >= 0) traverse(pc, nroot.right, fn); + } +} + +void build_tree(PointCloud &pcloud, Builder &builder); + +}} // namespace Slic3r::branchingtree + +#endif // POINTCLOUD_HPP diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index f48d7ff0a6..9ed56bea46 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -332,7 +332,7 @@ static std::vector inner_brim_area(const Print append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset, ClipperLib::jtSquare), ex_poly_holes_reversed)); if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, diff_ex(ExPolygon(ex_poly.contour), shrink_ex(ex_poly_holes_reversed, no_brim_offset, ClipperLib::jtSquare))); + append(no_brim_area_object, diff_ex(ex_poly.contour, shrink_ex(ex_poly_holes_reversed, no_brim_offset, ClipperLib::jtSquare))); append(holes_reversed_object, ex_poly_holes_reversed); } diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index ce4ef63407..2099800ff5 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -111,6 +111,8 @@ set(SLIC3R_SOURCES Format/SL1_SVG.cpp Format/pwmx.hpp Format/pwmx.cpp + Format/STEP.hpp + Format/STEP.cpp GCode/ThumbnailData.cpp GCode/ThumbnailData.hpp GCode/Thumbnails.cpp @@ -260,6 +262,10 @@ set(SLIC3R_SOURCES Tesselate.cpp Tesselate.hpp TextConfiguration.hpp + TreeSupport.cpp + TreeSupport.hpp + TreeModelVolumes.cpp + TreeModelVolumes.hpp TriangleMesh.cpp TriangleMesh.hpp TriangleMeshSlicer.cpp @@ -325,6 +331,12 @@ set(SLIC3R_SOURCES SLA/ReprojectPointsOnMesh.hpp SLA/DefaultSupportTree.hpp SLA/DefaultSupportTree.cpp + SLA/BranchingTreeSLA.hpp + SLA/BranchingTreeSLA.cpp + BranchingTree/BranchingTree.cpp + BranchingTree/BranchingTree.hpp + BranchingTree/PointCloud.cpp + BranchingTree/PointCloud.hpp Arachne/BeadingStrategy/BeadingStrategy.hpp Arachne/BeadingStrategy/BeadingStrategy.cpp @@ -388,6 +400,7 @@ cmake_policy(POP) add_library(libslic3r_cgal STATIC CutSurface.hpp CutSurface.cpp + Geometry/VoronoiUtilsCgal.hpp Geometry/VoronoiUtilsCgal.cpp IntersectionPoints.hpp IntersectionPoints.cpp MeshBoolean.hpp MeshBoolean.cpp TryCatchSignal.hpp TryCatchSignal.cpp @@ -447,6 +460,11 @@ target_link_libraries(libslic3r qoi ) +if (APPLE) + # TODO: we need to fix notarization with the separate shared library + target_link_libraries(libslic3r OCCTWrapper) +endif () + if (TARGET OpenVDB::openvdb) target_link_libraries(libslic3r OpenVDB::openvdb) endif() @@ -455,10 +473,6 @@ if(WIN32) target_link_libraries(libslic3r Psapi.lib) endif() -if(SLIC3R_PROFILE) - target_link_libraries(libslic3r Shiny) -endif() - if (APPLE) # This flag prevents the need for minimum SDK version 10.14 # currently, PS targets v10.12 diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index c6617002a1..d03cb5a707 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -8,17 +8,6 @@ #include "SVG.hpp" #endif /* CLIPPER_UTILS_DEBUG */ -// 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) namespace Slic3r { @@ -556,6 +545,8 @@ Slic3r::Polygons diff(const Slic3r::Surfaces &subject, const Slic3r::Polygons &c { return _clipper(ClipperLib::ctDifference, ClipperUtils::SurfacesProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::SinglePathProvider(clip.points), do_safety_offset); } +Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset) + { return _clipper(ClipperLib::ctIntersection, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonProvider(clip), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper(ClipperLib::ctIntersection, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::Polygons intersection(const Slic3r::ExPolygon &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset) @@ -576,6 +567,8 @@ Slic3r::Polygons union_(const Slic3r::ExPolygons &subject) { return _clipper(ClipperLib::ctUnion, ClipperUtils::ExPolygonsProvider(subject), ClipperUtils::EmptyPathsProvider(), ApplySafetyOffset::No); } Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::Polygons &subject2) { return _clipper(ClipperLib::ctUnion, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(subject2), ApplySafetyOffset::No); } +Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &subject2) + { return _clipper(ClipperLib::ctUnion, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonProvider(subject2), ApplySafetyOffset::No); } template static ExPolygons _clipper_ex(ClipperLib::ClipType clipType, TSubject &&subject, TClip &&clip, ApplySafetyOffset do_safety_offset, ClipperLib::PolyFillType fill_type = ClipperLib::pftNonZero) @@ -585,6 +578,8 @@ Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Polygo { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::SurfacesProvider(clip), do_safety_offset); } +Slic3r::ExPolygons diff_ex(const Slic3r::Polygon &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) + { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset) { return _clipper_ex(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); } Slic3r::ExPolygons diff_ex(const Slic3r::ExPolygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset) @@ -705,6 +700,8 @@ Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::Polygo { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::PolylinesProvider(subject), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonProvider(clip)); } +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip) + { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::ExPolygonsProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip) { return _clipper_pl_open(ClipperLib::ctDifference, ClipperUtils::PolylinesProvider(subject), ClipperUtils::ExPolygonProvider(clip)); } Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip) @@ -713,6 +710,8 @@ Slic3r::Polylines diff_pl(const Slic3r::Polygons &subject, const Slic3r::Polygon { return _clipper_pl_closed(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygon &clip) { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::PolylinesProvider(subject), ClipperUtils::SinglePathProvider(clip.points)); } +Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip) + { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::PolylinesProvider(subject), ClipperUtils::ExPolygonProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip) { return _clipper_pl_open(ClipperLib::ctIntersection, ClipperUtils::SinglePathProvider(subject.points), ClipperUtils::PolygonsProvider(clip)); } Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip) diff --git a/src/libslic3r/ClipperUtils.hpp b/src/libslic3r/ClipperUtils.hpp index d913154e00..0388af9a32 100644 --- a/src/libslic3r/ClipperUtils.hpp +++ b/src/libslic3r/ClipperUtils.hpp @@ -408,6 +408,7 @@ Slic3r::ExPolygons diff_ex(const Slic3r::Surfaces &subject, const Slic3r::Surfac Slic3r::ExPolygons diff_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygon &clip); +Slic3r::Polylines diff_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip); Slic3r::Polylines diff_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines diff_pl(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip); @@ -419,6 +420,7 @@ inline Slic3r::Lines diff_ln(const Slic3r::Lines &subject, const Slic3r::Polygon // Safety offset is applied to the clipping polygons only. Slic3r::Polygons intersection(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); +Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::ExPolygon &subject, const Slic3r::ExPolygon &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polygons intersection(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); @@ -435,6 +437,7 @@ Slic3r::ExPolygons intersection_ex(const Slic3r::Surfaces &subject, const Slic3r Slic3r::ExPolygons intersection_ex(const Slic3r::Surfaces &subject, const Slic3r::Surfaces &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::ExPolygons intersection_ex(const Slic3r::SurfacesPtr &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No); Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygon &clip); +Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::ExPolygon &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::Polygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polyline &subject, const Slic3r::ExPolygons &clip); Slic3r::Polylines intersection_pl(const Slic3r::Polylines &subject, const Slic3r::Polygons &clip); @@ -457,6 +460,7 @@ Slic3r::Polygons union_(const Slic3r::Polygons &subject); Slic3r::Polygons union_(const Slic3r::ExPolygons &subject); Slic3r::Polygons union_(const Slic3r::Polygons &subject, const ClipperLib::PolyFillType fillType); Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::Polygons &subject2); +Slic3r::Polygons union_(const Slic3r::Polygons &subject, const Slic3r::ExPolygon &subject2); // May be used to "heal" unusual models (3DLabPrints etc.) by providing fill_type (pftEvenOdd, pftNonZero, pftPositive, pftNegative). Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, ClipperLib::PolyFillType fill_type = ClipperLib::pftNonZero); Slic3r::ExPolygons union_ex(const Slic3r::ExPolygons &subject); diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index b8c046ceba..151043a04f 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "libslic3r.h" #include "clonable_ptr.hpp" #include "Exception.hpp" @@ -1766,8 +1767,8 @@ public: // limit of a numeric input. // If not set, the is set to // By setting min=0, only nonnegative input is allowed. - int min = INT_MIN; - int max = INT_MAX; + float min = -FLT_MAX; + float max = FLT_MAX; // To check if it's not a typo and a % is missing double max_literal = 1; ConfigOptionMode mode = comSimple; diff --git a/src/libslic3r/CustomGCode.hpp b/src/libslic3r/CustomGCode.hpp index 334b404313..c4a47b9a3e 100644 --- a/src/libslic3r/CustomGCode.hpp +++ b/src/libslic3r/CustomGCode.hpp @@ -66,6 +66,8 @@ struct Info bool operator==(const Info& rhs) const { + if (rhs.gcodes.empty() && this->gcodes.empty()) + return true; // don't respect to the comparison of the mode, when g_codes are empty return (rhs.mode == this->mode ) && (rhs.gcodes == this->gcodes ); } diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index 069c6e6020..7e22127cd4 100644 --- a/src/libslic3r/ExPolygon.cpp +++ b/src/libslic3r/ExPolygon.cpp @@ -12,27 +12,6 @@ namespace Slic3r { -ExPolygon::operator Points() const -{ - Points points; - Polygons pp = *this; - for (Polygons::const_iterator poly = pp.begin(); poly != pp.end(); ++poly) { - for (Points::const_iterator point = poly->points.begin(); point != poly->points.end(); ++point) - points.push_back(*point); - } - return points; -} - -ExPolygon::operator Polygons() const -{ - return to_polygons(*this); -} - -ExPolygon::operator Polylines() const -{ - return to_polylines(*this); -} - void ExPolygon::scale(double factor) { contour.scale(factor); @@ -149,7 +128,7 @@ bool ExPolygon::overlaps(const ExPolygon &other) const svg.draw_outline(*this); svg.draw_outline(other, "blue"); #endif - Polylines pl_out = intersection_pl((Polylines)other, *this); + Polylines pl_out = intersection_pl(to_polylines(other), *this); #if 0 svg.draw(pl_out, "red"); #endif diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index ff86d049c4..254a66884c 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -34,9 +34,6 @@ public: Polygon contour; Polygons holes; - operator Points() const; - operator Polygons() const; - operator Polylines() const; void clear() { contour.points.clear(); holes.clear(); } void scale(double factor); void translate(double x, double y) { this->translate(Point(coord_t(x), coord_t(y))); } @@ -91,6 +88,14 @@ inline size_t count_points(const ExPolygons &expolys) return n_points; } +inline size_t count_points(const ExPolygon &expoly) +{ + size_t n_points = expoly.contour.points.size(); + for (const auto &hole : expoly.holes) + n_points += hole.points.size(); + return n_points; +} + // Count a nuber of polygons stored inside the vector of expolygons. // Useful for allocating space for polygons when converting expolygons to polygons. inline size_t number_polygons(const ExPolygons &expolys) @@ -298,6 +303,16 @@ inline ExPolygons to_expolygons(Polygons &&polys) return ex_polys; } +inline Points to_points(const ExPolygon &expoly) +{ + Points out; + out.reserve(count_points(expoly)); + append(out, expoly.contour.points); + for (const Polygon &hole : expoly.holes) + append(out, hole.points); + return out; +} + inline void polygons_append(Polygons &dst, const ExPolygon &src) { dst.reserve(dst.size() + src.holes.size() + 1); diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp index aede1ad675..ba5fe0fcae 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -179,6 +179,13 @@ private: ExtrusionRole m_role; }; +class ExtrusionPathOriented : public ExtrusionPath +{ +public: + ExtrusionPathOriented(ExtrusionRole role, double mm3_per_mm, float width, float height) : ExtrusionPath(role, mm3_per_mm, width, height) {} + virtual bool can_reverse() const { return false; } +}; + typedef std::vector ExtrusionPaths; // Single continuous extrusion path, possibly with varying extrusion thickness, extrusion height or bridging / non bridging. @@ -330,12 +337,12 @@ inline void extrusion_paths_append(ExtrusionPaths &dst, Polylines &&polylines, E polylines.clear(); } -inline void extrusion_entities_append_paths(ExtrusionEntitiesPtr &dst, const Polylines &polylines, ExtrusionRole role, double mm3_per_mm, float width, float height) +inline void extrusion_entities_append_paths(ExtrusionEntitiesPtr &dst, const Polylines &polylines, ExtrusionRole role, double mm3_per_mm, float width, float height, bool can_reverse = true) { dst.reserve(dst.size() + polylines.size()); for (const Polyline &polyline : polylines) if (polyline.is_valid()) { - ExtrusionPath *extrusion_path = new ExtrusionPath(role, mm3_per_mm, width, height); + ExtrusionPath* extrusion_path = can_reverse ? new ExtrusionPath(role, mm3_per_mm, width, height) : new ExtrusionPathOriented(role, mm3_per_mm, width, height); dst.push_back(extrusion_path); extrusion_path->polyline = polyline; } diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 5b1b1d3454..8278db9600 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -389,6 +389,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: params.anchor_length_max = surface_fill.params.anchor_length_max; params.resolution = resolution; params.use_arachne = perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric; + params.layer_height = m_regions[surface_fill.region_id]->layer()->height; for (ExPolygon &expoly : surface_fill.expolygons) { // Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon. @@ -426,14 +427,13 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: for (const ThickPolyline &thick_polyline : thick_polylines) { Flow new_flow = surface_fill.params.flow.with_spacing(float(f->spacing)); - ExtrusionPaths paths = thick_polyline_to_extrusion_paths(thick_polyline, surface_fill.params.extrusion_role, new_flow, scaled(0.05), 0); + ExtrusionMultiPath multi_path = thick_polyline_to_multi_path(thick_polyline, surface_fill.params.extrusion_role, new_flow, scaled(0.05), float(SCALED_EPSILON)); // Append paths to collection. - if (!paths.empty()) { - if (paths.front().first_point() == paths.back().last_point()) - eec->entities.emplace_back(new ExtrusionLoop(std::move(paths))); + if (!multi_path.empty()) { + if (multi_path.paths.front().first_point() == multi_path.paths.back().last_point()) + eec->entities.emplace_back(new ExtrusionLoop(std::move(multi_path.paths))); else - for (ExtrusionPath &path : paths) - eec->entities.emplace_back(new ExtrusionPath(std::move(path))); + eec->entities.emplace_back(new ExtrusionMultiPath(std::move(multi_path))); } } diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index a8d5d20e21..b38c5c9f88 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -21,6 +21,8 @@ #include "FillAdaptive.hpp" #include "FillLightning.hpp" +#include + // #define INFILL_DEBUG_OUTPUT namespace Slic3r { @@ -129,8 +131,8 @@ std::pair Fill::_infill_direction(const Surface *surface) const float out_angle = this->angle; if (out_angle == FLT_MAX) { - //FIXME Vojtech: Add a warning? - printf("Using undefined infill angle\n"); + assert(false); + BOOST_LOG_TRIVIAL(error) << "Using undefined infill angle"; out_angle = 0.f; } diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index f35336beff..5200e1c0d7 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -61,6 +61,8 @@ struct FillParams // For Concentric infill, to switch between Classic and Arachne. bool use_arachne { false }; + // Layer height for Concentric infill with Arachne. + coordf_t layer_height { 0.f }; }; static_assert(IsTriviallyCopyable::value, "FillParams class is not POD (and it should be - see constructor)."); diff --git a/src/libslic3r/Fill/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp index f692babc6f..69f530720f 100644 --- a/src/libslic3r/Fill/FillConcentric.cpp +++ b/src/libslic3r/Fill/FillConcentric.cpp @@ -77,8 +77,8 @@ void FillConcentric::_fill_surface_single(const FillParams ¶ms, if (params.density > 0.9999f && !params.dont_adjust) { coord_t loops_count = std::max(bbox_size.x(), bbox_size.y()) / min_spacing + 1; - Polygons polygons = offset(expolygon, min_spacing / 2); - Arachne::WallToolPaths wallToolPaths(polygons, min_spacing, min_spacing, loops_count, 0, *this->print_object_config, *this->print_config); + Polygons polygons = offset(expolygon, float(min_spacing) / 2.f); + Arachne::WallToolPaths wallToolPaths(polygons, min_spacing, min_spacing, loops_count, 0, params.layer_height, *this->print_object_config, *this->print_config); std::vector loops = wallToolPaths.getToolPaths(); std::vector all_extrusions; @@ -106,6 +106,7 @@ void FillConcentric::_fill_surface_single(const FillParams ¶ms, thick_polyline.points.emplace_back(thick_polyline.points.front()); } thick_polylines_out.emplace_back(std::move(thick_polyline)); + last_pos = thick_polylines_out.back().last_point(); } // clip the paths to prevent the extruder from getting exactly on the first point of the loop diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index ba7461c5f5..bb93d824be 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -414,7 +414,7 @@ public: // bool sticks_removed = remove_sticks(polygons_src); // if (sticks_removed) BOOST_LOG_TRIVIAL(error) << "Sticks removed!"; - polygons_outer = aoffset1 == 0 ? polygons_src : offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, miterLimit); + polygons_outer = aoffset1 == 0 ? to_polygons(polygons_src) : offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, miterLimit); if (aoffset2 < 0) polygons_inner = shrink(polygons_outer, float(aoffset1 - aoffset2), ClipperLib::jtMiter, miterLimit); // Filter out contours with zero area or small area, contours with 2 points only. diff --git a/src/libslic3r/Fill/Lightning/Generator.cpp b/src/libslic3r/Fill/Lightning/Generator.cpp index 48377f4277..bd83bcfffe 100644 --- a/src/libslic3r/Fill/Lightning/Generator.cpp +++ b/src/libslic3r/Fill/Lightning/Generator.cpp @@ -70,7 +70,7 @@ void Generator::generateInitialInternalOverhangs(const PrintObject &print_object // Remove the part of the infill area that is already supported by the walls. Polygons overhang = diff(offset(infill_area_here, -float(m_wall_supporting_radius)), infill_area_above); // Filter out unprintable polygons and near degenerated polygons (three almost collinear points and so). - overhang = opening(overhang, SCALED_EPSILON, SCALED_EPSILON); + overhang = opening(overhang, float(SCALED_EPSILON), float(SCALED_EPSILON)); m_overhang_per_layer[layer_nr] = overhang; infill_area_above = std::move(infill_area_here); diff --git a/src/libslic3r/Fill/Lightning/TreeNode.cpp b/src/libslic3r/Fill/Lightning/TreeNode.cpp index 982d47b10e..801a46df49 100644 --- a/src/libslic3r/Fill/Lightning/TreeNode.cpp +++ b/src/libslic3r/Fill/Lightning/TreeNode.cpp @@ -141,18 +141,6 @@ NodeSPtr Node::closestNode(const Point& loc) return result; } -bool inside(const Polygons &polygons, const Point &p) -{ - int poly_count_inside = 0; - for (const Polygon &poly : polygons) { - const int is_inside_this_poly = ClipperLib::PointInPolygon(p, poly.points); - if (is_inside_this_poly == -1) - return true; - poly_count_inside += is_inside_this_poly; - } - return (poly_count_inside % 2) == 1; -} - bool lineSegmentPolygonsIntersection(const Point& a, const Point& b, const EdgeGrid::Grid& outline_locator, Point& result, const coord_t within_max_dist) { struct Visitor { @@ -192,7 +180,7 @@ bool Node::realign(const Polygons& outlines, const EdgeGrid::Grid& outline_locat if (outlines.empty()) return false; - if (inside(outlines, m_p)) { + if (contains(outlines, m_p)) { // Only keep children that have an unbroken connection to here, realign will put the rest in rerooted parts due to recursion: Point coll; bool reground_me = false; diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index 8b7c070489..bfbdbbc018 100644 --- a/src/libslic3r/Format/3mf.cpp +++ b/src/libslic3r/Format/3mf.cpp @@ -483,6 +483,7 @@ namespace Slic3r { bool load_model_from_file(const std::string& filename, Model& model, DynamicPrintConfig& config, ConfigSubstitutionContext& config_substitutions, bool check_version); unsigned int version() const { return m_version; } + boost::optional prusaslicer_generator_version() const { return m_prusaslicer_generator_version; } private: void _destroy_xml_parser(); @@ -3258,8 +3259,7 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv } // Perform conversions based on the config values available. -//FIXME provide a version of PrusaSlicer that stored the project file (3MF). -static void handle_legacy_project_loaded(unsigned int version_project_file, DynamicPrintConfig& config) +static void handle_legacy_project_loaded(unsigned int version_project_file, DynamicPrintConfig& config, const boost::optional& prusaslicer_generator_version) { if (! config.has("brim_separation")) { if (auto *opt_elephant_foot = config.option("elefant_foot_compensation", false); opt_elephant_foot) { @@ -3268,6 +3268,23 @@ static void handle_legacy_project_loaded(unsigned int version_project_file, Dyna opt_brim_separation->value = opt_elephant_foot->value; } } + + // In PrusaSlicer 2.5.0-alpha2 and 2.5.0-alpha3, we introduce several parameters for Arachne that depend + // on nozzle size . Later we decided to make default values for those parameters computed automatically + // until the user changes them. + if (prusaslicer_generator_version && *prusaslicer_generator_version >= *Semver::parse("2.5.0-alpha2") && *prusaslicer_generator_version <= *Semver::parse("2.5.0-alpha3")) { + if (auto *opt_wall_transition_length = config.option("wall_transition_length", false); + opt_wall_transition_length && !opt_wall_transition_length->percent && opt_wall_transition_length->value == 0.4) { + opt_wall_transition_length->percent = true; + opt_wall_transition_length->value = 100; + } + + if (auto *opt_min_feature_size = config.option("min_feature_size", false); + opt_min_feature_size && !opt_min_feature_size->percent && opt_min_feature_size->value == 0.1) { + opt_min_feature_size->percent = true; + opt_min_feature_size->value = 25; + } + } } bool is_project_3mf(const std::string& filename) @@ -3308,9 +3325,9 @@ bool load_3mf(const char* path, DynamicPrintConfig& config, ConfigSubstitutionCo // All import should use "C" locales for number formatting. CNumericLocalesSetter locales_setter; _3MF_Importer importer; - bool res = importer.load_model_from_file(path, *model, config, config_substitutions, check_version); + importer.load_model_from_file(path, *model, config, config_substitutions, check_version); importer.log_errors(); - handle_legacy_project_loaded(importer.version(), config); + handle_legacy_project_loaded(importer.version(), config, importer.prusaslicer_generator_version()); return !model->objects.empty() || !config.empty(); } diff --git a/src/libslic3r/Format/STEP.cpp b/src/libslic3r/Format/STEP.cpp new file mode 100644 index 0000000000..081726704a --- /dev/null +++ b/src/libslic3r/Format/STEP.cpp @@ -0,0 +1,131 @@ +#include "STEP.hpp" +#include "occt_wrapper/OCCTWrapper.hpp" + +#include "libslic3r/Model.hpp" +#include "libslic3r/TriangleMesh.hpp" +#include "libslic3r/Utils.hpp" + +#include +#include +#include + +#include +#include + +#ifdef _WIN32 + #include +#else + #include + #include +#endif + + +namespace Slic3r { + +#if __APPLE__ +extern "C" bool load_step_internal(const char *path, OCCTResult* res); +#endif + +LoadStepFn get_load_step_fn() +{ + static LoadStepFn load_step_fn = nullptr; + +#ifndef __APPLE__ + constexpr const char* fn_name = "load_step_internal"; +#endif + + if (!load_step_fn) { + auto libpath = boost::dll::program_location().parent_path(); +#ifdef _WIN32 + libpath /= "OCCTWrapper.dll"; + HMODULE module = LoadLibraryW(libpath.wstring().c_str()); + if (module == NULL) + throw Slic3r::RuntimeError("Cannot load OCCTWrapper.dll"); + + try { + FARPROC farproc = GetProcAddress(module, fn_name); + if (! farproc) { + DWORD ec = GetLastError(); + throw Slic3r::RuntimeError(std::string("Cannot load function from OCCTWrapper.dll: ") + fn_name + + "\n\nError code: " + std::to_string(ec)); + } + load_step_fn = reinterpret_cast(farproc); + } catch (const Slic3r::RuntimeError&) { + FreeLibrary(module); + throw; + } +#elif __APPLE__ + load_step_fn = &load_step_internal; +#else + libpath /= "OCCTWrapper.so"; + void *plugin_ptr = dlopen(libpath.c_str(), RTLD_NOW | RTLD_GLOBAL); + + if (plugin_ptr) { + load_step_fn = reinterpret_cast(dlsym(plugin_ptr, fn_name)); + if (!load_step_fn) { + dlclose(plugin_ptr); + throw Slic3r::RuntimeError(std::string("Cannot load function from OCCTWrapper.so: ") + fn_name + + "\n\n" + dlerror()); + } + } else { + throw Slic3r::RuntimeError(std::string("Cannot load OCCTWrapper.so:\n\n") + dlerror()); + } +#endif + } + + return load_step_fn; +} + +bool load_step(const char *path, Model *model /*BBS:, ImportStepProgressFn proFn*/) +{ + OCCTResult occt_object; + + LoadStepFn load_step_fn = get_load_step_fn(); + + if (!load_step_fn) + return false; + + load_step_fn(path, &occt_object); + + assert(! occt_object.volumes.empty()); + + assert(boost::algorithm::iends_with(occt_object.object_name, ".stp") + || boost::algorithm::iends_with(occt_object.object_name, ".step")); + occt_object.object_name.erase(occt_object.object_name.find(".")); + assert(! occt_object.object_name.empty()); + + + ModelObject* new_object = model->add_object(); + new_object->input_file = path; + if (new_object->volumes.size() == 1 && ! occt_object.volumes.front().volume_name.empty()) + new_object->name = new_object->volumes.front()->name; + else + new_object->name = occt_object.object_name; + + + for (size_t i=0; iadd_volume(std::move(triangle_mesh)); + + new_volume->name = occt_object.volumes[i].volume_name.empty() + ? std::string("Part") + std::to_string(i+1) + : occt_object.volumes[i].volume_name; + new_volume->source.input_file = path; + new_volume->source.object_idx = (int)model->objects.size() - 1; + new_volume->source.volume_idx = (int)new_object->volumes.size() - 1; + } + + return true; +} + +}; // namespace Slic3r diff --git a/src/libslic3r/Format/STEP.hpp b/src/libslic3r/Format/STEP.hpp new file mode 100644 index 0000000000..8fbc604d8d --- /dev/null +++ b/src/libslic3r/Format/STEP.hpp @@ -0,0 +1,19 @@ +// Original implementation of STEP format import created by Bambulab. +// https://github.com/bambulab/BambuStudio +// Forked off commit 1555904, modified by Prusa Research. + +#ifndef slic3r_Format_STEP_hpp_ +#define slic3r_Format_STEP_hpp_ + +namespace Slic3r { + +class Model; + +//typedef std::function ImportStepProgressFn; + +// Load a step file into a provided model. +extern bool load_step(const char *path_str, Model *model /*LMBBS:, ImportStepProgressFn proFn = nullptr*/); + +}; // namespace Slic3r + +#endif /* slic3r_Format_STEP_hpp_ */ diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index d836ac43c6..e44dfb742b 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -53,8 +53,6 @@ using slic3r_tbb_filtermode = tbb::filter; #endif -#include - using namespace std::literals::string_view_literals; #if 0 @@ -735,8 +733,6 @@ namespace DoExport { void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* result, ThumbnailsGeneratorCallback thumbnail_cb) { - PROFILE_CLEAR(); - CNumericLocalesSetter locales_setter; // Does the file exist? If so, we hope that it is still valid. @@ -828,10 +824,6 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu BOOST_LOG_TRIVIAL(info) << "Exporting G-code finished" << log_memory_info(); print->set_done(psGCodeExport); - - // Write the profiler measurements to file - PROFILE_UPDATE(); - PROFILE_OUTPUT(debug_out_path("gcode-export-profile.txt").c_str()); } // free functions called by GCode::_do_export() @@ -1048,8 +1040,6 @@ std::vector sort_object_instances_by_model_order(const Pri void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGeneratorCallback thumbnail_cb) { - PROFILE_FUNC(); - // modifies m_silent_time_estimator_enabled DoExport::init_gcode_processor(print.config(), m_processor, m_silent_time_estimator_enabled); @@ -2639,6 +2629,12 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, const std::string_view descr // thus empty path segments will not be produced by G-code export. loop.split_at(last_pos, false, scaled(0.0015)); + for (auto it = std::next(loop.paths.begin()); it != loop.paths.end(); ++it) { + assert(it->polyline.points.size() >= 2); + assert(std::prev(it)->polyline.last_point() == it->polyline.first_point()); + } + assert(loop.paths.front().first_point() == loop.paths.back().last_point()); + // 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 @@ -2665,8 +2661,21 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, const std::string_view descr // 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 + if (m_wipe.enable) { + m_wipe.path = paths.front().polyline; + + for (auto it = std::next(paths.begin()); it != paths.end(); ++it) { + if (is_bridge(it->role())) + break; // Don't perform a wipe on bridges. + + assert(it->polyline.points.size() >= 2); + assert(m_wipe.path.points.back() == it->polyline.first_point()); + if (m_wipe.path.points.back() != it->polyline.first_point()) + break; // ExtrusionLoop is interrupted in some place. + + m_wipe.path.points.insert(m_wipe.path.points.end(), it->polyline.points.begin() + 1, it->polyline.points.end()); + } + } // 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) { @@ -2709,6 +2718,10 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, const std::string_view descr std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, const std::string_view description, double speed) { + for (auto it = std::next(multipath.paths.begin()); it != multipath.paths.end(); ++it) { + assert(it->polyline.points.size() >= 2); + assert(std::prev(it)->polyline.last_point() == it->polyline.first_point()); + } // extrude along the path std::string gcode; for (ExtrusionPath path : multipath.paths) { @@ -2716,8 +2729,20 @@ std::string GCode::extrude_multi_path(ExtrusionMultiPath multipath, const std::s gcode += this->_extrude(path, description, speed); } if (m_wipe.enable) { - m_wipe.path = std::move(multipath.paths.back().polyline); // TODO: don't limit wipe to last path + m_wipe.path = std::move(multipath.paths.back().polyline); m_wipe.path.reverse(); + + for (auto it = std::next(multipath.paths.rbegin()); it != multipath.paths.rend(); ++it) { + if (is_bridge(it->role())) + break; // Do not perform a wipe on bridges. + + assert(it->polyline.points.size() >= 2); + assert(m_wipe.path.points.back() == it->polyline.last_point()); + if (m_wipe.path.points.back() != it->polyline.last_point()) + break; // ExtrusionMultiPath is interrupted in some place. + + m_wipe.path.points.insert(m_wipe.path.points.end(), it->polyline.points.rbegin() + 1, it->polyline.points.rend()); + } } // reset acceleration gcode += m_writer.set_acceleration((unsigned int)floor(m_config.default_acceleration.value + 0.5)); @@ -3134,15 +3159,26 @@ bool GCode::needs_retraction(const Polyline &travel, ExtrusionRole role) return false; } - if (role == erSupportMaterial) { - const SupportLayer* support_layer = dynamic_cast(m_layer); - //FIXME support_layer->support_islands.contains should use some search structure! - if (support_layer != NULL && ! intersection_pl(travel, support_layer->support_islands).empty()) - // skip retraction if this is a travel move inside a support material island - //FIXME not retracting over a long path may cause oozing, which in turn may result in missing material - // at the end of the extrusion path! - return false; - } + if (role == erSupportMaterial) + if (const SupportLayer *support_layer = dynamic_cast(m_layer); + support_layer != nullptr && ! support_layer->support_islands_bboxes.empty()) { + BoundingBox bbox_travel = get_extents(travel); + Polylines trimmed; + bool trimmed_initialized = false; + for (const BoundingBox &bbox : support_layer->support_islands_bboxes) + if (bbox.overlap(bbox_travel)) { + const auto &island = support_layer->support_islands[&bbox - support_layer->support_islands_bboxes.data()]; + trimmed = trimmed_initialized ? diff_pl(trimmed, island) : diff_pl(travel, island); + trimmed_initialized = true; + if (trimmed.empty()) + // skip retraction if this is a travel move inside a support material island + //FIXME not retracting over a long path may cause oozing, which in turn may result in missing material + // at the end of the extrusion path! + return false; + // Not sure whether updating the boudning box isn't too expensive. + //bbox_travel = get_extents(trimmed); + } + } if (m_config.only_retract_when_crossing_perimeters && m_layer != nullptr && m_config.fill_density.value > 0 && m_layer->any_internal_region_slice_contains(travel)) diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index cfdcf6d1e2..3868c87dfa 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -798,7 +798,8 @@ const std::vector> GCodeProces { EProducer::Simplify3D, "G-Code generated by Simplify3D(R)" }, { EProducer::CraftWare, "CraftWare" }, { EProducer::ideaMaker, "ideaMaker" }, - { EProducer::KissSlicer, "KISSlicer" } + { EProducer::KissSlicer, "KISSlicer" }, + { EProducer::BambuStudio, "BambuStudio" } }; unsigned int GCodeProcessor::s_result_id = 0; @@ -2054,6 +2055,7 @@ bool GCodeProcessor::process_producers_tags(const std::string_view comment) case EProducer::CraftWare: { return process_craftware_tags(comment); } case EProducer::ideaMaker: { return process_ideamaker_tags(comment); } case EProducer::KissSlicer: { return process_kissslicer_tags(comment); } + case EProducer::BambuStudio: { return process_bambustudio_tags(comment); } default: { return false; } } } @@ -2498,6 +2500,62 @@ bool GCodeProcessor::process_kissslicer_tags(const std::string_view comment) return false; } +bool GCodeProcessor::process_bambustudio_tags(const std::string_view comment) +{ + // extrusion roles + + std::string tag = "FEATURE: "; + size_t pos = comment.find(tag); + if (pos != comment.npos) { + const std::string_view type = comment.substr(pos + tag.length()); + if (type == "Custom") + set_extrusion_role(erCustom); + else if (type == "Inner wall") + set_extrusion_role(erPerimeter); + else if (type == "Outer wall") + set_extrusion_role(erExternalPerimeter); + else if (type == "Overhang wall") + set_extrusion_role(erOverhangPerimeter); + else if (type == "Gap infill") + set_extrusion_role(erGapFill); + else if (type == "Bridge") + set_extrusion_role(erBridgeInfill); + else if (type == "Sparse infill") + set_extrusion_role(erInternalInfill); + else if (type == "Internal solid infill") + set_extrusion_role(erSolidInfill); + else if (type == "Top surface") + set_extrusion_role(erTopSolidInfill); + else if (type == "Bottom surface") + set_extrusion_role(erNone); + else if (type == "Ironing") + set_extrusion_role(erIroning); + else if (type == "Skirt") + set_extrusion_role(erSkirt); + else if (type == "Brim") + set_extrusion_role(erSkirt); + else if (type == "Support") + set_extrusion_role(erSupportMaterial); + else if (type == "Support interface") + set_extrusion_role(erSupportMaterialInterface); + else if (type == "Support transition") + set_extrusion_role(erNone); + else if (type == "Prime tower") + set_extrusion_role(erWipeTower); + else { + set_extrusion_role(erNone); + BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type; + } + + if (m_extrusion_role == erExternalPerimeter) + m_seams_detector.activate(true); + + return true; + } + + return false; +} + bool GCodeProcessor::detect_producer(const std::string_view comment) { for (const auto& [id, search_string] : Producers) { @@ -2625,7 +2683,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) if (m_height == 0.0f) m_height = DEFAULT_TOOLPATH_HEIGHT; - if (m_end_position[Z] == 0.0f) + if (m_end_position[Z] == 0.0f || (m_extrusion_role == erCustom && m_layer_id == 0)) m_end_position[Z] = m_height; #if ENABLE_PROCESS_G2_G3_LINES @@ -2855,7 +2913,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) } if (m_spiral_vase_active && !m_result.spiral_vase_layers.empty()) { - if (m_result.spiral_vase_layers.back().first == FLT_MAX && delta_pos[Z] > 0.0) + if (m_result.spiral_vase_layers.back().first == FLT_MAX && delta_pos[Z] >= 0.0) // replace layer height placeholder with correct value m_result.spiral_vase_layers.back().first = static_cast(m_end_position[Z]); if (!m_result.moves.empty()) @@ -2873,7 +2931,7 @@ void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line) #if ENABLE_PROCESS_G2_G3_LINES void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool clockwise) { - if (!line.has('X') || !line.has('Y') || !line.has('I') || !line.has('J')) + if (!line.has('I') || !line.has('J')) return; // relative center @@ -2904,7 +2962,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc Vec3d relative_start() const { return start - center; } Vec3d relative_end() const { return end - center; } - bool closed() const { return end.isApprox(start); } + bool is_full_circle() const { return std::abs(delta_x()) < EPSILON && std::abs(delta_y()) < EPSILON; } }; Arc arc; @@ -2947,7 +3005,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc const Vec3d rel_arc_end = arc.relative_end(); // arc angle - if (arc.closed()) + if (arc.is_full_circle()) arc.angle = 2.0 * PI; else { arc.angle = std::atan2(rel_arc_start.x() * rel_arc_end.y() - rel_arc_start.y() * rel_arc_end.x(), @@ -2999,24 +3057,23 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc // calculate arc segments // reference: // Prusa-Firmware\Firmware\motion_control.cpp - mc_arc() + // https://github.com/prusa3d/Prusa-Firmware/blob/MK3/Firmware/motion_control.cpp // segments count - static const double MM_PER_ARC_SEGMENT = 1.0; - const size_t segments = std::max(std::floor(travel_length / MM_PER_ARC_SEGMENT), 1); + static const double MM_PER_ARC_SEGMENT = 0.5; + const size_t segments = std::ceil(travel_length / MM_PER_ARC_SEGMENT); + assert(segments >= 1); const double theta_per_segment = arc.angle / double(segments); const double z_per_segment = arc.delta_z() / double(segments); const double extruder_per_segment = (extrusion.has_value()) ? *extrusion / double(segments) : 0.0; - double cos_T = 1.0 - 0.5 * sqr(theta_per_segment); // Small angle approximation - double sin_T = theta_per_segment; + const double sq_theta_per_segment = sqr(theta_per_segment); + const double cos_T = 1.0 - 0.5 * sq_theta_per_segment; // Small angle approximation + const double sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6.0; // Small angle approximation AxisCoords prev_target = m_start_position; AxisCoords arc_target; - double sin_Ti; - double cos_Ti; - double r_axisi; - size_t count = 0; // Initialize the linear axis arc_target[Z] = m_start_position[Z]; @@ -3030,22 +3087,23 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc std::string gcode; - for (size_t i = 1; i < segments; ++i) { // Increment (segments-1) - if (count < N_ARC_CORRECTION) { - // Apply vector rotation matrix - r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T; - curr_rel_arc_start.x() = curr_rel_arc_start.x() * cos_T - curr_rel_arc_start.y() * sin_T; - curr_rel_arc_start.y() = r_axisi; - count++; - } - else { - // Arc correction to radius vector. Computed only every N_ARC_CORRECTION increments. - // Compute exact location by applying transformation matrix from initial radius vector(=-offset). - cos_Ti = ::cos(double(i) * theta_per_segment); - sin_Ti = ::sin(double(i) * theta_per_segment); + size_t n_arc_correction = N_ARC_CORRECTION; + + for (size_t i = 1; i < segments; ++i) { + if (n_arc_correction-- == 0) { + // Calculate the actual position for r_axis_x and r_axis_y + const double cos_Ti = ::cos((double)i * theta_per_segment); + const double sin_Ti = ::sin((double)i * theta_per_segment); curr_rel_arc_start.x() = -double(rel_center.x()) * cos_Ti + double(rel_center.y()) * sin_Ti; curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti; - count = 0; + // reset n_arc_correction + n_arc_correction = N_ARC_CORRECTION; + } + else { + // Calculate X and Y using the small angle approximation + const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T; + curr_rel_arc_start.x() = curr_rel_arc_start.x() * cos_T - curr_rel_arc_start.y() * sin_T; + curr_rel_arc_start.y() = r_axisi; } // Update arc_target location @@ -3721,8 +3779,13 @@ void GCodeProcessor::post_process() } auto process_used_filament = [&](std::string& gcode_line) { - auto process_tag = [](std::string& gcode_line, const std::string& tag, const std::vector& values) { - if (boost::algorithm::istarts_with(gcode_line, tag)) { + // Prefilter for parsing speed. + if (gcode_line.size() < 8 || gcode_line[0] != ';' || gcode_line[1] != ' ') + return false; + if (const char c = gcode_line[2]; c != 'f' && c != 't') + return false; + auto process_tag = [](std::string& gcode_line, const std::string_view tag, const std::vector& values) { + if (boost::algorithm::starts_with(gcode_line, tag)) { gcode_line = tag; char buf[1024]; for (size_t i = 0; i < values.size(); ++i) { diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp index 71388866e8..3edea61f42 100644 --- a/src/libslic3r/GCode/GCodeProcessor.hpp +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -590,7 +590,8 @@ namespace Slic3r { Simplify3D, CraftWare, ideaMaker, - KissSlicer + KissSlicer, + BambuStudio }; static const std::vector> Producers; @@ -658,6 +659,7 @@ namespace Slic3r { bool process_craftware_tags(const std::string_view comment); bool process_ideamaker_tags(const std::string_view comment); bool process_kissslicer_tags(const std::string_view comment); + bool process_bambustudio_tags(const std::string_view comment); bool detect_producer(const std::string_view comment); diff --git a/src/libslic3r/GCode/PostProcessor.cpp b/src/libslic3r/GCode/PostProcessor.cpp index ced74e3ebd..de1807dbb8 100644 --- a/src/libslic3r/GCode/PostProcessor.cpp +++ b/src/libslic3r/GCode/PostProcessor.cpp @@ -153,7 +153,7 @@ static int run_script(const std::string &script, const std::string &gcode, std:: { // Try to obtain user's default shell const char *shell = ::getenv("SHELL"); - if (shell == nullptr) { shell = "sh"; } + if (shell == nullptr) { shell = "/bin/sh"; } // Quote and escape the gcode path argument std::string command { script }; diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index 95e496b5a2..7135c0a5c0 100644 --- a/src/libslic3r/GCode/PressureEqualizer.cpp +++ b/src/libslic3r/GCode/PressureEqualizer.cpp @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include #include "../libslic3r.h" #include "../PrintConfig.hpp" @@ -31,7 +31,8 @@ PressureEqualizer::PressureEqualizer(const Slic3r::GCodeConfig &config) : m_use_ { // Preallocate some data, so that output_buffer.data() will return an empty string. output_buffer.assign(32, 0); - output_buffer_length = 0; + output_buffer_length = 0; + output_buffer_prev_length = 0; m_current_extruder = 0; // Zero the position of the XYZE axes + the current feed @@ -58,13 +59,14 @@ PressureEqualizer::PressureEqualizer(const Slic3r::GCodeConfig &config) : m_use_ extrusion_rate_slope.positive = m_max_volumetric_extrusion_rate_slope_positive; } - // Don't regulate the pressure in infill, gap fill and ironing. - // TODO: Do we want to regulate pressure in erWipeTower, erCustom and erMixed? - for (const ExtrusionRole er : {erBridgeInfill, erGapFill, erIroning}) { + // Don't regulate the pressure before and after gap-fill and ironing. + for (const ExtrusionRole er : {erGapFill, erIroning}) { m_max_volumetric_extrusion_rate_slopes[er].negative = 0; m_max_volumetric_extrusion_rate_slopes[er].positive = 0; } + opened_extrude_set_speed_block = false; + #ifdef PRESSURE_EQUALIZER_STATISTIC m_stat.reset(); #endif @@ -93,6 +95,7 @@ void PressureEqualizer::process_layer(const std::string &gcode) if (*gcode_begin == '\n') ++gcode_begin; } + assert(!this->opened_extrude_set_speed_block); } } @@ -114,9 +117,10 @@ LayerResult PressureEqualizer::process_layer(LayerResult &&input) LayerResult *prev_layer_result = m_layer_results.front(); m_layer_results.pop(); - output_buffer_length = 0; + output_buffer_length = 0; + output_buffer_prev_length = 0; for (size_t line_idx = 0; line_idx < next_layer_first_idx; ++line_idx) - output_gcode_line(m_gcode_lines[line_idx]); + output_gcode_line(line_idx); m_gcode_lines.erase(m_gcode_lines.begin(), m_gcode_lines.begin() + int(next_layer_first_idx)); if (output_buffer_length > 0) @@ -131,9 +135,9 @@ LayerResult PressureEqualizer::process_layer(LayerResult &&input) // Is a white space? static inline bool is_ws(const char c) { return c == ' ' || c == '\t'; } // Is it an end of line? Consider a comment to be an end of line as well. -static inline bool is_eol(const char c) { return c == 0 || c == '\r' || c == '\n' || c == ';'; }; +static inline bool is_eol(const char c) { return c == 0 || c == '\r' || c == '\n' || c == ';'; } // Is it a white space or end of line? -static inline bool is_ws_or_eol(const char c) { return is_ws(c) || is_eol(c); }; +static inline bool is_ws_or_eol(const char c) { return is_ws(c) || is_eol(c); } // Eat whitespaces. static void eatws(const char *&line) @@ -152,7 +156,7 @@ static inline int parse_int(const char *&line) throw Slic3r::InvalidArgument("PressureEqualizer: Error parsing an int"); line = endptr; return int(result); -}; +} float string_to_float_decimal_point(const char *line, const size_t str_len, size_t* pos) { @@ -173,7 +177,7 @@ static inline float parse_float(const char *&line, const size_t line_length) throw Slic3r::RuntimeError("PressureEqualizer: Error parsing a float"); line = line + endptr; return result; -}; +} bool PressureEqualizer::process_line(const char *line, const char *line_end, GCodeLine &buf) { @@ -209,6 +213,16 @@ bool PressureEqualizer::process_line(const char *line, const char *line_end, GCo buf.max_volumetric_extrusion_rate_slope_negative = 0.f; buf.extrusion_role = m_current_extrusion_role; + std::string str_line(line, line_end); + const bool found_extrude_set_speed_tag = boost::contains(str_line, EXTRUDE_SET_SPEED_TAG); + const bool found_extrude_end_tag = boost::contains(str_line, EXTRUDE_END_TAG); + assert(!found_extrude_set_speed_tag || !found_extrude_end_tag); + + if (found_extrude_set_speed_tag) + this->opened_extrude_set_speed_block = true; + else if (found_extrude_end_tag) + this->opened_extrude_set_speed_block = false; + // Parse the G-code line, store the result into the buf. switch (toupper(*line ++)) { case 'G': { @@ -228,6 +242,9 @@ bool PressureEqualizer::process_line(const char *line, const char *line_end, GCo case 1: { // G0, G1: A FFF 3D printer does not make a difference between the two. + buf.adjustable_flow = this->opened_extrude_set_speed_block; + buf.extrude_set_speed_tag = found_extrude_set_speed_tag; + buf.extrude_end_tag = found_extrude_end_tag; float new_pos[5]; memcpy(new_pos, m_current_pos, sizeof(float)*5); bool changed[5] = { false, false, false, false, false }; @@ -372,8 +389,9 @@ bool PressureEqualizer::process_line(const char *line, const char *line_end, GCo return true; } -void PressureEqualizer::output_gcode_line(GCodeLine &line) +void PressureEqualizer::output_gcode_line(const size_t line_idx) { + GCodeLine &line = m_gcode_lines[line_idx]; if (!line.modified) { push_to_output(line.raw.data(), line.raw_length, true); return; @@ -389,7 +407,7 @@ void PressureEqualizer::output_gcode_line(GCodeLine &line) // Emit the line with lowered extrusion rates. float l = line.dist_xyz(); if (auto nSegments = size_t(ceil(l / max_segment_length)); nSegments == 1) { // Just update this segment. - push_line_to_output(line, line.feedrate() * line.volumetric_correction_avg(), comment); + push_line_to_output(line_idx, line.feedrate() * line.volumetric_correction_avg(), comment); } else { bool accelerating = line.volumetric_extrusion_rate_start < line.volumetric_extrusion_rate_end; // Update the initial and final feed rate values. @@ -439,7 +457,7 @@ void PressureEqualizer::output_gcode_line(GCodeLine &line) line.pos_end[i] = pos_start[i] + (pos_end[i] - pos_start[i]) * t; line.pos_provided[i] = true; } - push_line_to_output(line, pos_start[4], comment); + push_line_to_output(line_idx, pos_start[4], comment); comment = nullptr; float new_pos_start_feedrate = pos_start[4]; @@ -459,7 +477,7 @@ void PressureEqualizer::output_gcode_line(GCodeLine &line) line.pos_provided[j] = true; } // Interpolate the feed rate at the center of the segment. - push_line_to_output(line, pos_start[4] + (pos_end[4] - pos_start[4]) * (float(i) - 0.5f) / float(nSegments), comment); + push_line_to_output(line_idx, pos_start[4] + (pos_end[4] - pos_start[4]) * (float(i) - 0.5f) / float(nSegments), comment); comment = nullptr; memcpy(line.pos_start, line.pos_end, sizeof(float)*5); } @@ -468,13 +486,13 @@ void PressureEqualizer::output_gcode_line(GCodeLine &line) line.pos_end[i] = pos_end2[i]; line.pos_provided[i] = true; } - push_line_to_output(line, pos_end[4], comment); + push_line_to_output(line_idx, pos_end[4], comment); } else { for (int i = 0; i < 4; ++ i) { line.pos_end[i] = pos_end[i]; line.pos_provided[i] = true; } - push_line_to_output(line, pos_end[4], comment); + push_line_to_output(line_idx, pos_end[4], comment); } } } @@ -501,6 +519,11 @@ void PressureEqualizer::adjust_volumetric_rate() for (; !m_gcode_lines[idx_prev].extruding() && idx_prev != fist_line_idx; --idx_prev); if (!m_gcode_lines[idx_prev].extruding()) break; + // Don't decelerate before ironing and gap-fill. + if (m_gcode_lines[line_idx].extrusion_role == erIroning || m_gcode_lines[line_idx].extrusion_role == erGapFill) { + line_idx = idx_prev; + continue; + } // Volumetric extrusion rate at the start of the succeding segment. float rate_succ = m_gcode_lines[line_idx].volumetric_extrusion_rate_start; // What is the gradient of the extrusion rate between idx_prev and idx? @@ -517,7 +540,7 @@ void PressureEqualizer::adjust_volumetric_rate() // Limit by the succeeding volumetric flow rate. rate_end = rate_succ; - if (line.extrusion_role == erExternalPerimeter || line.extrusion_role == erGapFill || line.extrusion_role == erBridgeInfill || line.extrusion_role == erIroning) { + if (!line.adjustable_flow || line.extrusion_role == erExternalPerimeter || line.extrusion_role == erGapFill || line.extrusion_role == erBridgeInfill || line.extrusion_role == erIroning) { rate_end = line.volumetric_extrusion_rate_end; } else if (line.volumetric_extrusion_rate_end > rate_end) { line.volumetric_extrusion_rate_end = rate_end; @@ -529,16 +552,20 @@ void PressureEqualizer::adjust_volumetric_rate() // Use the original, 'floating' extrusion rate as a starting point for the limiter. } - float rate_start = rate_end + rate_slope * line.time_corrected(); - if (rate_start < line.volumetric_extrusion_rate_start) { - // Limit the volumetric extrusion rate at the start of this segment due to a segment - // of ExtrusionType iRole, which will be extruded in the future. - line.volumetric_extrusion_rate_start = rate_start; - line.max_volumetric_extrusion_rate_slope_negative = rate_slope; - line.modified = true; + if (line.adjustable_flow) { + float rate_start = rate_end + rate_slope * line.time_corrected(); + if (rate_start < line.volumetric_extrusion_rate_start) { + // Limit the volumetric extrusion rate at the start of this segment due to a segment + // of ExtrusionType iRole, which will be extruded in the future. + line.volumetric_extrusion_rate_start = rate_start; + line.max_volumetric_extrusion_rate_slope_negative = rate_slope; + line.modified = true; + } } // feedrate_per_extrusion_role[iRole] = (iRole == line.extrusion_role) ? line.volumetric_extrusion_rate_start : rate_start; - feedrate_per_extrusion_role[iRole] = line.volumetric_extrusion_rate_start; + // Don't store feed rate for ironing and gap-fill. + if (line.extrusion_role != erIroning && line.extrusion_role != erGapFill) + feedrate_per_extrusion_role[iRole] = line.volumetric_extrusion_rate_start; } } @@ -551,6 +578,11 @@ void PressureEqualizer::adjust_volumetric_rate() for (; !m_gcode_lines[idx_next].extruding() && idx_next != last_line_idx; ++idx_next); if (!m_gcode_lines[idx_next].extruding()) break; + // Don't accelerate after ironing and gap-fill. + if (m_gcode_lines[line_idx].extrusion_role == erIroning || m_gcode_lines[line_idx].extrusion_role == erGapFill) { + line_idx = idx_next; + continue; + } float rate_prec = m_gcode_lines[line_idx].volumetric_extrusion_rate_end; // What is the gradient of the extrusion rate between idx_prev and idx? line_idx = idx_next; @@ -562,7 +594,7 @@ void PressureEqualizer::adjust_volumetric_rate() continue; // The positive rate is unlimited or the rate for ExtrusionRole iRole is unlimited. float rate_start = feedrate_per_extrusion_role[iRole]; - if (line.extrusion_role == erExternalPerimeter || line.extrusion_role == erGapFill || line.extrusion_role == erBridgeInfill || line.extrusion_role == erIroning) { + if (!line.adjustable_flow || line.extrusion_role == erExternalPerimeter || line.extrusion_role == erGapFill || line.extrusion_role == erBridgeInfill || line.extrusion_role == erIroning) { rate_start = line.volumetric_extrusion_rate_start; } else if (iRole == line.extrusion_role && rate_prec < rate_start) rate_start = rate_prec; @@ -575,16 +607,21 @@ void PressureEqualizer::adjust_volumetric_rate() } else { // Use the original, 'floating' extrusion rate as a starting point for the limiter. } - float rate_end = rate_start + rate_slope * line.time_corrected(); - if (rate_end < line.volumetric_extrusion_rate_end) { - // Limit the volumetric extrusion rate at the start of this segment due to a segment - // of ExtrusionType iRole, which was extruded before. - line.volumetric_extrusion_rate_end = rate_end; - line.max_volumetric_extrusion_rate_slope_positive = rate_slope; - line.modified = true; + + if (line.adjustable_flow) { + float rate_end = rate_start + rate_slope * line.time_corrected(); + if (rate_end < line.volumetric_extrusion_rate_end) { + // Limit the volumetric extrusion rate at the start of this segment due to a segment + // of ExtrusionType iRole, which was extruded before. + line.volumetric_extrusion_rate_end = rate_end; + line.max_volumetric_extrusion_rate_slope_positive = rate_slope; + line.modified = true; + } } // feedrate_per_extrusion_role[iRole] = (iRole == line.extrusion_role) ? line.volumetric_extrusion_rate_end : rate_end; - feedrate_per_extrusion_role[iRole] = line.volumetric_extrusion_rate_end; + // Don't store feed rate for ironing and gap-fill. + if (line.extrusion_role != erIroning && line.extrusion_role != erGapFill) + feedrate_per_extrusion_role[iRole] = line.volumetric_extrusion_rate_end; } } } @@ -624,6 +661,7 @@ inline void PressureEqualizer::push_to_output(const char *text, const size_t len // Copy the text to the output. if (len != 0) { memcpy(output_buffer.data() + output_buffer_length, text, len); + this->output_buffer_prev_length = this->output_buffer_length; output_buffer_length += len; } if (add_eol) @@ -631,9 +669,37 @@ inline void PressureEqualizer::push_to_output(const char *text, const size_t len output_buffer[output_buffer_length] = 0; } -void PressureEqualizer::push_line_to_output(const GCodeLine &line, const float new_feedrate, const char *comment) +inline bool is_just_line_with_extrude_set_speed_tag(const std::string &line) { - push_to_output(EXTRUDE_END_TAG.data(), EXTRUDE_END_TAG.length(), true); + if (line.empty() && !boost::starts_with(line, "G1 ") && !boost::ends_with(line, EXTRUDE_SET_SPEED_TAG)) + return false; + + const char *p_line = line.data() + 3; + const char *const line_end = line.data() + line.length() - 1; + while (!is_eol(*p_line)) { + if (toupper(*p_line++) == 'F') + break; + else + return false; + } + parse_float(p_line, line_end - p_line); + eatws(p_line); + p_line += EXTRUDE_SET_SPEED_TAG.length(); + return p_line <= line_end && is_eol(*p_line); +} + +void PressureEqualizer::push_line_to_output(const size_t line_idx, const float new_feedrate, const char *comment) +{ + const GCodeLine &line = this->m_gcode_lines[line_idx]; + if (line_idx > 0 && output_buffer_length > 0) { + const std::string prev_line_str = std::string(output_buffer.begin() + int(this->output_buffer_prev_length), + output_buffer.begin() + int(this->output_buffer_length) + 1); + if (is_just_line_with_extrude_set_speed_tag(prev_line_str)) + this->output_buffer_length = this->output_buffer_prev_length; // Remove the last line because it only sets the speed for an empty block of g-code lines, so it is useless. + else + push_to_output(EXTRUDE_END_TAG.data(), EXTRUDE_END_TAG.length(), true); + } else + push_to_output(EXTRUDE_END_TAG.data(), EXTRUDE_END_TAG.length(), true); GCodeG1Formatter feedrate_formatter; feedrate_formatter.emit_f(new_feedrate); diff --git a/src/libslic3r/GCode/PressureEqualizer.hpp b/src/libslic3r/GCode/PressureEqualizer.hpp index 2ae4167a7a..d6b7f2a4f1 100644 --- a/src/libslic3r/GCode/PressureEqualizer.hpp +++ b/src/libslic3r/GCode/PressureEqualizer.hpp @@ -81,6 +81,10 @@ private: bool m_retracted; bool m_use_relative_e_distances; + // Indicate if extrude set speed block was opened using the tag ";_EXTRUDE_SET_SPEED" + // or not (not opened, or it was closed using the tag ";_EXTRUDE_END"). + bool opened_extrude_set_speed_block = false; + enum GCodeLineType { GCODELINETYPE_INVALID, GCODELINETYPE_NOOP, @@ -139,7 +143,7 @@ private: // X,Y,Z,E,F. Storing the state of the currently active extruder only. float pos_start[5]; float pos_end[5]; - // Was the axis found on the G-code line? X,Y,Z,F + // Was the axis found on the G-code line? X,Y,Z,E,F bool pos_provided[5]; // Index of the active extruder. @@ -158,11 +162,17 @@ private: // If set to zero, the slope is unlimited. float max_volumetric_extrusion_rate_slope_positive; float max_volumetric_extrusion_rate_slope_negative; + + bool adjustable_flow = false; + + bool extrude_set_speed_tag = false; + bool extrude_end_tag = false; }; // Output buffer will only grow. It will not be reallocated over and over. std::vector output_buffer; size_t output_buffer_length; + size_t output_buffer_prev_length; #ifdef PRESSURE_EQUALIZER_DEBUG // For debugging purposes. Index of the G-code line processed. @@ -170,7 +180,7 @@ private: #endif bool process_line(const char *line, const char *line_end, GCodeLine &buf); - void output_gcode_line(GCodeLine &buf); + void output_gcode_line(size_t line_idx); // Go back from the current circular_buffer_pos and lower the feedtrate to decrease the slope of the extrusion rate changes. // Then go forward and adjust the feedrate to decrease the slope of the extrusion rate changes. @@ -181,7 +191,7 @@ private: inline void push_to_output(const std::string &text, bool add_eol); inline void push_to_output(const char *text, size_t len, bool add_eol = true); // Push a G-code line to the output. - void push_line_to_output(const GCodeLine &line, float new_feedrate, const char *comment); + void push_line_to_output(size_t line_idx, float new_feedrate, const char *comment); public: std::queue m_layer_results; diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp index 39d4435bbd..88d73277ce 100644 --- a/src/libslic3r/GCode/SeamPlacer.cpp +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -319,7 +319,7 @@ struct GlobalModelInfo { return 1.0f; } - auto compute_dist_to_plane = [](const Vec3f& position, const Vec3f& plane_origin, const Vec3f& plane_normal) { + auto compute_dist_to_plane = [](const Vec3f &position, const Vec3f &plane_origin, const Vec3f &plane_normal) { Vec3f orig_to_point = position - plane_origin; return std::abs(orig_to_point.dot(plane_normal)); }; @@ -403,9 +403,9 @@ Polygons extract_perimeter_polygons(const Layer *layer, const SeamPosition confi if (ex_entity->is_collection()) { //collection of inner, outer, and overhang perimeters for (const ExtrusionEntity *perimeter : static_cast(ex_entity)->entities) { ExtrusionRole role = perimeter->role(); - if (perimeter->is_loop()){ - for (const ExtrusionPath& path : static_cast(perimeter)->paths){ - if (path.role() == ExtrusionRole::erExternalPerimeter){ + if (perimeter->is_loop()) { + for (const ExtrusionPath &path : static_cast(perimeter)->paths) { + if (path.role() == ExtrusionRole::erExternalPerimeter) { role = ExtrusionRole::erExternalPerimeter; } } @@ -449,12 +449,13 @@ Polygons extract_perimeter_polygons(const Layer *layer, const SeamPosition confi //each SeamCandidate also contains pointer to shared Perimeter structure representing the polygon // if Custom Seam modifiers are present, oversamples the polygon if necessary to better fit user intentions void process_perimeter_polygon(const Polygon &orig_polygon, float z_coord, const LayerRegion *region, - bool arachne_generated, const GlobalModelInfo &global_model_info, PrintObjectSeamData::LayerSeams &result) { + const GlobalModelInfo &global_model_info, PrintObjectSeamData::LayerSeams &result) { if (orig_polygon.size() == 0) { return; } Polygon polygon = orig_polygon; bool was_clockwise = polygon.make_counter_clockwise(); + float angle_arm_len = region != nullptr ? region->flow(FlowRole::frExternalPerimeter).nozzle_diameter() : 0.5f; std::vector lengths { }; for (size_t point_idx = 0; point_idx < polygon.size() - 1; ++point_idx) { @@ -462,27 +463,7 @@ void process_perimeter_polygon(const Polygon &orig_polygon, float z_coord, const } lengths.push_back(std::max((unscale(polygon[0]) - unscale(polygon[polygon.size() - 1])).norm(), 0.1)); std::vector polygon_angles = calculate_polygon_angles_at_vertices(polygon, lengths, - SeamPlacer::polygon_local_angles_arm_distance); - - // resample smooth surfaces from arachne, so that alignment finds short path down, and does not create unnecesary curves - if (arachne_generated && std::all_of(polygon_angles.begin(), polygon_angles.end(), [](float angle) { - return compute_angle_penalty(angle) > SeamPlacer::sharp_angle_penalty_snapping_threshold; - })) { - float total_dist = std::accumulate(lengths.begin(), lengths.end(), 0.0f); - float avg_dist = total_dist / float(lengths.size()); - if (avg_dist < SeamPlacer::seam_align_tolerable_dist * 2.0f){ - coord_t sampling_dist = scaled(avg_dist*0.2f); - - polygon.points = polygon.equally_spaced_points(sampling_dist); - lengths.clear(); - for (size_t point_idx = 0; point_idx < polygon.size() - 1; ++point_idx) { - lengths.push_back((unscale(polygon[point_idx]) - unscale(polygon[point_idx + 1])).norm()); - } - lengths.push_back(std::max((unscale(polygon[0]) - unscale(polygon[polygon.size() - 1])).norm(), 0.1)); - polygon_angles = calculate_polygon_angles_at_vertices(polygon, lengths, avg_dist); - } - } - + angle_arm_len); result.perimeters.push_back( { }); Perimeter &perimeter = result.perimeters.back(); @@ -540,50 +521,72 @@ void process_perimeter_polygon(const Polygon &orig_polygon, float z_coord, const result.points.emplace_back(position, perimeter, local_ccw_angle, type); } - perimeter.end_index = result.points.size() - 1; + perimeter.end_index = result.points.size(); - // We will find first patch of enforced points (patch: continuous section of enforced points) and select the middle - // point, which will have priority during alignment - // If there are multiple enforced patches in the perimeter, others are ignored if (some_point_enforced) { - size_t perimeter_size = perimeter.end_index - perimeter.start_index + 1; + // We will patches of enforced points (patch: continuous section of enforced points), choose + // the longest patch, and select the middle point or sharp point (depending on the angle) + // this point will have high priority on this perimeter + size_t perimeter_size = perimeter.end_index - perimeter.start_index; const auto next_index = [&](size_t idx) { return perimeter.start_index + Slic3r::next_idx_modulo(idx - perimeter.start_index, perimeter_size); }; - size_t first_enforced_idx = perimeter.start_index; - for (size_t _ = 0; _ < perimeter_size; ++_) { - if (result.points[first_enforced_idx].type != EnforcedBlockedSeamPoint::Enforced && - result.points[next_index(first_enforced_idx)].type == EnforcedBlockedSeamPoint::Enforced) { - break; + std::vector patches_starts_ends; + for (size_t i = perimeter.start_index; i < perimeter.end_index; ++i) { + if (result.points[i].type != EnforcedBlockedSeamPoint::Enforced && + result.points[next_index(i)].type == EnforcedBlockedSeamPoint::Enforced) { + patches_starts_ends.push_back(next_index(i)); + } + if (result.points[i].type == EnforcedBlockedSeamPoint::Enforced && + result.points[next_index(i)].type != EnforcedBlockedSeamPoint::Enforced) { + patches_starts_ends.push_back(next_index(i)); } - first_enforced_idx = next_index(first_enforced_idx); } - first_enforced_idx = next_index(first_enforced_idx); - - // Gather also points with large angles (these are points from the original mesh, since oversampled points have zero angle) - // If there are any, the middle point will be picked from those (makes drawing over sharp corners easier) - std::vector orig_large_angle_points_indices { }; - std::vector viable_points_indices { }; - size_t last_enforced_idx = first_enforced_idx; - for (size_t _ = 0; _ < perimeter_size; ++_) { - if (result.points[last_enforced_idx].type != EnforcedBlockedSeamPoint::Enforced) { - break; + //if patches_starts_ends are empty, it means that the whole perimeter is enforced.. don't do anything in that case + if (!patches_starts_ends.empty()) { + //if the first point in the patches is not enforced, it marks a patch end. in that case, put it to the end and start on next + // to simplify the processing + assert(patches_starts_ends.size() % 2 == 0); + bool start_on_second = false; + if (result.points[patches_starts_ends[0]].type != EnforcedBlockedSeamPoint::Enforced) { + start_on_second = true; + patches_starts_ends.push_back(patches_starts_ends[0]); } - viable_points_indices.push_back(last_enforced_idx); - if (compute_angle_penalty(result.points[last_enforced_idx].local_ccw_angle) - < SeamPlacer::sharp_angle_penalty_snapping_threshold) { - orig_large_angle_points_indices.push_back(last_enforced_idx); + //now pick the longest patch + std::pair longest_patch { 0, 0 }; + auto patch_len = [perimeter_size](const std::pair &start_end) { + if (start_end.second < start_end.first) { + return start_end.first + (perimeter_size - start_end.second); + } else { + return start_end.second - start_end.first; + } + }; + for (size_t patch_idx = start_on_second ? 1 : 0; patch_idx < patches_starts_ends.size(); patch_idx += 2) { + std::pair current_patch { patches_starts_ends[patch_idx], patches_starts_ends[patch_idx + + 1] }; + if (patch_len(longest_patch) < patch_len(current_patch)) { + longest_patch = current_patch; + } + } + std::vector viable_points_indices; + std::vector large_angle_points_indices; + for (size_t point_idx = longest_patch.first; point_idx != longest_patch.second; + point_idx = next_index(point_idx)) { + viable_points_indices.push_back(point_idx); + if (std::abs(result.points[point_idx].local_ccw_angle) + > SeamPlacer::sharp_angle_snapping_threshold) { + large_angle_points_indices.push_back(point_idx); + } + } + assert(viable_points_indices.size() > 0); + if (large_angle_points_indices.empty()) { + size_t central_idx = viable_points_indices[viable_points_indices.size() / 2]; + result.points[central_idx].central_enforcer = true; + } else { + size_t central_idx = large_angle_points_indices.size() / 2; + result.points[large_angle_points_indices[central_idx]].central_enforcer = true; } - last_enforced_idx = next_index(last_enforced_idx); - } - assert(viable_points_indices.size() > 0); - if (orig_large_angle_points_indices.empty()) { - size_t central_idx = viable_points_indices[viable_points_indices.size() / 2]; - result.points[central_idx].central_enforcer = true; - } else { - size_t central_idx = orig_large_angle_points_indices.size() / 2; - result.points[orig_large_angle_points_indices[central_idx]].central_enforcer = true; } } @@ -603,7 +606,7 @@ std::pair find_previous_and_next_perimeter_point(const std::vect prev = current.perimeter.end_index; } - if (point_index == current.perimeter.end_index) { + if (point_index == current.perimeter.end_index - 1) { // if point_index is equal to end, than next neighbour is at the start next = current.perimeter.start_index; } @@ -731,7 +734,8 @@ struct SeamComparator { float angle_importance; explicit SeamComparator(SeamPosition setup) : setup(setup) { - angle_importance = setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned; + angle_importance = + setup == spNearest ? SeamPlacer::angle_importance_nearest : SeamPlacer::angle_importance_aligned; } // Standard comparator, must respect the requirements of comparators (e.g. give same result on same inputs) for sorting usage @@ -748,8 +752,7 @@ struct SeamComparator { } //avoid overhangs - if (a.overhang > SeamPlacer::overhang_distance_tolerance_factor * a.perimeter.flow_width || - b.overhang > SeamPlacer::overhang_distance_tolerance_factor * b.perimeter.flow_width) { + if (a.overhang > 0.0f || b.overhang > 0.0f) { return a.overhang < b.overhang; } @@ -773,10 +776,10 @@ struct SeamComparator { } // the penalites are kept close to range [0-1.x] however, it should not be relied upon - float penalty_a = a.visibility + + float penalty_a = a.overhang + a.visibility + angle_importance * compute_angle_penalty(a.local_ccw_angle) + distance_penalty_a; - float penalty_b = b.visibility + + float penalty_b = b.overhang + b.visibility + angle_importance * compute_angle_penalty(b.local_ccw_angle) + distance_penalty_b; @@ -806,8 +809,8 @@ struct SeamComparator { } //avoid overhangs - if (a.overhang > SeamPlacer::overhang_distance_tolerance_factor * a.perimeter.flow_width || - b.overhang > SeamPlacer::overhang_distance_tolerance_factor * b.perimeter.flow_width) { + if ((a.overhang > 0.0f || b.overhang > 0.0f) + && abs(a.overhang - b.overhang) > (0.1f * a.perimeter.flow_width)) { return a.overhang < b.overhang; } @@ -827,9 +830,9 @@ struct SeamComparator { return a.position.y() + SeamPlacer::seam_align_score_tolerance * 5.0f > b.position.y(); } - float penalty_a = a.visibility + float penalty_a = a.overhang + a.visibility + angle_importance * compute_angle_penalty(a.local_ccw_angle); - float penalty_b = b.visibility + + float penalty_b = b.overhang + b.visibility + angle_importance * compute_angle_penalty(b.local_ccw_angle); return penalty_a <= penalty_b || penalty_a - penalty_b < SeamPlacer::seam_align_score_tolerance; @@ -838,13 +841,6 @@ struct SeamComparator { bool are_similar(const SeamCandidate &a, const SeamCandidate &b) const { return is_first_not_much_worse(a, b) && is_first_not_much_worse(b, a); } - - float weight(const SeamCandidate &a) const { - if (setup == SeamPosition::spAligned && a.central_enforcer) { - return 2.0f; - } - return a.visibility + angle_importance * compute_angle_penalty(a.local_ccw_angle) / (1.0f + angle_importance); - } }; #ifdef DEBUG_FILES @@ -868,8 +864,8 @@ void debug_export_points(const std::vector &lay min_vis = std::min(min_vis, point.visibility); max_vis = std::max(max_vis, point.visibility); - min_weight = std::min(min_weight, -comparator.compute_angle_penalty(point.local_ccw_angle)); - max_weight = std::max(max_weight, -comparator.compute_angle_penalty(point.local_ccw_angle)); + min_weight = std::min(min_weight, -compute_angle_penalty(point.local_ccw_angle)); + max_weight = std::max(max_weight, -compute_angle_penalty(point.local_ccw_angle)); } @@ -890,7 +886,7 @@ void debug_export_points(const std::vector &lay visibility_svg.draw(scaled(Vec2f(point.position.head<2>())), visibility_fill); Vec3i weight_color = value_to_rgbi(min_weight, max_weight, - -comparator.compute_angle_penalty(point.local_ccw_angle)); + -compute_angle_penalty(point.local_ccw_angle)); std::string weight_fill = "rgb(" + std::to_string(weight_color.x()) + "," + std::to_string(weight_color.y()) + "," + std::to_string(weight_color.z()) + ")"; @@ -913,7 +909,7 @@ void pick_seam_point(std::vector &perimeter_points, size_t start_ size_t end_index = perimeter_points[start_index].perimeter.end_index; size_t seam_index = start_index; - for (size_t index = start_index; index <= end_index; ++index) { + for (size_t index = start_index; index < end_index; ++index) { if (comparator.is_first_better(perimeter_points[index], perimeter_points[seam_index])) { seam_index = index; } @@ -927,7 +923,7 @@ size_t pick_nearest_seam_point_index(const std::vector &perimeter SeamComparator comparator { spNearest }; size_t seam_index = start_index; - for (size_t index = start_index; index <= end_index; ++index) { + for (size_t index = start_index; index < end_index; ++index) { if (comparator.is_first_better(perimeter_points[index], perimeter_points[seam_index], preffered_location)) { seam_index = index; } @@ -954,10 +950,14 @@ void pick_random_seam_point(const std::vector &perimeter_points, }; std::vector viables; - for (size_t index = start_index; index <= end_index; ++index) { + const Vec3f pseudornd_seed = perimeter_points[viable_example_index].position; + float rand = std::abs(sin(pseudornd_seed.dot(Vec3f(12.9898f,78.233f, 133.3333f))) * 43758.5453f); + rand = rand - (int) rand; + + for (size_t index = start_index; index < end_index; ++index) { if (comparator.are_similar(perimeter_points[index], perimeter_points[viable_example_index])) { // index ok, push info into viables - Vec3f edge_to_next { perimeter_points[index == end_index ? start_index : index + 1].position + Vec3f edge_to_next { perimeter_points[index == end_index - 1 ? start_index : index + 1].position - perimeter_points[index].position }; float dist_to_next = edge_to_next.norm(); viables.push_back( { index, dist_to_next, edge_to_next }); @@ -970,7 +970,7 @@ void pick_random_seam_point(const std::vector &perimeter_points, viable_example_index = index; viables.clear(); - Vec3f edge_to_next = (perimeter_points[index == end_index ? start_index : index + 1].position + Vec3f edge_to_next = (perimeter_points[index == end_index - 1 ? start_index : index + 1].position - perimeter_points[index].position); float dist_to_next = edge_to_next.norm(); viables.push_back( { index, dist_to_next, edge_to_next }); @@ -981,7 +981,7 @@ void pick_random_seam_point(const std::vector &perimeter_points, float len_sum = std::accumulate(viables.begin(), viables.end(), 0.0f, [](const float acc, const Viable &v) { return acc + v.edge_length; }); - float picked_len = len_sum * (rand() / (float(RAND_MAX) + 1)); + float picked_len = len_sum * rand; size_t point_idx = 0; while (picked_len - viables[point_idx].edge_length > 0) { @@ -1002,11 +1002,7 @@ class PerimeterDistancer { public: PerimeterDistancer(const Layer *layer) { - static const float eps = float(scale_(layer->object()->config().slice_closing_radius.value)); - // merge with offset - ExPolygons merged = layer->merged(eps); - // ofsset back - ExPolygons layer_outline = offset_ex(merged, -eps); + ExPolygons layer_outline = layer->lslices; for (const ExPolygon &island : layer_outline) { assert(island.contour.is_counter_clockwise()); for (const auto &line : island.contour.lines()) { @@ -1022,10 +1018,10 @@ public: tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines); } - float distance_from_perimeter(const Point &point) const { - Vec2d p = unscale(point); - size_t hit_idx_out; - Vec2d hit_point_out; + float distance_from_perimeter(const Vec2f &point) const { + Vec2d p = point.cast(); + size_t hit_idx_out { }; + Vec2d hit_point_out = Vec2d::Zero(); auto distance = AABBTreeLines::squared_distance_to_indexed_lines(lines, tree, p, hit_idx_out, hit_point_out); if (distance < 0) { return std::numeric_limits::max(); @@ -1051,14 +1047,12 @@ public: void SeamPlacer::gather_seam_candidates(const PrintObject *po, const SeamPlacerImpl::GlobalModelInfo &global_model_info, const SeamPosition configured_seam_preference) { using namespace SeamPlacerImpl; - bool arachne_generated = po->config().perimeter_generator == PerimeterGeneratorType::Arachne; - PrintObjectSeamData &seam_data = m_seam_per_object.emplace(po, PrintObjectSeamData { }).first->second; seam_data.layers.resize(po->layer_count()); tbb::parallel_for(tbb::blocked_range(0, po->layers().size()), - [po, configured_seam_preference, arachne_generated, &global_model_info, &seam_data] - (tbb::blocked_range r) { + [po, configured_seam_preference, &global_model_info, &seam_data] + (tbb::blocked_range r) { for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { PrintObjectSeamData::LayerSeams &layer_seams = seam_data.layers[layer_idx]; const Layer *layer = po->get_layer(layer_idx); @@ -1068,7 +1062,7 @@ void SeamPlacer::gather_seam_candidates(const PrintObject *po, Polygons polygons = extract_perimeter_polygons(layer, configured_seam_preference, regions); for (size_t poly_index = 0; poly_index < polygons.size(); ++poly_index) { process_perimeter_polygon(polygons[poly_index], unscaled_z, - regions[poly_index], arachne_generated, global_model_info, layer_seams); + regions[poly_index], global_model_info, layer_seams); } auto functor = SeamCandidateCoordinateFunctor { layer_seams.points }; seam_data.layers[layer_idx].points_tree = @@ -1117,13 +1111,19 @@ void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po) std::unique_ptr current_layer_distancer = std::make_unique(po->layers()[layer_idx]); for (SeamCandidate &perimeter_point : layers[layer_idx].points) { - Point point = Point::new_scale(Vec2f { perimeter_point.position.head<2>() }); + Vec2f point = Vec2f { perimeter_point.position.head<2>() }; if (prev_layer_distancer.get() != nullptr) { - perimeter_point.overhang = prev_layer_distancer->distance_from_perimeter(point); + perimeter_point.overhang = prev_layer_distancer->distance_from_perimeter(point) + + 0.6f * perimeter_point.perimeter.flow_width + - tan(SeamPlacer::overhang_angle_threshold) + * po->layers()[layer_idx]->height; + perimeter_point.overhang = + perimeter_point.overhang < 0.0f ? 0.0f : perimeter_point.overhang; } if (should_compute_layer_embedding) { // search for embedded perimeter points (points hidden inside the print ,e.g. multimaterial join, best position for seam) - perimeter_point.embedded_distance = current_layer_distancer->distance_from_perimeter(point); + perimeter_point.embedded_distance = current_layer_distancer->distance_from_perimeter(point) + + 0.6f * perimeter_point.perimeter.flow_width; } } @@ -1142,7 +1142,7 @@ void SeamPlacer::calculate_overhangs_and_layer_embedding(const PrintObject *po) // Used by align_seam_points(). std::optional> SeamPlacer::find_next_seam_in_layer( const std::vector &layers, - const Vec3f& projected_position, + const Vec3f &projected_position, const size_t layer_idx, const float max_distance, const SeamPlacerImpl::SeamComparator &comparator) const { using namespace SeamPlacerImpl; @@ -1205,9 +1205,7 @@ std::optional> SeamPlacer::find_next_seam_in_layer( } std::vector> SeamPlacer::find_seam_string(const PrintObject *po, - std::pair start_seam, const SeamPlacerImpl::SeamComparator &comparator, - float& string_weight) const { - string_weight = 0.0f; + std::pair start_seam, const SeamPlacerImpl::SeamComparator &comparator) const { const std::vector &layers = m_seam_per_object.find(po)->second.layers; int layer_idx = start_seam.first; @@ -1230,7 +1228,8 @@ std::vector> SeamPlacer::find_seam_string(const PrintO break; } } - float max_distance = SeamPlacer::seam_align_tolerable_dist; + float max_distance = SeamPlacer::seam_align_tolerable_dist_factor * + layers[start_seam.first].points[start_seam.second].perimeter.flow_width; Vec3f prev_position = layers[prev_point_index.first].points[prev_point_index.second].position; Vec3f projected_position = prev_position; projected_position.z() = float(po->get_layer(next_layer)->slice_z); @@ -1241,11 +1240,6 @@ std::vector> SeamPlacer::find_seam_string(const PrintO if (maybe_next_seam.has_value()) { // For old macOS (pre 10.14), std::optional does not have .value() method, so the code is using operator*() instead. - std::pair next_seam_coords = maybe_next_seam.operator*(); - const auto &next_seam = layers[next_seam_coords.first].points[next_seam_coords.second]; - bool is_moved = next_seam.perimeter.seam_index != next_seam_coords.second; - string_weight += comparator.weight(next_seam) - - is_moved ? comparator.weight(layers[next_seam_coords.first].points[next_seam.perimeter.seam_index]) : 0.0f; seam_string.push_back(maybe_next_seam.operator*()); prev_point_index = seam_string.back(); //String added, prev_point_index updated @@ -1253,15 +1247,14 @@ std::vector> SeamPlacer::find_seam_string(const PrintO if (step == 1) { reverse_lookup_direction(); if (next_layer < 0) { - break; - } + break; + } } else { break; } } next_layer += step; } - return seam_string; } @@ -1300,7 +1293,7 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl:: size_t current_point_index = 0; while (current_point_index < layer_perimeter_points.size()) { seams.emplace_back(layer_idx, layer_perimeter_points[current_point_index].perimeter.seam_index); - current_point_index = layer_perimeter_points[current_point_index].perimeter.end_index + 1; + current_point_index = layer_perimeter_points[current_point_index].perimeter.end_index; } } @@ -1331,18 +1324,15 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl:: // This perimeter is already aligned, skip seam continue; } else { - float seam_string_weight; - seam_string = this->find_seam_string(po, { layer_idx, seam_index }, comparator, seam_string_weight); + seam_string = this->find_seam_string(po, { layer_idx, seam_index }, comparator); size_t step_size = 1 + seam_string.size() / 20; - for (size_t alternative_start = 0; alternative_start < seam_string.size(); alternative_start+=step_size) { - float alternative_seam_string_weight = 0; + for (size_t alternative_start = 0; alternative_start < seam_string.size(); alternative_start += step_size) { size_t start_layer_idx = seam_string[alternative_start].first; - size_t seam_idx = layers[start_layer_idx].points[seam_string[alternative_start].second].perimeter.seam_index; - alternative_seam_string = this->find_seam_string(po, std::pair(start_layer_idx, seam_idx), comparator, - alternative_seam_string_weight); - if (alternative_seam_string.size() >= SeamPlacer::seam_align_minimum_string_seams && - alternative_seam_string_weight > seam_string_weight) { - seam_string_weight = alternative_seam_string_weight; + size_t seam_idx = + layers[start_layer_idx].points[seam_string[alternative_start].second].perimeter.seam_index; + alternative_seam_string = this->find_seam_string(po, + std::pair(start_layer_idx, seam_idx), comparator); + if (alternative_seam_string.size() > seam_string.size()) { seam_string = std::move(alternative_seam_string); } } @@ -1361,36 +1351,60 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl:: //repeat the alignment for the current seam, since it could be skipped due to alternative path being aligned. global_index--; - // gather all positions of seams and their weights (weights are derived as negative penalty, they are made positive in next step) + // gather all positions of seams and their weights observations.resize(seam_string.size()); observation_points.resize(seam_string.size()); weights.resize(seam_string.size()); + auto angle_3d = [](const Vec3f& a, const Vec3f& b){ + return std::abs(acosf(a.normalized().dot(b.normalized()))); + }; + + auto angle_weight = [](float angle){ + return 1.0f / (0.1f + compute_angle_penalty(angle)); + }; + //gather points positions and weights float total_length = 0.0f; Vec3f last_point_pos = layers[seam_string[0].first].points[seam_string[0].second].position; for (size_t index = 0; index < seam_string.size(); ++index) { - Vec3f pos = layers[seam_string[index].first].points[seam_string[index].second].position; - total_length += (last_point_pos - pos).norm(); - last_point_pos = pos; - observations[index] = pos.head<2>(); - observation_points[index] = pos.z(); - weights[index] = comparator.weight(layers[seam_string[index].first].points[seam_string[index].second]); + const SeamCandidate ¤t = layers[seam_string[index].first].points[seam_string[index].second]; + float layer_angle = 0.0f; + if (index > 0 && index < seam_string.size() - 1) { + layer_angle = angle_3d( + current.position + - layers[seam_string[index - 1].first].points[seam_string[index - 1].second].position, + layers[seam_string[index + 1].first].points[seam_string[index + 1].second].position + - current.position + ); + } + observations[index] = current.position.head<2>(); + observation_points[index] = current.position.z(); + weights[index] = angle_weight(current.local_ccw_angle); + float sign = layer_angle > 2.0 * std::abs(current.local_ccw_angle) ? -0.8f : 1.0f; + if (current.type == EnforcedBlockedSeamPoint::Enforced) { + sign = 1.0f; + weights[index] += 3.0f; + } + total_length += sign * (last_point_pos - current.position).norm(); + last_point_pos = current.position; } // Curve Fitting size_t number_of_segments = std::max(size_t(1), - size_t(total_length / SeamPlacer::seam_align_mm_per_segment)); + size_t(std::max(0.0f,total_length) / SeamPlacer::seam_align_mm_per_segment)); auto curve = Geometry::fit_cubic_bspline(observations, observation_points, weights, number_of_segments); // Do alignment - compute fitted point for each point in the string from its Z coord, and store the position into // Perimeter structure of the point; also set flag aligned to true for (size_t index = 0; index < seam_string.size(); ++index) { const auto &pair = seam_string[index]; - const float t = - compute_angle_penalty(layers[pair.first].points[pair.second].local_ccw_angle) - < SeamPlacer::sharp_angle_penalty_snapping_threshold - ? 0.8f : 0.0f; + float t = std::min(1.0f, std::pow(std::abs(layers[pair.first].points[pair.second].local_ccw_angle) + / SeamPlacer::sharp_angle_snapping_threshold, 3.0f)); + if (layers[pair.first].points[pair.second].type == EnforcedBlockedSeamPoint::Enforced){ + t = std::max(0.4f, t); + } + Vec3f current_pos = layers[pair.first].points[pair.second].position; Vec2f fitted_pos = curve.get_fitted_value(current_pos.z()); @@ -1483,7 +1497,7 @@ void SeamPlacer::init(const Print &print, std::function throw_if_can for (size_t layer_idx = r.begin(); layer_idx < r.end(); ++layer_idx) { std::vector &layer_perimeter_points = layers[layer_idx].points; for (size_t current = 0; current < layer_perimeter_points.size(); - current = layer_perimeter_points[current].perimeter.end_index + 1) + current = layer_perimeter_points[current].perimeter.end_index) if (configured_seam_preference == spRandom) pick_random_seam_point(layer_perimeter_points, current); else @@ -1519,16 +1533,40 @@ void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool extern const size_t layer_index = layer->id() - po->slicing_parameters().raft_layers(); const double unscaled_z = layer->slice_z; + auto get_next_loop_point = [&loop](ExtrusionLoop::ClosestPathPoint current) { + current.segment_idx += 1; + if (current.segment_idx >= loop.paths[current.path_idx].polyline.points.size()) { + current.path_idx = next_idx_modulo(current.path_idx, loop.paths.size()); + current.segment_idx = 0; + } + current.foot_pt = loop.paths[current.path_idx].polyline.points[current.segment_idx]; + return current; + }; + const PrintObjectSeamData::LayerSeams &layer_perimeters = m_seam_per_object.find(layer->object())->second.layers[layer_index]; - // Find the closest perimeter in the SeamPlacer to the first point of this loop. - size_t closest_perimeter_point_index; - { - const Point &fp = loop.first_point(); - Vec2f unscaled_p = unscaled(fp); - closest_perimeter_point_index = find_closest_point(*layer_perimeters.points_tree.get(), - to_3d(unscaled_p, float(unscaled_z))); + // Find the closest perimeter in the SeamPlacer to this loop. + // Repeat search until two consecutive points of the loop are found, that result in the same closest_perimeter + // This is beacuse with arachne, T-Junctions may exist and sometimes the wrong perimeter was chosen + size_t closest_perimeter_point_index = 0; + { // local space for the closest_perimeter_point_index + Perimeter *closest_perimeter = nullptr; + ExtrusionLoop::ClosestPathPoint closest_point{0,0,loop.paths[0].polyline.points[0]}; + size_t points_count = std::accumulate(loop.paths.begin(), loop.paths.end(), 0, [](size_t acc,const ExtrusionPath& p) { + return acc + p.polyline.points.size(); + }); + for (size_t _ = 0; _ < points_count; ++_) { + Vec2f unscaled_p = unscaled(closest_point.foot_pt); + closest_perimeter_point_index = find_closest_point(*layer_perimeters.points_tree.get(), + to_3d(unscaled_p, float(unscaled_z))); + if (closest_perimeter != &layer_perimeters.points[closest_perimeter_point_index].perimeter) { + closest_perimeter = &layer_perimeters.points[closest_perimeter_point_index].perimeter; + closest_point = get_next_loop_point(closest_point); + } else { + break; + } + } } Vec3f seam_position; @@ -1557,12 +1595,12 @@ void SeamPlacer::place_seam(const Layer *layer, ExtrusionLoop &loop, bool extern // the internal seam into the concave corner, and not on the perpendicular projection on the closest edge (which is what the split_at function does) size_t index_of_prev = seam_index == perimeter_point.perimeter.start_index ? - perimeter_point.perimeter.end_index : + perimeter_point.perimeter.end_index - 1 : seam_index - 1; size_t index_of_next = - seam_index == perimeter_point.perimeter.end_index ? - perimeter_point.perimeter.start_index : - seam_index + 1; + seam_index == perimeter_point.perimeter.end_index - 1 ? + perimeter_point.perimeter.start_index : + seam_index + 1; Vec2f dir_to_middle = ((perimeter_point.position - layer_perimeters.points[index_of_prev].position).head<2>().normalized() diff --git a/src/libslic3r/GCode/SeamPlacer.hpp b/src/libslic3r/GCode/SeamPlacer.hpp index 8def6b84bc..8d52fd79f9 100644 --- a/src/libslic3r/GCode/SeamPlacer.hpp +++ b/src/libslic3r/GCode/SeamPlacer.hpp @@ -39,16 +39,16 @@ enum class EnforcedBlockedSeamPoint { // struct representing single perimeter loop struct Perimeter { - size_t start_index; - size_t end_index; //inclusive! - size_t seam_index; - float flow_width; + size_t start_index{}; + size_t end_index{}; //inclusive! + size_t seam_index{}; + float flow_width{}; // During alignment, a final position may be stored here. In that case, finalized is set to true. // Note that final seam position is not limited to points of the perimeter loop. In theory it can be any position // Random position also uses this flexibility to set final seam point position bool finalized = false; - Vec3f final_seam_position; + Vec3f final_seam_position = Vec3f::Zero(); }; //Struct over which all processing of perimeters is done. For each perimeter point, its respective candidate is created, @@ -113,13 +113,10 @@ public: //square of number of rays per sample point static constexpr size_t sqr_rays_per_sample_point = 5; - // arm length used during angles computation - static constexpr float polygon_local_angles_arm_distance = 0.3f; - // value for angles with penalty lower than this threshold - such angles will be snapped to their original position instead of spline interpolated position - static constexpr float sharp_angle_penalty_snapping_threshold = 0.6f; - - // max tolerable distance from the previous layer is overhang_distance_tolerance_factor * flow_width - static constexpr float overhang_distance_tolerance_factor = 0.5f; + // snapping angle - angles larger than this value will be snapped to during seam painting + static constexpr float sharp_angle_snapping_threshold = 55.0f * float(PI) / 180.0f; + // overhang angle for seam placement that still yields good results, in degrees, measured from vertical direction + static constexpr float overhang_angle_threshold = 50.0f * float(PI) / 180.0f; // determines angle importance compared to visibility ( neutral value is 1.0f. ) static constexpr float angle_importance_aligned = 0.6f; @@ -131,8 +128,8 @@ public: // When searching for seam clusters for alignment: // following value describes, how much worse score can point have and still be picked into seam cluster instead of original seam point on the same layer static constexpr float seam_align_score_tolerance = 0.3f; - // seam_align_tolerable_dist - if next layer closest point is too far away, break aligned string - static constexpr float seam_align_tolerable_dist = 1.0f; + // seam_align_tolerable_dist_factor - how far to search for seam from current position, final dist is seam_align_tolerable_dist_factor * flow_width + static constexpr float seam_align_tolerable_dist_factor = 4.0f; // minimum number of seams needed in cluster to make alignment happen static constexpr size_t seam_align_minimum_string_seams = 6; // millimeters covered by spline; determines number of splines for the given string @@ -154,8 +151,7 @@ private: void align_seam_points(const PrintObject *po, const SeamPlacerImpl::SeamComparator &comparator); std::vector> find_seam_string(const PrintObject *po, std::pair start_seam, - const SeamPlacerImpl::SeamComparator &comparator, - float& string_weight) const; + const SeamPlacerImpl::SeamComparator &comparator) const; std::optional> find_next_seam_in_layer( const std::vector &layers, const Vec3f& projected_position, diff --git a/src/libslic3r/GCodeReader.cpp b/src/libslic3r/GCodeReader.cpp index 44b0b89f60..cd6cedf515 100644 --- a/src/libslic3r/GCodeReader.cpp +++ b/src/libslic3r/GCodeReader.cpp @@ -10,7 +10,6 @@ #include "LocalesUtils.hpp" -#include #include namespace Slic3r { @@ -37,14 +36,11 @@ void GCodeReader::apply_config(const DynamicPrintConfig &config) const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, GCodeLine &gline, std::pair &command) { - PROFILE_FUNC(); - assert(is_decimal_separator_point()); // command and args const char *c = ptr; { - PROFILE_BLOCK(command_and_args); // Skip the whitespaces. command.first = skip_whitespaces(c); // Skip the command. @@ -98,10 +94,8 @@ const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, G for (; ! is_end_of_line(*c); ++ c); // Copy the raw string including the comment, without the trailing newlines. - if (c > ptr) { - PROFILE_BLOCK(copy_raw_string); + if (c > ptr) gline.m_raw.assign(ptr, c); - } // Skip the trailing newlines. if (*c == '\r') @@ -117,7 +111,6 @@ const char* GCodeReader::parse_line_internal(const char *ptr, const char *end, G void GCodeReader::update_coordinates(GCodeLine &gline, std::pair &command) { - PROFILE_FUNC(); if (*command.first == 'G') { int cmd_len = int(command.second - command.first); if ((cmd_len == 2 && (command.first[1] == '0' || command.first[1] == '1')) || diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index c5279c0f56..c2caf57664 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -23,8 +23,8 @@ void GCodeWriter::apply_print_config(const PrintConfig &print_config) bool use_mach_limits = print_config.gcode_flavor.value == gcfMarlinLegacy || print_config.gcode_flavor.value == gcfMarlinFirmware || print_config.gcode_flavor.value == gcfRepRapFirmware; - m_max_acceleration = std::lrint((use_mach_limits && print_config.machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) ? - print_config.machine_max_acceleration_extruding.values.front() : 0); + m_max_acceleration = static_cast(std::round((use_mach_limits && print_config.machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) ? + print_config.machine_max_acceleration_extruding.values.front() : 0)); } void GCodeWriter::set_extruders(std::vector extruder_ids) diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 115d21693b..13878e9ec8 100644 --- a/src/libslic3r/Geometry.cpp +++ b/src/libslic3r/Geometry.cpp @@ -351,12 +351,22 @@ Transform3d rotation_transform(const Vec3d& rotation) return transform; } +void scale_transform(Transform3d& transform, double scale) +{ + return scale_transform(transform, scale * Vec3d::Ones()); +} + void scale_transform(Transform3d& transform, const Vec3d& scale) { transform = Transform3d::Identity(); transform.scale(scale); } +Transform3d scale_transform(double scale) +{ + return scale_transform(scale * Vec3d::Ones()); +} + Transform3d scale_transform(const Vec3d& scale) { Transform3d transform; @@ -567,7 +577,6 @@ void Transformation::set_scaling_factor(const Vec3d& scaling_factor) void Transformation::set_scaling_factor(Axis axis, double scaling_factor) { #if ENABLE_WORLD_COORDINATE - assert(scaling_factor > 0.0); auto [rotation, scale] = extract_rotation_scale(m_matrix); scale(axis, axis) = scaling_factor; diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index 4b685800da..d0ae84d86f 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -366,9 +366,11 @@ void rotation_transform(Transform3d& transform, const Vec3d& rotation); Transform3d rotation_transform(const Vec3d& rotation); // Sets the given transform by assembling the given scale factors +void scale_transform(Transform3d& transform, double scale); void scale_transform(Transform3d& transform, const Vec3d& scale); // Returns the transform obtained by assembling the given scale factors +Transform3d scale_transform(double scale); Transform3d scale_transform(const Vec3d& scale); // Returns the euler angles extracted from the given rotation matrix @@ -558,13 +560,13 @@ inline bool is_rotation_ninety_degrees(const Vec3d &rotation) return is_rotation_ninety_degrees(rotation.x()) && is_rotation_ninety_degrees(rotation.y()) && is_rotation_ninety_degrees(rotation.z()); } -template -std::pair dir_to_spheric(const Vec<3, T> &n, T norm = 1.) +template +std::pair dir_to_spheric(const Vec<3, Tin> &n, Tout norm = 1.) { - T z = n.z(); - T r = norm; - T polar = std::acos(z / r); - T azimuth = std::atan2(n(1), n(0)); + Tout z = n.z(); + Tout r = norm; + Tout polar = std::acos(z / r); + Tout azimuth = std::atan2(n(1), n(0)); return {polar, azimuth}; } diff --git a/src/libslic3r/Geometry/Curves.hpp b/src/libslic3r/Geometry/Curves.hpp index 6ccdea3663..f4a5a0067e 100644 --- a/src/libslic3r/Geometry/Curves.hpp +++ b/src/libslic3r/Geometry/Curves.hpp @@ -175,6 +175,19 @@ PiecewiseFittedCurve fit_curve( return result; } + +template +PiecewiseFittedCurve> +fit_linear_spline( + const std::vector> &observations, + std::vector observation_points, + std::vector weights, + size_t segments_count, + size_t endpoints_level_of_freedom = 0) { + return fit_curve>(observations, observation_points, weights, segments_count, + endpoints_level_of_freedom); +} + template PiecewiseFittedCurve> fit_cubic_bspline( diff --git a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp new file mode 100644 index 0000000000..062a3b3979 --- /dev/null +++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp @@ -0,0 +1,103 @@ +#include +#include +#include + +#include "libslic3r/Geometry/Voronoi.hpp" +#include "libslic3r/Arachne/utils/VoronoiUtils.hpp" + +#include "VoronoiUtilsCgal.hpp" + +using VD = Slic3r::Geometry::VoronoiDiagram; + +namespace Slic3r::Geometry { + +using CGAL_Point = CGAL::Exact_predicates_exact_constructions_kernel::Point_2; +using CGAL_Segment = CGAL::Arr_segment_traits_2::Curve_2; + +inline static CGAL_Point to_cgal_point(const VD::vertex_type &pt) { return {pt.x(), pt.y()}; } + +// FIXME Lukas H.: Also includes parabolic segments. +bool VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(const VD &voronoi_diagram) +{ + assert(std::all_of(voronoi_diagram.edges().cbegin(), voronoi_diagram.edges().cend(), + [](const VD::edge_type &edge) { return edge.color() == 0; })); + + std::vector segments; + segments.reserve(voronoi_diagram.num_edges()); + + for (const VD::edge_type &edge : voronoi_diagram.edges()) { + if (edge.color() != 0) + continue; + + if (edge.is_finite() && edge.is_linear() && edge.vertex0() != nullptr && edge.vertex1() != nullptr && + Arachne::VoronoiUtils::is_finite(*edge.vertex0()) && Arachne::VoronoiUtils::is_finite(*edge.vertex1())) { + segments.emplace_back(to_cgal_point(*edge.vertex0()), to_cgal_point(*edge.vertex1())); + edge.color(1); + assert(edge.twin() != nullptr); + edge.twin()->color(1); + } + } + + for (const VD::edge_type &edge : voronoi_diagram.edges()) + edge.color(0); + + std::vector intersections_pt; + CGAL::compute_intersection_points(segments.begin(), segments.end(), std::back_inserter(intersections_pt)); + return intersections_pt.empty(); +} + +static bool check_if_three_vectors_are_ccw(const CGAL_Point &common_pt, const CGAL_Point &pt_1, const CGAL_Point &pt_2, const CGAL_Point &test_pt) { + CGAL::Orientation orientation = CGAL::orientation(common_pt, pt_1, pt_2); + if (orientation == CGAL::Orientation::COLLINEAR) { + // The first two edges are collinear, so the third edge must be on the right side on the first of them. + return CGAL::orientation(common_pt, pt_1, test_pt) == CGAL::Orientation::RIGHT_TURN; + } else if (orientation == CGAL::Orientation::LEFT_TURN) { + // CCW oriented angle between vectors (common_pt, pt1) and (common_pt, pt2) is bellow PI. + // So we need to check if test_pt isn't between them. + CGAL::Orientation orientation1 = CGAL::orientation(common_pt, pt_1, test_pt); + CGAL::Orientation orientation2 = CGAL::orientation(common_pt, pt_2, test_pt); + return (orientation1 != CGAL::Orientation::LEFT_TURN || orientation2 != CGAL::Orientation::RIGHT_TURN); + } else { + assert(orientation == CGAL::Orientation::RIGHT_TURN); + // CCW oriented angle between vectors (common_pt, pt1) and (common_pt, pt2) is upper PI. + // So we need to check if test_pt is between them. + CGAL::Orientation orientation1 = CGAL::orientation(common_pt, pt_1, test_pt); + CGAL::Orientation orientation2 = CGAL::orientation(common_pt, pt_2, test_pt); + return (orientation1 == CGAL::Orientation::RIGHT_TURN || orientation2 == CGAL::Orientation::LEFT_TURN); + } +} + +bool VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(const VoronoiDiagram &voronoi_diagram) +{ + for (const VD::vertex_type &vertex : voronoi_diagram.vertices()) { + std::vector edges; + const VD::edge_type *edge = vertex.incident_edge(); + + do { + // FIXME Lukas H.: Also process parabolic segments. + if (edge->is_finite() && edge->is_linear() && edge->vertex0() != nullptr && edge->vertex1() != nullptr && + Arachne::VoronoiUtils::is_finite(*edge->vertex0()) && Arachne::VoronoiUtils::is_finite(*edge->vertex1())) + edges.emplace_back(edge); + + edge = edge->rot_next(); + } while (edge != vertex.incident_edge()); + + // Checking for CCW make sense for three and more edges. + if (edges.size() > 2) { + for (auto edge_it = edges.begin() ; edge_it != edges.end(); ++edge_it) { + const Geometry::VoronoiDiagram::edge_type *prev_edge = edge_it == edges.begin() ? edges.back() : *std::prev(edge_it); + const Geometry::VoronoiDiagram::edge_type *curr_edge = *edge_it; + const Geometry::VoronoiDiagram::edge_type *next_edge = std::next(edge_it) == edges.end() ? edges.front() : *std::next(edge_it); + + if (!check_if_three_vectors_are_ccw(to_cgal_point(*prev_edge->vertex0()), to_cgal_point(*prev_edge->vertex1()), + to_cgal_point(*curr_edge->vertex1()), to_cgal_point(*next_edge->vertex1()))) + return false; + } + } + } + + return true; +} + + +} // namespace Slic3r::Geometry \ No newline at end of file diff --git a/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp new file mode 100644 index 0000000000..897891bd93 --- /dev/null +++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.hpp @@ -0,0 +1,21 @@ +#ifndef slic3r_VoronoiUtilsCgal_hpp_ +#define slic3r_VoronoiUtilsCgal_hpp_ + +#include "Voronoi.hpp" + +namespace Slic3r::Geometry { +class VoronoiDiagram; + +class VoronoiUtilsCgal +{ +public: + // Check if the Voronoi diagram is planar using CGAL sweeping edge algorithm for enumerating all intersections between lines. + static bool is_voronoi_diagram_planar_intersection(const VoronoiDiagram &voronoi_diagram); + + // Check if the Voronoi diagram is planar using verification that all neighboring edges are ordered CCW for each vertex. + static bool is_voronoi_diagram_planar_angle(const VoronoiDiagram &voronoi_diagram); + +}; +} // namespace Slic3r::Geometry + +#endif // slic3r_VoronoiUtilsCgal_hpp_ diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 21de030cda..e11c740e6f 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -197,6 +197,8 @@ 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. ExPolygons support_islands; + // Slightly inflated bounding boxes of the above, for faster intersection query. + std::vector support_islands_bboxes; // 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 dfae5f1882..1996a58b57 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -101,7 +101,7 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec g.overhang_flow = this->bridging_flow(frPerimeter); g.solid_infill_flow = this->flow(frSolidInfill); - if (this->layer()->object()->config().perimeter_generator.value == PerimeterGeneratorType::Arachne) + if (this->layer()->object()->config().perimeter_generator.value == PerimeterGeneratorType::Arachne && !spiral_vase) g.process_arachne(); else g.process_classic(); @@ -386,10 +386,12 @@ void LayerRegion::prepare_fill_surfaces() bool spiral_vase = this->layer()->object()->print()->config().spiral_vase; // if no solid layers are requested, turn top/bottom surfaces to internal + // For Lightning infill, infill_only_where_needed is ignored because both + // do a similar thing, and their combination doesn't make much sense. 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; + surface.surface_type = this->layer()->object()->config().infill_only_where_needed && this->region().config().fill_pattern != ipLightning ? stInternalVoid : stInternal; } if (this->region().config().bottom_solid_layers == 0) { for (Surface &surface : this->fill_surfaces.surfaces) diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index 00ee1717f6..86b50d1562 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -274,7 +274,7 @@ void CGALMeshDeleter::operator()(CGALMesh *ptr) { delete ptr; } bool does_bound_a_volume(const CGALMesh &mesh) { - return CGALProc::does_bound_a_volume(mesh.m); + return CGAL::is_closed(mesh.m) && CGALProc::does_bound_a_volume(mesh.m); } bool empty(const CGALMesh &mesh) diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 1f8083aca6..97d8ea04b2 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -13,6 +13,7 @@ #include "Format/OBJ.hpp" #include "Format/STL.hpp" #include "Format/3mf.hpp" +#include "Format/STEP.hpp" #include @@ -114,13 +115,15 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c result = load_stl(input_file.c_str(), &model); else if (boost::algorithm::iends_with(input_file, ".obj")) result = load_obj(input_file.c_str(), &model); + else if (boost::algorithm::iends_with(input_file, ".step") || boost::algorithm::iends_with(input_file, ".stp")) + result = load_step(input_file.c_str(), &model); else if (boost::algorithm::iends_with(input_file, ".amf") || boost::algorithm::iends_with(input_file, ".amf.xml")) result = load_amf(input_file.c_str(), config, config_substitutions, &model, options & LoadAttribute::CheckVersion); else if (boost::algorithm::iends_with(input_file, ".3mf")) //FIXME options & LoadAttribute::CheckVersion ? result = load_3mf(input_file.c_str(), *config, *config_substitutions, &model, false); else - throw Slic3r::RuntimeError("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), .prusa or .step/.stp extension."); if (! result) throw Slic3r::RuntimeError("Loading of a model file failed."); diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index e447cf10c6..9cb287aa0a 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -611,6 +611,9 @@ public: // The triangular model. const TriangleMesh& mesh() const { return *m_mesh.get(); } +#if ENABLE_RAYCAST_PICKING + std::shared_ptr mesh_ptr() const { return m_mesh; } +#endif // ENABLE_RAYCAST_PICKING void set_mesh(const TriangleMesh &mesh) { m_mesh = std::make_shared(mesh); } void set_mesh(TriangleMesh &&mesh) { m_mesh = std::make_shared(std::move(mesh)); } void set_mesh(const indexed_triangle_set &mesh) { m_mesh = std::make_shared(mesh); } diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 0bbe601e20..e61f9097d1 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -10,21 +10,40 @@ #include #include #include +#include + +//#define ARACHNE_DEBUG + +#ifdef ARACHNE_DEBUG +#include "SVG.hpp" +#include "Utils.hpp" +#endif namespace Slic3r { -ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, const float tolerance, const float merge_tolerance) +ExtrusionMultiPath thick_polyline_to_multi_path(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, const float tolerance, const float merge_tolerance) { - ExtrusionPaths paths; - ExtrusionPath path(role); - ThickLines lines = thick_polyline.thicklines(); - + ExtrusionMultiPath multi_path; + ExtrusionPath path(role); + ThickLines lines = thick_polyline.thicklines(); + for (int i = 0; i < (int)lines.size(); ++i) { const ThickLine& line = lines[i]; assert(line.a_width >= SCALED_EPSILON && line.b_width >= SCALED_EPSILON); const coordf_t line_len = line.length(); - if (line_len < SCALED_EPSILON) continue; + if (line_len < SCALED_EPSILON) { + // The line is so tiny that we don't care about its width when we connect it to another line. + if (!path.empty()) + path.polyline.points.back() = line.b; // If the variable path is non-empty, connect this tiny line to it. + else if (i + 1 < (int)lines.size()) // If there is at least one following line, connect this tiny line to it. + lines[i + 1].a = line.a; + else if (!multi_path.paths.empty()) + multi_path.paths.back().polyline.points.back() = line.b; // Connect this tiny line to the last finished path. + + // If any of the above isn't satisfied, then remove this tiny line. + continue; + } double thickness_delta = fabs(line.a_width - line.b_width); if (thickness_delta > tolerance) { @@ -84,35 +103,38 @@ ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_poly path.polyline.append(line.b); } else { // we need to initialize a new line - paths.emplace_back(std::move(path)); + multi_path.paths.emplace_back(std::move(path)); path = ExtrusionPath(role); -- i; } } } if (path.polyline.is_valid()) - paths.emplace_back(std::move(path)); - return paths; + multi_path.paths.emplace_back(std::move(path)); + return multi_path; } -static void variable_width(const ThickPolylines& polylines, ExtrusionRole role, const Flow &flow, std::vector &out) +static void variable_width(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector &out) { - // This value determines granularity of adaptive width, as G-code does not allow - // variable extrusion within a single move; this value shall only affect the amount - // of segments, and any pruning shall be performed before we apply this tolerance. - const float tolerance = float(scale_(0.05)); - for (const ThickPolyline &p : polylines) { - ExtrusionPaths paths = thick_polyline_to_extrusion_paths(p, role, flow, tolerance, tolerance); - // Append paths to collection. - if (! paths.empty()) { - if (paths.front().first_point() == paths.back().last_point()) - out.emplace_back(new ExtrusionLoop(std::move(paths))); - else { - for (ExtrusionPath &path : paths) - out.emplace_back(new ExtrusionPath(std::move(path))); - } - } - } + // This value determines granularity of adaptive width, as G-code does not allow + // variable extrusion within a single move; this value shall only affect the amount + // of segments, and any pruning shall be performed before we apply this tolerance. + const auto tolerance = float(scale_(0.05)); + for (const ThickPolyline &p : polylines) { + ExtrusionMultiPath multi_path = thick_polyline_to_multi_path(p, role, flow, tolerance, tolerance); + // Append paths to collection. + if (!multi_path.paths.empty()) { + for (auto it = std::next(multi_path.paths.begin()); it != multi_path.paths.end(); ++it) { + assert(it->polyline.points.size() >= 2); + assert(std::prev(it)->polyline.last_point() == it->polyline.first_point()); + } + + if (multi_path.paths.front().first_point() == multi_path.paths.back().last_point()) + out.emplace_back(new ExtrusionLoop(std::move(multi_path.paths))); + else + out.emplace_back(new ExtrusionMultiPath(std::move(multi_path))); + } + } } // Hierarchy of perimeters. @@ -462,8 +484,40 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator &p // Reapply the nearest point search for starting point. // We allow polyline reversal because Clipper may have randomly reversed polylines during clipping. // Arachne sometimes creates extrusion with zero-length (just two same endpoints); - if (!paths.empty()) - chain_and_reorder_extrusion_paths(paths, &paths.front().first_point()); + if (!paths.empty()) { + Point start_point = paths.front().first_point(); + if (!extrusion->is_closed) { + // Especially for open extrusion, we need to select a starting point that is at the start + // or the end of the extrusions to make one continuous line. Also, we prefer a non-overhang + // starting point. + struct PointInfo + { + size_t occurrence = 0; + bool is_overhang = false; + }; + std::unordered_map point_occurrence; + for (const ExtrusionPath &path : paths) { + ++point_occurrence[path.polyline.first_point()].occurrence; + ++point_occurrence[path.polyline.last_point()].occurrence; + if (path.role() == erOverhangPerimeter) { + point_occurrence[path.polyline.first_point()].is_overhang = true; + point_occurrence[path.polyline.last_point()].is_overhang = true; + } + } + + // Prefer non-overhang point as a starting point. + for (const std::pair pt : point_occurrence) + if (pt.second.occurrence == 1) { + start_point = pt.first; + if (!pt.second.is_overhang) { + start_point = pt.first; + break; + } + } + } + + chain_and_reorder_extrusion_paths(paths, &start_point); + } } else { extrusion_paths_append(paths, *extrusion, role, is_external ? perimeter_generator.ext_perimeter_flow : perimeter_generator.perimeter_flow); } @@ -478,16 +532,62 @@ static ExtrusionEntityCollection traverse_extrusions(const PerimeterGenerator &p else extrusion_loop.make_clockwise(); + for (auto it = std::next(extrusion_loop.paths.begin()); it != extrusion_loop.paths.end(); ++it) { + assert(it->polyline.points.size() >= 2); + assert(std::prev(it)->polyline.last_point() == it->polyline.first_point()); + } + assert(extrusion_loop.paths.front().first_point() == extrusion_loop.paths.back().last_point()); + extrusion_coll.append(std::move(extrusion_loop)); - } else - for (ExtrusionPath &path : paths) - extrusion_coll.append(ExtrusionPath(std::move(path))); + } else { + // Because we are processing one ExtrusionLine all ExtrusionPaths should form one connected path. + // But there is possibility that due to numerical issue there is poss + assert([&paths = std::as_const(paths)]() -> bool { + for (auto it = std::next(paths.begin()); it != paths.end(); ++it) + if (std::prev(it)->polyline.last_point() != it->polyline.first_point()) + return false; + return true; + }()); + ExtrusionMultiPath multi_path; + multi_path.paths.emplace_back(std::move(paths.front())); + + for (auto it_path = std::next(paths.begin()); it_path != paths.end(); ++it_path) { + if (multi_path.paths.back().last_point() != it_path->first_point()) { + extrusion_coll.append(ExtrusionMultiPath(std::move(multi_path))); + multi_path = ExtrusionMultiPath(); + } + multi_path.paths.emplace_back(std::move(*it_path)); + } + + extrusion_coll.append(ExtrusionMultiPath(std::move(multi_path))); + } } } return extrusion_coll; } +#ifdef ARACHNE_DEBUG +static void export_perimeters_to_svg(const std::string &path, const Polygons &contours, const std::vector &perimeters, const ExPolygons &infill_area) +{ + coordf_t stroke_width = scale_(0.03); + BoundingBox bbox = get_extents(contours); + bbox.offset(scale_(1.)); + ::Slic3r::SVG svg(path.c_str(), bbox); + + svg.draw(infill_area, "cyan"); + + for (const Arachne::VariableWidthLines &perimeter : perimeters) + for (const Arachne::ExtrusionLine &extrusion_line : perimeter) { + ThickPolyline thick_polyline = to_thick_polyline(extrusion_line); + svg.draw({thick_polyline}, "green", "blue", stroke_width); + } + + for (const Line &line : to_lines(contours)) + svg.draw(line, "red", stroke_width); +} +#endif + // Thanks, Cura developers, for implementing an algorithm for generating perimeters with variable width (Arachne) that is based on the paper // "A framework for adaptive width control of dense contour-parallel toolpaths in fused deposition modeling" void PerimeterGenerator::process_arachne() @@ -525,10 +625,28 @@ void PerimeterGenerator::process_arachne() ExPolygons last = offset_ex(surface.expolygon.simplify_p(m_scaled_resolution), - float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); Polygons last_p = to_polygons(last); - Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), 0, *this->object_config, *this->print_config); + Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), 0, layer_height, *this->object_config, *this->print_config); std::vector perimeters = wallToolPaths.getToolPaths(); loop_number = int(perimeters.size()) - 1; +#ifdef ARACHNE_DEBUG + { + static int iRun = 0; + export_perimeters_to_svg(debug_out_path("arachne-perimeters-%d-%d.svg", layer_id, iRun++), to_polygons(last), perimeters, union_ex(wallToolPaths.getInnerContour())); + } +#endif + + // All closed ExtrusionLine should have the same the first and the last point. + // But in rare cases, Arachne produce ExtrusionLine marked as closed but without + // equal the first and the last point. + assert([&perimeters = std::as_const(perimeters)]() -> bool { + for (const Arachne::VariableWidthLines &perimeter : perimeters) + for (const Arachne::ExtrusionLine &el : perimeter) + if (el.is_closed && el.junctions.front().p != el.junctions.back().p) + return false; + return true; + }()); + int start_perimeter = int(perimeters.size()) - 1; int end_perimeter = -1; int direction = -1; diff --git a/src/libslic3r/PerimeterGenerator.hpp b/src/libslic3r/PerimeterGenerator.hpp index 2e478e107b..ecf09c593d 100644 --- a/src/libslic3r/PerimeterGenerator.hpp +++ b/src/libslic3r/PerimeterGenerator.hpp @@ -72,7 +72,7 @@ private: Polygons m_lower_slices_polygons; }; -ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, float tolerance, float merge_tolerance); +ExtrusionMultiPath thick_polyline_to_multi_path(const ThickPolyline &thick_polyline, ExtrusionRole role, const Flow &flow, float tolerance, float merge_tolerance); } diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp index e84ddc5035..109c949cd3 100644 --- a/src/libslic3r/PlaceholderParser.cpp +++ b/src/libslic3r/PlaceholderParser.cpp @@ -40,11 +40,11 @@ #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include #include #include diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index d7286106f0..ae0d4dfe3f 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -46,8 +46,10 @@ using Vec3i64 = Eigen::Matrix; // Vector types with a double coordinate base type. using Vec2f = Eigen::Matrix; using Vec3f = Eigen::Matrix; +using Vec4f = Eigen::Matrix; using Vec2d = Eigen::Matrix; using Vec3d = Eigen::Matrix; +using Vec4d = Eigen::Matrix; using Points = std::vector; using PointPtrs = std::vector; @@ -140,9 +142,9 @@ public: Point() : Vec2crd(0, 0) {} Point(int32_t x, int32_t y) : Vec2crd(coord_t(x), coord_t(y)) {} Point(int64_t x, int64_t y) : Vec2crd(coord_t(x), coord_t(y)) {} - Point(double x, double y) : Vec2crd(coord_t(lrint(x)), coord_t(lrint(y))) {} + Point(double x, double y) : Vec2crd(coord_t(std::round(x)), coord_t(std::round(y))) {} Point(const Point &rhs) { *this = rhs; } - explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(lrint(rhs.x())), coord_t(lrint(rhs.y()))) {} + explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(std::round(rhs.x())), coord_t(std::round(rhs.y()))) {} // This constructor allows you to construct Point from Eigen expressions template Point(const Eigen::MatrixBase &other) : Vec2crd(other) {} @@ -283,7 +285,7 @@ namespace int128 { // To be used by std::unordered_map, std::unordered_multimap and friends. struct PointHash { - size_t operator()(const Vec2crd &pt) const { + size_t operator()(const Vec2crd &pt) const noexcept { return coord_t((89 * 31 + int64_t(pt.x())) * 31 + pt.y()); } }; diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp index 09f1c393d5..1cfb16eb27 100644 --- a/src/libslic3r/Polygon.cpp +++ b/src/libslic3r/Polygon.cpp @@ -90,28 +90,24 @@ void Polygon::douglas_peucker(double tolerance) // Does an unoriented polygon contain a point? // Tested by counting intersections along a horizontal line. -bool Polygon::contains(const Point &point) const +bool Polygon::contains(const Point &p) const { // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html bool result = false; Points::const_iterator i = this->points.begin(); Points::const_iterator j = this->points.end() - 1; - for (; i != this->points.end(); j = i++) { - //FIXME this test is not numerically robust. Particularly, it does not handle horizontal segments at y == point(1) well. - // Does the ray with y == point(1) intersect this line segment? + for (; i != this->points.end(); j = i ++) + if (i->y() > p.y() != j->y() > p.y()) #if 1 - if ( (((*i)(1) > point(1)) != ((*j)(1) > point(1))) - && ((double)point(0) < (double)((*j)(0) - (*i)(0)) * (double)(point(1) - (*i)(1)) / (double)((*j)(1) - (*i)(1)) + (double)(*i)(0)) ) - result = !result; + if (Vec2d v = (*j - *i).cast(); + // p.x() is below the line + p.x() - i->x() < double(p.y() - i->y()) * v.x() / v.y()) #else - if (((*i)(1) > point(1)) != ((*j)(1) > point(1))) { // Orientation predicated relative to i-th point. - double orient = (double)(point(0) - (*i)(0)) * (double)((*j)(1) - (*i)(1)) - (double)(point(1) - (*i)(1)) * (double)((*j)(0) - (*i)(0)); - if (((*i)(1) > (*j)(1)) ? (orient > 0.) : (orient < 0.)) - result = !result; - } + if (double orient = (double)(p.x() - i->x()) * (double)(j->y() - i->y()) - (double)(p.y() - i->y()) * (double)(j->x() - i->x()); + (i->y() > j->y()) ? (orient > 0.) : (orient < 0.)) #endif - } + result = !result; return result; } @@ -520,4 +516,16 @@ void remove_collinear(Polygons &polys) remove_collinear(poly); } +bool contains(const Polygons &polygons, const Point &p, bool border_result) +{ + int poly_count_inside = 0; + for (const Polygon &poly : polygons) { + const int is_inside_this_poly = ClipperLib::PointInPolygon(p, poly.points); + if (is_inside_this_poly == -1) + return border_result; + poly_count_inside += is_inside_this_poly; + } + return (poly_count_inside % 2) == 1; +} + } diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index 9402739b25..5e052c0312 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -250,6 +250,9 @@ inline Polygons to_polygons(std::vector &&paths) return out; } +// Returns true if inside. Returns border_result if on boundary. +bool contains(const Polygons& polygons, const Point& p, bool border_result = true); + } // Slic3r // start Boost diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp index 5282f6c77a..547664d4ff 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -61,6 +61,9 @@ public: } } + Point& operator[](Points::size_type idx) { return this->points[idx]; } + const Point& operator[](Points::size_type idx) const { return this->points[idx]; } + const Point& last_point() const override { return this->points.back(); } const Point& leftmost_point() const; Lines lines() const override; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 092c0ed9b1..52d44ca483 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -448,7 +448,7 @@ static std::vector s_Preset_print_options { "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_brim_width", "wipe_tower_bridging", "single_extruder_multi_material_priming", "mmu_segmented_region_max_width", "wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits", "perimeter_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle", - "wall_distribution_count", "wall_split_middle_threshold", "wall_add_middle_threshold", "min_feature_size", "min_bead_width" + "wall_distribution_count", "min_feature_size", "min_bead_width" }; static std::vector s_Preset_filament_options { @@ -493,6 +493,7 @@ static std::vector s_Preset_sla_print_options { "layer_height", "faded_layers", "supports_enable", + "support_tree_type", "support_head_front_diameter", "support_head_penetration", "support_head_width", @@ -747,7 +748,7 @@ std::pair PresetCollection::load_external_preset( { // Load the preset over a default preset, so that the missing fields are filled in from the default preset. DynamicPrintConfig cfg(this->default_preset_for(combined_config).config); - const auto &keys = cfg.keys(); + t_config_option_keys keys = std::move(cfg.keys()); cfg.apply_only(combined_config, keys, true); std::string &inherits = Preset::inherits(cfg); if (select == LoadAndSelect::Never) { @@ -791,6 +792,13 @@ std::pair PresetCollection::load_external_preset( // the differences will be shown in the preset editor against the referenced profile. this->select_preset(it - m_presets.begin()); // The source config may contain keys from many possible preset types. Just copy those that relate to this preset. + + // Following keys are not used neither by the UI nor by the slicing core, therefore they are not important + // Erase them from config appl to avoid redundant "dirty" parameter in loaded preset. + for (const char* key : { "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" }) + keys.erase(std::remove(keys.begin(), keys.end(), key), keys.end()); + this->get_edited_preset().config.apply_only(combined_config, keys, true); this->update_dirty(); // Don't save the newly loaded project as a "saved into project" state. diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index e744d72ca7..d98998cc40 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -453,10 +453,8 @@ void PresetBundle::save_changes_for_preset(const std::string& new_name, Preset:: presets.get_edited_preset().config.apply_only(presets.get_selected_preset().config, unselected_options); } -#if ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE if (type == Preset::TYPE_PRINTER) copy_bed_model_and_texture_if_needed(presets.get_edited_preset().config); -#endif // ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE // Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini presets.save_current_preset(new_name); @@ -1865,7 +1863,6 @@ void PresetBundle::set_default_suppressed(bool default_suppressed) printers.set_default_suppressed(default_suppressed); } -#if ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE void copy_bed_model_and_texture_if_needed(DynamicPrintConfig& config) { const boost::filesystem::path user_dir = boost::filesystem::absolute(boost::filesystem::path(data_dir()) / "printer").make_preferred(); @@ -1891,6 +1888,5 @@ void copy_bed_model_and_texture_if_needed(DynamicPrintConfig& config) do_copy(config.option("bed_custom_texture"), "texture"); do_copy(config.option("bed_custom_model"), "model"); } -#endif // ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE } // namespace Slic3r diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index b36f6ed6e5..0213069679 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -178,11 +178,9 @@ private: ENABLE_ENUM_BITMASK_OPERATORS(PresetBundle::LoadConfigBundleAttribute) -#if ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE // Copies bed texture and model files to 'data_dir()\printer' folder, if needed // and updates the config accordingly extern void copy_bed_model_and_texture_if_needed(DynamicPrintConfig& config); -#endif // ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE } // namespace Slic3r diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 1cd983fb91..cb01600fa5 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -124,7 +124,7 @@ public: T * const * begin() const { return m_data->data(); } T * const * end() const { return m_data->data() + m_data->size(); } const T* front() const { return m_data->front(); } - const T* back() const { return m_data->front(); } + const T* back() const { return m_data->back(); } size_t size() const { return m_data->size(); } bool empty() const { return m_data->empty(); } const T* operator[](size_t i) const { return (*m_data)[i]; } diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index 4c085728c7..1cae900e79 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -626,7 +626,8 @@ PrintObjectRegions::BoundingBox find_modifier_volume_extents(const PrintObjectRe const PrintObjectRegions::VolumeRegion &parent_region = layer_range.volume_regions[parent_region_id]; const PrintObjectRegions::BoundingBox *parent_extents = find_volume_extents(layer_range, *parent_region.model_volume); assert(parent_extents); - out.extend(*parent_extents); + out.clamp(*parent_extents); + assert(! out.isEmpty()); if (parent_region.model_volume->is_model_part()) break; parent_region_id = parent_region.parent; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d32caf3c09..efb92d3d3c 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -137,7 +137,8 @@ CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SupportMaterialPattern) static const t_config_enum_values s_keys_map_SupportMaterialStyle { { "grid", smsGrid }, - { "snug", smsSnug } + { "snug", smsSnug }, + { "tree", smsTree } }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SupportMaterialStyle) @@ -176,6 +177,12 @@ static const t_config_enum_values s_keys_map_SLAMaterialSpeed = { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SLAMaterialSpeed); +static inline const t_config_enum_values s_keys_map_SLASupportTreeType = { + {"default", int(sla::SupportTreeType::Default)}, + {"branching", int(sla::SupportTreeType::Branching)} +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(SLASupportTreeType); + static const t_config_enum_values s_keys_map_BrimType = { {"no_brim", btNoBrim}, {"outer_only", btOuterOnly}, @@ -1044,6 +1051,7 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("HIPS"); def->enum_values.push_back("EDGE"); def->enum_values.push_back("NGEN"); + def->enum_values.push_back("PA"); def->enum_values.push_back("NYLON"); def->enum_values.push_back("PVA"); def->enum_values.push_back("PC"); @@ -2770,8 +2778,10 @@ void PrintConfigDef::init_fff_params() def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("grid"); def->enum_values.push_back("snug"); + def->enum_values.push_back("tree"); def->enum_labels.push_back(L("Grid")); def->enum_labels.push_back(L("Snug")); + def->enum_labels.push_back(L("Tree")); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(smsGrid)); @@ -3069,7 +3079,8 @@ void PrintConfigDef::init_fff_params() def->category = L("Layers and Perimeters"); def->tooltip = L("Classic perimeter generator produces perimeters with constant extrusion width and for " "very thin areas is used gap-fill. " - "Arachne engine produces perimeters with variable extrusion width."); + "Arachne engine produces perimeters with variable extrusion width. " + "This setting also affects the Concentric infill."); def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("classic"); def->enum_values.push_back("arachne"); @@ -3078,15 +3089,16 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(PerimeterGeneratorType::Arachne)); - def = this->add("wall_transition_length", coFloat); + def = this->add("wall_transition_length", coFloatOrPercent); def->label = L("Perimeter transition length"); def->category = L("Advanced"); def->tooltip = L("When transitioning between different numbers of perimeters as the part becomes " - "thinner, a certain amount of space is allotted to split or join the perimeter segments."); - def->sidetext = L("mm"); + "thinner, a certain amount of space is allotted to split or join the perimeter segments. " + "If expressed as a percentage (for example 100%), it will be computed based on the nozzle diameter."); + def->sidetext = L("mm or %"); def->mode = comExpert; def->min = 0; - def->set_default_value(new ConfigOptionFloat(0.4)); + def->set_default_value(new ConfigOptionFloatOrPercent(100, true)); def = this->add("wall_transition_filter_deviation", coFloatOrPercent); def->label = L("Perimeter transitioning filter margin"); @@ -3125,46 +3137,17 @@ void PrintConfigDef::init_fff_params() def->min = 1; def->set_default_value(new ConfigOptionInt(1)); - def = this->add("wall_split_middle_threshold", coPercent); - def->label = L("Split middle perimeter threshold"); - def->category = L("Advanced"); - def->tooltip = L("The smallest extrusion width, as a factor of the normal extrusion width, above which the middle " - "perimeter (if there is one) will be split into two. Reduce this setting to use more, thinner " - "perimeters. Increase to use fewer, wider perimeters. Note that this applies -as if- the entire " - "shape should be filled with perimeter, so the middle here refers to the middle of the object " - "between two outer edges of the shape, even if there actually is infill or other extrusion types in " - "the print instead of the perimeter."); - def->sidetext = L("%"); - def->mode = comAdvanced; - def->min = 1; - def->max = 99; - def->set_default_value(new ConfigOptionPercent(50)); - - def = this->add("wall_add_middle_threshold", coPercent); - def->label = L("Add middle perimeter threshold"); - def->category = L("Advanced"); - def->tooltip = L("The smallest extrusion width, as a factor of the normal extrusion width, above which a middle " - "perimeter (if there wasn't one already) will be added. Reduce this setting to use more, " - "thinner perimeters. Increase to use fewer, wider perimeters. Note that this applies -as if- the " - "entire shape should be filled with perimeter, so the middle here refers to the middle of the " - "object between two outer edges of the shape, even if there actually is infill or other " - "extrusion types in the print instead of the perimeter."); - def->sidetext = L("%"); - def->mode = comAdvanced; - def->min = 1; - def->max = 99; - def->set_default_value(new ConfigOptionPercent(75)); - - def = this->add("min_feature_size", coFloat); + def = this->add("min_feature_size", coFloatOrPercent); def->label = L("Minimum feature size"); def->category = L("Advanced"); def->tooltip = L("Minimum thickness of thin features. Model features that are thinner than this value will " "not be printed, while features thicker than the Minimum feature size will be widened to " - "the Minimum perimeter width."); - def->sidetext = L("mm"); + "the Minimum perimeter width. " + "If expressed as a percentage (for example 25%), it will be computed based on the nozzle diameter."); + def->sidetext = L("mm or %"); def->mode = comExpert; def->min = 0; - def->set_default_value(new ConfigOptionFloat(0.1)); + def->set_default_value(new ConfigOptionFloatOrPercent(25, true)); def = this->add("min_bead_width", coFloatOrPercent); def->label = L("Minimum perimeter width"); @@ -3564,6 +3547,17 @@ void PrintConfigDef::init_sla_params() def->mode = comSimple; def->set_default_value(new ConfigOptionBool(true)); + def = this->add("support_tree_type", coEnum); + def->label = L("Support tree type"); + def->tooltip = L("Support tree building strategy"); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values = ConfigOptionEnum::get_enum_names(); + def->enum_labels = ConfigOptionEnum::get_enum_names(); + def->enum_labels[0] = L("Default"); + def->enum_labels[1] = L("Branching"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionEnum(sla::SupportTreeType::Default)); + def = this->add("support_head_front_diameter", coFloat); def->label = L("Pinhead front diameter"); def->category = L("Supports"); @@ -3649,13 +3643,17 @@ void PrintConfigDef::init_sla_params() def = this->add("support_pillar_widening_factor", coFloat); def->label = L("Pillar widening factor"); def->category = L("Supports"); - def->tooltip = L("Merging bridges or pillars into another pillars can " - "increase the radius. Zero means no increase, one means " - "full increase."); + def->tooltip = L( + "Merging bridges or pillars into another pillars can " + "increase the radius. Zero means no increase, one means " + "full increase. The exact amount of increase is unspecified and can " + "change in the future. What is garanteed is that thickness will not " + "exceed \"support_base_diameter\""); + def->min = 0; def->max = 1; def->mode = comExpert; - def->set_default_value(new ConfigOptionFloat(0.0)); + def->set_default_value(new ConfigOptionFloat(0.15)); def = this->add("support_base_diameter", coFloat); def->label = L("Support base diameter"); @@ -4027,6 +4025,8 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va "serial_port", "serial_speed", // Introduced in some PrusaSlicer 2.3.1 alpha, later renamed or removed. "fuzzy_skin_perimeter_mode", "fuzzy_skin_shape", + // Introduced in PrusaSlicer 2.3.0-alpha2, later replaced by automatic calculation based on extrusion width. + "wall_add_middle_threshold", "wall_split_middle_threshold", }; // In PrusaSlicer 2.3.0-alpha0 the "monotonous" infill was introduced, which was later renamed to "monotonic". @@ -4440,6 +4440,20 @@ CLIActionsConfigDef::CLIActionsConfigDef() def->cli = "gcodeviewer"; def->set_default_value(new ConfigOptionBool(false)); +#if ENABLE_GL_CORE_PROFILE + def = this->add("opengl-version", coString); + def->label = L("OpenGL version"); + def->tooltip = L("Select the specified OpenGL version"); + def->cli = "opengl-version"; + def->set_default_value(new ConfigOptionString()); + + def = this->add("opengl-debug", coBool); + def->label = L("OpenGL debug output"); + def->tooltip = L("Activate OpenGL debug output on graphic cards which support it"); + def->cli = "opengl-debug"; + def->set_default_value(new ConfigOptionBool(false)); +#endif // ENABLE_GL_CORE_PROFILE + 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."); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 9e1d7989d4..5cc5cc59cd 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -60,7 +60,7 @@ enum InfillPattern : int { ipRectilinear, ipMonotonic, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipSupportBase, ipLightning, -ipCount, + ipCount, }; enum class IroningType { @@ -85,7 +85,7 @@ enum SupportMaterialPattern { }; enum SupportMaterialStyle { - smsGrid, smsSnug, + smsGrid, smsSnug, smsTree, }; enum SupportMaterialInterfacePattern { @@ -155,6 +155,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SupportMaterialInterfacePattern) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SeamPosition) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLADisplayOrientation) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLAPillarConnectionMode) +CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(SLASupportTreeType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(BrimType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(DraftShield) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(GCodeThumbnailsFormat) @@ -507,13 +508,11 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloat, slice_closing_radius)) ((ConfigOptionEnum, slicing_mode)) ((ConfigOptionEnum, perimeter_generator)) - ((ConfigOptionFloat, wall_transition_length)) + ((ConfigOptionFloatOrPercent, wall_transition_length)) ((ConfigOptionFloatOrPercent, wall_transition_filter_deviation)) ((ConfigOptionFloat, wall_transition_angle)) ((ConfigOptionInt, wall_distribution_count)) - ((ConfigOptionPercent, wall_split_middle_threshold)) - ((ConfigOptionPercent, wall_add_middle_threshold)) - ((ConfigOptionFloat, min_feature_size)) + ((ConfigOptionFloatOrPercent, min_feature_size)) ((ConfigOptionFloatOrPercent, min_bead_width)) ((ConfigOptionBool, support_material)) // Automatic supports (generated based on support_material_threshold). @@ -829,6 +828,8 @@ PRINT_CONFIG_CLASS_DEFINE( // Enabling or disabling support creation ((ConfigOptionBool, supports_enable)) + ((ConfigOptionEnum, support_tree_type)) + // Diameter in mm of the pointing side of the head. ((ConfigOptionFloat, support_head_front_diameter))/*= 0.2*/ diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index aef5019220..e0806818ce 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -8,6 +8,7 @@ #include "Layer.hpp" #include "MutablePolygon.hpp" #include "SupportMaterial.hpp" +#include "TreeSupport.hpp" #include "Surface.hpp" #include "Slicing.hpp" #include "Tesselate.hpp" @@ -25,8 +26,6 @@ #include -#include - using namespace std::literals; //! macro used to mark string used at localization, @@ -627,12 +626,21 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "bottom_fill_pattern" || opt_key == "external_fill_link_max_length" || opt_key == "fill_angle" - || opt_key == "fill_pattern" || opt_key == "infill_anchor" || opt_key == "infill_anchor_max" || opt_key == "top_infill_extrusion_width" || opt_key == "first_layer_extrusion_width") { steps.emplace_back(posInfill); + } else if (opt_key == "fill_pattern") { + steps.emplace_back(posInfill); + + const auto *old_fill_pattern = old_config.option>(opt_key); + const auto *new_fill_pattern = new_config.option>(opt_key); + assert(old_fill_pattern && new_fill_pattern); + // We need to recalculate infill surfaces when infill_only_where_needed is enabled, and we are switching from + // the Lightning infill to another infill or vice versa. + if (m_config.infill_only_where_needed && (new_fill_pattern->value == ipLightning || old_fill_pattern->value == ipLightning)) + steps.emplace_back(posPrepareInfill); } else if (opt_key == "fill_density") { // One likely wants to reslice only when switching between zero infill to simulate boolean difference (subtracting volumes), // normal infill and 100% (solid) infill. @@ -673,8 +681,6 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "wall_transition_filter_deviation" || opt_key == "wall_transition_angle" || opt_key == "wall_distribution_count" - || opt_key == "wall_split_middle_threshold" - || opt_key == "wall_add_middle_threshold" || opt_key == "min_feature_size" || opt_key == "min_bead_width") { steps.emplace_back(posSlice); @@ -1038,8 +1044,6 @@ void PrintObject::process_external_surfaces() void PrintObject::discover_vertical_shells() { - PROFILE_FUNC(); - BOOST_LOG_TRIVIAL(info) << "Discovering vertical shells..." << log_memory_info(); struct DiscoverVerticalShellsCacheEntry @@ -1150,8 +1154,6 @@ void PrintObject::discover_vertical_shells() } for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { - PROFILE_BLOCK(discover_vertical_shells_region); - const PrintRegion ®ion = this->printing_region(region_id); if (! region.config().ensure_vertical_shell_thickness.value) // This region will be handled by discover_horizontal_shells(). @@ -1201,7 +1203,6 @@ void PrintObject::discover_vertical_shells() (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) { - PROFILE_BLOCK(discover_vertical_shells_region_layer); m_print->throw_if_canceled(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING static size_t debug_idx = 0; @@ -1226,88 +1227,82 @@ void PrintObject::discover_vertical_shells() ExPolygons shell_ex; #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ float min_perimeter_infill_spacing = float(infill_line_spacing) * 1.05f; - { - PROFILE_BLOCK(discover_vertical_shells_region_layer_collect); #if 0 // #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - { - Slic3r::SVG svg_cummulative(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d.svg", debug_idx), this->bounding_box()); - 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()) - continue; - ExPolygons &expolys = m_layers[n]->perimeter_expolygons; - for (size_t i = 0; i < expolys.size(); ++ i) { - Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d-layer%d-expoly%d.svg", debug_idx, n, i), get_extents(expolys[i])); - svg.draw(expolys[i]); - svg.draw_outline(expolys[i].contour, "black", scale_(0.05)); - svg.draw_outline(expolys[i].holes, "blue", scale_(0.05)); - svg.Close(); + { + Slic3r::SVG svg_cummulative(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d.svg", debug_idx), this->bounding_box()); + 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()) + continue; + ExPolygons &expolys = m_layers[n]->perimeter_expolygons; + for (size_t i = 0; i < expolys.size(); ++ i) { + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-run%d-layer%d-expoly%d.svg", debug_idx, n, i), get_extents(expolys[i])); + svg.draw(expolys[i]); + svg.draw_outline(expolys[i].contour, "black", scale_(0.05)); + svg.draw_outline(expolys[i].holes, "blue", scale_(0.05)); + svg.Close(); - svg_cummulative.draw(expolys[i]); - svg_cummulative.draw_outline(expolys[i].contour, "black", scale_(0.05)); - svg_cummulative.draw_outline(expolys[i].holes, "blue", scale_(0.05)); - } + svg_cummulative.draw(expolys[i]); + svg_cummulative.draw_outline(expolys[i].contour, "black", scale_(0.05)); + svg_cummulative.draw_outline(expolys[i].holes, "blue", scale_(0.05)); } } + } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - 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); - } + 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); } } - 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); - } - } + } + 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); + } } + } #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - { - Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-%d.svg", debug_idx), get_extents(shell)); - svg.draw(shell); - svg.draw_outline(shell, "black", scale_(0.05)); - svg.Close(); - } + { + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-%d.svg", debug_idx), get_extents(shell)); + svg.draw(shell); + svg.draw_outline(shell, "black", scale_(0.05)); + svg.Close(); + } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ #if 0 - { - PROFILE_BLOCK(discover_vertical_shells_region_layer_shell_); - // shell = union_(shell, true); - shell = union_(shell, false); - } +// shell = union_(shell, true); + shell = union_(shell, false); #endif #ifdef SLIC3R_DEBUG_SLICE_PROCESSING - shell_ex = union_safety_offset_ex(shell); + shell_ex = union_safety_offset_ex(shell); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - } //if (shell.empty()) // continue; @@ -1434,62 +1429,66 @@ void PrintObject::discover_vertical_shells() } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ } // for each region - - // Write the profiler measurements to file -// PROFILE_UPDATE(); -// PROFILE_OUTPUT(debug_out_path("discover_vertical_shells-profile.txt").c_str()); } -/* This method applies bridge flow to the first internal solid layer above - sparse infill */ +// This method applies bridge flow to the first internal solid layer above sparse infill. void PrintObject::bridge_over_infill() { BOOST_LOG_TRIVIAL(info) << "Bridge over infill..." << log_memory_info(); - for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) { - const PrintRegion ®ion = this->printing_region(region_id); - - // skip bridging in case there are no voids - if (region.config().fill_density.value == 100) - continue; + std::vector sparse_infill_regions; + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++ region_id) + if (const PrintRegion ®ion = this->printing_region(region_id); region.config().fill_density.value < 100) + sparse_infill_regions.emplace_back(region_id); + if (this->layer_count() < 2 || sparse_infill_regions.empty()) + return; - for (LayerPtrs::iterator layer_it = m_layers.begin(); layer_it != m_layers.end(); ++ layer_it) { - // skip first layer - if (layer_it == m_layers.begin()) - continue; - - Layer *layer = *layer_it; + // Collect sum of all internal (sparse infill) regions, because + // 1) layerm->fill_surfaces.will be modified in parallel. + // 2) the parallel loop works on a sum of surfaces over regions anyways, thus collecting the sparse infill surfaces + // up front is an optimization. + std::vector internals; + internals.reserve(this->layer_count()); + for (Layer *layer : m_layers) { + Polygons sum; + for (const LayerRegion *layerm : layer->m_regions) + layerm->fill_surfaces.filter_by_type(stInternal, &sum); + internals.emplace_back(std::move(sum)); + } + + // Process all regions and layers in parallel. + tbb::parallel_for(tbb::blocked_range(0, sparse_infill_regions.size() * (this->layer_count() - 1), sparse_infill_regions.size()), + [this, &sparse_infill_regions, &internals] + (const tbb::blocked_range &range) { + for (size_t task_id = range.begin(); task_id != range.end(); ++ task_id) { + const size_t layer_id = (task_id / sparse_infill_regions.size()) + 1; + const size_t region_id = sparse_infill_regions[task_id % sparse_infill_regions.size()]; + Layer *layer = this->get_layer(layer_id); LayerRegion *layerm = layer->m_regions[region_id]; Flow bridge_flow = layerm->bridging_flow(frSolidInfill); - // extract the stInternalSolid surfaces that might be transformed into bridges - Polygons internal_solid; - layerm->fill_surfaces.filter_by_type(stInternalSolid, &internal_solid); - + // Extract the stInternalSolid surfaces that might be transformed into bridges. + ExPolygons internal_solid; + layerm->fill_surfaces.remove_type(stInternalSolid, &internal_solid); + if (internal_solid.empty()) + // No internal solid -> no new bridges for this layer region. + continue; + // check whether the lower area is deep enough for absorbing the extra flow // (for obvious physical reasons but also for preventing the bridge extrudates // from overflowing in 3D preview) ExPolygons to_bridge; { - Polygons to_bridge_pp = internal_solid; - - // iterate through lower layers spanned by bridge_flow + Polygons to_bridge_pp = to_polygons(internal_solid); + // Iterate through lower layers spanned by bridge_flow. double bottom_z = layer->print_z - bridge_flow.height() - EPSILON; - for (int i = int(layer_it - m_layers.begin()) - 1; i >= 0; --i) { - const Layer* lower_layer = m_layers[i]; - - // stop iterating if layer is lower than bottom_z - if (lower_layer->print_z < bottom_z) break; - - // iterate through regions and collect internal surfaces - Polygons lower_internal; - for (LayerRegion *lower_layerm : lower_layer->m_regions) - lower_layerm->fill_surfaces.filter_by_type(stInternal, &lower_internal); - - // intersect such lower internal surfaces with the candidate solid surfaces - to_bridge_pp = intersection(to_bridge_pp, lower_internal); + for (auto i = int(layer_id) - 1; i >= 0; -- i) { + // Stop iterating if layer is lower than bottom_z. + if (m_layers[i]->print_z < bottom_z) + break; + // Intersect lower sparse infills with the candidate solid surfaces. + to_bridge_pp = intersection(to_bridge_pp, internals[i]); } - // there's no point in bridging too thin/short regions //FIXME Vojtech: The offset2 function is not a geometric offset, // therefore it may create 1) gaps, and 2) sharp corners, which are outside the original contour. @@ -1499,12 +1498,16 @@ void PrintObject::bridge_over_infill() to_bridge_pp = opening(to_bridge_pp, min_width); } - if (to_bridge_pp.empty()) continue; - + if (to_bridge_pp.empty()) { + // Restore internal_solid surfaces. + for (ExPolygon &ex : internal_solid) + layerm->fill_surfaces.surfaces.push_back(Surface(stInternalSolid, std::move(ex))); + continue; + } // convert into ExPolygons to_bridge = union_ex(to_bridge_pp); } - + #ifdef SLIC3R_DEBUG printf("Bridging %zu internal areas at layer %zu\n", to_bridge.size(), layer->id()); #endif @@ -1513,11 +1516,10 @@ void PrintObject::bridge_over_infill() ExPolygons not_to_bridge = diff_ex(internal_solid, to_bridge, ApplySafetyOffset::Yes); to_bridge = intersection_ex(to_bridge, internal_solid, ApplySafetyOffset::Yes); // build the new collection of fill_surfaces - layerm->fill_surfaces.remove_type(stInternalSolid); for (ExPolygon &ex : to_bridge) - layerm->fill_surfaces.surfaces.push_back(Surface(stInternalBridge, ex)); + layerm->fill_surfaces.surfaces.push_back(Surface(stInternalBridge, std::move(ex))); for (ExPolygon &ex : not_to_bridge) - layerm->fill_surfaces.surfaces.push_back(Surface(stInternalSolid, ex)); + layerm->fill_surfaces.surfaces.push_back(Surface(stInternalSolid, std::move(ex))); /* # exclude infill from the layers below if needed # see discussion at https://github.com/alexrj/Slic3r/issues/240 @@ -1551,14 +1553,13 @@ void PrintObject::bridge_over_infill() } } */ - #ifdef SLIC3R_DEBUG_SLICE_PROCESSING layerm->export_region_slices_to_svg_debug("7_bridge_over_infill"); layerm->export_region_fill_surfaces_to_svg_debug("7_bridge_over_infill"); #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ m_print->throw_if_canceled(); } - } + }); } static void clamp_exturder_to_default(ConfigOptionInt &opt, size_t num_extruders) @@ -1735,7 +1736,14 @@ bool PrintObject::update_layer_height_profile(const ModelObject &model_object, c // fill_surfaces but we only turn them into VOID surfaces, thus preserving the boundaries. void PrintObject::clip_fill_surfaces() { - if (! m_config.infill_only_where_needed.value) + bool has_lightning_infill = false; + for (size_t region_id = 0; region_id < this->num_printing_regions(); ++region_id) + if (const PrintRegionConfig &config = this->printing_region(region_id).config(); config.fill_density > 0 && config.fill_pattern == ipLightning) + has_lightning_infill = true; + + // For Lightning infill, infill_only_where_needed is ignored because both + // do a similar thing, and their combination doesn't make much sense. + if (! m_config.infill_only_where_needed.value || has_lightning_infill) return; bool has_infill = false; for (size_t i = 0; i < this->num_printing_regions(); ++ i) @@ -2127,8 +2135,13 @@ void PrintObject::combine_infill() void PrintObject::_generate_support_material() { - PrintObjectSupportMaterial support_material(this, m_slicing_params); - support_material.generate(*this); + if (m_config.support_material_style == smsTree) { + TreeSupport tree_support; + tree_support.generateSupportAreas(*this); + } else { + PrintObjectSupportMaterial support_material(this, m_slicing_params); + support_material.generate(*this); + } } static void project_triangles_to_slabs(ConstLayerPtrsAdaptor layers, const indexed_triangle_set &custom_facets, const Transform3f &tr, bool seam, std::vector &out) diff --git a/src/libslic3r/SLA/BranchingTreeSLA.cpp b/src/libslic3r/SLA/BranchingTreeSLA.cpp new file mode 100644 index 0000000000..72314c9d83 --- /dev/null +++ b/src/libslic3r/SLA/BranchingTreeSLA.cpp @@ -0,0 +1,257 @@ +#include "BranchingTreeSLA.hpp" + +#include "libslic3r/Execution/ExecutionTBB.hpp" + +#include "libslic3r/KDTreeIndirect.hpp" + +#include "SupportTreeUtils.hpp" +#include "BranchingTree/PointCloud.hpp" + +#include "Pad.hpp" + +#include + +namespace Slic3r { namespace sla { + +class BranchingTreeBuilder: public branchingtree::Builder { + SupportTreeBuilder &m_builder; + const SupportableMesh &m_sm; + const branchingtree::PointCloud &m_cloud; + + // Scaling of the input value 'widening_factor:<0, 1>' to produce resonable + // widening behaviour + static constexpr double WIDENING_SCALE = 0.02; + + double get_radius(const branchingtree::Node &j) + { + double w = WIDENING_SCALE * m_sm.cfg.pillar_widening_factor * j.weight; + + return std::min(m_sm.cfg.base_radius_mm, double(j.Rmin) + w); + } + + std::vector m_unroutable_pinheads; + + void build_subtree(size_t root) + { + traverse(m_cloud, root, [this](const branchingtree::Node &node) { + if (node.left >= 0 && node.right >= 0) { + auto nparent = m_cloud.get(node.id); + auto nleft = m_cloud.get(node.left); + auto nright = m_cloud.get(node.right); + Vec3d from1d = nleft.pos.cast(); + Vec3d from2d = nright.pos.cast(); + Vec3d tod = nparent.pos.cast(); + double mergeR = get_radius(nparent); + double leftR = get_radius(nleft); + double rightR = get_radius(nright); + + m_builder.add_diffbridge(from1d, tod, leftR, mergeR); + m_builder.add_diffbridge(from2d, tod, rightR, mergeR); + m_builder.add_junction(tod, mergeR); + } else if (int child = node.left + node.right + 1; child >= 0) { + auto from = m_cloud.get(child); + auto to = m_cloud.get(node.id); + auto tod = to.pos.cast(); + double toR = get_radius(to); + m_builder.add_diffbridge(from.pos.cast(), + tod, + get_radius(from), + toR); + m_builder.add_junction(tod, toR); + } + }); + } + + void discard_subtree(size_t root) + { + // Discard all the support points connecting to this branch. + traverse(m_cloud, root, [this](const branchingtree::Node &node) { + int suppid_parent = m_cloud.get_leaf_id(node.id); + int suppid_left = m_cloud.get_leaf_id(node.left); + int suppid_right = m_cloud.get_leaf_id(node.right); + if (suppid_parent >= 0) + m_unroutable_pinheads.emplace_back(suppid_parent); + if (suppid_left >= 0) + m_unroutable_pinheads.emplace_back(suppid_left); + if (suppid_right >= 0) + m_unroutable_pinheads.emplace_back(suppid_right); + }); + } + +public: + BranchingTreeBuilder(SupportTreeBuilder &builder, + const SupportableMesh &sm, + const branchingtree::PointCloud &cloud) + : m_builder{builder}, m_sm{sm}, m_cloud{cloud} + {} + + bool add_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) override; + + bool add_merger(const branchingtree::Node &node, + const branchingtree::Node &closest, + const branchingtree::Node &merge_node) override; + + bool add_ground_bridge(const branchingtree::Node &from, + const branchingtree::Node &/*to*/) override; + + bool add_mesh_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) override; + + void report_unroutable(const branchingtree::Node &j) override + { + BOOST_LOG_TRIVIAL(error) << "Cannot route junction at " << j.pos.x() + << " " << j.pos.y() << " " << j.pos.z(); + + // Discard all the support points connecting to this branch. + discard_subtree(j.id); + } + + const std::vector& unroutable_pinheads() const + { + return m_unroutable_pinheads; + } + + bool is_valid() const override { return !m_builder.ctl().stopcondition(); } +}; + +bool BranchingTreeBuilder::add_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) +{ + Vec3d fromd = from.pos.cast(), tod = to.pos.cast(); + double fromR = get_radius(from), toR = get_radius(to); + Beam beam{Ball{fromd, fromR}, Ball{tod, toR}}; + auto hit = beam_mesh_hit(ex_tbb, m_sm.emesh, beam, + m_sm.cfg.safety_distance_mm); + + bool ret = hit.distance() > (tod - fromd).norm(); + + return ret; +} + +bool BranchingTreeBuilder::add_merger(const branchingtree::Node &node, + const branchingtree::Node &closest, + const branchingtree::Node &merge_node) +{ + Vec3d from1d = node.pos.cast(), + from2d = closest.pos.cast(), + tod = merge_node.pos.cast(); + + double mergeR = get_radius(merge_node); + double nodeR = get_radius(node); + double closestR = get_radius(closest); + Beam beam1{Ball{from1d, nodeR}, Ball{tod, mergeR}}; + Beam beam2{Ball{from2d, closestR}, Ball{tod, mergeR}}; + + auto sd = m_sm.cfg.safety_distance_mm ; + auto hit1 = beam_mesh_hit(ex_tbb, m_sm.emesh, beam1, sd); + auto hit2 = beam_mesh_hit(ex_tbb, m_sm.emesh, beam2, sd); + + bool ret = hit1.distance() > (tod - from1d).norm() && + hit2.distance() > (tod - from2d).norm(); + + return ret; +} + +bool BranchingTreeBuilder::add_ground_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) +{ + bool ret = search_ground_route(ex_tbb, m_builder, m_sm, + sla::Junction{from.pos.cast(), + get_radius(from)}, + get_radius(to)).first; + + if (ret) { + build_subtree(from.id); + } + + return ret; +} + +bool BranchingTreeBuilder::add_mesh_bridge(const branchingtree::Node &from, + const branchingtree::Node &to) +{ + sla::Junction fromj = {from.pos.cast(), get_radius(from)}; + + auto anchor = m_sm.cfg.ground_facing_only ? + std::optional{} : // If no mesh connections are allowed + calculate_anchor_placement(ex_tbb, m_sm, fromj, + to.pos.cast()); + + if (anchor) { + sla::Junction toj = {anchor->junction_point(), anchor->r_back_mm}; + + auto hit = beam_mesh_hit(ex_tbb, m_sm.emesh, + Beam{{fromj.pos, fromj.r}, {toj.pos, toj.r}}, 0.); + + if (hit.distance() > distance(fromj.pos, toj.pos)) { + m_builder.add_diffbridge(fromj.pos, toj.pos, fromj.r, toj.r); + m_builder.add_anchor(*anchor); + + build_subtree(from.id); + } else { + anchor.reset(); + } + } + + return bool(anchor); +} + +void create_branching_tree(SupportTreeBuilder &builder, const SupportableMesh &sm) +{ + auto coordfn = [&sm](size_t id, size_t dim) { return sm.pts[id].pos(dim); }; + KDTreeIndirect<3, float, decltype (coordfn)> tree{coordfn, sm.pts.size()}; + + auto nondup_idx = non_duplicate_suppt_indices(tree, sm.pts, 0.1); + std::vector> heads(nondup_idx.size()); + auto leafs = reserve_vector(nondup_idx.size()); + + execution::for_each( + ex_tbb, size_t(0), nondup_idx.size(), + [&sm, &heads, &nondup_idx, &builder](size_t i) { + if (!builder.ctl().stopcondition()) + heads[i] = calculate_pinhead_placement(ex_seq, sm, nondup_idx[i]); + }, + execution::max_concurrency(ex_tbb) + ); + + if (builder.ctl().stopcondition()) + return; + + for (auto &h : heads) + if (h && h->is_valid()) { + leafs.emplace_back(h->junction_point().cast(), h->r_back_mm); + h->id = leafs.size() - 1; + builder.add_head(h->id, *h); + } + + auto &its = *sm.emesh.get_triangle_mesh(); + ExPolygons bedpolys = {branchingtree::make_bed_poly(its)}; + + auto props = branchingtree::Properties{} + .bed_shape(bedpolys) + .ground_level(sla::ground_level(sm)) + .max_slope(sm.cfg.bridge_slope) + .max_branch_length(sm.cfg.max_bridge_length_mm); + + auto meshpts = sm.cfg.ground_facing_only ? + std::vector{} : + branchingtree::sample_mesh(its, + props.sampling_radius()); + + auto bedpts = branchingtree::sample_bed(props.bed_shape(), + props.ground_level(), + props.sampling_radius()); + + branchingtree::PointCloud nodes{std::move(meshpts), std::move(bedpts), + std::move(leafs), props}; + + BranchingTreeBuilder vbuilder{builder, sm, nodes}; + branchingtree::build_tree(nodes, vbuilder); + + for (size_t id : vbuilder.unroutable_pinheads()) + builder.head(id).invalidate(); + +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/BranchingTreeSLA.hpp b/src/libslic3r/SLA/BranchingTreeSLA.hpp new file mode 100644 index 0000000000..c101029bd3 --- /dev/null +++ b/src/libslic3r/SLA/BranchingTreeSLA.hpp @@ -0,0 +1,15 @@ +#ifndef BRANCHINGTREESLA_HPP +#define BRANCHINGTREESLA_HPP + +#include "libslic3r/BranchingTree/BranchingTree.hpp" +#include "SupportTreeBuilder.hpp" + +#include + +namespace Slic3r { namespace sla { + +void create_branching_tree(SupportTreeBuilder& builder, const SupportableMesh &sm); + +}} // namespace Slic3r::sla + +#endif // BRANCHINGTREESLA_HPP diff --git a/src/libslic3r/SLA/Pad.cpp b/src/libslic3r/SLA/Pad.cpp index b04c3f2199..ec9e216f55 100644 --- a/src/libslic3r/SLA/Pad.cpp +++ b/src/libslic3r/SLA/Pad.cpp @@ -204,7 +204,7 @@ public: void add(const ExPolygon &ep) { m_polys.emplace_back(ep); - m_index.insert(BoundingBox{ep}, unsigned(m_index.size())); + m_index.insert(get_extents(ep), unsigned(m_index.size())); } // Check an arbitrary polygon for intersection with the indexed polygons diff --git a/src/libslic3r/SLA/SupportTree.cpp b/src/libslic3r/SLA/SupportTree.cpp index 466fade881..b221c4330a 100644 --- a/src/libslic3r/SLA/SupportTree.cpp +++ b/src/libslic3r/SLA/SupportTree.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,10 @@ indexed_triangle_set create_support_tree(const SupportableMesh &sm, create_default_tree(*builder, sm); break; } + case SupportTreeType::Branching: { + create_branching_tree(*builder, sm); + break; + } default:; } diff --git a/src/libslic3r/SLA/SupportTreeStrategies.hpp b/src/libslic3r/SLA/SupportTreeStrategies.hpp index d04ceaa2d0..487f43575b 100644 --- a/src/libslic3r/SLA/SupportTreeStrategies.hpp +++ b/src/libslic3r/SLA/SupportTreeStrategies.hpp @@ -5,7 +5,7 @@ namespace Slic3r { namespace sla { -enum class SupportTreeType { Default, Clever }; +enum class SupportTreeType { Default, Branching }; enum class PillarConnectionMode { zigzag, cross, dynamic }; }} // namespace Slic3r::sla diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 9ad5453384..d9b8e33df0 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -43,6 +43,7 @@ sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c) sla::SupportTreeConfig scfg; scfg.enabled = c.supports_enable.getBool(); + scfg.tree_type = c.support_tree_type.value; 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; @@ -824,6 +825,7 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vectorfill = fill; std::string d; - Polygons pp = expolygon; - for (Polygons::const_iterator p = pp.begin(); p != pp.end(); ++p) { - d += this->get_path_d(*p, true) + " "; - } + for (const Polygon &p : to_polygons(expolygon)) + d += this->get_path_d(p, true) + " "; this->path(d, true, 0, fill_opacity); } @@ -274,26 +272,29 @@ std::string SVG::get_path_d(const ClipperLib::Path &path, double scale, bool clo return d.str(); } -void SVG::draw_text(const Point &pt, const char *text, const char *color) +void SVG::draw_text(const Point &pt, const char *text, const char *color, const coordf_t font_size) { fprintf(this->f, - "%s", - to_svg_x(pt(0)-origin(0)), - to_svg_y(pt(1)-origin(1)), + R"(%s)", + to_svg_x(float(pt.x() - origin.x())), + to_svg_y(float(pt.y() - origin.y())), + font_size, color, text); } -void SVG::draw_legend(const Point &pt, const char *text, const char *color) +void SVG::draw_legend(const Point &pt, const char *text, const char *color, const coordf_t font_size) { fprintf(this->f, - "", - to_svg_x(pt(0)-origin(0)), - to_svg_y(pt(1)-origin(1)), + R"()", + to_svg_x(float(pt.x() - origin.x())), + to_svg_y(float(pt.y() - origin.y())), + font_size, color); fprintf(this->f, - "%s", - to_svg_x(pt(0)-origin(0)) + 20.f, - to_svg_y(pt(1)-origin(1)), + R"(%s)", + to_svg_x(float(pt.x() - origin.x())) + 20.f, + to_svg_y(float(pt.y() - origin.y())), + font_size, "black", text); } @@ -356,7 +357,7 @@ void SVG::export_expolygons(const char *path, const std::vector 0) for (const ExPolygon &expoly : exp_with_attr.first) - svg.draw((Points)expoly, exp_with_attr.second.color_points, exp_with_attr.second.radius_points); + svg.draw(to_points(expoly), exp_with_attr.second.color_points, exp_with_attr.second.radius_points); // Export legend. // 1st row diff --git a/src/libslic3r/SVG.hpp b/src/libslic3r/SVG.hpp index 68089a0626..25727139e2 100644 --- a/src/libslic3r/SVG.hpp +++ b/src/libslic3r/SVG.hpp @@ -72,8 +72,8 @@ public: void draw(const ClipperLib::Path &polygon, double scale, std::string fill = "grey", coordf_t stroke_width = 0); void draw(const ClipperLib::Paths &polygons, double scale, std::string fill = "grey", coordf_t stroke_width = 0); - void draw_text(const Point &pt, const char *text, const char *color); - void draw_legend(const Point &pt, const char *text, const char *color); + void draw_text(const Point &pt, const char *text, const char *color, coordf_t font_size = 20.f); + void draw_legend(const Point &pt, const char *text, const char *color, coordf_t font_size = 10.f); void Close(); diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index e2a1f0cf23..e8ee782f43 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -8,6 +8,8 @@ #include "Point.hpp" #include "MutablePolygon.hpp" +#include + #include #include #include @@ -61,19 +63,19 @@ namespace Slic3r { //#define SUPPORT_SURFACES_OFFSET_PARAMETERS ClipperLib::jtMiter, 1.5 #define SUPPORT_SURFACES_OFFSET_PARAMETERS ClipperLib::jtSquare, 0. -#ifdef SLIC3R_DEBUG -const char* support_surface_type_to_color_name(const PrintObjectSupportMaterial::SupporLayerType surface_type) +#if 1 //#ifdef SLIC3R_DEBUG +const char* support_surface_type_to_color_name(const SupporLayerType surface_type) { switch (surface_type) { - case PrintObjectSupportMaterial::sltTopContact: return "rgb(255,0,0)"; // "red"; - case PrintObjectSupportMaterial::sltTopInterface: return "rgb(0,255,0)"; // "green"; - case PrintObjectSupportMaterial::sltBase: return "rgb(0,0,255)"; // "blue"; - case PrintObjectSupportMaterial::sltBottomInterface:return "rgb(255,255,128)"; // yellow - case PrintObjectSupportMaterial::sltBottomContact: return "rgb(255,0,255)"; // magenta - case PrintObjectSupportMaterial::sltRaftInterface: return "rgb(0,255,255)"; - case PrintObjectSupportMaterial::sltRaftBase: return "rgb(128,128,128)"; - case PrintObjectSupportMaterial::sltUnknown: return "rgb(128,0,0)"; // maroon - default: return "rgb(64,64,64)"; + case SupporLayerType::TopContact: return "rgb(255,0,0)"; // "red"; + case SupporLayerType::TopInterface: return "rgb(0,255,0)"; // "green"; + case SupporLayerType::Base: return "rgb(0,0,255)"; // "blue"; + case SupporLayerType::BottomInterface:return "rgb(255,255,128)"; // yellow + case SupporLayerType::BottomContact: return "rgb(255,0,255)"; // magenta + case SupporLayerType::RaftInterface: return "rgb(0,255,255)"; + case SupporLayerType::RaftBase: return "rgb(128,128,128)"; + case SupporLayerType::Unknown: return "rgb(128,0,0)"; // maroon + default: return "rgb(64,64,64)"; }; } @@ -89,28 +91,28 @@ void export_support_surface_type_legend_to_svg(SVG &svg, const Point &pos) coord_t pos_x = pos_x0; coord_t pos_y = pos(1) + scale_(1.5); coord_t step_x = scale_(10.); - svg.draw_legend(Point(pos_x, pos_y), "top contact" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltTopContact)); + svg.draw_legend(Point(pos_x, pos_y), "top contact" , support_surface_type_to_color_name(SupporLayerType::TopContact)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "top iface" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltTopInterface)); + svg.draw_legend(Point(pos_x, pos_y), "top iface" , support_surface_type_to_color_name(SupporLayerType::TopInterface)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "base" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltBase)); + svg.draw_legend(Point(pos_x, pos_y), "base" , support_surface_type_to_color_name(SupporLayerType::Base)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "bottom iface" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltBottomInterface)); + svg.draw_legend(Point(pos_x, pos_y), "bottom iface" , support_surface_type_to_color_name(SupporLayerType::BottomInterface)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "bottom contact" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltBottomContact)); + svg.draw_legend(Point(pos_x, pos_y), "bottom contact" , support_surface_type_to_color_name(SupporLayerType::BottomContact)); // 2nd row pos_x = pos_x0; pos_y = pos(1)+scale_(2.8); - svg.draw_legend(Point(pos_x, pos_y), "raft interface" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltRaftInterface)); + svg.draw_legend(Point(pos_x, pos_y), "raft interface" , support_surface_type_to_color_name(SupporLayerType::RaftInterface)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "raft base" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltRaftBase)); + svg.draw_legend(Point(pos_x, pos_y), "raft base" , support_surface_type_to_color_name(SupporLayerType::RaftBase)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "unknown" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltUnknown)); + svg.draw_legend(Point(pos_x, pos_y), "unknown" , support_surface_type_to_color_name(SupporLayerType::Unknown)); pos_x += step_x; - svg.draw_legend(Point(pos_x, pos_y), "intermediate" , support_surface_type_to_color_name(PrintObjectSupportMaterial::sltIntermediate)); + svg.draw_legend(Point(pos_x, pos_y), "intermediate" , support_surface_type_to_color_name(SupporLayerType::Intermediate)); } -void export_print_z_polygons_to_svg(const char *path, PrintObjectSupportMaterial::MyLayer ** const layers, size_t n_layers) +void export_print_z_polygons_to_svg(const char *path, SupportGeneratorLayer ** const layers, int n_layers) { BoundingBox bbox; for (int i = 0; i < n_layers; ++ i) @@ -129,10 +131,10 @@ void export_print_z_polygons_to_svg(const char *path, PrintObjectSupportMaterial } void export_print_z_polygons_and_extrusions_to_svg( - const char *path, - PrintObjectSupportMaterial::MyLayer ** const layers, - size_t n_layers, - SupportLayer &support_layer) + const char *path, + SupportGeneratorLayer ** const layers, + int n_layers, + SupportLayer &support_layer) { BoundingBox bbox; for (int i = 0; i < n_layers; ++ i) @@ -321,112 +323,119 @@ static Polygons contours_simplified(const Vec2i &grid_size, const double pixel_s } #endif // SUPPORT_USE_AGG_RASTERIZER -PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params) : - m_object (object), - m_print_config (&object->print()->config()), - m_object_config (&object->config()), - m_slicing_params (slicing_params) +SupportParameters::SupportParameters(const PrintObject &object) { - m_support_params.first_layer_flow = support_material_1st_layer_flow(object, float(slicing_params.first_print_layer_height)); - m_support_params.support_material_flow = support_material_flow(object, float(slicing_params.layer_height)); - m_support_params.support_material_interface_flow = support_material_interface_flow(object, float(slicing_params.layer_height)); - m_support_params.support_layer_height_min = 0.01; + const PrintConfig &print_config = object.print()->config(); + const PrintObjectConfig &object_config = object.config(); + const SlicingParameters &slicing_params = object.slicing_parameters(); + + this->first_layer_flow = Slic3r::support_material_1st_layer_flow(&object, float(slicing_params.first_print_layer_height)); + this->support_material_flow = Slic3r::support_material_flow(&object, float(slicing_params.layer_height)); + this->support_material_interface_flow = Slic3r::support_material_interface_flow(&object, float(slicing_params.layer_height)); // Calculate a minimum support layer height as a minimum over all extruders, but not smaller than 10um. - m_support_params.support_layer_height_min = 1000000.; - for (auto lh : m_print_config->min_layer_height.values) - m_support_params.support_layer_height_min = std::min(m_support_params.support_layer_height_min, std::max(0.01, lh)); - for (auto layer : m_object->layers()) - m_support_params.support_layer_height_min = std::min(m_support_params.support_layer_height_min, std::max(0.01, layer->height)); + this->support_layer_height_min = scaled(0.01); + for (auto lh : print_config.min_layer_height.values) + this->support_layer_height_min = std::min(this->support_layer_height_min, std::max(0.01, lh)); + for (auto layer : object.layers()) + this->support_layer_height_min = std::min(this->support_layer_height_min, std::max(0.01, layer->height)); - if (m_object_config->support_material_interface_layers.value == 0) { + if (object_config.support_material_interface_layers.value == 0) { // No interface layers allowed, print everything with the base support pattern. - m_support_params.support_material_interface_flow = m_support_params.support_material_flow; + this->support_material_interface_flow = this->support_material_flow; } // Evaluate the XY gap between the object outer perimeters and the support structures. // Evaluate the XY gap between the object outer perimeters and the support structures. coordf_t external_perimeter_width = 0.; coordf_t bridge_flow_ratio = 0; - for (size_t region_id = 0; region_id < object->num_printing_regions(); ++ region_id) { - const PrintRegion ®ion = object->printing_region(region_id); - external_perimeter_width = std::max(external_perimeter_width, coordf_t(region.flow(*object, frExternalPerimeter, slicing_params.layer_height).width())); + for (size_t region_id = 0; region_id < object.num_printing_regions(); ++ region_id) { + const PrintRegion ®ion = object.printing_region(region_id); + external_perimeter_width = std::max(external_perimeter_width, coordf_t(region.flow(object, frExternalPerimeter, slicing_params.layer_height).width())); bridge_flow_ratio += region.config().bridge_flow_ratio; } - m_support_params.gap_xy = m_object_config->support_material_xy_spacing.get_abs_value(external_perimeter_width); - bridge_flow_ratio /= object->num_printing_regions(); + this->gap_xy = object_config.support_material_xy_spacing.get_abs_value(external_perimeter_width); + bridge_flow_ratio /= object.num_printing_regions(); - m_support_params.support_material_bottom_interface_flow = m_slicing_params.soluble_interface || ! m_object_config->thick_bridges ? - m_support_params.support_material_interface_flow.with_flow_ratio(bridge_flow_ratio) : - Flow::bridging_flow(bridge_flow_ratio * m_support_params.support_material_interface_flow.nozzle_diameter(), m_support_params.support_material_interface_flow.nozzle_diameter()); + this->support_material_bottom_interface_flow = slicing_params.soluble_interface || ! object_config.thick_bridges ? + this->support_material_interface_flow.with_flow_ratio(bridge_flow_ratio) : + Flow::bridging_flow(bridge_flow_ratio * this->support_material_interface_flow.nozzle_diameter(), this->support_material_interface_flow.nozzle_diameter()); - m_support_params.can_merge_support_regions = m_object_config->support_material_extruder.value == m_object_config->support_material_interface_extruder.value; - if (!m_support_params.can_merge_support_regions && (m_object_config->support_material_extruder.value == 0 || m_object_config->support_material_interface_extruder.value == 0)) { + this->can_merge_support_regions = object_config.support_material_extruder.value == object_config.support_material_interface_extruder.value; + if (!this->can_merge_support_regions && (object_config.support_material_extruder.value == 0 || object_config.support_material_interface_extruder.value == 0)) { // One of the support extruders is of "don't care" type. - auto object_extruders = m_object->object_extruders(); + auto object_extruders = object.object_extruders(); if (object_extruders.size() == 1 && - *object_extruders.begin() == std::max(m_object_config->support_material_extruder.value, m_object_config->support_material_interface_extruder.value)) + *object_extruders.begin() == std::max(object_config.support_material_extruder.value, object_config.support_material_interface_extruder.value)) // Object is printed with the same extruder as the support. - m_support_params.can_merge_support_regions = true; + this->can_merge_support_regions = true; } - m_support_params.base_angle = Geometry::deg2rad(float(m_object_config->support_material_angle.value)); - m_support_params.interface_angle = Geometry::deg2rad(float(m_object_config->support_material_angle.value + 90.)); - m_support_params.interface_spacing = m_object_config->support_material_interface_spacing.value + m_support_params.support_material_interface_flow.spacing(); - m_support_params.interface_density = std::min(1., m_support_params.support_material_interface_flow.spacing() / m_support_params.interface_spacing); - m_support_params.support_spacing = m_object_config->support_material_spacing.value + m_support_params.support_material_flow.spacing(); - m_support_params.support_density = std::min(1., m_support_params.support_material_flow.spacing() / m_support_params.support_spacing); - if (m_object_config->support_material_interface_layers.value == 0) { + this->base_angle = Geometry::deg2rad(float(object_config.support_material_angle.value)); + this->interface_angle = Geometry::deg2rad(float(object_config.support_material_angle.value + 90.)); + this->interface_spacing = object_config.support_material_interface_spacing.value + this->support_material_interface_flow.spacing(); + this->interface_density = std::min(1., this->support_material_interface_flow.spacing() / this->interface_spacing); + this->support_spacing = object_config.support_material_spacing.value + this->support_material_flow.spacing(); + this->support_density = std::min(1., this->support_material_flow.spacing() / this->support_spacing); + if (object_config.support_material_interface_layers.value == 0) { // No interface layers allowed, print everything with the base support pattern. - m_support_params.interface_spacing = m_support_params.support_spacing; - m_support_params.interface_density = m_support_params.support_density; + this->interface_spacing = this->support_spacing; + this->interface_density = this->support_density; } - SupportMaterialPattern support_pattern = m_object_config->support_material_pattern; - m_support_params.with_sheath = m_object_config->support_material_with_sheath; - m_support_params.base_fill_pattern = + SupportMaterialPattern support_pattern = object_config.support_material_pattern; + this->with_sheath = object_config.support_material_with_sheath; + this->base_fill_pattern = support_pattern == smpHoneycomb ? ipHoneycomb : - m_support_params.support_density > 0.95 || m_support_params.with_sheath ? ipRectilinear : ipSupportBase; - m_support_params.interface_fill_pattern = (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); - m_support_params.contact_fill_pattern = - (m_object_config->support_material_interface_pattern == smipAuto && m_slicing_params.soluble_interface) || - m_object_config->support_material_interface_pattern == smipConcentric ? + this->support_density > 0.95 || this->with_sheath ? ipRectilinear : ipSupportBase; + this->interface_fill_pattern = (this->interface_density > 0.95 ? ipRectilinear : ipSupportBase); + this->contact_fill_pattern = + (object_config.support_material_interface_pattern == smipAuto && slicing_params.soluble_interface) || + object_config.support_material_interface_pattern == smipConcentric ? ipConcentric : - (m_support_params.interface_density > 0.95 ? ipRectilinear : ipSupportBase); + (this->interface_density > 0.95 ? ipRectilinear : ipSupportBase); +} + +PrintObjectSupportMaterial::PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params) : + m_print_config (&object->print()->config()), + m_object_config (&object->config()), + m_slicing_params (slicing_params), + m_support_params (*object) +{ } // Using the std::deque as an allocator. -inline PrintObjectSupportMaterial::MyLayer& layer_allocate( - std::deque &layer_storage, - PrintObjectSupportMaterial::SupporLayerType layer_type) +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, + SupporLayerType layer_type) { - layer_storage.push_back(PrintObjectSupportMaterial::MyLayer()); + layer_storage.push_back(SupportGeneratorLayer()); layer_storage.back().layer_type = layer_type; return layer_storage.back(); } -inline PrintObjectSupportMaterial::MyLayer& layer_allocate( - std::deque &layer_storage, +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, tbb::spin_mutex &layer_storage_mutex, - PrintObjectSupportMaterial::SupporLayerType layer_type) + SupporLayerType layer_type) { layer_storage_mutex.lock(); - layer_storage.push_back(PrintObjectSupportMaterial::MyLayer()); - PrintObjectSupportMaterial::MyLayer *layer_new = &layer_storage.back(); + layer_storage.push_back(SupportGeneratorLayer()); + SupportGeneratorLayer *layer_new = &layer_storage.back(); layer_storage_mutex.unlock(); layer_new->layer_type = layer_type; return *layer_new; } -inline void layers_append(PrintObjectSupportMaterial::MyLayersPtr &dst, const PrintObjectSupportMaterial::MyLayersPtr &src) +inline void layers_append(SupportGeneratorLayersPtr &dst, const SupportGeneratorLayersPtr &src) { dst.insert(dst.end(), src.begin(), src.end()); } // Support layer that is covered by some form of dense interface. -static constexpr const std::initializer_list support_types_interface { - PrintObjectSupportMaterial::sltRaftInterface, PrintObjectSupportMaterial::sltBottomContact, PrintObjectSupportMaterial::sltBottomInterface, PrintObjectSupportMaterial::sltTopContact, PrintObjectSupportMaterial::sltTopInterface +static constexpr const std::initializer_list support_types_interface { + SupporLayerType::RaftInterface, SupporLayerType::BottomContact, SupporLayerType::BottomInterface, SupporLayerType::TopContact, SupporLayerType::TopInterface }; void PrintObjectSupportMaterial::generate(PrintObject &object) @@ -439,7 +448,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // Layer instances will be allocated by std::deque and they will be kept until the end of this function call. // The layers will be referenced by various LayersPtr (of type std::vector) - MyLayerStorage layer_storage; + SupportGeneratorLayerStorage layer_storage; BOOST_LOG_TRIVIAL(info) << "Support generator - Creating top contacts"; @@ -452,7 +461,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // should the support material expose to the object in order to guarantee // that it will be effective, regardless of how it's built below. // If raft is to be generated, the 1st top_contact layer will contain the 1st object layer silhouette without holes. - MyLayersPtr top_contacts = this->top_contact_layers(object, buildplate_covered, layer_storage); + SupportGeneratorLayersPtr top_contacts = this->top_contact_layers(object, buildplate_covered, layer_storage); if (top_contacts.empty()) // Nothing is supported, no supports are generated. return; @@ -460,7 +469,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) #ifdef SLIC3R_DEBUG static int iRun = 0; iRun ++; - for (const MyLayer *layer : top_contacts) + for (const SupportGeneratorLayer *layer : top_contacts) Slic3r::SVG::export_expolygons( debug_out_path("support-top-contacts-%d-%lf.svg", iRun, layer->print_z), union_ex(layer->polygons)); @@ -473,7 +482,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // layer_support_areas contains the per object layer support areas. These per object layer support areas // may get merged and trimmed by this->generate_base_layers() if the support layers are not synchronized with object layers. std::vector layer_support_areas; - MyLayersPtr bottom_contacts = this->bottom_contact_layers_and_layer_support_areas( + SupportGeneratorLayersPtr bottom_contacts = this->bottom_contact_layers_and_layer_support_areas( object, top_contacts, buildplate_covered, layer_storage, layer_support_areas); @@ -491,13 +500,13 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // The layers may or may not be synchronized with the object layers, depending on the configuration. // For example, a single nozzle multi material printing will need to generate a waste tower, which in turn // wastes less material, if there are as little tool changes as possible. - MyLayersPtr intermediate_layers = this->raft_and_intermediate_support_layers( + SupportGeneratorLayersPtr intermediate_layers = this->raft_and_intermediate_support_layers( object, bottom_contacts, top_contacts, layer_storage); this->trim_support_layers_by_object(object, top_contacts, m_slicing_params.gap_support_object, m_slicing_params.gap_object_support, m_support_params.gap_xy); #ifdef SLIC3R_DEBUG - for (const MyLayer *layer : top_contacts) + for (const SupportGeneratorLayer *layer : top_contacts) Slic3r::SVG::export_expolygons( debug_out_path("support-top-contacts-trimmed-by-object-%d-%lf.svg", iRun, layer->print_z), union_ex(layer->polygons)); @@ -509,7 +518,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) this->generate_base_layers(object, bottom_contacts, top_contacts, intermediate_layers, layer_support_areas); #ifdef SLIC3R_DEBUG - for (MyLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++ it) + for (SupportGeneratorLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++ it) Slic3r::SVG::export_expolygons( debug_out_path("support-base-layers-%d-%lf.svg", iRun, (*it)->print_z), union_ex((*it)->polygons)); @@ -535,14 +544,14 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // If raft is to be generated, the 1st top_contact layer will contain the 1st object layer silhouette with holes filled. // There is also a 1st intermediate layer containing bases of support columns. // Inflate the bases of the support columns and create the raft base under the object. - MyLayersPtr raft_layers = this->generate_raft_base(object, top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage); + SupportGeneratorLayersPtr raft_layers = generate_raft_base(object, m_support_params, m_slicing_params, top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage); #ifdef SLIC3R_DEBUG - for (const MyLayer *l : interface_layers) + for (const SupportGeneratorLayer *l : interface_layers) Slic3r::SVG::export_expolygons( debug_out_path("support-interface-layers-%d-%lf.svg", iRun, l->print_z), union_ex(l->polygons)); - for (const MyLayer *l : base_interface_layers) + for (const SupportGeneratorLayer *l : base_interface_layers) Slic3r::SVG::export_expolygons( debug_out_path("support-base-interface-layers-%d-%lf.svg", iRun, l->print_z), union_ex(l->polygons)); @@ -565,71 +574,10 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // intermediate_layers.clear(); // interface_layers.clear(); - // Install support layers into the object. - // A support layer installed on a PrintObject has a unique print_z. - MyLayersPtr layers_sorted; - layers_sorted.reserve(raft_layers.size() + bottom_contacts.size() + top_contacts.size() + intermediate_layers.size() + interface_layers.size() + base_interface_layers.size()); - layers_append(layers_sorted, raft_layers); - layers_append(layers_sorted, bottom_contacts); - layers_append(layers_sorted, top_contacts); - layers_append(layers_sorted, intermediate_layers); - layers_append(layers_sorted, interface_layers); - layers_append(layers_sorted, base_interface_layers); - // Sort the layers lexicographically by a raising print_z and a decreasing height. - std::sort(layers_sorted.begin(), layers_sorted.end(), [](auto *l1, auto *l2) { return *l1 < *l2; }); - int layer_id = 0; - int layer_id_interface = 0; - assert(object.support_layers().empty()); - for (size_t i = 0; i < layers_sorted.size();) { - // Find the last layer with roughly the same print_z, find the minimum layer height of all. - // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. - size_t j = i + 1; - coordf_t zmax = layers_sorted[i]->print_z + EPSILON; - for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) ; - // Assign an average print_z to the set of layers with nearly equal print_z. - coordf_t zavg = 0.5 * (layers_sorted[i]->print_z + layers_sorted[j - 1]->print_z); - coordf_t height_min = layers_sorted[i]->height; - bool empty = true; - // For snug supports, layers where the direction of the support interface shall change are accounted for. - size_t num_interfaces = 0; - size_t num_top_contacts = 0; - double top_contact_bottom_z = 0; - for (size_t u = i; u < j; ++u) { - MyLayer &layer = *layers_sorted[u]; - if (! layer.polygons.empty()) { - empty = false; - num_interfaces += one_of(layer.layer_type, support_types_interface); - if (layer.layer_type == sltTopContact) { - ++ num_top_contacts; - assert(num_top_contacts <= 1); - // All top contact layers sharing this print_z shall also share bottom_z. - //assert(num_top_contacts == 1 || (top_contact_bottom_z - layer.bottom_z) < EPSILON); - top_contact_bottom_z = layer.bottom_z; - } - } - layer.print_z = zavg; - height_min = std::min(height_min, layer.height); - } - if (! empty) { - // Here the upper_layer and lower_layer pointers are left to null at the support layers, - // as they are never used. These pointers are candidates for removal. - bool this_layer_contacts_only = num_top_contacts > 0 && num_top_contacts == num_interfaces; - size_t this_layer_id_interface = layer_id_interface; - if (this_layer_contacts_only) { - // Find a supporting layer for its interface ID. - for (auto it = object.support_layers().rbegin(); it != object.support_layers().rend(); ++ it) - if (const SupportLayer &other_layer = **it; std::abs(other_layer.print_z - top_contact_bottom_z) < EPSILON) { - // other_layer supports this top contact layer. Assign a different support interface direction to this layer - // from the layer that supports it. - this_layer_id_interface = other_layer.interface_id() + 1; - } - } - object.add_support_layer(layer_id ++, this_layer_id_interface, height_min, zavg); - if (num_interfaces && ! this_layer_contacts_only) - ++ layer_id_interface; - } - i = j; - } +#ifdef SLIC3R_DEBUG + SupportGeneratorLayersPtr layers_sorted = +#endif // SLIC3R_DEBUG + generate_support_layers(object, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); BOOST_LOG_TRIVIAL(info) << "Support generator - Generating tool paths"; @@ -641,7 +589,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. int j = i + 1; coordf_t zmax = layers_sorted[i]->print_z + EPSILON; - bool empty = true; + bool empty = layers_sorted[i]->polygons.empty(); for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) if (!layers_sorted[j]->polygons.empty()) empty = false; @@ -661,7 +609,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) #endif /* SLIC3R_DEBUG */ // Generate the actual toolpaths and save them into each layer. - this->generate_toolpaths(object.support_layers(), raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); + generate_support_toolpaths(object.support_layers(), *m_object_config, m_support_params, m_slicing_params, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); #ifdef SLIC3R_DEBUG { @@ -671,7 +619,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object) // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. int j = i + 1; coordf_t zmax = layers_sorted[i]->print_z + EPSILON; - bool empty = true; + bool empty = layers_sorted[i]->polygons.empty(); for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) if (! layers_sorted[j]->polygons.empty()) empty = false; @@ -848,6 +796,9 @@ public: ) { switch (m_style) { + case smsTree: + assert(false); + [[fallthrough]]; case smsGrid: { #ifdef SUPPORT_USE_AGG_RASTERIZER @@ -1681,17 +1632,17 @@ static inline std::tuple detect_overhangs( // Allocate one, possibly two support contact layers. // For "thick" overhangs, one support layer will be generated to support normal extrusions, the other to support the "thick" extrusions. -static inline std::pair new_contact_layer( +static inline std::pair new_contact_layer( const PrintConfig &print_config, const PrintObjectConfig &object_config, const SlicingParameters &slicing_params, const coordf_t support_layer_height_min, const Layer &layer, - std::deque &layer_storage, + std::deque &layer_storage, tbb::spin_mutex &layer_storage_mutex) { double print_z, bottom_z, height; - PrintObjectSupportMaterial::MyLayer* bridging_layer = nullptr; + SupportGeneratorLayer* bridging_layer = nullptr; assert(layer.id() >= slicing_params.raft_layers()); size_t layer_id = layer.id() - slicing_params.raft_layers(); @@ -1717,7 +1668,7 @@ static inline std::pair(nullptr, nullptr); + return std::pair(nullptr, nullptr); } const bool has_raft = slicing_params.raft_layers() > 1; const coordf_t min_print_z = has_raft ? slicing_params.raft_contact_top_z : slicing_params.first_print_layer_height; @@ -1748,7 +1699,7 @@ static inline std::pairidx_object_layer_above = layer_id; bridging_layer->print_z = bridging_print_z; if (bridging_print_z == slicing_params.first_print_layer_height) { @@ -1764,7 +1715,7 @@ static inline std::pairprint_z < l2->print_z; }); + std::sort(layers.begin(), layers.end(), [](const SupportGeneratorLayer *l1, const SupportGeneratorLayer *l2) { return l1->print_z < l2->print_z; }); int i = 0; int k = 0; @@ -1938,7 +1889,7 @@ static void merge_contact_layers(const SlicingParameters &slicing_params, double for (; j < (int)layers.size() && layers[j]->print_z < slicing_params.first_print_layer_height + support_layer_height_min - EPSILON; ++ j); if (j > 0) { // Merge the layers layers (0) to (j - 1) into the layers[0]. - PrintObjectSupportMaterial::MyLayer &dst = *layers.front(); + SupportGeneratorLayer &dst = *layers.front(); for (int u = 1; u < j; ++ u) dst.merge(std::move(*layers[u])); // Snap the first layer to the 1st layer height. @@ -1956,7 +1907,7 @@ static void merge_contact_layers(const SlicingParameters &slicing_params, double for (; j < (int)layers.size() && layers[j]->print_z < zmax; ++ j) ; if (i + 1 < j) { // Merge the layers layers (i + 1) to (j - 1) into the layers[i]. - PrintObjectSupportMaterial::MyLayer &dst = *layers[i]; + SupportGeneratorLayer &dst = *layers[i]; for (int u = i + 1; u < j; ++ u) dst.merge(std::move(*layers[u])); } @@ -1971,8 +1922,8 @@ static void merge_contact_layers(const SlicingParameters &slicing_params, double // Generate top contact layers supporting overhangs. // For a soluble interface material synchronize the layer heights with the object, otherwise leave the layer height undefined. // If supports over bed surface only are requested, don't generate contact layers over an object. -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_layers( - const PrintObject &object, const std::vector &buildplate_covered, MyLayerStorage &layer_storage) const +SupportGeneratorLayersPtr PrintObjectSupportMaterial::top_contact_layers( + const PrintObject &object, const std::vector &buildplate_covered, SupportGeneratorLayerStorage &layer_storage) const { #ifdef SLIC3R_DEBUG static int iRun = 0; @@ -1984,7 +1935,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ SupportAnnotations annotations(object, buildplate_covered); // Output layers, sorted by top Z. - MyLayersPtr contact_out; + SupportGeneratorLayersPtr contact_out; BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::top_contact_layers() in parallel - start"; // Determine top contact areas. @@ -2056,17 +2007,17 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ } // Find the bottom contact layers above the top surfaces of this layer. -static inline PrintObjectSupportMaterial::MyLayer* detect_bottom_contacts( +static inline SupportGeneratorLayer* detect_bottom_contacts( const SlicingParameters &slicing_params, - const PrintObjectSupportMaterial::SupportParams &support_params, + const SupportParameters &support_params, const PrintObject &object, const Layer &layer, // Existing top contact layers, to which this newly created bottom contact layer will be snapped to guarantee a minimum layer height. - const PrintObjectSupportMaterial::MyLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &top_contacts, // First top contact layer index overlapping with this new bottom interface layer. size_t contact_idx, // To allocate a new layer from. - std::deque &layer_storage, + std::deque &layer_storage, // To trim the support areas above this bottom interface layer with this newly created bottom interface layer. std::vector &layer_support_areas, // Support areas projected from top to bottom, starting with top support interfaces. @@ -2101,7 +2052,7 @@ static inline PrintObjectSupportMaterial::MyLayer* detect_bottom_contacts( size_t layer_id = layer.id() - slicing_params.raft_layers(); // Allocate a new bottom contact layer. - PrintObjectSupportMaterial::MyLayer &layer_new = layer_allocate(layer_storage, PrintObjectSupportMaterial::sltBottomContact); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::BottomContact); // Grow top surfaces so that interface and support generation are generated // with some spacing from object - it looks we don't need the actual // top shapes so this can be done here @@ -2263,12 +2214,12 @@ static inline std::pair project_support_to_grid(const Layer // Generate bottom contact layers supporting the top contact layers. // For a soluble interface material synchronize the layer heights with the object, // otherwise set the layer height to a bridging flow of a support interface nozzle. -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_contact_layers_and_layer_support_areas( - const PrintObject &object, const MyLayersPtr &top_contacts, std::vector &buildplate_covered, - MyLayerStorage &layer_storage, std::vector &layer_support_areas) const +SupportGeneratorLayersPtr PrintObjectSupportMaterial::bottom_contact_layers_and_layer_support_areas( + const PrintObject &object, const SupportGeneratorLayersPtr &top_contacts, std::vector &buildplate_covered, + SupportGeneratorLayerStorage &layer_storage, std::vector &layer_support_areas) const { if (top_contacts.empty()) - return MyLayersPtr(); + return SupportGeneratorLayersPtr(); #ifdef SLIC3R_DEBUG static size_t s_iRun = 0; @@ -2285,7 +2236,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta // find object top surfaces // we'll use them to clip our support and detect where does it stick - MyLayersPtr bottom_contacts; + SupportGeneratorLayersPtr bottom_contacts; // There is some support to be built, if there are non-empty top surfaces detected. // Sum of unsupported contact areas above the current layer.print_z. @@ -2304,7 +2255,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta Polygons enforcers_new; #endif // SLIC3R_DEBUG for (; contact_idx >= 0 && top_contacts[contact_idx]->print_z > layer.print_z - EPSILON; -- contact_idx) { - MyLayer &top_contact = *top_contacts[contact_idx]; + SupportGeneratorLayer &top_contact = *top_contacts[contact_idx]; #ifndef SLIC3R_DEBUG Polygons polygons_new; Polygons enforcers_new; @@ -2346,7 +2297,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta #endif // SLIC3R_DEBUG ] { // Find the bottom contact layers above the top surfaces of this layer. - MyLayer *layer_new = detect_bottom_contacts( + SupportGeneratorLayer *layer_new = detect_bottom_contacts( m_slicing_params, m_support_params, object, layer, top_contacts, contact_idx, layer_storage, layer_support_areas, overhangs_for_bottom_contacts #ifdef SLIC3R_DEBUG , iRun, polygons_new @@ -2481,19 +2432,19 @@ int idx_lower_or_equal(const std::vector &vec, int idx, FN_LOWER_EQUAL fn_lo // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them. void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts( - const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const + const PrintObject &object, const SupportGeneratorLayersPtr &bottom_contacts, SupportGeneratorLayersPtr &top_contacts) const { tbb::parallel_for(tbb::blocked_range(0, int(top_contacts.size())), [&bottom_contacts, &top_contacts](const tbb::blocked_range& range) { int idx_bottom_overlapping_first = -2; // For all top contact layers, counting downwards due to the way idx_higher_or_equal caches the last index to avoid repeated binary search. for (int idx_top = range.end() - 1; idx_top >= range.begin(); -- idx_top) { - MyLayer &layer_top = *top_contacts[idx_top]; + SupportGeneratorLayer &layer_top = *top_contacts[idx_top]; // Find the first bottom layer overlapping with layer_top. - idx_bottom_overlapping_first = idx_lower_or_equal(bottom_contacts, idx_bottom_overlapping_first, [&layer_top](const MyLayer *layer_bottom){ return layer_bottom->bottom_print_z() - EPSILON <= layer_top.bottom_z; }); + idx_bottom_overlapping_first = idx_lower_or_equal(bottom_contacts, idx_bottom_overlapping_first, [&layer_top](const SupportGeneratorLayer *layer_bottom){ return layer_bottom->bottom_print_z() - EPSILON <= layer_top.bottom_z; }); // For all top contact layers overlapping with the thick bottom contact layer: for (int idx_bottom_overlapping = idx_bottom_overlapping_first; idx_bottom_overlapping >= 0; -- idx_bottom_overlapping) { - const MyLayer &layer_bottom = *bottom_contacts[idx_bottom_overlapping]; + const SupportGeneratorLayer &layer_bottom = *bottom_contacts[idx_bottom_overlapping]; assert(layer_bottom.bottom_print_z() - EPSILON <= layer_top.bottom_z); if (layer_top.print_z < layer_bottom.print_z + EPSILON) { // Layers overlap. Trim layer_top with layer_bottom. @@ -2505,16 +2456,16 @@ void PrintObjectSupportMaterial::trim_top_contacts_by_bottom_contacts( }); } -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_intermediate_support_layers( +SupportGeneratorLayersPtr PrintObjectSupportMaterial::raft_and_intermediate_support_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayerStorage &layer_storage) const + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayerStorage &layer_storage) const { - MyLayersPtr intermediate_layers; + SupportGeneratorLayersPtr intermediate_layers; // Collect and sort the extremes (bottoms of the top contacts and tops of the bottom contacts). - MyLayersPtr extremes; + SupportGeneratorLayersPtr extremes; extremes.reserve(top_contacts.size() + bottom_contacts.size()); for (size_t i = 0; i < top_contacts.size(); ++ i) // Bottoms of the top contact layers. In case of non-soluble supports, @@ -2526,18 +2477,18 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int if (extremes.empty()) return intermediate_layers; - auto layer_extreme_lower = [](const MyLayer *l1, const MyLayer *l2) { + auto layer_extreme_lower = [](const SupportGeneratorLayer *l1, const SupportGeneratorLayer *l2) { coordf_t z1 = l1->extreme_z(); coordf_t z2 = l2->extreme_z(); // If the layers are aligned, return the top contact surface first. - return z1 < z2 || (z1 == z2 && l1->layer_type == PrintObjectSupportMaterial::sltTopContact && l2->layer_type == PrintObjectSupportMaterial::sltBottomContact); + return z1 < z2 || (z1 == z2 && l1->layer_type == SupporLayerType::TopContact && l2->layer_type == SupporLayerType::BottomContact); }; std::sort(extremes.begin(), extremes.end(), layer_extreme_lower); assert(extremes.empty() || (extremes.front()->extreme_z() > m_slicing_params.raft_interface_top_z - EPSILON && (m_slicing_params.raft_layers() == 1 || // only raft contact layer - extremes.front()->layer_type == sltTopContact || // first extreme is a top contact layer + extremes.front()->layer_type == SupporLayerType::TopContact || // first extreme is a top contact layer extremes.front()->extreme_z() > m_slicing_params.first_print_layer_height - EPSILON))); bool synchronize = this->synchronize_layers(); @@ -2549,7 +2500,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int extremes[i]->extreme_z() - extremes[i-1]->extreme_z() > m_support_params.support_layer_height_min - EPSILON); assert(extremes[i]->extreme_z() - extremes[i-1]->extreme_z() > 0. || extremes[i]->layer_type == extremes[i-1]->layer_type || - (extremes[i]->layer_type == sltBottomContact && extremes[i - 1]->layer_type == sltTopContact)); + (extremes[i]->layer_type == SupporLayerType::BottomContact && extremes[i - 1]->layer_type == SupporLayerType::TopContact)); } #endif @@ -2562,19 +2513,19 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int if (! extremes.empty() && std::abs(extremes.front()->extreme_z() - m_slicing_params.raft_interface_top_z) < EPSILON) { // This is a raft contact layer, its height has been decided in this->top_contact_layers(). // Ignore this layer when calculating the intermediate support layers. - assert(extremes.front()->layer_type == sltTopContact); + assert(extremes.front()->layer_type == SupporLayerType::TopContact); ++ idx_extreme_first; } for (size_t idx_extreme = idx_extreme_first; idx_extreme < extremes.size(); ++ idx_extreme) { - MyLayer *extr2 = extremes[idx_extreme]; + SupportGeneratorLayer *extr2 = extremes[idx_extreme]; coordf_t extr2z = extr2->extreme_z(); if (std::abs(extr2z - m_slicing_params.first_print_layer_height) < EPSILON) { // This is a bottom of a synchronized (or soluble) top contact layer, its height has been decided in this->top_contact_layers(). - assert(extr2->layer_type == sltTopContact); + assert(extr2->layer_type == SupporLayerType::TopContact); assert(extr2->bottom_z == m_slicing_params.first_print_layer_height); assert(extr2->print_z >= m_slicing_params.first_print_layer_height + m_support_params.support_layer_height_min - EPSILON); if (intermediate_layers.empty() || intermediate_layers.back()->print_z < m_slicing_params.first_print_layer_height) { - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.bottom_z = 0.; layer_new.print_z = m_slicing_params.first_print_layer_height; layer_new.height = m_slicing_params.first_print_layer_height; @@ -2584,11 +2535,11 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int } assert(extr2z >= m_slicing_params.raft_interface_top_z + EPSILON); assert(extr2z >= m_slicing_params.first_print_layer_height + EPSILON); - MyLayer *extr1 = (idx_extreme == idx_extreme_first) ? nullptr : extremes[idx_extreme - 1]; + SupportGeneratorLayer *extr1 = (idx_extreme == idx_extreme_first) ? nullptr : extremes[idx_extreme - 1]; // Fuse a support layer firmly to the raft top interface (not to the raft contacts). coordf_t extr1z = (extr1 == nullptr) ? m_slicing_params.raft_interface_top_z : extr1->extreme_z(); assert(extr2z >= extr1z); - assert(extr2z > extr1z || (extr1 != nullptr && extr2->layer_type == sltBottomContact)); + assert(extr2z > extr1z || (extr1 != nullptr && extr2->layer_type == SupporLayerType::BottomContact)); if (std::abs(extr1z) < EPSILON) { // This layer interval starts with the 1st layer. Print the 1st layer using the prescribed 1st layer thickness. // assert(! m_slicing_params.has_raft()); RaftingEdition: unclear where the issue is: assert fails with 1-layer raft & base supports @@ -2596,7 +2547,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int // At this point only layers above first_print_layer_heigth + EPSILON are expected as the other cases were captured earlier. assert(extr2z >= m_slicing_params.first_print_layer_height + EPSILON); // Generate a new intermediate layer. - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.bottom_z = 0.; layer_new.print_z = extr1z = m_slicing_params.first_print_layer_height; layer_new.height = extr1z; @@ -2616,7 +2567,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int ++ idx_layer_object; if (idx_layer_object == 0 && extr1z == m_slicing_params.raft_interface_top_z) { // Insert one base support layer below the object. - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.print_z = m_slicing_params.object_print_z_min; layer_new.bottom_z = m_slicing_params.raft_interface_top_z; layer_new.height = layer_new.print_z - layer_new.bottom_z; @@ -2624,7 +2575,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int } // Emit all intermediate support layers synchronized with object layers up to extr2z. for (; idx_layer_object < object.layers().size() && object.layers()[idx_layer_object]->print_z < extr2z + EPSILON; ++ idx_layer_object) { - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.print_z = object.layers()[idx_layer_object]->print_z; layer_new.height = object.layers()[idx_layer_object]->height; layer_new.bottom_z = (idx_layer_object > 0) ? object.layers()[idx_layer_object - 1]->print_z : (layer_new.print_z - layer_new.height); @@ -2636,13 +2587,13 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int size_t n_layers_extra = size_t(ceil(dist / m_slicing_params.max_suport_layer_height)); assert(n_layers_extra > 0); coordf_t step = dist / coordf_t(n_layers_extra); - if (extr1 != nullptr && extr1->layer_type == sltTopContact && + if (extr1 != nullptr && extr1->layer_type == SupporLayerType::TopContact && extr1->print_z + m_support_params.support_layer_height_min > extr1->bottom_z + step) { // The bottom extreme is a bottom of a top surface. Ensure that the gap // between the 1st intermediate layer print_z and extr1->print_z is not too small. assert(extr1->bottom_z + m_support_params.support_layer_height_min < extr1->print_z + EPSILON); // Generate the first intermediate layer. - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); layer_new.bottom_z = extr1->bottom_z; layer_new.print_z = extr1z = extr1->print_z; layer_new.height = extr1->height; @@ -2654,7 +2605,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int // Continue printing the other layers up to extr2z. step = dist / coordf_t(n_layers_extra); } - if (! m_slicing_params.soluble_interface && extr2->layer_type == sltTopContact) { + if (! m_slicing_params.soluble_interface && extr2->layer_type == SupporLayerType::TopContact) { // This is a top interface layer, which does not have a height assigned yet. Do it now. assert(extr2->height == 0.); assert(extr1z > m_slicing_params.first_print_layer_height - EPSILON); @@ -2666,7 +2617,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int coordf_t extr2z_large_steps = extr2z; // Take the largest allowed step in the Z axis until extr2z_large_steps is reached. for (size_t i = 0; i < n_layers_extra; ++ i) { - MyLayer &layer_new = layer_allocate(layer_storage, sltIntermediate); + SupportGeneratorLayer &layer_new = layer_allocate(layer_storage, SupporLayerType::Intermediate); if (i + 1 == n_layers_extra) { // Last intermediate layer added. Align the last entered layer with extr2z_large_steps exactly. layer_new.bottom_z = (i == 0) ? extr1z : intermediate_layers.back()->print_z; @@ -2697,9 +2648,9 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::raft_and_int // Also the bottom/top_contacts shall have a layer thickness assigned already. void PrintObjectSupportMaterial::generate_base_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, const std::vector &layer_support_areas) const { #ifdef SLIC3R_DEBUG @@ -2723,7 +2674,7 @@ void PrintObjectSupportMaterial::generate_base_layers( { BOOST_LOG_TRIVIAL(trace) << "Support generator - generate_base_layers - creating layer " << idx_intermediate << " of " << intermediate_layers.size(); - MyLayer &layer_intermediate = *intermediate_layers[idx_intermediate]; + SupportGeneratorLayer &layer_intermediate = *intermediate_layers[idx_intermediate]; // Layers must be sorted by print_z. assert(idx_intermediate == 0 || layer_intermediate.print_z >= intermediate_layers[idx_intermediate - 1]->print_z); @@ -2746,10 +2697,10 @@ void PrintObjectSupportMaterial::generate_base_layers( // 4) base.print_z > top.bottom_z && base.bottom_z < top.bottom_z -> Base overlaps with top.bottom_z. This must not happen. // 5) base.print_z <= top.print_z && base.bottom_z >= top.bottom_z -> Base is fully inside top. Trim base by top. idx_top_contact_above = idx_lower_or_equal(top_contacts, idx_top_contact_above, - [&layer_intermediate](const MyLayer *layer){ return layer->bottom_z <= layer_intermediate.print_z - EPSILON; }); + [&layer_intermediate](const SupportGeneratorLayer *layer){ return layer->bottom_z <= layer_intermediate.print_z - EPSILON; }); // Collect all the top_contact layer intersecting with this layer. for (int idx_top_contact_overlapping = idx_top_contact_above; idx_top_contact_overlapping >= 0; -- idx_top_contact_overlapping) { - MyLayer &layer_top_overlapping = *top_contacts[idx_top_contact_overlapping]; + SupportGeneratorLayer &layer_top_overlapping = *top_contacts[idx_top_contact_overlapping]; if (layer_top_overlapping.print_z < layer_intermediate.bottom_z + EPSILON) break; // Base must not overlap with top.bottom_z. @@ -2766,7 +2717,7 @@ void PrintObjectSupportMaterial::generate_base_layers( polygons_new = layer_support_areas.front(); double first_layer_z = object.layers().front()->print_z; for (int i = idx_top_contact_above + 1; i < int(top_contacts.size()); ++ i) { - MyLayer &contacts = *top_contacts[i]; + SupportGeneratorLayer &contacts = *top_contacts[i]; if (contacts.print_z > first_layer_z + EPSILON) break; assert(contacts.bottom_z > layer_intermediate.print_z - EPSILON); @@ -2783,10 +2734,10 @@ void PrintObjectSupportMaterial::generate_base_layers( // 4) base.print_z > bottom.print_z && base.bottom_z >= bottom.print_z -> Base overlaps with bottom.print_z. This must not happen. // 5) base.print_z <= bottom.print_z && base.bottom_z >= bottom.bottom_z -> Base is fully inside top. Trim base by top. idx_bottom_contact_overlapping = idx_lower_or_equal(bottom_contacts, idx_bottom_contact_overlapping, - [&layer_intermediate](const MyLayer *layer){ return layer->bottom_print_z() <= layer_intermediate.print_z - EPSILON; }); + [&layer_intermediate](const SupportGeneratorLayer *layer){ return layer->bottom_print_z() <= layer_intermediate.print_z - EPSILON; }); // Collect all the bottom_contacts layer intersecting with this layer. for (int i = idx_bottom_contact_overlapping; i >= 0; -- i) { - MyLayer &layer_bottom_overlapping = *bottom_contacts[i]; + SupportGeneratorLayer &layer_bottom_overlapping = *bottom_contacts[i]; if (layer_bottom_overlapping.print_z < layer_intermediate.bottom_print_z() + EPSILON) break; // Base must not overlap with bottom.top_z. @@ -2816,7 +2767,7 @@ void PrintObjectSupportMaterial::generate_base_layers( polygons_new, polygons_trimming, ApplySafetyOffset::Yes); // safety offset to merge the touching source polygons - layer_intermediate.layer_type = sltBase; + layer_intermediate.layer_type = SupporLayerType::Base; #if 0 // coordf_t fillet_radius_scaled = scale_(m_object_config->support_material_spacing); @@ -2838,7 +2789,7 @@ void PrintObjectSupportMaterial::generate_base_layers( BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::generate_base_layers() in parallel - end"; #ifdef SLIC3R_DEBUG - for (MyLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++it) + for (SupportGeneratorLayersPtr::const_iterator it = intermediate_layers.begin(); it != intermediate_layers.end(); ++it) ::Slic3r::SVG::export_expolygons( debug_out_path("support-intermediate-layers-untrimmed-%d-%lf.svg", iRun, (*it)->print_z), union_ex((*it)->polygons)); @@ -2850,7 +2801,7 @@ void PrintObjectSupportMaterial::generate_base_layers( void PrintObjectSupportMaterial::trim_support_layers_by_object( const PrintObject &object, - MyLayersPtr &support_layers, + SupportGeneratorLayersPtr &support_layers, const coordf_t gap_extra_above, const coordf_t gap_extra_below, const coordf_t gap_xy) const @@ -2859,10 +2810,10 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( // Collect non-empty layers to be processed in parallel. // This is a good idea as pulling a thread from a thread pool for an empty task is expensive. - MyLayersPtr nonempty_layers; + SupportGeneratorLayersPtr nonempty_layers; nonempty_layers.reserve(support_layers.size()); for (size_t idx_layer = 0; idx_layer < support_layers.size(); ++ idx_layer) { - MyLayer *support_layer = support_layers[idx_layer]; + SupportGeneratorLayer *support_layer = support_layers[idx_layer]; if (! support_layer->polygons.empty() && support_layer->print_z >= m_slicing_params.raft_contact_top_z + EPSILON) // Non-empty support layer and not a raft layer. nonempty_layers.push_back(support_layer); @@ -2875,7 +2826,7 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( [this, &object, &nonempty_layers, gap_extra_above, gap_extra_below, gap_xy_scaled](const tbb::blocked_range& range) { size_t idx_object_layer_overlapping = size_t(-1); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { - MyLayer &support_layer = *nonempty_layers[idx_layer]; + SupportGeneratorLayer &support_layer = *nonempty_layers[idx_layer]; // BOOST_LOG_TRIVIAL(trace) << "Support generator - trim_support_layers_by_object - trimmming non-empty layer " << idx_layer << " of " << nonempty_layers.size(); assert(! support_layer.polygons.empty() && support_layer.print_z >= m_slicing_params.raft_contact_top_z + EPSILON); // Find the overlapping object layers including the extra above / below gap. @@ -2922,13 +2873,15 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( BOOST_LOG_TRIVIAL(debug) << "PrintObjectSupportMaterial::trim_support_layers_by_object() in parallel - end"; } -PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raft_base( - const PrintObject &object, - const MyLayersPtr &top_contacts, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers, - const MyLayersPtr &base_layers, - MyLayerStorage &layer_storage) const +SupportGeneratorLayersPtr generate_raft_base( + const PrintObject &object, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers, + const SupportGeneratorLayersPtr &base_layers, + SupportGeneratorLayerStorage &layer_storage) { // If there is brim to be generated, calculate the trimming regions. Polygons brim; @@ -2960,22 +2913,22 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf } // How much to inflate the support columns to be stable. This also applies to the 1st layer, if no raft layers are to be printed. - const float inflate_factor_fine = float(scale_((m_slicing_params.raft_layers() > 1) ? 0.5 : EPSILON)); + const float inflate_factor_fine = float(scale_((slicing_params.raft_layers() > 1) ? 0.5 : EPSILON)); const float inflate_factor_1st_layer = std::max(0.f, float(scale_(object.config().raft_first_layer_expansion)) - inflate_factor_fine); - MyLayer *contacts = top_contacts .empty() ? nullptr : top_contacts .front(); - MyLayer *interfaces = interface_layers .empty() ? nullptr : interface_layers .front(); - MyLayer *base_interfaces = base_interface_layers.empty() ? nullptr : base_interface_layers.front(); - MyLayer *columns_base = base_layers .empty() ? nullptr : base_layers .front(); - if (contacts != nullptr && contacts->print_z > std::max(m_slicing_params.first_print_layer_height, m_slicing_params.raft_contact_top_z) + EPSILON) + SupportGeneratorLayer *contacts = top_contacts .empty() ? nullptr : top_contacts .front(); + SupportGeneratorLayer *interfaces = interface_layers .empty() ? nullptr : interface_layers .front(); + SupportGeneratorLayer *base_interfaces = base_interface_layers.empty() ? nullptr : base_interface_layers.front(); + SupportGeneratorLayer *columns_base = base_layers .empty() ? nullptr : base_layers .front(); + if (contacts != nullptr && contacts->print_z > std::max(slicing_params.first_print_layer_height, slicing_params.raft_contact_top_z) + EPSILON) // This is not the raft contact layer. contacts = nullptr; - if (interfaces != nullptr && interfaces->bottom_print_z() > m_slicing_params.raft_interface_top_z + EPSILON) + if (interfaces != nullptr && interfaces->bottom_print_z() > slicing_params.raft_interface_top_z + EPSILON) // This is not the raft column base layer. interfaces = nullptr; - if (base_interfaces != nullptr && base_interfaces->bottom_print_z() > m_slicing_params.raft_interface_top_z + EPSILON) + if (base_interfaces != nullptr && base_interfaces->bottom_print_z() > slicing_params.raft_interface_top_z + EPSILON) // This is not the raft column base layer. base_interfaces = nullptr; - if (columns_base != nullptr && columns_base->bottom_print_z() > m_slicing_params.raft_interface_top_z + EPSILON) + if (columns_base != nullptr && columns_base->bottom_print_z() > slicing_params.raft_interface_top_z + EPSILON) // This is not the raft interface layer. columns_base = nullptr; @@ -2988,9 +2941,9 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf polygons_append(interface_polygons, expand(base_interfaces->polygons, inflate_factor_fine, SUPPORT_SURFACES_OFFSET_PARAMETERS)); // Output vector. - MyLayersPtr raft_layers; + SupportGeneratorLayersPtr raft_layers; - if (m_slicing_params.raft_layers() > 1) { + if (slicing_params.raft_layers() > 1) { Polygons base; Polygons columns; if (columns_base != nullptr) { @@ -3007,30 +2960,30 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf // Do not add the raft contact layer, only add the raft layers below the contact layer. // Insert the 1st layer. { - MyLayer &new_layer = layer_allocate(layer_storage, (m_slicing_params.base_raft_layers > 0) ? sltRaftBase : sltRaftInterface); + SupportGeneratorLayer &new_layer = layer_allocate(layer_storage, (slicing_params.base_raft_layers > 0) ? SupporLayerType::RaftBase : SupporLayerType::RaftInterface); raft_layers.push_back(&new_layer); - new_layer.print_z = m_slicing_params.first_print_layer_height; - new_layer.height = m_slicing_params.first_print_layer_height; + new_layer.print_z = slicing_params.first_print_layer_height; + new_layer.height = slicing_params.first_print_layer_height; new_layer.bottom_z = 0.; new_layer.polygons = inflate_factor_1st_layer > 0 ? expand(base, inflate_factor_1st_layer) : base; } // Insert the base layers. - for (size_t i = 1; i < m_slicing_params.base_raft_layers; ++ i) { + for (size_t i = 1; i < slicing_params.base_raft_layers; ++ i) { coordf_t print_z = raft_layers.back()->print_z; - MyLayer &new_layer = layer_allocate(layer_storage, sltRaftBase); + SupportGeneratorLayer &new_layer = layer_allocate(layer_storage, SupporLayerType::RaftBase); raft_layers.push_back(&new_layer); - new_layer.print_z = print_z + m_slicing_params.base_raft_layer_height; - new_layer.height = m_slicing_params.base_raft_layer_height; + new_layer.print_z = print_z + slicing_params.base_raft_layer_height; + new_layer.height = slicing_params.base_raft_layer_height; new_layer.bottom_z = print_z; new_layer.polygons = base; } // Insert the interface layers. - for (size_t i = 1; i < m_slicing_params.interface_raft_layers; ++ i) { + for (size_t i = 1; i < slicing_params.interface_raft_layers; ++ i) { coordf_t print_z = raft_layers.back()->print_z; - MyLayer &new_layer = layer_allocate(layer_storage, sltRaftInterface); + SupportGeneratorLayer &new_layer = layer_allocate(layer_storage, SupporLayerType::RaftInterface); raft_layers.push_back(&new_layer); - new_layer.print_z = print_z + m_slicing_params.interface_raft_layer_height; - new_layer.height = m_slicing_params.interface_raft_layer_height; + new_layer.print_z = print_z + slicing_params.interface_raft_layer_height; + new_layer.height = slicing_params.interface_raft_layer_height; new_layer.bottom_z = print_z; new_layer.polygons = interface_polygons; //FIXME misusing contact_polygons for support columns. @@ -3038,12 +2991,12 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf } } else { if (columns_base != nullptr) { - // Expand the bases of the support columns in the 1st layer. + // Expand the bases of the support columns in the 1st layer. Polygons &raft = columns_base->polygons; - Polygons trimming = offset(m_object->layers().front()->lslices, (float)scale_(m_support_params.gap_xy), SUPPORT_SURFACES_OFFSET_PARAMETERS); + Polygons trimming = offset(object.layers().front()->lslices, (float)scale_(support_params.gap_xy), SUPPORT_SURFACES_OFFSET_PARAMETERS); if (inflate_factor_1st_layer > SCALED_EPSILON) { // Inflate in multiple steps to avoid leaking of the support 1st layer through object walls. - auto nsteps = std::max(5, int(ceil(inflate_factor_1st_layer / m_support_params.first_layer_flow.scaled_width()))); + auto nsteps = std::max(5, int(ceil(inflate_factor_1st_layer / support_params.first_layer_flow.scaled_width()))); float step = inflate_factor_1st_layer / nsteps; for (int i = 0; i < nsteps; ++ i) raft = diff(expand(raft, step), trimming); @@ -3068,17 +3021,17 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf } // Convert some of the intermediate layers into top/bottom interface layers as well as base interface layers. -std::pair PrintObjectSupportMaterial::generate_interface_layers( - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, - MyLayerStorage &layer_storage) const +std::pair PrintObjectSupportMaterial::generate_interface_layers( + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage) const { // my $area_threshold = $self->interface_flow->scaled_spacing ** 2; - std::pair base_and_interface_layers; - MyLayersPtr &interface_layers = base_and_interface_layers.first; - MyLayersPtr &base_interface_layers = base_and_interface_layers.second; + std::pair base_and_interface_layers; + SupportGeneratorLayersPtr &interface_layers = base_and_interface_layers.first; + SupportGeneratorLayersPtr &base_interface_layers = base_and_interface_layers.second; // distinguish between interface and base interface layers // Contact layer is considered an interface layer, therefore run the following block only if support_material_interface_layers > 1. @@ -3115,7 +3068,7 @@ std::pair MyLayer* { + SupportGeneratorLayer &intermediate_layer, Polygons &bottom, Polygons &&top, const Polygons *subtract, SupporLayerType type) -> SupportGeneratorLayer* { assert(! bottom.empty() || ! top.empty()); // Merge top into bottom, unite them with a safety offset. append(bottom, std::move(top)); @@ -3129,7 +3082,7 @@ std::pair::max() : intermediate_layers[std::min(num_intermediate - 1, idx_intermediate_layer + num_interface_layers_only_top - 1)]->print_z; // Move idx_top_contact_first up until above the current print_z. - idx_top_contact_first = idx_higher_or_equal(top_contacts, idx_top_contact_first, [&intermediate_layer](const MyLayer *layer){ return layer->print_z >= intermediate_layer.print_z; }); // - EPSILON + idx_top_contact_first = idx_higher_or_equal(top_contacts, idx_top_contact_first, [&intermediate_layer](const SupportGeneratorLayer *layer){ return layer->print_z >= intermediate_layer.print_z; }); // - EPSILON // Collect the top contact areas above this intermediate layer, below top_z. for (int idx_top_contact = idx_top_contact_first; idx_top_contact < int(top_contacts.size()); ++ idx_top_contact) { - const MyLayer &top_contact_layer = *top_contacts[idx_top_contact]; + const SupportGeneratorLayer &top_contact_layer = *top_contacts[idx_top_contact]; //FIXME maybe this adds one interface layer in excess? if (top_contact_layer.bottom_z - EPSILON > top_z) break; @@ -3199,26 +3152,26 @@ std::pair::max() : intermediate_layers[std::max(0, idx_intermediate_layer - num_interface_layers_only_bottom)]->bottom_z; // Move idx_bottom_contact_first up until touching bottom_z. - idx_bottom_contact_first = idx_higher_or_equal(bottom_contacts, idx_bottom_contact_first, [bottom_z](const MyLayer *layer){ return layer->print_z >= bottom_z - EPSILON; }); + idx_bottom_contact_first = idx_higher_or_equal(bottom_contacts, idx_bottom_contact_first, [bottom_z](const SupportGeneratorLayer *layer){ return layer->print_z >= bottom_z - EPSILON; }); // Collect the top contact areas above this intermediate layer, below top_z. for (int idx_bottom_contact = idx_bottom_contact_first; idx_bottom_contact < int(bottom_contacts.size()); ++ idx_bottom_contact) { - const MyLayer &bottom_contact_layer = *bottom_contacts[idx_bottom_contact]; + const SupportGeneratorLayer &bottom_contact_layer = *bottom_contacts[idx_bottom_contact]; if (bottom_contact_layer.print_z - EPSILON > intermediate_layer.bottom_z) break; polygons_append(bottom_contact_layer.print_z - EPSILON > bottom_interface_z ? polygons_bottom_contact_projected_interface : polygons_bottom_contact_projected_base, bottom_contact_layer.polygons); } } - MyLayer *interface_layer = nullptr; + SupportGeneratorLayer *interface_layer = nullptr; if (! polygons_bottom_contact_projected_interface.empty() || ! polygons_top_contact_projected_interface.empty()) { interface_layer = insert_layer( intermediate_layer, polygons_bottom_contact_projected_interface, std::move(polygons_top_contact_projected_interface), nullptr, - polygons_top_contact_projected_interface.empty() ? sltBottomInterface : sltTopInterface); + polygons_top_contact_projected_interface.empty() ? SupporLayerType::BottomInterface : SupporLayerType::TopInterface); interface_layers[idx_intermediate_layer] = interface_layer; } if (! polygons_bottom_contact_projected_base.empty() || ! polygons_top_contact_projected_base.empty()) base_interface_layers[idx_intermediate_layer] = insert_layer( intermediate_layer, polygons_bottom_contact_projected_base, std::move(polygons_top_contact_projected_base), - interface_layer ? &interface_layer->polygons : nullptr, sltBase); + interface_layer ? &interface_layer->polygons : nullptr, SupporLayerType::Base); } }); @@ -3281,6 +3234,207 @@ static inline void fill_expolygons_generate_paths( fill_expolygons_generate_paths(dst, std::move(expolygons), filler, fill_params, density, role, flow); } +static inline void tree_supports_generate_paths( + ExtrusionEntitiesPtr &dst, + const Polygons &polygons, + const Flow &flow) +{ + // Offset expolygon inside, returns number of expolygons collected (0 or 1). + // Vertices of output paths are marked with Z = source contour index of the expoly. + // Vertices at the intersection of source contours are marked with Z = -1. + auto shrink_expolygon_with_contour_idx = [](const Slic3r::ExPolygon &expoly, const float delta, ClipperLib::JoinType joinType, double miterLimit, ClipperLib_Z::Paths &out) -> int + { + assert(delta > 0); + auto append_paths_with_z = [](ClipperLib::Paths &src, coord_t contour_idx, ClipperLib_Z::Paths &dst) { + dst.reserve(next_highest_power_of_2(dst.size() + src.size())); + for (const ClipperLib::Path &contour : src) { + ClipperLib_Z::Path tmp; + tmp.reserve(contour.size()); + for (const Point &p : contour) + tmp.emplace_back(p.x(), p.y(), contour_idx); + dst.emplace_back(std::move(tmp)); + } + }; + + // 1) Offset the outer contour. + ClipperLib_Z::Paths contours; + { + ClipperLib::ClipperOffset co; + if (joinType == jtRound) + co.ArcTolerance = miterLimit; + else + co.MiterLimit = miterLimit; + co.ShortestEdgeLength = double(delta * 0.005); + co.AddPath(expoly.contour.points, joinType, ClipperLib::etClosedPolygon); + ClipperLib::Paths contours_raw; + co.Execute(contours_raw, - delta); + if (contours_raw.empty()) + // No need to try to offset the holes. + return 0; + append_paths_with_z(contours_raw, 0, contours); + } + + if (expoly.holes.empty()) { + // No need to subtract holes from the offsetted expolygon, we are done. + append(out, std::move(contours)); + } else { + // 2) Offset the holes one by one, collect the offsetted holes. + ClipperLib_Z::Paths holes; + { + for (const Polygon &hole : expoly.holes) { + ClipperLib::ClipperOffset co; + if (joinType == jtRound) + co.ArcTolerance = miterLimit; + else + co.MiterLimit = miterLimit; + co.ShortestEdgeLength = double(delta * 0.005); + co.AddPath(hole.points, joinType, ClipperLib::etClosedPolygon); + ClipperLib::Paths out2; + // Execute reorients the contours so that the outer most contour has a positive area. Thus the output + // contours will be CCW oriented even though the input paths are CW oriented. + // Offset is applied after contour reorientation, thus the signum of the offset value is reversed. + co.Execute(out2, delta); + append_paths_with_z(out2, 1 + (&hole - expoly.holes.data()), holes); + } + } + + // 3) Subtract holes from the contours. + if (holes.empty()) { + // No hole remaining after an offset. Just copy the outer contour. + append(out, std::move(contours)); + } else { + // Negative offset. There is a chance, that the offsetted hole intersects the outer contour. + // Subtract the offsetted holes from the offsetted contours. + ClipperLib_Z::Clipper clipper; + clipper.ZFillFunction([](const ClipperLib_Z::IntPoint &e1bot, const ClipperLib_Z::IntPoint &e1top, const ClipperLib_Z::IntPoint &e2bot, const ClipperLib_Z::IntPoint &e2top, ClipperLib_Z::IntPoint &pt) { + //pt.z() = std::max(std::max(e1bot.z(), e1top.z()), std::max(e2bot.z(), e2top.z())); + // Just mark the intersection. + pt.z() = -1; + }); + clipper.AddPaths(contours, ClipperLib_Z::ptSubject, true); + clipper.AddPaths(holes, ClipperLib_Z::ptClip, true); + ClipperLib_Z::Paths output; + clipper.Execute(ClipperLib_Z::ctDifference, output, ClipperLib_Z::pftNonZero, ClipperLib_Z::pftNonZero); + if (! output.empty()) { + append(out, std::move(output)); + } else { + // The offsetted holes have eaten up the offsetted outer contour. + return 0; + } + } + } + + return 1; + }; + + const double spacing = flow.scaled_spacing(); + // Clip the sheath path to avoid the extruder to get exactly on the first point of the loop. + const double clip_length = spacing * 0.15; + const double anchor_length = spacing * 6.; + ClipperLib_Z::Paths anchor_candidates; + for (ExPolygon &expoly : closing_ex(polygons, float(SCALED_EPSILON), float(SCALED_EPSILON + 0.5*flow.scaled_width()))) { + // Try to produce one more perimeter to place the seam anchor. + // First genrate a 2nd perimeter loop as a source for anchor candidates. + // The anchor candidate points are annotated with an index of the source contour or with -1 if on intersection. + anchor_candidates.clear(); + shrink_expolygon_with_contour_idx(expoly, flow.scaled_width(), DefaultJoinType, 1.2, anchor_candidates); + // Orient all contours CCW. + for (auto &path : anchor_candidates) + if (ClipperLib_Z::Area(path) < 0) + std::reverse(path.begin(), path.end()); + + // Draw the perimeters. + Polylines polylines; + polylines.reserve(expoly.holes.size() + 1); + for (size_t idx_loop = 0; idx_loop <= expoly.holes.size(); ++ idx_loop) { + // Open the loop with a seam. + const Polygon &loop = idx_loop == 0 ? expoly.contour : expoly.holes[idx_loop - 1]; + Polyline pl(loop.points); + // Orient all contours CCW. + if (loop.area() < 0) + pl.reverse(); + pl.points.emplace_back(pl.points.front()); + pl.clip_end(clip_length); + if (pl.size() < 2) + continue; + // Find the foot of the seam point on anchor_candidates. Only pick an anchor point that was created by offsetting the source contour. + ClipperLib_Z::Path *closest_contour = nullptr; + Vec2d closest_point; + int closest_point_idx = -1; + double closest_point_t; + double d2min = std::numeric_limits::max(); + Vec2d seam_pt = pl.back().cast(); + for (ClipperLib_Z::Path &path : anchor_candidates) + for (int i = 0; i < path.size(); ++ i) { + int j = next_idx_modulo(i, path); + if (path[i].z() == idx_loop || path[j].z() == idx_loop) { + Vec2d pi(path[i].x(), path[i].y()); + Vec2d pj(path[j].x(), path[j].y()); + Vec2d v = pj - pi; + Vec2d w = seam_pt - pi; + auto l2 = v.squaredNorm(); + auto t = std::clamp((l2 == 0) ? 0 : v.dot(w) / l2, 0., 1.); + if ((path[i].z() == idx_loop || t > EPSILON) && (path[j].z() == idx_loop || t < 1. - EPSILON)) { + // Closest point. + Vec2d fp = pi + v * t; + double d2 = (fp - seam_pt).squaredNorm(); + if (d2 < d2min) { + d2min = d2; + closest_contour = &path; + closest_point = fp; + closest_point_idx = i; + closest_point_t = t; + } + } + } + } + if (d2min < sqr(flow.scaled_width() * 3.)) { + // Try to cut an anchor from the closest_contour. + // Both closest_contour and pl are CCW oriented. + pl.points.emplace_back(closest_point.cast()); + const ClipperLib_Z::Path &path = *closest_contour; + double remaining_length = anchor_length - (seam_pt - closest_point).norm(); + int i = closest_point_idx; + int j = next_idx_modulo(i, *closest_contour); + Vec2d pi(path[i].x(), path[i].y()); + Vec2d pj(path[j].x(), path[j].y()); + Vec2d v = pj - pi; + double l = v.norm(); + if (remaining_length < (1. - closest_point_t) * l) { + // Just trim the current line. + pl.points.emplace_back((closest_point + v * (remaining_length / l)).cast()); + } else { + // Take the rest of the current line, continue with the other lines. + pl.points.emplace_back(path[j].x(), path[j].y()); + pi = pj; + for (i = j; path[i].z() == idx_loop && remaining_length > 0; i = j, pi = pj) { + j = next_idx_modulo(i, path); + pj = Vec2d(path[j].x(), path[j].y()); + v = pj - pi; + l = v.norm(); + if (i == closest_point_idx) { + // Back at the first segment. Most likely this should not happen and we may end the anchor. + break; + } + if (remaining_length <= l) { + pl.points.emplace_back((pi + v * (remaining_length / l)).cast()); + break; + } + pl.points.emplace_back(path[j].x(), path[j].y()); + remaining_length -= l; + } + } + } + // Start with the anchor. + pl.reverse(); + polylines.emplace_back(std::move(pl)); + } + extrusion_entities_append_paths(dst, polylines, erSupportMaterial, flow.mm3_per_mm(), flow.width(), flow.height(), + // Disable reversal of the path, always start with the anchor, always print CCW. + false); + } +} + static inline void fill_expolygons_with_sheath_generate_paths( ExtrusionEntitiesPtr &dst, const Polygons &polygons, @@ -3294,7 +3448,12 @@ static inline void fill_expolygons_with_sheath_generate_paths( if (polygons.empty()) return; - if (! with_sheath) { + if (with_sheath) { + if (density == 0) { + tree_supports_generate_paths(dst, polygons, flow); + return; + } + } else { fill_expolygons_generate_paths(dst, closing_ex(polygons, float(SCALED_EPSILON)), filler, density, role, flow); return; } @@ -3333,9 +3492,9 @@ static inline void fill_expolygons_with_sheath_generate_paths( } // Support layers, partially processed. -struct MyLayerExtruded +struct SupportGeneratorLayerExtruded { - MyLayerExtruded& operator=(MyLayerExtruded &&rhs) { + SupportGeneratorLayerExtruded& operator=(SupportGeneratorLayerExtruded &&rhs) { this->layer = rhs.layer; this->extrusions = std::move(rhs.extrusions); m_polygons_to_extrude = std::move(rhs.m_polygons_to_extrude); @@ -3356,14 +3515,14 @@ struct MyLayerExtruded Polygons& polygons_to_extrude() { return (m_polygons_to_extrude == nullptr) ? layer->polygons : *m_polygons_to_extrude; } const Polygons& polygons_to_extrude() const { return (m_polygons_to_extrude == nullptr) ? layer->polygons : *m_polygons_to_extrude; } - bool could_merge(const MyLayerExtruded &other) const { + bool could_merge(const SupportGeneratorLayerExtruded &other) const { return ! this->empty() && ! other.empty() && std::abs(this->layer->height - other.layer->height) < EPSILON && this->layer->bridging == other.layer->bridging; } // Merge regions, perform boolean union over the merged polygons. - void merge(MyLayerExtruded &&other) { + void merge(SupportGeneratorLayerExtruded &&other) { assert(this->could_merge(other)); // 1) Merge the rest polygons to extrude, if there are any. if (other.m_polygons_to_extrude != nullptr) { @@ -3397,7 +3556,7 @@ struct MyLayerExtruded } // The source layer. It carries the height and extrusion type (bridging / non bridging, extrusion height). - PrintObjectSupportMaterial::MyLayer *layer { nullptr }; + SupportGeneratorLayer *layer { nullptr }; // Collect extrusions. They will be exported sorted by the bottom height. ExtrusionEntitiesPtr extrusions; @@ -3407,7 +3566,7 @@ private: std::unique_ptr m_polygons_to_extrude; }; -typedef std::vector MyLayerExtrudedPtrs; +typedef std::vector SupportGeneratorLayerExtrudedPtrs; struct LoopInterfaceProcessor { @@ -3426,7 +3585,7 @@ struct LoopInterfaceProcessor // Generate loop contacts at the top_contact_layer, // trim the top_contact_layer->polygons with the areas covered by the loops. - void generate(MyLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const; + void generate(SupportGeneratorLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const; int n_contact_loops; coordf_t circle_radius; @@ -3434,7 +3593,7 @@ struct LoopInterfaceProcessor Polygon circle; }; -void LoopInterfaceProcessor::generate(MyLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const +void LoopInterfaceProcessor::generate(SupportGeneratorLayerExtruded &top_contact_layer, const Flow &interface_flow_src) const { if (n_contact_loops == 0 || top_contact_layer.empty()) return; @@ -3665,9 +3824,9 @@ static std::string dbg_index_to_color(int idx) void modulate_extrusion_by_overlapping_layers( // Extrusions generated for this_layer. ExtrusionEntitiesPtr &extrusions_in_out, - const PrintObjectSupportMaterial::MyLayer &this_layer, + const SupportGeneratorLayer &this_layer, // Multiple layers overlapping with this_layer, sorted bottom up. - const PrintObjectSupportMaterial::MyLayersPtr &overlapping_layers) + const SupportGeneratorLayersPtr &overlapping_layers) { size_t n_overlapping_layers = overlapping_layers.size(); if (n_overlapping_layers == 0 || extrusions_in_out.empty()) @@ -3704,7 +3863,7 @@ void modulate_extrusion_by_overlapping_layers( ++ iRun; BoundingBox bbox; for (size_t i_overlapping_layer = 0; i_overlapping_layer < n_overlapping_layers; ++ i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; bbox.merge(get_extents(overlapping_layer.polygons)); } for (ExtrusionEntitiesPtr::const_iterator it = extrusions_in_out.begin(); it != extrusions_in_out.end(); ++ it) { @@ -3717,13 +3876,13 @@ void modulate_extrusion_by_overlapping_layers( // Filled polygons for the overlapping regions. svg.draw(union_ex(this_layer.polygons), dbg_index_to_color(-1), transparency); for (size_t i_overlapping_layer = 0; i_overlapping_layer < n_overlapping_layers; ++ i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; svg.draw(union_ex(overlapping_layer.polygons), dbg_index_to_color(int(i_overlapping_layer)), transparency); } // Contours of the overlapping regions. svg.draw(to_polylines(this_layer.polygons), dbg_index_to_color(-1), scale_(0.2)); for (size_t i_overlapping_layer = 0; i_overlapping_layer < n_overlapping_layers; ++ i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; svg.draw(to_polylines(overlapping_layer.polygons), dbg_index_to_color(int(i_overlapping_layer)), scale_(0.1)); } // Fill extrusion, the source. @@ -3765,7 +3924,7 @@ void modulate_extrusion_by_overlapping_layers( // Fragment the path segments by overlapping layers. The overlapping layers are sorted by an increasing print_z. // Trim by the highest overlapping layer first. for (int i_overlapping_layer = int(n_overlapping_layers) - 1; i_overlapping_layer >= 0; -- i_overlapping_layer) { - const PrintObjectSupportMaterial::MyLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; + const SupportGeneratorLayer &overlapping_layer = *overlapping_layers[i_overlapping_layer]; ExtrusionPathFragment &frag = path_fragments[i_overlapping_layer]; Polygons polygons_trimming = offset(union_ex(overlapping_layer.polygons), float(scale_(0.5*extrusion_width))); frag.polylines = intersection_pl(path_fragments.back().polylines, polygons_trimming); @@ -3856,7 +4015,7 @@ void modulate_extrusion_by_overlapping_layers( ExtrusionPath *path = multipath.paths.empty() ? nullptr : &multipath.paths.back(); if (path != nullptr) { // Verify whether the path is compatible with the current fragment. - assert(this_layer.layer_type == PrintObjectSupportMaterial::sltBottomContact || path->height != frag.height || path->mm3_per_mm != frag.mm3_per_mm); + assert(this_layer.layer_type == SupporLayerType::BottomContact || path->height != frag.height || path->mm3_per_mm != frag.mm3_per_mm); if (path->height != frag.height || path->mm3_per_mm != frag.mm3_per_mm) { path = nullptr; } @@ -3903,22 +4062,102 @@ void modulate_extrusion_by_overlapping_layers( extrusion_entities_append_paths(extrusions_in_out, std::move(it_fragment->polylines), extrusion_role, it_fragment->mm3_per_mm, it_fragment->width, it_fragment->height); } -void PrintObjectSupportMaterial::generate_toolpaths( - SupportLayerPtrs &support_layers, - const MyLayersPtr &raft_layers, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - const MyLayersPtr &intermediate_layers, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers) const +SupportGeneratorLayersPtr generate_support_layers( + PrintObject &object, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers) +{ + // Install support layers into the object. + // A support layer installed on a PrintObject has a unique print_z. + SupportGeneratorLayersPtr layers_sorted; + layers_sorted.reserve(raft_layers.size() + bottom_contacts.size() + top_contacts.size() + intermediate_layers.size() + interface_layers.size() + base_interface_layers.size()); + layers_append(layers_sorted, raft_layers); + layers_append(layers_sorted, bottom_contacts); + layers_append(layers_sorted, top_contacts); + layers_append(layers_sorted, intermediate_layers); + layers_append(layers_sorted, interface_layers); + layers_append(layers_sorted, base_interface_layers); + // Sort the layers lexicographically by a raising print_z and a decreasing height. + std::sort(layers_sorted.begin(), layers_sorted.end(), [](auto *l1, auto *l2) { return *l1 < *l2; }); + int layer_id = 0; + int layer_id_interface = 0; + assert(object.support_layers().empty()); + for (size_t i = 0; i < layers_sorted.size();) { + // Find the last layer with roughly the same print_z, find the minimum layer height of all. + // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. + size_t j = i + 1; + coordf_t zmax = layers_sorted[i]->print_z + EPSILON; + for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) ; + // Assign an average print_z to the set of layers with nearly equal print_z. + coordf_t zavg = 0.5 * (layers_sorted[i]->print_z + layers_sorted[j - 1]->print_z); + coordf_t height_min = layers_sorted[i]->height; + bool empty = true; + // For snug supports, layers where the direction of the support interface shall change are accounted for. + size_t num_interfaces = 0; + size_t num_top_contacts = 0; + double top_contact_bottom_z = 0; + for (size_t u = i; u < j; ++u) { + SupportGeneratorLayer &layer = *layers_sorted[u]; + if (! layer.polygons.empty()) { + empty = false; + num_interfaces += one_of(layer.layer_type, support_types_interface); + if (layer.layer_type == SupporLayerType::TopContact) { + ++ num_top_contacts; + assert(num_top_contacts <= 1); + // All top contact layers sharing this print_z shall also share bottom_z. + //assert(num_top_contacts == 1 || (top_contact_bottom_z - layer.bottom_z) < EPSILON); + top_contact_bottom_z = layer.bottom_z; + } + } + layer.print_z = zavg; + height_min = std::min(height_min, layer.height); + } + if (! empty) { + // Here the upper_layer and lower_layer pointers are left to null at the support layers, + // as they are never used. These pointers are candidates for removal. + bool this_layer_contacts_only = num_top_contacts > 0 && num_top_contacts == num_interfaces; + size_t this_layer_id_interface = layer_id_interface; + if (this_layer_contacts_only) { + // Find a supporting layer for its interface ID. + for (auto it = object.support_layers().rbegin(); it != object.support_layers().rend(); ++ it) + if (const SupportLayer &other_layer = **it; std::abs(other_layer.print_z - top_contact_bottom_z) < EPSILON) { + // other_layer supports this top contact layer. Assign a different support interface direction to this layer + // from the layer that supports it. + this_layer_id_interface = other_layer.interface_id() + 1; + } + } + object.add_support_layer(layer_id ++, this_layer_id_interface, height_min, zavg); + if (num_interfaces && ! this_layer_contacts_only) + ++ layer_id_interface; + } + i = j; + } + return layers_sorted; +} + +void generate_support_toolpaths( + SupportLayerPtrs &support_layers, + const PrintObjectConfig &config, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers) { // loop_interface_processor with a given circle radius. - LoopInterfaceProcessor loop_interface_processor(1.5 * m_support_params.support_material_interface_flow.scaled_width()); - loop_interface_processor.n_contact_loops = this->has_contact_loops() ? 1 : 0; + LoopInterfaceProcessor loop_interface_processor(1.5 * support_params.support_material_interface_flow.scaled_width()); + loop_interface_processor.n_contact_loops = config.support_material_interface_contact_loops ? 1 : 0; - std::vector angles { m_support_params.base_angle }; - if (m_object_config->support_material_pattern == smpRectilinearGrid) - angles.push_back(m_support_params.interface_angle); + std::vector angles { support_params.base_angle }; + if (config.support_material_pattern == smpRectilinearGrid) + angles.push_back(support_params.interface_angle); BoundingBox bbox_object(Point(-scale_(1.), -scale_(1.0)), Point(scale_(1.), scale_(1.))); @@ -3928,34 +4167,34 @@ void PrintObjectSupportMaterial::generate_toolpaths( float raft_angle_1st_layer = 0.f; float raft_angle_base = 0.f; float raft_angle_interface = 0.f; - if (m_slicing_params.base_raft_layers > 1) { + if (slicing_params.base_raft_layers > 1) { // There are all raft layer types (1st layer, base, interface & contact layers) available. - raft_angle_1st_layer = m_support_params.interface_angle; - raft_angle_base = m_support_params.base_angle; - raft_angle_interface = m_support_params.interface_angle; - } else if (m_slicing_params.base_raft_layers == 1 || m_slicing_params.interface_raft_layers > 1) { + raft_angle_1st_layer = support_params.interface_angle; + raft_angle_base = support_params.base_angle; + raft_angle_interface = support_params.interface_angle; + } else if (slicing_params.base_raft_layers == 1 || slicing_params.interface_raft_layers > 1) { // 1st layer, interface & contact layers available. - raft_angle_1st_layer = m_support_params.base_angle; - if (this->has_support()) + raft_angle_1st_layer = support_params.base_angle; + if (config.support_material || config.support_material_enforce_layers > 0) // Print 1st layer at 45 degrees from both the interface and base angles as both can land on the 1st layer. raft_angle_1st_layer += 0.7854f; - raft_angle_interface = m_support_params.interface_angle; - } else if (m_slicing_params.interface_raft_layers == 1) { + raft_angle_interface = support_params.interface_angle; + } else if (slicing_params.interface_raft_layers == 1) { // Only the contact raft layer is non-empty, which will be printed as the 1st layer. - assert(m_slicing_params.base_raft_layers == 0); - assert(m_slicing_params.interface_raft_layers == 1); - assert(m_slicing_params.raft_layers() == 1 && raft_layers.size() == 0); + assert(slicing_params.base_raft_layers == 0); + assert(slicing_params.interface_raft_layers == 1); + assert(slicing_params.raft_layers() == 1 && raft_layers.size() == 0); } else { // No raft. - assert(m_slicing_params.base_raft_layers == 0); - assert(m_slicing_params.interface_raft_layers == 0); - assert(m_slicing_params.raft_layers() == 0 && raft_layers.size() == 0); + assert(slicing_params.base_raft_layers == 0); + assert(slicing_params.interface_raft_layers == 0); + assert(slicing_params.raft_layers() == 0 && raft_layers.size() == 0); } // Insert the raft base layers. - size_t n_raft_layers = size_t(std::max(0, int(m_slicing_params.raft_layers()) - 1)); + size_t n_raft_layers = size_t(std::max(0, int(slicing_params.raft_layers()) - 1)); tbb::parallel_for(tbb::blocked_range(0, n_raft_layers), - [this, &support_layers, &raft_layers, + [&support_layers, &raft_layers, &config, &support_params, &slicing_params, &bbox_object, raft_angle_1st_layer, raft_angle_base, raft_angle_interface, link_max_length_factor] (const tbb::blocked_range& range) { for (size_t support_layer_id = range.begin(); support_layer_id < range.end(); ++ support_layer_id) @@ -3963,55 +4202,55 @@ void PrintObjectSupportMaterial::generate_toolpaths( assert(support_layer_id < raft_layers.size()); SupportLayer &support_layer = *support_layers[support_layer_id]; assert(support_layer.support_fills.entities.empty()); - MyLayer &raft_layer = *raft_layers[support_layer_id]; + SupportGeneratorLayer &raft_layer = *raft_layers[support_layer_id]; - std::unique_ptr filler_interface = std::unique_ptr(Fill::new_from_type(m_support_params.interface_fill_pattern)); - std::unique_ptr filler_support = std::unique_ptr(Fill::new_from_type(m_support_params.base_fill_pattern)); + std::unique_ptr filler_interface = std::unique_ptr(Fill::new_from_type(support_params.interface_fill_pattern)); + std::unique_ptr filler_support = std::unique_ptr(Fill::new_from_type(support_params.base_fill_pattern)); filler_interface->set_bounding_box(bbox_object); filler_support->set_bounding_box(bbox_object); // Print the support base below the support columns, or the support base for the support columns plus the contacts. if (support_layer_id > 0) { - const Polygons &to_infill_polygons = (support_layer_id < m_slicing_params.base_raft_layers) ? + const Polygons &to_infill_polygons = (support_layer_id < slicing_params.base_raft_layers) ? raft_layer.polygons : //FIXME misusing contact_polygons for support columns. ((raft_layer.contact_polygons == nullptr) ? Polygons() : *raft_layer.contact_polygons); if (! to_infill_polygons.empty()) { assert(! raft_layer.bridging); - Flow flow(float(m_support_params.support_material_flow.width()), float(raft_layer.height), m_support_params.support_material_flow.nozzle_diameter()); + Flow flow(float(support_params.support_material_flow.width()), float(raft_layer.height), support_params.support_material_flow.nozzle_diameter()); Fill * filler = filler_support.get(); filler->angle = raft_angle_base; - filler->spacing = m_support_params.support_material_flow.spacing(); - filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / m_support_params.support_density)); + filler->spacing = support_params.support_material_flow.spacing(); + filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.support_density)); fill_expolygons_with_sheath_generate_paths( // Destination support_layer.support_fills.entities, // Regions to fill to_infill_polygons, // Filler and its parameters - filler, float(m_support_params.support_density), + filler, float(support_params.support_density), // Extrusion parameters erSupportMaterial, flow, - m_support_params.with_sheath, false); + support_params.with_sheath, false); } } Fill *filler = filler_interface.get(); - Flow flow = m_support_params.first_layer_flow; + Flow flow = support_params.first_layer_flow; float density = 0.f; if (support_layer_id == 0) { // Base flange. filler->angle = raft_angle_1st_layer; - filler->spacing = m_support_params.first_layer_flow.spacing(); - density = float(m_object_config->raft_first_layer_density.value * 0.01); - } else if (support_layer_id >= m_slicing_params.base_raft_layers) { + filler->spacing = support_params.first_layer_flow.spacing(); + density = float(config.raft_first_layer_density.value * 0.01); + } else if (support_layer_id >= slicing_params.base_raft_layers) { filler->angle = raft_angle_interface; // We don't use $base_flow->spacing because we need a constant spacing // value that guarantees that all layers are correctly aligned. - filler->spacing = m_support_params.support_material_flow.spacing(); + filler->spacing = support_params.support_material_flow.spacing(); assert(! raft_layer.bridging); - flow = Flow(float(m_support_params.support_material_interface_flow.width()), float(raft_layer.height), m_support_params.support_material_flow.nozzle_diameter()); - density = float(m_support_params.interface_density); + flow = Flow(float(support_params.support_material_interface_flow.width()), float(raft_layer.height), support_params.support_material_flow.nozzle_diameter()); + density = float(support_params.interface_density); } else continue; filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / density)); @@ -4023,27 +4262,27 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Filler and its parameters filler, density, // Extrusion parameters - (support_layer_id < m_slicing_params.base_raft_layers) ? erSupportMaterial : erSupportMaterialInterface, flow, + (support_layer_id < slicing_params.base_raft_layers) ? erSupportMaterial : erSupportMaterialInterface, flow, // sheath at first layer support_layer_id == 0, support_layer_id == 0); } }); struct LayerCacheItem { - LayerCacheItem(MyLayerExtruded *layer_extruded = nullptr) : layer_extruded(layer_extruded) {} - MyLayerExtruded *layer_extruded; - std::vector overlapping; + LayerCacheItem(SupportGeneratorLayerExtruded *layer_extruded = nullptr) : layer_extruded(layer_extruded) {} + SupportGeneratorLayerExtruded *layer_extruded; + std::vector overlapping; }; struct LayerCache { - MyLayerExtruded bottom_contact_layer; - MyLayerExtruded top_contact_layer; - MyLayerExtruded base_layer; - MyLayerExtruded interface_layer; - MyLayerExtruded base_interface_layer; + SupportGeneratorLayerExtruded bottom_contact_layer; + SupportGeneratorLayerExtruded top_contact_layer; + SupportGeneratorLayerExtruded base_layer; + SupportGeneratorLayerExtruded interface_layer; + SupportGeneratorLayerExtruded base_interface_layer; boost::container::static_vector nonempty; void add_nonempty_and_sort() { - for (MyLayerExtruded *item : { &bottom_contact_layer, &top_contact_layer, &interface_layer, &base_interface_layer, &base_layer }) + for (SupportGeneratorLayerExtruded *item : { &bottom_contact_layer, &top_contact_layer, &interface_layer, &base_interface_layer, &base_layer }) if (! item->empty()) this->nonempty.emplace_back(item); // Sort the layers with the same print_z coordinate by their heights, thickest first. @@ -4053,7 +4292,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( std::vector layer_caches(support_layers.size()); tbb::parallel_for(tbb::blocked_range(n_raft_layers, support_layers.size()), - [this, &support_layers, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &base_interface_layers, &layer_caches, &loop_interface_processor, + [&config, &support_params, &support_layers, &bottom_contacts, &top_contacts, &intermediate_layers, &interface_layers, &base_interface_layers, &layer_caches, &loop_interface_processor, &bbox_object, &angles, link_max_length_factor] (const tbb::blocked_range& range) { // Indices of the 1st layer in their respective container at the support layer height. @@ -4063,15 +4302,15 @@ void PrintObjectSupportMaterial::generate_toolpaths( size_t idx_layer_interface = size_t(-1); size_t idx_layer_base_interface = size_t(-1); const auto fill_type_first_layer = ipRectilinear; - auto filler_interface = std::unique_ptr(Fill::new_from_type(m_support_params.contact_fill_pattern)); + auto filler_interface = std::unique_ptr(Fill::new_from_type(support_params.contact_fill_pattern)); // Filler for the 1st layer interface, if different from filler_interface. - auto filler_first_layer_ptr = std::unique_ptr(range.begin() == 0 && m_support_params.contact_fill_pattern != fill_type_first_layer ? Fill::new_from_type(fill_type_first_layer) : nullptr); + auto filler_first_layer_ptr = std::unique_ptr(range.begin() == 0 && support_params.contact_fill_pattern != fill_type_first_layer ? Fill::new_from_type(fill_type_first_layer) : nullptr); // Pointer to the 1st layer interface filler. auto filler_first_layer = filler_first_layer_ptr ? filler_first_layer_ptr.get() : filler_interface.get(); // Filler for the base interface (to be used for soluble interface / non soluble base, to produce non soluble interface layer below soluble interface layer). auto filler_base_interface = std::unique_ptr(base_interface_layers.empty() ? nullptr : - Fill::new_from_type(m_support_params.interface_density > 0.95 || m_support_params.with_sheath ? ipRectilinear : ipSupportBase)); - auto filler_support = std::unique_ptr(Fill::new_from_type(m_support_params.base_fill_pattern)); + Fill::new_from_type(support_params.interface_density > 0.95 || support_params.with_sheath ? ipRectilinear : ipSupportBase)); + auto filler_support = std::unique_ptr(Fill::new_from_type(support_params.base_fill_pattern)); filler_interface->set_bounding_box(bbox_object); if (filler_first_layer_ptr) filler_first_layer_ptr->set_bounding_box(bbox_object); @@ -4082,19 +4321,19 @@ void PrintObjectSupportMaterial::generate_toolpaths( { SupportLayer &support_layer = *support_layers[support_layer_id]; LayerCache &layer_cache = layer_caches[support_layer_id]; - float interface_angle_delta = m_object_config->support_material_style.value == smsSnug ? + float interface_angle_delta = config.support_material_style.value == smsSnug || config.support_material_style.value == smsTree ? (support_layer.interface_id() & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.) : 0; // Find polygons with the same print_z. - MyLayerExtruded &bottom_contact_layer = layer_cache.bottom_contact_layer; - MyLayerExtruded &top_contact_layer = layer_cache.top_contact_layer; - MyLayerExtruded &base_layer = layer_cache.base_layer; - MyLayerExtruded &interface_layer = layer_cache.interface_layer; - MyLayerExtruded &base_interface_layer = layer_cache.base_interface_layer; + SupportGeneratorLayerExtruded &bottom_contact_layer = layer_cache.bottom_contact_layer; + SupportGeneratorLayerExtruded &top_contact_layer = layer_cache.top_contact_layer; + SupportGeneratorLayerExtruded &base_layer = layer_cache.base_layer; + SupportGeneratorLayerExtruded &interface_layer = layer_cache.interface_layer; + SupportGeneratorLayerExtruded &base_interface_layer = layer_cache.base_interface_layer; // Increment the layer indices to find a layer at support_layer.print_z. { - auto fun = [&support_layer](const MyLayer *l){ return l->print_z >= support_layer.print_z - EPSILON; }; + auto fun = [&support_layer](const SupportGeneratorLayer *l){ return l->print_z >= support_layer.print_z - EPSILON; }; idx_layer_bottom_contact = idx_higher_or_equal(bottom_contacts, idx_layer_bottom_contact, fun); idx_layer_top_contact = idx_higher_or_equal(top_contacts, idx_layer_top_contact, fun); idx_layer_intermediate = idx_higher_or_equal(intermediate_layers, idx_layer_intermediate, fun); @@ -4113,23 +4352,23 @@ void PrintObjectSupportMaterial::generate_toolpaths( if (idx_layer_intermediate < intermediate_layers.size() && intermediate_layers[idx_layer_intermediate]->print_z < support_layer.print_z + EPSILON) base_layer.layer = intermediate_layers[idx_layer_intermediate]; - if (m_object_config->support_material_interface_layers == 0) { + if (config.support_material_interface_layers == 0) { // If no top interface layers were requested, we treat the contact layer exactly as a generic base layer. - if (m_support_params.can_merge_support_regions) { + if (support_params.can_merge_support_regions) { if (base_layer.could_merge(top_contact_layer)) base_layer.merge(std::move(top_contact_layer)); else if (base_layer.empty()) base_layer = std::move(top_contact_layer); } } else { - loop_interface_processor.generate(top_contact_layer, m_support_params.support_material_interface_flow); + loop_interface_processor.generate(top_contact_layer, support_params.support_material_interface_flow); // If no loops are allowed, we treat the contact layer exactly as a generic interface layer. // Merge interface_layer into top_contact_layer, as the top_contact_layer is not synchronized and therefore it will be used // to trim other layers. if (top_contact_layer.could_merge(interface_layer)) top_contact_layer.merge(std::move(interface_layer)); } - if ((m_object_config->support_material_interface_layers == 0 || m_object_config->support_material_bottom_interface_layers == 0) && m_support_params.can_merge_support_regions) { + if ((config.support_material_interface_layers == 0 || config.support_material_bottom_interface_layers == 0) && support_params.can_merge_support_regions) { if (base_layer.could_merge(bottom_contact_layer)) base_layer.merge(std::move(bottom_contact_layer)); else if (base_layer.empty() && ! bottom_contact_layer.empty() && ! bottom_contact_layer.layer->bridging) @@ -4153,23 +4392,23 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Top and bottom contacts, interface layers. for (size_t i = 0; i < 3; ++ i) { - MyLayerExtruded &layer_ex = (i == 0) ? top_contact_layer : (i == 1 ? bottom_contact_layer : interface_layer); + SupportGeneratorLayerExtruded &layer_ex = (i == 0) ? top_contact_layer : (i == 1 ? bottom_contact_layer : interface_layer); if (layer_ex.empty() || layer_ex.polygons_to_extrude().empty()) continue; - bool interface_as_base = m_object_config->support_material_interface_layers.value == 0 || - (m_object_config->support_material_bottom_interface_layers == 0 && &layer_ex == &bottom_contact_layer); + bool interface_as_base = config.support_material_interface_layers.value == 0 || + (config.support_material_bottom_interface_layers == 0 && &layer_ex == &bottom_contact_layer); //FIXME Bottom interfaces are extruded with the briding flow. Some bridging layers have its height slightly reduced, therefore // the bridging flow does not quite apply. Reduce the flow to area of an ellipse? (A = pi * a * b) auto interface_flow = layer_ex.layer->bridging ? - Flow::bridging_flow(layer_ex.layer->height, m_support_params.support_material_bottom_interface_flow.nozzle_diameter()) : - (interface_as_base ? &m_support_params.support_material_flow : &m_support_params.support_material_interface_flow)->with_height(float(layer_ex.layer->height)); + Flow::bridging_flow(layer_ex.layer->height, support_params.support_material_bottom_interface_flow.nozzle_diameter()) : + (interface_as_base ? &support_params.support_material_flow : &support_params.support_material_interface_flow)->with_height(float(layer_ex.layer->height)); filler_interface->angle = interface_as_base ? // If zero interface layers are configured, use the same angle as for the base layers. angles[support_layer_id % angles.size()] : // Use interface angle for the interface layers. - m_support_params.interface_angle + interface_angle_delta; - double density = interface_as_base ? m_support_params.support_density : m_support_params.interface_density; - filler_interface->spacing = interface_as_base ? m_support_params.support_material_flow.spacing() : m_support_params.support_material_interface_flow.spacing(); + support_params.interface_angle + interface_angle_delta; + double density = interface_as_base ? support_params.support_density : support_params.interface_density; + filler_interface->spacing = interface_as_base ? support_params.support_material_flow.spacing() : support_params.support_material_interface_flow.spacing(); filler_interface->link_max_length = coord_t(scale_(filler_interface->spacing * link_max_length_factor / density)); fill_expolygons_generate_paths( // Destination @@ -4188,10 +4427,10 @@ void PrintObjectSupportMaterial::generate_toolpaths( //FIXME Bottom interfaces are extruded with the briding flow. Some bridging layers have its height slightly reduced, therefore // the bridging flow does not quite apply. Reduce the flow to area of an ellipse? (A = pi * a * b) assert(! base_interface_layer.layer->bridging); - Flow interface_flow = m_support_params.support_material_flow.with_height(float(base_interface_layer.layer->height)); - filler->angle = m_support_params.interface_angle + interface_angle_delta; - filler->spacing = m_support_params.support_material_interface_flow.spacing(); - filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / m_support_params.interface_density)); + Flow interface_flow = support_params.support_material_flow.with_height(float(base_interface_layer.layer->height)); + filler->angle = support_params.interface_angle + interface_angle_delta; + filler->spacing = support_params.support_material_interface_flow.spacing(); + filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.interface_density)); fill_expolygons_generate_paths( // Destination base_interface_layer.extrusions, @@ -4199,7 +4438,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Regions to fill union_safety_offset_ex(base_interface_layer.polygons_to_extrude()), // Filler and its parameters - filler, float(m_support_params.interface_density), + filler, float(support_params.interface_density), // Extrusion parameters erSupportMaterial, interface_flow); } @@ -4211,18 +4450,18 @@ void PrintObjectSupportMaterial::generate_toolpaths( // We don't use $base_flow->spacing because we need a constant spacing // value that guarantees that all layers are correctly aligned. assert(! base_layer.layer->bridging); - auto flow = m_support_params.support_material_flow.with_height(float(base_layer.layer->height)); - filler->spacing = m_support_params.support_material_flow.spacing(); - filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / m_support_params.support_density)); - float density = float(m_support_params.support_density); - bool sheath = m_support_params.with_sheath; + auto flow = support_params.support_material_flow.with_height(float(base_layer.layer->height)); + filler->spacing = support_params.support_material_flow.spacing(); + filler->link_max_length = coord_t(scale_(filler->spacing * link_max_length_factor / support_params.support_density)); + float density = float(support_params.support_density); + bool sheath = support_params.with_sheath; bool no_sort = false; if (base_layer.layer->bottom_z < EPSILON) { // Base flange (the 1st layer). filler = filler_first_layer; - filler->angle = Geometry::deg2rad(float(m_object_config->support_material_angle.value + 90.)); - density = float(m_object_config->raft_first_layer_density.value * 0.01); - flow = m_support_params.first_layer_flow; + filler->angle = Geometry::deg2rad(float(config.support_material_angle.value + 90.)); + density = float(config.raft_first_layer_density.value * 0.01); + flow = support_params.first_layer_flow; // use the proper spacing for first layer as we don't need to align // its pattern to the other layers //FIXME When paralellizing, each thread shall have its own copy of the fillers. @@ -4269,12 +4508,12 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Collect overlapping top/bottom surfaces. layer_cache_item.overlapping.reserve(20); coordf_t bottom_z = layer_cache_item.layer_extruded->layer->bottom_print_z() + EPSILON; - auto add_overlapping = [&layer_cache_item, bottom_z](const MyLayersPtr &layers, size_t idx_top) { + auto add_overlapping = [&layer_cache_item, bottom_z](const SupportGeneratorLayersPtr &layers, size_t idx_top) { for (int i = int(idx_top) - 1; i >= 0 && layers[i]->print_z > bottom_z; -- i) layer_cache_item.overlapping.push_back(layers[i]); }; add_overlapping(top_contacts, idx_layer_top_contact); - if (layer_cache_item.layer_extruded->layer->layer_type == sltBottomContact) { + if (layer_cache_item.layer_extruded->layer->layer_type == SupporLayerType::BottomContact) { // Bottom contact layer may overlap with a base layer, which may be changed to interface layer. add_overlapping(intermediate_layers, idx_layer_intermediate); add_overlapping(interface_layers, idx_layer_interface); @@ -4283,8 +4522,13 @@ void PrintObjectSupportMaterial::generate_toolpaths( // Order the layers by lexicographically by an increasing print_z and a decreasing layer height. std::stable_sort(layer_cache_item.overlapping.begin(), layer_cache_item.overlapping.end(), [](auto *l1, auto *l2) { return *l1 < *l2; }); } - if (! polys.empty()) - expolygons_append(support_layer.support_islands, union_ex(polys)); + assert(support_layer.support_islands.empty()); + if (! polys.empty()) { + support_layer.support_islands = union_ex(polys); + support_layer.support_islands_bboxes.reserve(support_layer.support_islands.size()); + for (const ExPolygon &expoly : support_layer.support_islands) + support_layer.support_islands_bboxes.emplace_back(get_extents(expoly).inflated(SCALED_EPSILON)); + } } // for each support_layer_id }); @@ -4322,7 +4566,7 @@ void PrintObjectSupportMaterial::generate_toolpaths( } }; for (const SupportLayer *support_layer : support_layers) - assert(Test::verify_nonempty(&support_layer->support_fills)); + assert(Test::verify_nonempty(&support_layer->support_fills)); #endif // NDEBUG } diff --git a/src/libslic3r/SupportMaterial.hpp b/src/libslic3r/SupportMaterial.hpp index 65604ef721..b578adb306 100644 --- a/src/libslic3r/SupportMaterial.hpp +++ b/src/libslic3r/SupportMaterial.hpp @@ -11,147 +11,187 @@ class PrintObject; class PrintConfig; class PrintObjectConfig; +// Support layer type to be used by SupportGeneratorLayer. This type carries a much more detailed information +// about the support layer type than the final support layers stored in a PrintObject. +enum SupporLayerType { + Unknown = 0, + // Ratft base layer, to be printed with the support material. + RaftBase, + // Raft interface layer, to be printed with the support interface material. + RaftInterface, + // Bottom contact layer placed over a top surface of an object. To be printed with a support interface material. + BottomContact, + // Dense interface layer, to be printed with the support interface material. + // This layer is separated from an object by an BottomContact layer. + BottomInterface, + // Sparse base support layer, to be printed with a support material. + Base, + // Dense interface layer, to be printed with the support interface material. + // This layer is separated from an object with TopContact layer. + TopInterface, + // Top contact layer directly supporting an overhang. To be printed with a support interface material. + TopContact, + // Some undecided type yet. It will turn into Base first, then it may turn into BottomInterface or TopInterface. + Intermediate, +}; + +// A support layer type used internally by the SupportMaterial class. This class carries a much more detailed +// information about the support layer than the layers stored in the PrintObject, mainly +// the SupportGeneratorLayer is aware of the bridging flow and the interface gaps between the object and the support. +class SupportGeneratorLayer +{ +public: + void reset() { + *this = SupportGeneratorLayer(); + } + + bool operator==(const SupportGeneratorLayer &layer2) const { + return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging; + } + + // Order the layers by lexicographically by an increasing print_z and a decreasing layer height. + bool operator<(const SupportGeneratorLayer &layer2) const { + if (print_z < layer2.print_z) { + return true; + } else if (print_z == layer2.print_z) { + if (height > layer2.height) + return true; + else if (height == layer2.height) { + // Bridging layers first. + return bridging && ! layer2.bridging; + } else + return false; + } else + return false; + } + + void merge(SupportGeneratorLayer &&rhs) { + // The union_() does not support move semantic yet, but maybe one day it will. + this->polygons = union_(this->polygons, std::move(rhs.polygons)); + auto merge = [](std::unique_ptr &dst, std::unique_ptr &src) { + if (! dst || dst->empty()) + dst = std::move(src); + else if (src && ! src->empty()) + *dst = union_(*dst, std::move(*src)); + }; + merge(this->contact_polygons, rhs.contact_polygons); + merge(this->overhang_polygons, rhs.overhang_polygons); + merge(this->enforcer_polygons, rhs.enforcer_polygons); + rhs.reset(); + } + + // For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation. + // For the non-bridging flow, bottom_print_z will be equal to bottom_z. + coordf_t bottom_print_z() const { return print_z - height; } + + // To sort the extremes of top / bottom interface layers. + coordf_t extreme_z() const { return (this->layer_type == SupporLayerType::TopContact) ? this->bottom_z : this->print_z; } + + SupporLayerType layer_type { SupporLayerType::Unknown }; + // Z used for printing, in unscaled coordinates. + coordf_t print_z { 0 }; + // Bottom Z of this layer. For soluble layers, bottom_z + height = print_z, + // otherwise bottom_z + gap + height = print_z. + coordf_t bottom_z { 0 }; + // Layer height in unscaled coordinates. + coordf_t height { 0 }; + // Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers. + // If this is not a contact layer, it will be set to size_t(-1). + size_t idx_object_layer_above { size_t(-1) }; + // Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers. + // If this is not a contact layer, it will be set to size_t(-1). + size_t idx_object_layer_below { size_t(-1) }; + // Use a bridging flow when printing this support layer. + bool bridging { false }; + + // Polygons to be filled by the support pattern. + Polygons polygons; + // Currently for the contact layers only. + std::unique_ptr contact_polygons; + std::unique_ptr overhang_polygons; + // Enforcers need to be propagated independently in case the "support on build plate only" option is enabled. + std::unique_ptr enforcer_polygons; +}; + +// Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained +// up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future, +// which would allocate layers by multiple chunks. +using SupportGeneratorLayerStorage = std::deque; +using SupportGeneratorLayersPtr = std::vector; + +struct SupportParameters { + SupportParameters(const PrintObject &object); + + Flow first_layer_flow; + Flow support_material_flow; + Flow support_material_interface_flow; + Flow support_material_bottom_interface_flow; + // Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder? + bool can_merge_support_regions; + + coordf_t support_layer_height_min; +// coordf_t support_layer_height_max; + + coordf_t gap_xy; + + float base_angle; + float interface_angle; + coordf_t interface_spacing; + coordf_t interface_density; + coordf_t support_spacing; + coordf_t support_density; + + InfillPattern base_fill_pattern; + InfillPattern interface_fill_pattern; + InfillPattern contact_fill_pattern; + bool with_sheath; +}; + +// Generate raft layers, also expand the 1st support layer +// in case there is no raft layer to improve support adhesion. +SupportGeneratorLayersPtr generate_raft_base( + const PrintObject &object, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers, + const SupportGeneratorLayersPtr &base_layers, + SupportGeneratorLayerStorage &layer_storage); + +// returns sorted layers +SupportGeneratorLayersPtr generate_support_layers( + PrintObject &object, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers); + +// Produce the support G-code. +// Used by both classic and tree supports. +void generate_support_toolpaths( + SupportLayerPtrs &support_layers, + const PrintObjectConfig &config, + const SupportParameters &support_params, + const SlicingParameters &slicing_params, + const SupportGeneratorLayersPtr &raft_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + const SupportGeneratorLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &interface_layers, + const SupportGeneratorLayersPtr &base_interface_layers); + +void export_print_z_polygons_to_svg(const char *path, SupportGeneratorLayer ** const layers, size_t n_layers); +void export_print_z_polygons_and_extrusions_to_svg(const char *path, SupportGeneratorLayer ** const layers, size_t n_layers, SupportLayer& support_layer); + // This class manages raft and supports for a single PrintObject. // Instantiated by Slic3r::Print::Object->_support_material() // This class is instantiated before the slicing starts as Object.pm will query // the parameters of the raft to determine the 1st layer height and thickness. class PrintObjectSupportMaterial { -public: - // Support layer type to be used by MyLayer. This type carries a much more detailed information - // about the support layer type than the final support layers stored in a PrintObject. - enum SupporLayerType { - sltUnknown = 0, - // Ratft base layer, to be printed with the support material. - sltRaftBase, - // Raft interface layer, to be printed with the support interface material. - sltRaftInterface, - // Bottom contact layer placed over a top surface of an object. To be printed with a support interface material. - sltBottomContact, - // Dense interface layer, to be printed with the support interface material. - // This layer is separated from an object by an sltBottomContact layer. - sltBottomInterface, - // Sparse base support layer, to be printed with a support material. - sltBase, - // Dense interface layer, to be printed with the support interface material. - // This layer is separated from an object with sltTopContact layer. - sltTopInterface, - // Top contact layer directly supporting an overhang. To be printed with a support interface material. - sltTopContact, - // Some undecided type yet. It will turn into sltBase first, then it may turn into sltBottomInterface or sltTopInterface. - sltIntermediate, - }; - - // A support layer type used internally by the SupportMaterial class. This class carries a much more detailed - // information about the support layer than the layers stored in the PrintObject, mainly - // the MyLayer is aware of the bridging flow and the interface gaps between the object and the support. - class MyLayer - { - public: - void reset() { - *this = MyLayer(); - } - - bool operator==(const MyLayer &layer2) const { - return print_z == layer2.print_z && height == layer2.height && bridging == layer2.bridging; - } - - // Order the layers by lexicographically by an increasing print_z and a decreasing layer height. - bool operator<(const MyLayer &layer2) const { - if (print_z < layer2.print_z) { - return true; - } else if (print_z == layer2.print_z) { - if (height > layer2.height) - return true; - else if (height == layer2.height) { - // Bridging layers first. - return bridging && ! layer2.bridging; - } else - return false; - } else - return false; - } - - void merge(MyLayer &&rhs) { - // The union_() does not support move semantic yet, but maybe one day it will. - this->polygons = union_(this->polygons, std::move(rhs.polygons)); - auto merge = [](std::unique_ptr &dst, std::unique_ptr &src) { - if (! dst || dst->empty()) - dst = std::move(src); - else if (src && ! src->empty()) - *dst = union_(*dst, std::move(*src)); - }; - merge(this->contact_polygons, rhs.contact_polygons); - merge(this->overhang_polygons, rhs.overhang_polygons); - merge(this->enforcer_polygons, rhs.enforcer_polygons); - rhs.reset(); - } - - // For the bridging flow, bottom_print_z will be above bottom_z to account for the vertical separation. - // For the non-bridging flow, bottom_print_z will be equal to bottom_z. - coordf_t bottom_print_z() const { return print_z - height; } - - // To sort the extremes of top / bottom interface layers. - coordf_t extreme_z() const { return (this->layer_type == sltTopContact) ? this->bottom_z : this->print_z; } - - SupporLayerType layer_type { sltUnknown }; - // Z used for printing, in unscaled coordinates. - coordf_t print_z { 0 }; - // Bottom Z of this layer. For soluble layers, bottom_z + height = print_z, - // otherwise bottom_z + gap + height = print_z. - coordf_t bottom_z { 0 }; - // Layer height in unscaled coordinates. - coordf_t height { 0 }; - // Index of a PrintObject layer_id supported by this layer. This will be set for top contact layers. - // If this is not a contact layer, it will be set to size_t(-1). - size_t idx_object_layer_above { size_t(-1) }; - // Index of a PrintObject layer_id, which supports this layer. This will be set for bottom contact layers. - // If this is not a contact layer, it will be set to size_t(-1). - size_t idx_object_layer_below { size_t(-1) }; - // Use a bridging flow when printing this support layer. - bool bridging { false }; - - // Polygons to be filled by the support pattern. - Polygons polygons; - // Currently for the contact layers only. - std::unique_ptr contact_polygons; - std::unique_ptr overhang_polygons; - // Enforcers need to be propagated independently in case the "support on build plate only" option is enabled. - std::unique_ptr enforcer_polygons; - }; - - struct SupportParams { - Flow first_layer_flow; - Flow support_material_flow; - Flow support_material_interface_flow; - Flow support_material_bottom_interface_flow; - // Is merging of regions allowed? Could the interface & base support regions be printed with the same extruder? - bool can_merge_support_regions; - - coordf_t support_layer_height_min; - // coordf_t support_layer_height_max; - - coordf_t gap_xy; - - float base_angle; - float interface_angle; - coordf_t interface_spacing; - coordf_t interface_density; - coordf_t support_spacing; - coordf_t support_density; - - InfillPattern base_fill_pattern; - InfillPattern interface_fill_pattern; - InfillPattern contact_fill_pattern; - bool with_sheath; - }; - - // Layers are allocated and owned by a deque. Once a layer is allocated, it is maintained - // up to the end of a generate() method. The layer storage may be replaced by an allocator class in the future, - // which would allocate layers by multiple chunks. - typedef std::deque MyLayerStorage; - typedef std::vector MyLayersPtr; - public: PrintObjectSupportMaterial(const PrintObject *object, const SlicingParameters &slicing_params); @@ -175,58 +215,48 @@ private: // Generate top contact layers supporting overhangs. // For a soluble interface material synchronize the layer heights with the object, otherwise leave the layer height undefined. // If supports over bed surface only are requested, don't generate contact layers over an object. - MyLayersPtr top_contact_layers(const PrintObject &object, const std::vector &buildplate_covered, MyLayerStorage &layer_storage) const; + SupportGeneratorLayersPtr top_contact_layers(const PrintObject &object, const std::vector &buildplate_covered, SupportGeneratorLayerStorage &layer_storage) const; // Generate bottom contact layers supporting the top contact layers. // For a soluble interface material synchronize the layer heights with the object, // otherwise set the layer height to a bridging flow of a support interface nozzle. - MyLayersPtr bottom_contact_layers_and_layer_support_areas( - const PrintObject &object, const MyLayersPtr &top_contacts, std::vector &buildplate_covered, - MyLayerStorage &layer_storage, std::vector &layer_support_areas) const; + SupportGeneratorLayersPtr bottom_contact_layers_and_layer_support_areas( + const PrintObject &object, const SupportGeneratorLayersPtr &top_contacts, std::vector &buildplate_covered, + SupportGeneratorLayerStorage &layer_storage, std::vector &layer_support_areas) const; // Trim the top_contacts layers with the bottom_contacts layers if they overlap, so there would not be enough vertical space for both of them. - void trim_top_contacts_by_bottom_contacts(const PrintObject &object, const MyLayersPtr &bottom_contacts, MyLayersPtr &top_contacts) const; + void trim_top_contacts_by_bottom_contacts(const PrintObject &object, const SupportGeneratorLayersPtr &bottom_contacts, SupportGeneratorLayersPtr &top_contacts) const; // Generate raft layers and the intermediate support layers between the bottom contact and top contact surfaces. - MyLayersPtr raft_and_intermediate_support_layers( + SupportGeneratorLayersPtr raft_and_intermediate_support_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayerStorage &layer_storage) const; + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayerStorage &layer_storage) const; // Fill in the base layers with polygons. void generate_base_layers( const PrintObject &object, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, const std::vector &layer_support_areas) const; - // Generate raft layers, also expand the 1st support layer - // in case there is no raft layer to improve support adhesion. - MyLayersPtr generate_raft_base( - const PrintObject &object, - const MyLayersPtr &top_contacts, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers, - const MyLayersPtr &base_layers, - MyLayerStorage &layer_storage) const; - // Turn some of the base layers into base interface layers. // For soluble interfaces with non-soluble bases, print maximum two first interface layers with the base // extruder to improve adhesion of the soluble filament to the base. - std::pair generate_interface_layers( - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - MyLayersPtr &intermediate_layers, - MyLayerStorage &layer_storage) const; + std::pair generate_interface_layers( + const SupportGeneratorLayersPtr &bottom_contacts, + const SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage) const; // Trim support layers by an object to leave a defined gap between // the support volume and the object. void trim_support_layers_by_object( const PrintObject &object, - MyLayersPtr &support_layers, + SupportGeneratorLayersPtr &support_layers, const coordf_t gap_extra_above, const coordf_t gap_extra_below, const coordf_t gap_xy) const; @@ -236,25 +266,14 @@ private: void clip_with_shape(); */ - // Produce the actual G-code. - void generate_toolpaths( - SupportLayerPtrs &support_layers, - const MyLayersPtr &raft_layers, - const MyLayersPtr &bottom_contacts, - const MyLayersPtr &top_contacts, - const MyLayersPtr &intermediate_layers, - const MyLayersPtr &interface_layers, - const MyLayersPtr &base_interface_layers) const; - // Following objects are not owned by SupportMaterial class. - const PrintObject *m_object; const PrintConfig *m_print_config; const PrintObjectConfig *m_object_config; // Pre-calculated parameters shared between the object slicer and the support generator, // carrying information on a raft, 1st layer height, 1st object layer height, gap between the raft and object etc. SlicingParameters m_slicing_params; // Various precomputed support parameters to be shared with external functions. - SupportParams m_support_params; + SupportParameters m_support_params; }; } // namespace Slic3r diff --git a/src/libslic3r/SurfaceCollection.cpp b/src/libslic3r/SurfaceCollection.cpp index ec847d2a3f..2ec071f7db 100644 --- a/src/libslic3r/SurfaceCollection.cpp +++ b/src/libslic3r/SurfaceCollection.cpp @@ -65,14 +65,11 @@ SurfacesPtr SurfaceCollection::filter_by_types(const SurfaceType *types, int nty return ss; } -void SurfaceCollection::filter_by_type(SurfaceType type, Polygons* polygons) +void SurfaceCollection::filter_by_type(SurfaceType type, Polygons *polygons) const { - for (Surfaces::iterator surface = this->surfaces.begin(); surface != this->surfaces.end(); ++surface) { - if (surface->surface_type == type) { - Polygons pp = surface->expolygon; - polygons->insert(polygons->end(), pp.begin(), pp.end()); - } - } + for (const Surface &surface : this->surfaces) + if (surface.surface_type == type) + polygons_append(*polygons, to_polygons(surface.expolygon)); } void SurfaceCollection::keep_type(const SurfaceType type) @@ -124,6 +121,22 @@ void SurfaceCollection::remove_type(const SurfaceType type) surfaces.erase(surfaces.begin() + j, surfaces.end()); } +void SurfaceCollection::remove_type(const SurfaceType type, ExPolygons *polygons) +{ + size_t j = 0; + for (size_t i = 0; i < surfaces.size(); ++ i) { + if (Surface &surface = surfaces[i]; surface.surface_type == type) { + polygons->emplace_back(std::move(surface.expolygon)); + } else { + if (j < i) + std::swap(surfaces[i], surfaces[j]); + ++ j; + } + } + if (j < surfaces.size()) + surfaces.erase(surfaces.begin() + j, surfaces.end()); +} + void SurfaceCollection::remove_types(const SurfaceType *types, int ntypes) { size_t j = 0; diff --git a/src/libslic3r/SurfaceCollection.hpp b/src/libslic3r/SurfaceCollection.hpp index 7e01a68dfb..8c27a507bf 100644 --- a/src/libslic3r/SurfaceCollection.hpp +++ b/src/libslic3r/SurfaceCollection.hpp @@ -32,7 +32,8 @@ public: void keep_types(const SurfaceType *types, int ntypes); void remove_type(const SurfaceType type); void remove_types(const SurfaceType *types, int ntypes); - void filter_by_type(SurfaceType type, Polygons* polygons); + void filter_by_type(SurfaceType type, Polygons *polygons) const; + void remove_type(const SurfaceType type, ExPolygons *polygons); void set_type(SurfaceType type) { for (Surface &surface : this->surfaces) surface.surface_type = type; diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 0c747d878f..af59877d75 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -12,8 +12,6 @@ #define ENABLE_RENDER_SELECTION_CENTER 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) -#define ENABLE_RENDER_PICKING_PASS 0 // Enable extracting thumbnails from selected gcode and save them as png files #define ENABLE_THUMBNAIL_GENERATOR_DEBUG 0 // Disable synchronization of unselected instances @@ -49,41 +47,35 @@ #define ENABLE_PREVIEW_LAYER_TIME (1 && ENABLE_2_5_0_ALPHA1) // Enable showing time estimate for travel moves in legend #define ENABLE_TRAVEL_TIME (1 && ENABLE_2_5_0_ALPHA1) -// Enable not killing focus in object manipulator fields when hovering over 3D scene -#define ENABLE_OBJECT_MANIPULATOR_FOCUS (0 && ENABLE_2_5_0_ALPHA1) // Enable removal of wipe tower magic object_id equal to 1000 #define ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) // Enable removal of legacy OpenGL calls #define ENABLE_LEGACY_OPENGL_REMOVAL (1 && ENABLE_2_5_0_ALPHA1) -// Enable using vertex attributes and matrices in shaders -#define ENABLE_GL_SHADERS_ATTRIBUTES (1 && ENABLE_LEGACY_OPENGL_REMOVAL) -// Enable rendering imgui using shaders -#define ENABLE_GL_IMGUI_SHADERS (0 && ENABLE_GL_SHADERS_ATTRIBUTES) +// Enable OpenGL ES +#define ENABLE_OPENGL_ES (0 && ENABLE_LEGACY_OPENGL_REMOVAL) +// Enable OpenGL core profile context (tested against Mesa 20.1.8 on Windows) +#define ENABLE_GL_CORE_PROFILE (1 && ENABLE_LEGACY_OPENGL_REMOVAL && !ENABLE_OPENGL_ES) +// Enable OpenGL debug messages using debug context +#define ENABLE_OPENGL_DEBUG_OPTION (1 && ENABLE_GL_CORE_PROFILE) // Shows an imgui dialog with GLModel statistics data #define ENABLE_GLMODEL_STATISTICS (0 && ENABLE_LEGACY_OPENGL_REMOVAL) -// Enable show non-manifold edges -#define ENABLE_SHOW_NON_MANIFOLD_EDGES (1 && ENABLE_2_5_0_ALPHA1) // Enable rework of Reload from disk command #define ENABLE_RELOAD_FROM_DISK_REWORK (1 && ENABLE_2_5_0_ALPHA1) -// Enable showing toolpaths center of gravity -#define ENABLE_SHOW_TOOLPATHS_COG (1 && ENABLE_2_5_0_ALPHA1) // Enable recalculating toolpaths when switching to/from volumetric rate visualization #define ENABLE_VOLUMETRIC_RATE_TOOLPATHS_RECALC (1 && ENABLE_2_5_0_ALPHA1) // Enable editing volumes transformation in world coordinates and instances in local coordinates #define ENABLE_WORLD_COORDINATE (1 && ENABLE_2_5_0_ALPHA1) // Enable modified camera control using mouse #define ENABLE_NEW_CAMERA_MOVEMENTS (1 && ENABLE_2_5_0_ALPHA1) -// Enable modified rectangle selection -#define ENABLE_NEW_RECTANGLE_SELECTION (1 && ENABLE_2_5_0_ALPHA1) // Enable alternative version of file_wildcards() #define ENABLE_ALTERNATIVE_FILE_WILDCARDS_GENERATOR (1 && ENABLE_2_5_0_ALPHA1) // Enable processing of gcode G2 and G3 lines #define ENABLE_PROCESS_G2_G3_LINES (1 && ENABLE_2_5_0_ALPHA1) // Enable fix of used filament data exported to gcode file #define ENABLE_USED_FILAMENT_POST_PROCESS (1 && ENABLE_2_5_0_ALPHA1) -// Enable gizmo grabbers to share common models -#define ENABLE_GIZMO_GRABBER_REFACTOR (1 && ENABLE_2_5_0_ALPHA1) -// Enable copy of custom bed model and texture -#define ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE (1 && ENABLE_2_5_0_ALPHA1) +// Enable picking using raytracing +#define ENABLE_RAYCAST_PICKING (0 && ENABLE_LEGACY_OPENGL_REMOVAL) +#define ENABLE_RAYCAST_PICKING_DEBUG (0 && ENABLE_RAYCAST_PICKING) + #endif // _prusaslicer_technologies_h_ diff --git a/src/libslic3r/Thread.cpp b/src/libslic3r/Thread.cpp index c099f8de6c..4fe07fb590 100644 --- a/src/libslic3r/Thread.cpp +++ b/src/libslic3r/Thread.cpp @@ -203,7 +203,7 @@ void name_tbb_thread_pool_threads_set_locale() const size_t nthreads_hw = tbb::this_task_arena::max_concurrency(); size_t nthreads = nthreads_hw; -#ifdef SLIC3R_PROFILE +#if 0 // Shiny profiler is not thread safe, thus disable parallelization. disable_multi_threading(); nthreads = 1; diff --git a/src/libslic3r/TreeModelVolumes.cpp b/src/libslic3r/TreeModelVolumes.cpp new file mode 100644 index 0000000000..f8e2a14a70 --- /dev/null +++ b/src/libslic3r/TreeModelVolumes.cpp @@ -0,0 +1,782 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#include "TreeModelVolumes.hpp" +#include "TreeSupport.hpp" + +#include "BuildVolume.hpp" +#include "ClipperUtils.hpp" +#include "Flow.hpp" +#include "Layer.hpp" +#include "Point.hpp" +#include "Print.hpp" +#include "PrintConfig.hpp" +#include "Utils.hpp" + +#include + +#include +#include + +namespace Slic3r +{ + +// or warning +// had to use a define beacuse the macro processing inside macro BOOST_LOG_TRIVIAL() +#define error_level_not_in_cache error + +TreeSupportMeshGroupSettings::TreeSupportMeshGroupSettings(const PrintObject &print_object) +{ + const PrintConfig &print_config = print_object.print()->config(); + const PrintObjectConfig &config = print_object.config(); + const SlicingParameters &slicing_params = print_object.slicing_parameters(); +// const std::vector printing_extruders = print_object.object_extruders(); + + // Support must be enabled and set to Tree style. + assert(config.support_material); + assert(config.support_material_style == smsTree); + + // Calculate maximum external perimeter width over all printing regions, taking into account the default layer height. + coordf_t external_perimeter_width = 0.; + for (size_t region_id = 0; region_id < print_object.num_printing_regions(); ++ region_id) { + const PrintRegion ®ion = print_object.printing_region(region_id); + external_perimeter_width = std::max(external_perimeter_width, region.flow(print_object, frExternalPerimeter, config.layer_height).width()); + } + + this->layer_height = scaled(config.layer_height.value); + this->resolution = scaled(print_config.gcode_resolution.value); + this->min_feature_size = scaled(config.min_feature_size.value); + // +1 makes the threshold inclusive + this->support_angle = 0.5 * M_PI - std::clamp((config.support_material_threshold + 1) * M_PI / 180., 0., 0.5 * M_PI); + this->support_line_width = support_material_flow(&print_object, config.layer_height).scaled_width(); + this->support_roof_line_width = support_material_interface_flow(&print_object, config.layer_height).scaled_width(); + //FIXME add it to SlicingParameters and reuse in both tree and normal supports? + this->support_bottom_enable = config.support_material_interface_layers.value > 0 && config.support_material_bottom_interface_layers.value != 0; + this->support_bottom_height = this->support_bottom_enable ? + (config.support_material_bottom_interface_layers.value > 0 ? + config.support_material_bottom_interface_layers.value : + config.support_material_interface_layers.value) * this->layer_height : + 0; + this->support_material_buildplate_only = config.support_material_buildplate_only; +// this->support_xy_overrides_z = + this->support_xy_distance = scaled(config.support_material_xy_spacing.get_abs_value(external_perimeter_width)); + // Separation of interfaces, it is likely smaller than support_xy_distance. + this->support_xy_distance_overhang = std::min(this->support_xy_distance, scaled(0.5 * external_perimeter_width)); + this->support_top_distance = scaled(slicing_params.gap_support_object); + this->support_bottom_distance = scaled(slicing_params.gap_object_support); +// this->support_interface_skip_height = +// this->support_infill_angles = + this->support_roof_enable = config.support_material_interface_layers.value > 0; + this->support_roof_height = config.support_material_interface_layers.value * this->layer_height; +// this->minimum_roof_area = +// this->support_roof_angles = + this->support_roof_pattern = config.support_material_interface_pattern; + this->support_pattern = config.support_material_pattern; + this->support_line_spacing = scaled(config.support_material_spacing.value); +// this->support_bottom_offset = +// this->support_wall_count = config.support_material_with_sheath ? 1 : 0; + this->support_wall_count = 1; + this->support_roof_line_distance = scaled(config.support_material_interface_spacing.value) + this->support_roof_line_width; +// this->minimum_support_area = +// this->minimum_bottom_area = +// this->support_offset = +} + +//FIXME Machine border is currently ignored. +static Polygons calculateMachineBorderCollision(Polygon machine_border) +{ + // Put a border of 1m around the print volume so that we don't collide. +#if 1 + //FIXME just returning no border will let tree support legs collide with print bed boundary + return {}; +#else + //FIXME offsetting by 1000mm easily overflows int32_tr coordinate. + Polygons out = offset(machine_border, scaled(1000.), jtMiter, 1.2); + machine_border.reverse(); // Makes the polygon negative so that we subtract the actual volume from the collision area. + out.emplace_back(std::move(machine_border)); + return out; +#endif +} + +TreeModelVolumes::TreeModelVolumes( + const PrintObject &print_object, + const BuildVolume &build_volume, + const coord_t max_move, const coord_t max_move_slow, size_t current_mesh_idx, + double progress_multiplier, double progress_offset, const std::vector& additional_excluded_areas) : + // -2 to avoid rounding errors + m_max_move{ std::max(max_move - 2, 0) }, m_max_move_slow{ std::max(max_move_slow - 2, 0) }, +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + m_progress_multiplier{ progress_multiplier }, m_progress_offset{ progress_offset }, +#endif // SLIC3R_TREESUPPORTS_PROGRESS + m_machine_border{ calculateMachineBorderCollision(build_volume.polygon()) } +{ +#if 0 + std::unordered_map mesh_to_layeroutline_idx; + for (size_t mesh_idx = 0; mesh_idx < storage.meshes.size(); ++ mesh_idx) { + SliceMeshStorage mesh = storage.meshes[mesh_idx]; + bool added = false; + for (size_t idx = 0; idx < m_layer_outlines.size(); ++ idx) + if (TreeSupport::TreeSupportSettings(m_layer_outlines[idx].first) == TreeSupport::TreeSupportSettings(mesh.settings)) { + added = true; + mesh_to_layeroutline_idx[mesh_idx] = idx; + } + if (! added) { + mesh_to_layeroutline_idx[mesh_idx] = m_layer_outlines.size(); + m_layer_outlines.emplace_back(mesh.settings, std::vector(storage.support.supportLayers.size(), Polygons())); + } + } + for (size_t idx = 0; idx < m_layer_outlines.size(); ++ idx) { + tbb::parallel_for(tbb::blocked_range(0, m_layer_outlines[idx].second.size()), + [&](const tbb::blocked_range &range) { + for (const size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) + m_layer_outlines[idx].second[layer_idx] = union_(m_layer_outlines[idx].second[layer_idx]); + }); + } + m_current_outline_idx = mesh_to_layeroutline_idx[current_mesh_idx]; + +#else + { + m_anti_overhang = print_object.slice_support_blockers(); + TreeSupportMeshGroupSettings mesh_settings(print_object); + m_layer_outlines.emplace_back(mesh_settings, std::vector{}); + m_current_outline_idx = 0; + std::vector &outlines = m_layer_outlines.front().second; + outlines.assign(print_object.layer_count(), Polygons{}); + tbb::parallel_for(tbb::blocked_range(0, print_object.layer_count(), std::min(1, std::max(16, print_object.layer_count() / (8 * tbb::this_task_arena::max_concurrency())))), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) + outlines[layer_idx] = to_polygons(expolygons_simplify(print_object.get_layer(layer_idx)->lslices, mesh_settings.resolution)); + }); + } +#endif + + m_support_rests_on_model = false; + m_min_resolution = std::numeric_limits::max(); + for (auto data_pair : m_layer_outlines) { + m_support_rests_on_model |= ! data_pair.first.support_material_buildplate_only; + m_min_resolution = std::min(m_min_resolution, data_pair.first.resolution); + } + + const TreeSupport::TreeSupportSettings config{ m_layer_outlines[m_current_outline_idx].first }; + if (! config.support_xy_overrides_z) { + m_current_min_xy_dist = config.xy_min_distance; + if (TreeSupport::TreeSupportSettings::has_to_rely_on_min_xy_dist_only) + m_current_min_xy_dist = std::max(m_current_min_xy_dist, coord_t(100)); + m_current_min_xy_dist_delta = std::max(config.xy_distance - m_current_min_xy_dist, coord_t(0)); + } else { + m_current_min_xy_dist = config.xy_distance; + m_current_min_xy_dist_delta = 0; + } + m_increase_until_radius = config.increase_radius_until_radius; + m_radius_0 = config.getRadius(0); + +#if 0 + for (size_t mesh_idx = 0; mesh_idx < storage.meshes.size(); mesh_idx++) { + SliceMeshStorage mesh = storage.meshes[mesh_idx]; + tbb::parallel_for(tbb::blocked_range(0, m_layer_outlines[mesh_to_layeroutline_idx[mesh_idx]].second.size()), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) + if (layer_idx < mesh.layer_nr_max_filled_layer) { + Polygons outline = extractOutlineFromMesh(mesh, layer_idx); + append(m_layer_outlines[mesh_to_layeroutline_idx[mesh_idx]].second[layer_idx], outline); + } + }); + } + if (! additional_excluded_areas.empty()) { + tbb::parallel_for(tbb::blocked_range(0, m_anti_overhang.size()), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + if (layer_idx < coord_t(additional_excluded_areas.size())) + append(m_anti_overhang[layer_idx], additional_excluded_areas[layer_idx]); + // if (SUPPORT_TREE_AVOID_SUPPORT_BLOCKER) + // append(m_anti_overhang[layer_idx], storage.support.supportLayers[layer_idx].anti_overhang); + //FIXME block wipe tower + // if (storage.primeTower.enabled) + // append(m_anti_overhang[layer_idx], layer_idx == 0 ? storage.primeTower.outer_poly_first_layer : storage.primeTower.outer_poly); + m_anti_overhang[layer_idx] = union_(m_anti_overhang[layer_idx]); + } + }); + } +#endif +} + +void TreeModelVolumes::precalculate(const coord_t max_layer) +{ + auto t_start = std::chrono::high_resolution_clock::now(); + m_precalculated = true; + + // Get the config corresponding to one mesh that is in the current group. Which one has to be irrelevant. + // Not the prettiest way to do this, but it ensures some calculations that may be a bit more complex + // like inital layer diameter are only done in once. + TreeSupport::TreeSupportSettings config(m_layer_outlines[m_current_outline_idx].first); + + { + // calculate which radius each layer in the tip may have. + std::vector possible_tip_radiis; + for (size_t distance_to_top = 0; distance_to_top <= config.tip_layers; ++ distance_to_top) { + possible_tip_radiis.emplace_back(ceilRadius(config.getRadius(distance_to_top))); + possible_tip_radiis.emplace_back(ceilRadius(config.getRadius(distance_to_top) + m_current_min_xy_dist_delta)); + } + sort_remove_duplicates(possible_tip_radiis); + // It theoretically may happen in the tip, that the radius can change so much in-between 2 layers, + // that a ceil step is skipped (as in there is a radius r so that ceilRadius(radius(dtt)) radius_until_layer; + // while it is possible to calculate, up to which layer the avoidance should be calculated, this simulation is easier to understand, and does not need to be adjusted if something of the radius calculation is changed. + // Overhead with an assumed worst case of 6600 layers was about 2ms + for (LayerIndex distance_to_top = 0; distance_to_top <= max_layer; ++ distance_to_top) { + const LayerIndex current_layer = max_layer - distance_to_top; + auto update_radius_until_layer = [&radius_until_layer, current_layer](coord_t r) { + auto it = radius_until_layer.find(r); + if (it == radius_until_layer.end()) + radius_until_layer.emplace_hint(it, r, current_layer); + }; + // regular radius + update_radius_until_layer(ceilRadius(config.getRadius(distance_to_top, 0) + m_current_min_xy_dist_delta)); + // the maximum radius that the radius with the min_xy_dist can achieve + update_radius_until_layer(ceilRadius(config.getRadius(distance_to_top, 0))); + update_radius_until_layer(ceilRadius(config.recommendedMinRadius(current_layer) + m_current_min_xy_dist_delta)); + } + + // Copy to deque to use in parallel for later. + std::vector relevant_avoidance_radiis{ radius_until_layer.begin(), radius_until_layer.end() }; + + // Append additional radiis needed for collision. + // To calculate collision holefree for every radius, the collision of radius m_increase_until_radius will be required. + radius_until_layer[ceilRadius(m_increase_until_radius + m_current_min_xy_dist_delta)] = max_layer; + // Collision for radius 0 needs to be calculated everywhere, as it will be used to ensure valid xy_distance in drawAreas. + radius_until_layer[0] = max_layer; + if (m_current_min_xy_dist_delta != 0) + radius_until_layer[m_current_min_xy_dist_delta] = max_layer; + + // Now that required_avoidance_limit contains the maximum of ild and regular required radius just copy. + std::vector relevant_collision_radiis{ radius_until_layer.begin(), radius_until_layer.end() }; + + // Calculate the relevant collisions + calculateCollision(relevant_collision_radiis); + + // calculate a separate Collisions with all holes removed. These are relevant for some avoidances that try to avoid holes (called safe) + std::vector relevant_hole_collision_radiis; + for (RadiusLayerPair key : relevant_avoidance_radiis) + if (key.first < m_increase_until_radius + m_current_min_xy_dist_delta) + relevant_hole_collision_radiis.emplace_back(key); + + // Calculate collisions without holes, built from regular collision + calculateCollisionHolefree(relevant_hole_collision_radiis); + // Let placables be calculated from calculateAvoidance() for better parallelization. + if (m_support_rests_on_model) + calculatePlaceables(relevant_avoidance_radiis); + + auto t_coll = std::chrono::high_resolution_clock::now(); + + // Calculate the relevant avoidances in parallel as far as possible + { + tbb::task_group task_group; + task_group.run([this, relevant_avoidance_radiis]{ calculateAvoidance(relevant_avoidance_radiis, true, m_support_rests_on_model); }); + task_group.run([this, relevant_avoidance_radiis]{ calculateWallRestrictions(relevant_avoidance_radiis); }); + task_group.wait(); + } + auto t_end = std::chrono::high_resolution_clock::now(); + auto dur_col = 0.001 * std::chrono::duration_cast(t_coll - t_start).count(); + auto dur_avo = 0.001 * std::chrono::duration_cast(t_end - t_coll).count(); + +// m_precalculated = true; + BOOST_LOG_TRIVIAL(info) << "Precalculating collision took" << dur_col << " ms. Precalculating avoidance took " << dur_avo << " ms."; +} + +const Polygons& TreeModelVolumes::getCollision(const coord_t orig_radius, LayerIndex layer_idx, bool min_xy_dist) const +{ + const coord_t radius = this->ceilRadius(orig_radius, min_xy_dist); + if (std::optional> result = m_collision_cache.getArea({ radius, layer_idx }); result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate collision at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + TreeSupport::showError("Not precalculated Collision requested.", false); + } + const_cast(this)->calculateCollision(radius, layer_idx); + return getCollision(orig_radius, layer_idx, min_xy_dist); +} + +// Private. Only called internally by calculateAvoidance() and calculateAvoidanceToModel(), radius is already snapped to grid. +const Polygons& TreeModelVolumes::getCollisionHolefree(coord_t radius, LayerIndex layer_idx) const +{ + assert(radius == this->ceilRadius(radius)); + assert(radius < m_increase_until_radius + m_current_min_xy_dist_delta); + if (std::optional> result = m_collision_cache_holefree.getArea({ radius, layer_idx }); result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate collision holefree at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + TreeSupport::showError("Not precalculated Holefree Collision requested.", false); + } + const_cast(this)->calculateCollisionHolefree({ radius, layer_idx }); + return getCollisionHolefree(radius, layer_idx); +} + +const Polygons& TreeModelVolumes::getAvoidance(const coord_t orig_radius, LayerIndex layer_idx, AvoidanceType type, bool to_model, bool min_xy_dist) const +{ + if (layer_idx == 0) // What on the layer directly above buildplate do i have to avoid to reach the buildplate ... + return getCollision(orig_radius, layer_idx, min_xy_dist); + + const coord_t radius = this->ceilRadius(orig_radius, min_xy_dist); + if (type == AvoidanceType::FastSafe && radius >= m_increase_until_radius + m_current_min_xy_dist_delta) + // no holes anymore by definition at this request + type = AvoidanceType::Fast; + + if (std::optional> result = + this->avoidance_cache(type, to_model).getArea({ radius, layer_idx }); + result) + return (*result).get(); + + if (m_precalculated) { + if (to_model) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Avoidance to model at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + TreeSupport::showError("Not precalculated Avoidance(to model) requested.", false); + } else { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Avoidance at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + TreeSupport::showError("Not precalculated Avoidance(to buildplate) requested.", false); + } + } + const_cast(this)->calculateAvoidance({ radius, layer_idx }, ! to_model, to_model); + // Retrive failed and correct result was calculated. Now it has to be retrived. + return getAvoidance(orig_radius, layer_idx, type, to_model, min_xy_dist); +} + +const Polygons& TreeModelVolumes::getPlaceableAreas(const coord_t orig_radius, LayerIndex layer_idx) const +{ + if (orig_radius == 0) + return this->getCollision(0, layer_idx, true); + + const coord_t radius = ceilRadius(orig_radius); + if (std::optional> result = m_placeable_areas_cache.getArea({ radius, layer_idx }); result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Placeable Areas at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + TreeSupport::showError("Not precalculated Placeable areas requested.", false); + } + const_cast(this)->calculatePlaceables(radius, layer_idx); + return getPlaceableAreas(orig_radius, layer_idx); +} + +const Polygons& TreeModelVolumes::getWallRestriction(const coord_t orig_radius, LayerIndex layer_idx, bool min_xy_dist) const +{ + assert(layer_idx > 0); + if (layer_idx == 0) + // Should never be requested as there will be no going below layer 0 ..., + // but just to be sure some semi-sane catch. Alternative would be empty Polygon. + return getCollision(orig_radius, layer_idx, min_xy_dist); + + min_xy_dist &= m_current_min_xy_dist_delta > 0; + + const coord_t radius = ceilRadius(orig_radius); + if (std::optional> result = + (min_xy_dist ? m_wall_restrictions_cache_min : m_wall_restrictions_cache).getArea({ radius, layer_idx }); + result) + return (*result).get(); + if (m_precalculated) { + BOOST_LOG_TRIVIAL(error_level_not_in_cache) << "Had to calculate Wall restricions at radius " << radius << " and layer " << layer_idx << ", but precalculate was called. Performance may suffer!"; + TreeSupport::showError( + min_xy_dist ? + "Not precalculated Wall restriction of minimum xy distance requested )." : + "Not precalculated Wall restriction requested )." + , false); + } + const_cast(this)->calculateWallRestrictions({ radius, layer_idx }); + return getWallRestriction(orig_radius, layer_idx, min_xy_dist); // Retrieve failed and correct result was calculated. Now it has to be retrieved. +} + +void TreeModelVolumes::calculateCollision(const std::vector &keys) +{ + tbb::parallel_for(tbb::blocked_range(0, keys.size()), + [&](const tbb::blocked_range &range) { + for (size_t ikey = range.begin(); ikey != range.end(); ++ ikey) { + const LayerIndex radius = keys[ikey].first; + const size_t max_layer_idx = keys[ikey].second; + // recursive call to parallel_for. + calculateCollision(radius, max_layer_idx); + } + }); +} + +void TreeModelVolumes::calculateCollision(const coord_t radius, const LayerIndex max_layer_idx) +{ +// assert(radius == this->ceilRadius(radius)); + + // Process the outlines from least layers to most layers so that the final union will run over the longest vector. + std::vector layer_outline_indices(m_layer_outlines.size(), 0); + std::iota(layer_outline_indices.begin(), layer_outline_indices.end(), 0); + std::sort(layer_outline_indices.begin(), layer_outline_indices.end(), + [this](size_t i, size_t j) { return m_layer_outlines[i].second.size() < m_layer_outlines[j].second.size(); }); + + const LayerIndex min_layer_last = m_collision_cache.getMaxCalculatedLayer(radius); + std::vector data(max_layer_idx + 1 - min_layer_last, Polygons{}); + const bool calculate_placable = m_support_rests_on_model && radius == 0; + std::vector data_placeable; + if (calculate_placable) + data_placeable = std::vector(max_layer_idx + 1 - min_layer_last, Polygons{}); + + for (size_t outline_idx : layer_outline_indices) + if (const std::vector &outlines = m_layer_outlines[outline_idx].second; ! outlines.empty()) { + const TreeSupportMeshGroupSettings &settings = m_layer_outlines[outline_idx].first; + const coord_t layer_height = settings.layer_height; + const coord_t z_distance_bottom = settings.support_bottom_distance; + const int z_distance_bottom_layers = round_up_divide(z_distance_bottom, layer_height); + const int z_distance_top_layers = round_up_divide(settings.support_top_distance, layer_height); + const LayerIndex max_required_layer = std::min(outlines.size(), max_layer_idx + std::max(coord_t(1), z_distance_top_layers)); + const LayerIndex min_layer_bottom = std::max(0, min_layer_last - int(z_distance_bottom_layers)); + // technically this causes collision for the normal xy_distance to be larger by m_current_min_xy_dist_delta for all + // not currently processing meshes as this delta will be added at request time. + // avoiding this would require saving each collision for each outline_idx separately. + // and later for each avoidance... But avoidance calculation has to be for the whole scene and can NOT be done for each outline_idx separately and combined later. + // so avoiding this inaccuracy seems infeasible as it would require 2x the avoidance calculations => 0.5x the performance. + const coord_t xy_distance = outline_idx == m_current_outline_idx ? m_current_min_xy_dist : settings.support_xy_distance; + + // 1) Calculate offsets of collision areas in parallel. + std::vector collision_areas_offsetted(max_required_layer + 1 - min_layer_bottom); + tbb::parallel_for(tbb::blocked_range(min_layer_bottom, max_required_layer + 1), + [&outlines, &machine_border = m_machine_border, offset_value = radius + xy_distance, min_layer_bottom, &collision_areas_offsetted] + (const tbb::blocked_range &range) { + for (LayerIndex layer_idx = range.begin(); layer_idx != range.end(); ++ layer_idx) { + Polygons collision_areas = machine_border; + append(collision_areas, outlines[layer_idx]); + // jtRound is not needed here, as the overshoot can not cause errors in the algorithm, because no assumptions are made about the model. + // if a key does not exist when it is accessed it is added! + collision_areas_offsetted[layer_idx - min_layer_bottom] = offset_value == 0 ? union_(collision_areas) : offset(union_ex(collision_areas), offset_value, ClipperLib::jtMiter, 1.2); + } + }); + + // 2) Sum over top / bottom ranges. + const bool last = outline_idx == layer_outline_indices.size(); + tbb::parallel_for(tbb::blocked_range(min_layer_last + 1, max_layer_idx + 1), + [&collision_areas_offsetted, &anti_overhang = m_anti_overhang, min_layer_bottom, radius, z_distance_bottom_layers, z_distance_top_layers, min_resolution = m_min_resolution, &data, min_layer_last, last] + (const tbb::blocked_range& range) { + for (LayerIndex layer_idx = range.begin(); layer_idx != range.end(); ++layer_idx) { + Polygons collisions; + for (int i = -z_distance_bottom_layers; i <= z_distance_top_layers; ++ i) { + int j = layer_idx + i - min_layer_bottom; + if (j >= 0 && j < int(collision_areas_offsetted.size())) + append(collisions, collision_areas_offsetted[j]); + } + collisions = last && layer_idx < int(anti_overhang.size()) ? union_(collisions, offset(union_ex(anti_overhang[layer_idx]), radius, ClipperLib::jtMiter, 1.2)) : union_(collisions); + auto &dst = data[layer_idx - (min_layer_last + 1)]; + if (last) { + if (! dst.empty()) + collisions = union_(collisions, dst); + dst = polygons_simplify(collisions, min_resolution); + } else + append(dst, collisions); + } + }); + + // 3) Optionally calculate placables. + if (calculate_placable) { + // Calculating both the collision areas and placable areas. + tbb::parallel_for(tbb::blocked_range(std::max(min_layer_last + 1, z_distance_bottom_layers + 1), max_layer_idx + 1), + [&collision_areas_offsetted, &anti_overhang = m_anti_overhang, min_layer_bottom, z_distance_bottom_layers, last, min_resolution = m_min_resolution, &data_placeable, min_layer_last] + (const tbb::blocked_range& range) { + for (LayerIndex layer_idx = range.begin(); layer_idx != range.end(); ++ layer_idx) { + LayerIndex layer_idx_below = layer_idx - (z_distance_bottom_layers + 1) - min_layer_bottom; + assert(layer_idx_below >= 0); + auto ¤t = collision_areas_offsetted[layer_idx - min_layer_bottom]; + auto &below = collision_areas_offsetted[layer_idx_below]; + auto placable = diff(below, layer_idx < int(anti_overhang.size()) ? union_(current, anti_overhang[layer_idx - (z_distance_bottom_layers + 1)]) : current); + auto &dst = data_placeable[layer_idx - (min_layer_last + 1)]; + if (last) { + if (! dst.empty()) + placable = union_(placable, dst); + dst = polygons_simplify(placable, min_resolution); + } else + append(dst, placable); + } + }); + } else { + // Calculating just the collision areas. + } + } +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section(*m_critical_progress); + if (m_precalculated && m_precalculation_progress < TREE_PROGRESS_PRECALC_COLL) { + m_precalculation_progress += TREE_PROGRESS_PRECALC_COLL / keys.size(); + Progress::messageProgress(Progress::Stage::SUPPORT, m_precalculation_progress * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } + } +#endif + m_collision_cache.insert(std::move(data), min_layer_last + 1, radius); + if (calculate_placable) + m_placeable_areas_cache.insert(std::move(data_placeable), min_layer_last + 1, radius); +} + +void TreeModelVolumes::calculateCollisionHolefree(const std::vector &keys) +{ + LayerIndex max_layer = 0; + for (long long unsigned int i = 0; i < keys.size(); i++) + max_layer = std::max(max_layer, keys[i].second); + + tbb::parallel_for(tbb::blocked_range(0, max_layer + 1, keys.size()), + [&](const tbb::blocked_range &range) { + RadiusLayerPolygonCacheData data; + for (LayerIndex layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + for (RadiusLayerPair key : keys) + if (layer_idx <= key.second) { + // Logically increase the collision by m_increase_until_radius + coord_t radius = key.first; + assert(radius == this->ceilRadius(radius)); + assert(radius < m_increase_until_radius + m_current_min_xy_dist_delta); + coord_t increase_radius_ceil = ceilRadius(m_increase_until_radius, false) - radius; + assert(increase_radius_ceil > 0); + // this union is important as otherwise holes(in form of lines that will increase to holes in a later step) can get unioned onto the area. + data[RadiusLayerPair(radius, layer_idx)] = polygons_simplify( + offset(union_ex(getCollision(m_increase_until_radius, layer_idx, false)), + 5 - increase_radius_ceil, ClipperLib::jtRound, m_min_resolution), + m_min_resolution); + } + } + m_collision_cache_holefree.insert(std::move(data)); + }); +} + +void TreeModelVolumes::calculateAvoidance(const std::vector &keys, bool to_build_plate, bool to_model) +{ + // For every RadiusLayer pair there are 3 avoidances that have to be calculated. + // Prepare tasks for parallelization. + struct AvoidanceTask { + AvoidanceType type; + coord_t radius; + LayerIndex max_required_layer; + bool to_model; + LayerIndex start_layer; + + bool slow() const { return this->type == AvoidanceType::Slow; } + bool holefree() const { return this->type == AvoidanceType::FastSafe; } + }; + + std::vector avoidance_tasks; + avoidance_tasks.reserve((int(to_build_plate) + int(to_model)) * keys.size() * size_t(AvoidanceType::Count)); + + for (int iter_idx = 0; iter_idx < 2 * int(keys.size()) * int(AvoidanceType::Count); ++ iter_idx) { + AvoidanceTask task{ + AvoidanceType(iter_idx % int(AvoidanceType::Count)), + keys[iter_idx / 6].first, // radius + keys[iter_idx / 6].second, // max_layer + ((iter_idx / 3) & 1) != 0 // to_model + }; + // Ensure start_layer is at least 1 as if no avoidance was calculated yet getMaxCalculatedLayer() returns -1. + task.start_layer = std::max(1, 1 + avoidance_cache(task.type, task.to_model).getMaxCalculatedLayer(task.radius)); + if (task.start_layer > task.max_required_layer) { + BOOST_LOG_TRIVIAL(debug) << "Calculation requested for value already calculated?"; + continue; + } + if (! task.holefree() || task.radius < m_increase_until_radius + m_current_min_xy_dist_delta) + avoidance_tasks.emplace_back(task); + } + + tbb::parallel_for(tbb::blocked_range(0, avoidance_tasks.size(), 1), + [this, &avoidance_tasks](const tbb::blocked_range &range) { + for (size_t task_idx = range.begin(); task_idx < range.end(); ++ task_idx) { + const AvoidanceTask &task = avoidance_tasks[task_idx]; + assert(! task.holefree() || task.radius < m_increase_until_radius + m_current_min_xy_dist_delta); + if (task.to_model) + // ensuring Placeableareas are calculated + getPlaceableAreas(task.radius, task.max_required_layer); + // The following loop propagating avoidance regions bottom up is inherently serial. + const bool collision_holefree = (task.slow() || task.holefree()) && task.radius < m_increase_until_radius + m_current_min_xy_dist_delta; + const float max_move = task.slow() ? m_max_move_slow : m_max_move; + // Limiting the offset step so that unioning the shrunk latest_avoidance with the current layer collisions + // will not create gaps in the resulting avoidance region letting a tree support branch tunneling through an object wall. + float move_step = 1.9 * std::max(task.radius, m_current_min_xy_dist); + int move_steps = round_up_divide(max_move, move_step); + assert(move_steps > 0); + float last_move_step = max_move - (move_steps - 1) * move_step; + if (last_move_step < scaled(0.05)) { + assert(move_steps > 1); + if (move_steps > 1) { + // Avoid taking a very short last step, stretch the other steps a bit instead. + move_step = max_move / (-- move_steps); + last_move_step = move_step; + } + } + // minDist as the delta was already added, also avoidance for layer 0 will return the collision. + Polygons latest_avoidance = getAvoidance(task.radius, task.start_layer - 1, task.type, task.to_model, true); + std::vector> data; + data.reserve(task.max_required_layer + 1 - task.start_layer); + for (LayerIndex layer_idx = task.start_layer; layer_idx <= task.max_required_layer; ++ layer_idx) { + // Merge current layer collisions with shrunk last_avoidance. + const Polygons ¤t_layer_collisions = collision_holefree ? getCollisionHolefree(task.radius, layer_idx) : getCollision(task.radius, layer_idx, true); + // For mildly steep branch angles only one step will be taken. + for (int istep = 0; istep < move_steps; ++ istep) + latest_avoidance = union_(current_layer_collisions, + offset(latest_avoidance, + istep + 1 == move_steps ? - last_move_step : - move_step, + ClipperLib::jtRound, m_min_resolution)); + if (task.to_model) + latest_avoidance = diff(latest_avoidance, getPlaceableAreas(task.radius, layer_idx)); + latest_avoidance = polygons_simplify(latest_avoidance, m_min_resolution); + data.emplace_back(RadiusLayerPair{task.radius, layer_idx}, latest_avoidance); + } +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section(*m_critical_progress); + if (m_precalculated && m_precalculation_progress < TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_PRECALC_AVO) { + m_precalculation_progress += to_model ? + 0.4 * TREE_PROGRESS_PRECALC_AVO / (keys.size() * 3) : + m_support_rests_on_model ? 0.4 : 1 * TREE_PROGRESS_PRECALC_AVO / (keys.size() * 3); + Progress::messageProgress(Progress::Stage::SUPPORT, m_precalculation_progress * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } + } +#endif + avoidance_cache(task.type, task.to_model).insert(std::move(data)); + } + }); +} + + +void TreeModelVolumes::calculatePlaceables(const std::vector &keys) +{ + tbb::parallel_for(tbb::blocked_range(0, keys.size()), + [&, keys](const tbb::blocked_range& range) { + for (size_t key_idx = range.begin(); key_idx < range.end(); ++ key_idx) + this->calculatePlaceables(keys[key_idx].first, keys[key_idx].second); + }); +} + +void TreeModelVolumes::calculatePlaceables(const coord_t radius, const LayerIndex max_required_layer) +{ + LayerIndex start_layer = 1 + m_placeable_areas_cache.getMaxCalculatedLayer(radius); + if (start_layer > max_required_layer) { + BOOST_LOG_TRIVIAL(debug) << "Requested calculation for value already calculated ?"; + return; + } + + std::vector data(max_required_layer + 1 - start_layer, Polygons{}); + + if (start_layer == 0) + data[0] = diff(m_machine_border, getCollision(radius, 0, true)); + + tbb::parallel_for(tbb::blocked_range(std::max(1, start_layer), max_required_layer + 1), + [this, &data, radius, start_layer](const tbb::blocked_range& range) { + for (LayerIndex layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) + data[layer_idx - start_layer] = offset(union_ex(getPlaceableAreas(0, layer_idx)), - radius, jtMiter, 1.2); + }); +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section(*m_critical_progress); + if (m_precalculated && m_precalculation_progress < TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_PRECALC_AVO) { + m_precalculation_progress += 0.2 * TREE_PROGRESS_PRECALC_AVO / (keys.size()); + Progress::messageProgress(Progress::Stage::SUPPORT, m_precalculation_progress * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } + } +#endif + m_placeable_areas_cache.insert(std::move(data), start_layer, radius); +} + +void TreeModelVolumes::calculateWallRestrictions(const std::vector &keys) +{ + // Wall restrictions are mainly important when they represent actual walls that are printed, and not "just" the configured z_distance, because technically valid placement is no excuse for moving through a wall. + // As they exist to prevent accidentially moving though a wall at high speed between layers like thie (x = wall,i = influence area,o= empty space,d = blocked area because of z distance) Assume maximum movement distance is two characters and maximum safe movement distance of one character + + /* Potential issue addressed by the wall restrictions: Influence area may lag through a wall + * layer z+1:iiiiiiiiiiioooo + * layer z+0:xxxxxiiiiiiiooo + * layer z-1:ooooixxxxxxxxxx + */ + + // The radius for the upper collission has to be 0 as otherwise one may not enter areas that may be forbidden on layer_idx but not one below (c = not an influence area even though it should ): + /* + * layer z+1:xxxxxiiiiiioo + * layer z+0:dddddiiiiiiio + * layer z-1:dddocdddddddd + */ + // Also there can not just the collision of the lower layer be used because if it were: + /* + * layer z+1:dddddiiiiiiiiiio + * layer z+0:xxxxxddddddddddc + * layer z-1:dddddxxxxxxxxxxc + */ + // Or of the upper layer be used because if it were: + /* + * layer z+1:dddddiiiiiiiiiio + * layer z+0:xxxxcddddddddddc + * layer z-1:ddddcxxxxxxxxxxc + */ + + // And just offseting with maximum movement distance (and not in multiple steps) could cause: + /* + * layer z: oxiiiiiiiiioo + * layer z-1: ixiiiiiiiiiii + */ + + tbb::parallel_for(tbb::blocked_range(0, keys.size()), + [&, keys](const tbb::blocked_range &range) { + for (size_t key_idx = range.begin(); key_idx < range.end(); ++ key_idx) { + const coord_t radius = keys[key_idx].first; + const LayerIndex max_required_layer = keys[key_idx].second; + const coord_t min_layer_bottom = std::max(1, m_wall_restrictions_cache.getMaxCalculatedLayer(radius)); + const size_t buffer_size = max_required_layer + 1 - min_layer_bottom; + std::vector data(buffer_size, Polygons{}); + std::vector data_min; + if (m_current_min_xy_dist_delta > 0) + data_min.assign(buffer_size, Polygons{}); + tbb::parallel_for(tbb::blocked_range(min_layer_bottom, max_required_layer + 1), + [this, &data, &data_min, radius, min_layer_bottom](const tbb::blocked_range &range) { + for (LayerIndex layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + data[layer_idx - min_layer_bottom] = polygons_simplify( + // radius contains m_current_min_xy_dist_delta already if required + intersection(getCollision(0, layer_idx, false), getCollision(radius, layer_idx - 1, true)), + m_min_resolution); + if (! data_min.empty()) + data_min[layer_idx - min_layer_bottom] = + polygons_simplify( + intersection(getCollision(0, layer_idx, true), getCollision(radius, layer_idx - 1, true)), + m_min_resolution); + } + }); + m_wall_restrictions_cache.insert(std::move(data), min_layer_bottom, radius); + if (! data_min.empty()) + m_wall_restrictions_cache_min.insert(std::move(data_min), min_layer_bottom, radius); + } + }); +} + +coord_t TreeModelVolumes::ceilRadius(const coord_t radius) const +{ + if (radius == 0) + return 0; + + coord_t out = m_radius_0; + if (radius > m_radius_0) { + // generate SUPPORT_TREE_PRE_EXPONENTIAL_STEPS of radiis before starting to exponentially increase them. + coord_t initial_radius_delta = SUPPORT_TREE_EXPONENTIAL_THRESHOLD - m_radius_0; + auto ignore = [this](coord_t r) { return std::binary_search(m_ignorable_radii.begin(), m_ignorable_radii.end(), r); }; + if (initial_radius_delta > SUPPORT_TREE_COLLISION_RESOLUTION) { + const int num_steps = round_up_divide(initial_radius_delta, SUPPORT_TREE_EXPONENTIAL_THRESHOLD); + const int stepsize = initial_radius_delta / num_steps; + out += stepsize; + for (auto step = 0; step < num_steps; ++ step) { + if (out >= radius && ! ignore(out)) + return out; + out += stepsize; + } + } else + out += SUPPORT_TREE_COLLISION_RESOLUTION; + while (out < radius || ignore(out)) { + assert(out * SUPPORT_TREE_EXPONENTIAL_FACTOR > out + SUPPORT_TREE_COLLISION_RESOLUTION); + out = out * SUPPORT_TREE_EXPONENTIAL_FACTOR; + } + } + return out; +} + +} diff --git a/src/libslic3r/TreeModelVolumes.hpp b/src/libslic3r/TreeModelVolumes.hpp new file mode 100644 index 0000000000..0ae72acacb --- /dev/null +++ b/src/libslic3r/TreeModelVolumes.hpp @@ -0,0 +1,615 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#ifndef slic3r_TreeModelVolumes_hpp +#define slic3r_TreeModelVolumes_hpp + +#include +#include +#include + +#include + +#include "Point.hpp" +#include "Polygon.hpp" +#include "PrintConfig.hpp" + +namespace Slic3r +{ + +using LayerIndex = int; + +class BuildVolume; +class PrintObject; + +struct TreeSupportMeshGroupSettings { + TreeSupportMeshGroupSettings() = default; + explicit TreeSupportMeshGroupSettings(const PrintObject &print_object); + +/*********************************************************************/ +/* Print parameters, not support specific: */ +/*********************************************************************/ + coord_t layer_height { scaled(0.15) }; + // Maximum Deviation (meshfix_maximum_deviation) + // The maximum deviation allowed when reducing the resolution for the Maximum Resolution setting. If you increase this, + // the print will be less accurate, but the g-code will be smaller. Maximum Deviation is a limit for Maximum Resolution, + // so if the two conflict the Maximum Deviation will always be held true. + coord_t resolution { scaled(0.025) }; + // Minimum Feature Size (aka minimum line width) + // Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker + // than the Minimum Feature Size will be widened to the Minimum Wall Line Width. + coord_t min_feature_size { scaled(0.1) }; + +/*********************************************************************/ +/* General support parameters: */ +/*********************************************************************/ + + // Support Overhang Angle + // The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support. + double support_angle { 50. * M_PI / 180. }; + // Support Line Width + // Width of a single support structure line. + coord_t support_line_width { scaled(0.4) }; + // Support Roof Line Width: Width of a single support roof line. + coord_t support_roof_line_width { scaled(0.4) }; + // Enable Support Floor (aka bottom interfaces) + // Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support. + bool support_bottom_enable { false }; + // Support Floor Thickness + // The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests. + coord_t support_bottom_height { scaled(1.) }; + bool support_material_buildplate_only { false }; + // Support Distance Priority + // Whether the Support X/Y Distance overrides the Support Z Distance or vice versa. When X/Y overrides Z the X/Y distance can push away + // the support from the model, influencing the actual Z distance to the overhang. We can disable this by not applying the X/Y distance around overhangs. + bool support_xy_overrides_z { false }; + // Support X/Y Distance + // Distance of the support structure from the print in the X/Y directions. + // minimum: 0, maximum warning: 1.5 * machine_nozzle_tip_outer_diameter + coord_t support_xy_distance { scaled(0.7) }; + // Minimum Support X/Y Distance + // Distance of the support structure from the overhang in the X/Y directions. + // minimum_value: 0, minimum warning": support_xy_distance - support_line_width * 2, maximum warning: support_xy_distance + // Used if ! support_xy_overrides_z. + coord_t support_xy_distance_overhang { scaled(0.2) }; + // Support Top Distance + // Distance from the top of the support to the print. + coord_t support_top_distance { scaled(0.1) }; + // Support Bottom Distance + // Distance from the print to the bottom of the support. + coord_t support_bottom_distance { scaled(0.1) }; + //FIXME likely not needed, optimization for clipping of interface layers + // When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values + // may cause normal support to be printed in some places where there should have been support interface. + coord_t support_interface_skip_height { scaled(0.3) }; + // Support Infill Line Directions + // A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end + // of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained + // in square brackets. Default is an empty list which means use the default angle 0 degrees. + std::vector support_infill_angles {}; + // Enable Support Roof + // Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support. + bool support_roof_enable { false }; + // Support Roof Thickness + // The thickness of the support roofs. This controls the amount of dense layers at the top of the support on which the model rests. + coord_t support_roof_height { scaled(1.) }; + // Minimum Support Roof Area + // Minimum area size for the roofs of the support. Polygons which have an area smaller than this value will be printed as normal support. + double minimum_roof_area { scaled(scaled(1.)) }; + // A list of integer line directions to use. Elements from the list are used sequentially as the layers progress + // and when the end of the list is reached, it starts at the beginning again. The list items are separated + // by commas and the whole list is contained in square brackets. Default is an empty list which means + // use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees). + std::vector support_roof_angles {}; + // Support Roof Pattern (aka top interface) + // The pattern with which the roofs of the support are printed. + SupportMaterialInterfacePattern support_roof_pattern { smipAuto }; + // Support Pattern + // The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support. + SupportMaterialPattern support_pattern { smpRectilinear }; + // Support Line Distance + // Distance between the printed support structure lines. This setting is calculated by the support density. + coord_t support_line_spacing { scaled(2.66 - 0.4) }; + // Support Floor Horizontal Expansion + // Amount of offset applied to the floors of the support. + coord_t support_bottom_offset { scaled(0.) }; + // Support Wall Line Count + // The number of walls with which to surround support infill. Adding a wall can make support print more reliably + // and can support overhangs better, but increases print time and material used. + // tree: 1, zig-zag: 0, concentric: 1 + int support_wall_count { 1 }; + // Support Roof Line Distance + // Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately. + coord_t support_roof_line_distance { scaled(0.4) }; + // Minimum Support Area + // Minimum area size for support polygons. Polygons which have an area smaller than this value will not be generated. + coord_t minimum_support_area { scaled(0.) }; + // Minimum Support Floor Area + // Minimum area size for the floors of the support. Polygons which have an area smaller than this value will be printed as normal support. + coord_t minimum_bottom_area { scaled(1.0) }; + // Support Horizontal Expansion + // Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support. + coord_t support_offset { scaled(0.) }; + +/*********************************************************************/ +/* Parameters for the Cura tree supports implementation: */ +/*********************************************************************/ + + // Tree Support Maximum Branch Angle + // The maximum angle of the branches, when the branches have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach. + // minimum: 0, minimum warning: 20, maximum: 89, maximum warning": 85 + double support_tree_angle { 60. * M_PI / 180. }; + // Tree Support Branch Diameter Angle + // The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. + // A bit of an angle can increase stability of the tree support. + // minimum: 0, maximum: 89.9999, maximum warning: 15 + double support_tree_branch_diameter_angle { 5. * M_PI / 180. }; + // Tree Support Branch Distance + // How far apart the branches need to be when they touch the model. Making this distance small will cause + // the tree support to touch the model at more points, causing better overhang but making support harder to remove. + coord_t support_tree_branch_distance { scaled(1.) }; + // Tree Support Branch Diameter + // The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this. + // minimum: 0.001, minimum warning: support_line_width * 2 + coord_t support_tree_branch_diameter { scaled(2.) }; + +/*********************************************************************/ +/* Parameters new to the Thomas Rahm's tree supports implementation: */ +/*********************************************************************/ + + // Tree Support Preferred Branch Angle + // The preferred angle of the branches, when they do not have to avoid the model. Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster. + // minimum: 0, minimum warning: 10, maximum: support_tree_angle, maximum warning: support_tree_angle-1 + double support_tree_angle_slow { 50. * M_PI / 180. }; + // Tree Support Diameter Increase To Model + // The most the diameter of a branch that has to connect to the model may increase by merging with branches that could reach the buildplate. + // Increasing this reduces print time, but increases the area of support that rests on model + // minimum: 0 + coord_t support_tree_max_diameter_increase_by_merges_when_support_to_model { scaled(1.0) }; + // Tree Support Minimum Height To Model + // How tall a branch has to be if it is placed on the model. Prevents small blobs of support. This setting is ignored when a branch is supporting a support roof. + // minimum: 0, maximum warning: 5 + coord_t support_tree_min_height_to_model { scaled(1.0) }; + // Tree Support Inital Layer Diameter + // Diameter every branch tries to achieve when reaching the buildplate. Improves bed adhesion. + // minimum: 0, maximum warning: 20 + coord_t support_tree_bp_diameter { scaled(7.5) }; + // Tree Support Branch Density + // Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs, + // but the supports are harder to remove. Use Support Roof for very high values or ensure support density is similarly high at the top. + // 5%-35% + double support_tree_top_rate { 15. }; + // Tree Support Tip Diameter + // The diameter of the top of the tip of the branches of tree support." + // minimum: min_wall_line_width, minimum warning: min_wall_line_width+0.05, maximum_value: support_tree_branch_diameter, value: support_line_width + coord_t support_tree_tip_diameter { scaled(0.4) }; + + // Support Interface Priority + // How support interface and support will interact when they overlap. Currently only implemented for support roof. + //enum support_interface_priority { support_lines_overwrite_interface_area }; +}; + +class TreeModelVolumes +{ +public: + TreeModelVolumes() = default; + explicit TreeModelVolumes(const PrintObject &print_object, const BuildVolume &build_volume, + coord_t max_move, coord_t max_move_slow, size_t current_mesh_idx, double progress_multiplier, + double progress_offset, const std::vector &additional_excluded_areas = {}); + TreeModelVolumes(TreeModelVolumes&&) = default; + TreeModelVolumes& operator=(TreeModelVolumes&&) = default; + + TreeModelVolumes(const TreeModelVolumes&) = delete; + TreeModelVolumes& operator=(const TreeModelVolumes&) = delete; + + enum class AvoidanceType + { + Slow, + FastSafe, + Fast, + Count + }; + + /*! + * \brief Precalculate avoidances and collisions up to max_layer. + * + * Knowledge about branch angle is used to only calculate avoidances and collisions that may actually be needed. + * Not calling precalculate() will cause the class to lazily calculate avoidances and collisions as needed, which will be a lot slower on systems with more then one or two cores! + */ + void precalculate(const coord_t max_layer); + + /*! + * \brief Provides the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model. + * + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \param min_xy_dist Is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getCollision(const coord_t radius, LayerIndex layer_idx, bool min_xy_dist) const; + + /*! + * \brief Provides the areas that have to be avoided by the tree's branches + * in order to reach the build plate. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model or be unable to reach the build platform. + * + * The input collision areas are inset by the maximum move distance and + * propagated upwards. + * + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \param type Is the propagation with the maximum move distance slow required. + * \param to_model Does the avoidance allow good connections with the model. + * \param min_xy_dist is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getAvoidance(coord_t radius, LayerIndex layer_idx, AvoidanceType type, bool to_model, bool min_xy_dist) const; + /*! + * \brief Provides the area represents all areas on the model where the branch does completely fit on the given layer. + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \return Polygons object + */ + const Polygons& getPlaceableAreas(coord_t radius, LayerIndex layer_idx) const; + /*! + * \brief Provides the area that represents the walls, as in the printed area, of the model. This is an abstract representation not equal with the outline. See calculateWallRestrictions for better description. + * \param radius The radius of the node of interest. + * \param layer_idx The layer of interest. + * \param min_xy_dist is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getWallRestriction(coord_t radius, LayerIndex layer_idx, bool min_xy_dist) const; + /*! + * \brief Round \p radius upwards to either a multiple of m_radius_sample_resolution or a exponentially increasing value + * + * It also adds the difference between the minimum xy distance and the regular one. + * + * \param radius The radius of the node of interest + * \param min_xy_dist is the minimum xy distance used. + * \return The rounded radius + */ + coord_t ceilRadius(const coord_t radius, const bool min_xy_dist) const { + assert(radius >= 0); + return min_xy_dist ? + this->ceilRadius(radius) : + // special case as if a radius 0 is requested it could be to ensure correct xy distance. As such it is beneficial if the collision is as close to the configured values as possible. + radius > 0 ? this->ceilRadius(radius + m_current_min_xy_dist_delta) : m_current_min_xy_dist_delta; + } + /*! + * \brief Round \p radius upwards to the maximum that would still round up to the same value as the provided one. + * + * \param radius The radius of the node of interest + * \param min_xy_dist is the minimum xy distance used. + * \return The maximum radius, resulting in the same rounding. + */ + coord_t getRadiusNextCeil(coord_t radius, bool min_xy_dist) const { + assert(radius > 0); + return min_xy_dist ? + this->ceilRadius(radius) : + this->ceilRadius(radius + m_current_min_xy_dist_delta) - m_current_min_xy_dist_delta; + } + +private: + /*! + * \brief Convenience typedef for the keys to the caches + */ + using RadiusLayerPair = std::pair; + using RadiusLayerPolygonCacheData = std::unordered_map>; + class RadiusLayerPolygonCache { + public: + RadiusLayerPolygonCache() = default; + RadiusLayerPolygonCache(RadiusLayerPolygonCache &&rhs) : data(std::move(rhs.data)) {} + RadiusLayerPolygonCache& operator=(RadiusLayerPolygonCache &&rhs) { data = std::move(rhs.data); return *this; } + + RadiusLayerPolygonCache(const RadiusLayerPolygonCache&) = delete; + RadiusLayerPolygonCache& operator=(const RadiusLayerPolygonCache&) = delete; + + void insert(RadiusLayerPolygonCacheData &&in) { + std::lock_guard guard(this->mutex); + for (auto& d : in) + this->data.emplace(d.first, std::move(d.second)); + } + void insert(std::vector> &&in) { + std::lock_guard guard(this->mutex); + for (auto& d : in) + this->data.emplace(d.first, std::move(d.second)); + } + // by layer + void insert(std::vector> &&in, coord_t radius) { + std::lock_guard guard(this->mutex); + for (auto &d : in) + this->data.emplace(RadiusLayerPair{ radius, d.first }, std::move(d.second)); + } + void insert(std::vector &&in, coord_t first_layer_idx, coord_t radius) { + std::lock_guard guard(this->mutex); + for (auto &d : in) + this->data.emplace(RadiusLayerPair{ radius, first_layer_idx ++ }, std::move(d)); + } + /*! + * \brief Checks a cache for a given RadiusLayerPair and returns it if it is found + * \param key RadiusLayerPair of the requested areas. The radius will be calculated up to the provided layer. + * \return A wrapped optional reference of the requested area (if it was found, an empty optional if nothing was found) + */ + std::optional> getArea(const TreeModelVolumes::RadiusLayerPair &key) const { + std::lock_guard guard(this->mutex); + const auto it = this->data.find(key); + return it == this->data.end() ? + std::optional>{} : std::optional>{ it->second }; + } + /*! + * \brief Get the highest already calculated layer in the cache. + * \param radius The radius for which the highest already calculated layer has to be found. + * \param map The cache in which the lookup is performed. + * + * \return A wrapped optional reference of the requested area (if it was found, an empty optional if nothing was found) + */ + LayerIndex getMaxCalculatedLayer(coord_t radius) const { + std::lock_guard guard(this->mutex); + int max_layer = -1; + // the placeable on model areas do not exist on layer 0, as there can not be model below it. As such it may be possible that layer 1 is available, but layer 0 does not exist. + if (this->data.find({ radius, 1 }) != this->data.end()) + max_layer = 1; + while (this->data.count(TreeModelVolumes::RadiusLayerPair(radius, max_layer + 1)) > 0) + ++ max_layer; + return max_layer; + } + + private: + RadiusLayerPolygonCacheData data; + mutable std::mutex mutex; + }; + + + /*! + * \brief Provides the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. Holes are removed. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model or be inside a hole. + * A Hole is defined as an area, in which a branch with m_increase_until_radius radius would collide with the wall. + * minimum xy distance is always used. + * \param radius The radius of the node of interest + * \param layer_idx The layer of interest + * \param min_xy_dist Is the minimum xy distance used. + * \return Polygons object + */ + const Polygons& getCollisionHolefree(coord_t radius, LayerIndex layer_idx) const; + + /*! + * \brief Round \p radius upwards to either a multiple of m_radius_sample_resolution or a exponentially increasing value + * + * \param radius The radius of the node of interest + */ + coord_t ceilRadius(const coord_t radius) const; + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model. Result is saved in the cache. + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateCollision(const std::vector &keys); + void calculateCollision(const coord_t radius, const LayerIndex max_layer_idx); + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. Holes are removed. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model or be inside a hole. Result is saved in the cache. + * A Hole is defined as an area, in which a branch with m_increase_until_radius radius would collide with the wall. + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateCollisionHolefree(const std::vector &keys); + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model on this layer. Holes are removed. + * + * The result is a 2D area that would cause nodes of given radius to + * collide with the model or be inside a hole. Result is saved in the cache. + * A Hole is defined as an area, in which a branch with m_increase_until_radius radius would collide with the wall. + * \param key RadiusLayerPairs the requested areas. The radius will be calculated up to the provided layer. + */ + void calculateCollisionHolefree(RadiusLayerPair key) + { + calculateCollisionHolefree(std::vector{ RadiusLayerPair(key) }); + } + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model. Result is saved in the cache. + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateAvoidance(const std::vector &keys, bool to_build_plate, bool to_model); + + /*! + * \brief Creates the areas that have to be avoided by the tree's branches to prevent collision with the model. + * + * The result is a 2D area that would cause nodes of radius \p radius to + * collide with the model. Result is saved in the cache. + * \param key RadiusLayerPair of the requested areas. It will be calculated up to the provided layer. + */ + void calculateAvoidance(RadiusLayerPair key, bool to_build_plate, bool to_model) + { + calculateAvoidance(std::vector{ RadiusLayerPair(key) }, to_build_plate, to_model); + } + + /*! + * \brief Creates the areas where a branch of a given radius can be place on the model. + * Result is saved in the cache. + * \param key RadiusLayerPair of the requested areas. It will be calculated up to the provided layer. + */ + void calculatePlaceables(const coord_t radius, const LayerIndex max_required_layer); + + + /*! + * \brief Creates the areas where a branch of a given radius can be placed on the model. + * Result is saved in the cache. + * \param keys RadiusLayerPair of the requested areas. The radius will be calculated up to the provided layer. + */ + void calculatePlaceables(const std::vector &keys); + + /*! + * \brief Creates the areas that can not be passed when expanding an area downwards. As such these areas are an somewhat abstract representation of a wall (as in a printed object). + * + * These areas are at least xy_min_dist wide. When calculating it is always assumed that every wall is printed on top of another (as in has an overlap with the wall a layer below). Result is saved in the corresponding cache. + * + * \param keys RadiusLayerPairs of all requested areas. Every radius will be calculated up to the provided layer. + */ + void calculateWallRestrictions(const std::vector &keys); + + /*! + * \brief Creates the areas that can not be passed when expanding an area downwards. As such these areas are an somewhat abstract representation of a wall (as in a printed object). + * These areas are at least xy_min_dist wide. When calculating it is always assumed that every wall is printed on top of another (as in has an overlap with the wall a layer below). Result is saved in the corresponding cache. + * \param key RadiusLayerPair of the requested area. It well be will be calculated up to the provided layer. + */ + void calculateWallRestrictions(RadiusLayerPair key) + { + calculateWallRestrictions(std::vector{ RadiusLayerPair(key) }); + } + + /*! + * \brief The maximum distance that the center point of a tree branch may move in consecutive layers if it has to avoid the model. + */ + coord_t m_max_move; + /*! + * \brief The maximum distance that the centre-point of a tree branch may + * move in consecutive layers if it does not have to avoid the model + */ + coord_t m_max_move_slow; + /*! + * \brief The smallest maximum resolution for simplify + */ + coord_t m_min_resolution; + + bool m_precalculated = false; + /*! + * \brief The index to access the outline corresponding with the currently processing mesh + */ + size_t m_current_outline_idx; + /*! + * \brief The minimum required clearance between the model and the tree branches + */ + coord_t m_current_min_xy_dist; + /*! + * \brief The difference between the minimum required clearance between the model and the tree branches and the regular one. + */ + coord_t m_current_min_xy_dist_delta; + /*! + * \brief Does at least one mesh allow support to rest on a model. + */ + bool m_support_rests_on_model; +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + /*! + * \brief The progress of the precalculate function for communicating it to the progress bar. + */ + coord_t m_precalculation_progress = 0; + /*! + * \brief The progress multiplier of all values added progress bar. + * Required for the progress bar the behave as expected when areas have to be calculated multiple times + */ + double m_progress_multiplier; + /*! + * \brief The progress offset added to all values communicated to the progress bar. + * Required for the progress bar the behave as expected when areas have to be calculated multiple times + */ + double m_progress_offset; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + /*! + * \brief Increase radius in the resulting drawn branches, even if the avoidance does not allow it. Will be cut later to still fit. + */ + coord_t m_increase_until_radius; + + /*! + * \brief Polygons representing the limits of the printable area of the + * machine + */ + Polygons m_machine_border; + /*! + * \brief Storage for layer outlines and the corresponding settings of the meshes grouped by meshes with identical setting. + */ + std::vector>> m_layer_outlines; + /*! + * \brief Storage for areas that should be avoided, like support blocker or previous generated trees. + */ + std::vector m_anti_overhang; + /*! + * \brief Radii that can be ignored by ceilRadius as they will never be requested, sorted. + */ + std::vector m_ignorable_radii; + + /*! + * \brief Smallest radius a branch can have. This is the radius of a SupportElement with DTT=0. + */ + coord_t m_radius_0; + + /*! + * \brief Caches for the collision, avoidance and areas on the model where support can be placed safely + * at given radius and layer indices. + */ + RadiusLayerPolygonCache m_collision_cache; + RadiusLayerPolygonCache m_collision_cache_holefree; + RadiusLayerPolygonCache m_avoidance_cache; + RadiusLayerPolygonCache m_avoidance_cache_slow; + RadiusLayerPolygonCache m_avoidance_cache_to_model; + RadiusLayerPolygonCache m_avoidance_cache_to_model_slow; + RadiusLayerPolygonCache m_placeable_areas_cache; + + /*! + * \brief Caches to avoid holes smaller than the radius until which the radius is always increased, as they are free of holes. + * Also called safe avoidances, as they are safe regarding not running into holes. + */ + RadiusLayerPolygonCache m_avoidance_cache_holefree; + RadiusLayerPolygonCache m_avoidance_cache_holefree_to_model; + + RadiusLayerPolygonCache& avoidance_cache(const AvoidanceType type, const bool to_model) { + if (to_model) { + switch (type) { + case AvoidanceType::Fast: return m_avoidance_cache_to_model; + case AvoidanceType::Slow: return m_avoidance_cache_to_model_slow; + case AvoidanceType::Count: assert(false); + case AvoidanceType::FastSafe: return m_avoidance_cache_holefree_to_model; + } + } else { + switch (type) { + case AvoidanceType::Fast: return m_avoidance_cache; + case AvoidanceType::Slow: return m_avoidance_cache_slow; + case AvoidanceType::Count: assert(false); + case AvoidanceType::FastSafe: return m_avoidance_cache_holefree; + } + } + assert(false); + return m_avoidance_cache; + } + const RadiusLayerPolygonCache& avoidance_cache(const AvoidanceType type, const bool to_model) const { + return const_cast(this)->avoidance_cache(type, to_model); + } + + /*! + * \brief Caches to represent walls not allowed to be passed over. + */ + RadiusLayerPolygonCache m_wall_restrictions_cache; + + // A different cache for min_xy_dist as the maximal safe distance an influence area can be increased(guaranteed overlap of two walls in consecutive layer) + // is much smaller when min_xy_dist is used. This causes the area of the wall restriction to be thinner and as such just using the min_xy_dist wall + // restriction would be slower. + RadiusLayerPolygonCache m_wall_restrictions_cache_min; + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + std::unique_ptr m_critical_progress { std::make_unique() }; +#endif // SLIC3R_TREESUPPORTS_PROGRESS +}; + +} + +#endif //slic3r_TreeModelVolumes_hpp diff --git a/src/libslic3r/TreeSupport.cpp b/src/libslic3r/TreeSupport.cpp new file mode 100644 index 0000000000..2ef3817205 --- /dev/null +++ b/src/libslic3r/TreeSupport.cpp @@ -0,0 +1,2853 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#include "TreeSupport.hpp" +#include "BuildVolume.hpp" +#include "ClipperUtils.hpp" +#include "EdgeGrid.hpp" +#include "Fill/Fill.hpp" +#include "Layer.hpp" +#include "Print.hpp" +#include "MultiPoint.hpp" +#include "Polygon.hpp" +#include "Polyline.hpp" +#include "MutablePolygon.hpp" +#include "SupportMaterial.hpp" + +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 + #include //todo Remove! ONLY FOR PUBLIC BETA!! +#endif // _WIN32 + +#include + +#include +#include +#include + +namespace Slic3r +{ + +enum class LineStatus +{ + INVALID, + TO_MODEL, + TO_MODEL_GRACIOUS, + TO_MODEL_GRACIOUS_SAFE, + TO_BP, + TO_BP_SAFE +}; + +using LineInformation = std::vector>; +using LineInformations = std::vector; + +static inline void validate_range(const Point &pt) +{ + static constexpr const int32_t hi = 65536 * 16384; + if (pt.x() > hi || pt.y() > hi || -pt.x() > hi || -pt.y() > hi) + throw ClipperLib::clipperException("Coordinate outside allowed range"); +} + +static inline void validate_range(const Points &points) +{ + for (const Point &p : points) + validate_range(p); +} + +static inline void validate_range(const MultiPoint &mp) +{ + validate_range(mp.points); +} + +static inline void validate_range(const Polygons &polygons) +{ + for (const Polygon &p : polygons) + validate_range(p); +} + +static inline void validate_range(const Polylines &polylines) +{ + for (const Polyline &p : polylines) + validate_range(p); +} + +static inline void validate_range(const LineInformation &lines) +{ + for (const auto& p : lines) + validate_range(p.first); +} + +static inline void validate_range(const LineInformations &lines) +{ + for (const LineInformation &l : lines) + validate_range(l); +} + +static inline void clip_for_diff(const Polygon &src, const BoundingBox &bbox, Polygon &out) +{ + out.clear(); + const size_t cnt = src.points.size(); + if (cnt < 3) + return; + + enum class Side { + Left = 1, + Right = 2, + Top = 4, + Bottom = 8 + }; + + auto sides = [bbox](const Point &p) { + return int(p.x() < bbox.min.x()) * int(Side::Left) + + int(p.x() > bbox.max.x()) * int(Side::Right) + + int(p.y() < bbox.min.y()) * int(Side::Bottom) + + int(p.y() > bbox.max.y()) * int(Side::Top); + }; + + int sides_prev = sides(src.points.back()); + int sides_this = sides(src.points.front()); + const size_t last = cnt - 1; + for (size_t i = 0; i < last; ++ i) { + int sides_next = sides(src.points[i + 1]); + if (// This point is inside. Take it. + sides_this == 0 || + // Either this point is outside and previous or next is inside, or + // the edge possibly cuts corner of the bounding box. + (sides_prev & sides_this & sides_next) == 0) { + out.points.emplace_back(src.points[i]); + sides_prev = sides_this; + } else { + // All the three points (this, prev, next) are outside at the same side. + // Ignore this point. + } + sides_this = sides_next; + } + // For the last point, if src is completely outside bbox, then out.points will be empty. Just use the first point instead. + int sides_next = sides(out.points.empty() ? src.points.front() : out.points.front()); + if (// The last point is inside. Take it. + sides_this == 0 || + // Either this point is outside and previous or next is inside, or + // the edge possibly cuts corner of the bounding box. + (sides_prev & sides_this & sides_next) == 0) + out.points.emplace_back(src.points.back()); +} + +[[nodiscard]] static inline Polygon clip_for_diff(const Polygon &src, const BoundingBox &bbox) +{ + Polygon out; + clip_for_diff(src, bbox, out); + return out; +} + +[[nodiscard]] static inline Polygons clip_for_diff(const Polygons &src, const BoundingBox &bbox) +{ + Polygons out; + out.reserve(src.size()); + for (const Polygon &p : src) + out.emplace_back(clip_for_diff(p, bbox)); + return out; +} + +[[nodiscard]] static inline Polygons diff_clipped(const Polygons &src, const Polygons &clipping) +{ + return diff(src, clip_for_diff(clipping, get_extents(src).inflated(SCALED_EPSILON))); +} + +static constexpr const auto tiny_area_threshold = sqr(scaled(0.001)); + +static std::vector>> group_meshes(const Print &print, const std::vector &print_object_ids) +{ + std::vector>> grouped_meshes; + + //FIXME this is ugly, it does not belong here. + for (size_t object_id = 0; object_id < print_object_ids.size(); ++ object_id) { + const PrintObject &print_object = *print.get_object(object_id); + const PrintObjectConfig &object_config = print_object.config(); + if (object_config.support_material_interface_layers >= 2) + TreeSupport::TreeSupportSettings::some_model_contains_thick_roof = true; + if (object_config.support_material_contact_distance < EPSILON) + // || min_feature_size < scaled(0.1) that is the minimum line width + TreeSupport::TreeSupportSettings::has_to_rely_on_min_xy_dist_only = true; + } + + size_t largest_printed_mesh_idx = 0; + + // Group all meshes that can be processed together. NOTE this is different from mesh-groups! Only one setting object is needed per group, + // as different settings in the same group may only occur in the tip, which uses the original settings objects from the meshes. + for (size_t object_id = 0; object_id < print_object_ids.size(); ++ object_id) { + const PrintObject &print_object = *print.get_object(object_id); +#ifndef NDEBUG + const PrintObjectConfig &object_config = print_object.config(); +#endif // NDEBUG + // Support must be enabled and set to Tree style. + assert(object_config.support_material); + assert(object_config.support_material_style == smsTree); + + bool found_existing_group = false; + TreeSupport::TreeSupportSettings next_settings{ TreeSupportMeshGroupSettings{ print_object } }; + //FIXME for now only a single object per group is enabled. +#if 0 + for (size_t idx = 0; idx < grouped_meshes.size(); ++ idx) + if (next_settings == grouped_meshes[idx].first) { + found_existing_group = true; + grouped_meshes[idx].second.emplace_back(object_id); + // handle some settings that are only used for performance reasons. This ensures that a horrible set setting intended to improve performance can not reduce it drastically. + grouped_meshes[idx].first.performance_interface_skip_layers = std::min(grouped_meshes[idx].first.performance_interface_skip_layers, next_settings.performance_interface_skip_layers); + } +#endif + if (! found_existing_group) + grouped_meshes.emplace_back(next_settings, std::vector{ object_id }); + + // no need to do this per mesh group as adaptive layers and raft setting are not setable per mesh. + if (print.get_object(largest_printed_mesh_idx)->layers().back()->print_z < print_object.layers().back()->print_z) + largest_printed_mesh_idx = object_id; + } + +#if 0 + { + std::vector known_z(storage.meshes[largest_printed_mesh_idx].layers.size()); + for (size_t z = 0; z < storage.meshes[largest_printed_mesh_idx].layers.size(); z++) + known_z[z] = storage.meshes[largest_printed_mesh_idx].layers[z].printZ; + for (size_t idx = 0; idx < grouped_meshes.size(); ++ idx) + grouped_meshes[idx].first.setActualZ(known_z); + } +#endif + + return grouped_meshes; +} + +#if 0 +// todo remove as only for debugging relevant +[[nodiscard]] static std::string getPolygonAsString(const Polygons& poly) +{ + std::string ret; + for (auto path : poly) + for (Point p : path) { + if (ret != "") + ret += ","; + ret += "(" + std::to_string(p.x()) + "," + std::to_string(p.y()) + ")"; + } + return ret; +} +#endif + +//todo Remove! Only relevant for public BETA! +static bool inline g_showed_critical_error = false; +static bool inline g_showed_performance_warning = false; +void TreeSupport::showError(std::string message, bool critical) +{ // todo Remove! ONLY FOR PUBLIC BETA!! + +#if defined(_WIN32) && defined(TREE_SUPPORT_SHOW_ERRORS) + auto bugtype = std::string(critical ? " This is a critical bug. It may cause missing or malformed branches.\n" : "This bug should only decrease performance.\n"); + bool show = (critical && !g_showed_critical_error) || (!critical && !g_showed_performance_warning); + (critical ? g_showed_critical_error : g_showed_performance_warning) = true; + + if (show) + MessageBoxA(nullptr, std::string("TreeSupport_2 MOD detected an error while generating the tree support.\nPlease report this back to me with profile and model.\nRevision 5.0\n" + message + "\n" + bugtype).c_str(), + "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // WIN32 +} + +[[nodiscard]] static const std::vector generate_overhangs(const PrintObject &print_object) +{ + std::vector out(print_object.layer_count(), Polygons{}); + + const PrintObjectConfig &config = print_object.config(); + const bool support_auto = config.support_material_auto.value; + const int support_enforce_layers = config.support_material_enforce_layers.value; + std::vector enforcers_layers{ print_object.slice_support_enforcers() }; + std::vector blockers_layers{ print_object.slice_support_blockers() }; + print_object.project_and_append_custom_facets(false, EnforcerBlockerType::ENFORCER, enforcers_layers); + print_object.project_and_append_custom_facets(false, EnforcerBlockerType::BLOCKER, blockers_layers); + const int support_threshold = config.support_material_threshold.value; + const bool support_threshold_auto = support_threshold == 0; + // +1 makes the threshold inclusive + double tan_threshold = support_threshold_auto ? 0. : tan(M_PI * double(support_threshold + 1) / 180.); + + tbb::parallel_for(tbb::blocked_range(1, out.size()), + [&print_object, &enforcers_layers, &blockers_layers, support_auto, support_enforce_layers, support_threshold_auto, tan_threshold, &out] + (const tbb::blocked_range &range) { + for (LayerIndex layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { + const Layer ¤t_layer = *print_object.get_layer(layer_id); + const Layer &lower_layer = *print_object.get_layer(layer_id - 1); + // Full overhangs with zero lower_layer_offset and no blockers applied. + Polygons raw_overhangs; + bool raw_overhangs_calculated = false; + // Final overhangs. + Polygons overhangs; + // For how many layers full overhangs shall be supported. + const bool enforced_layer = layer_id < support_enforce_layers; + if (support_auto || enforced_layer) { + float lower_layer_offset; + if (enforced_layer) + lower_layer_offset = 0; + else if (support_threshold_auto) { + float external_perimeter_width = 0; + for (const LayerRegion *layerm : lower_layer.regions()) + external_perimeter_width += layerm->flow(frExternalPerimeter).scaled_width(); + external_perimeter_width /= lower_layer.region_count(); + lower_layer_offset = float(0.5 * external_perimeter_width); + } else + lower_layer_offset = scaled(lower_layer.height / tan_threshold); + overhangs = lower_layer_offset == 0 ? + diff(current_layer.lslices, lower_layer.lslices) : + diff(current_layer.lslices, offset(lower_layer.lslices, lower_layer_offset)); + if (lower_layer_offset == 0) { + raw_overhangs = overhangs; + raw_overhangs_calculated = true; + } + if (! (enforced_layer || blockers_layers.empty() || blockers_layers[layer_id].empty())) + overhangs = diff(overhangs, blockers_layers[layer_id]); + } + if (! enforcers_layers.empty() && ! enforcers_layers[layer_id].empty()) + // Has some support enforcers at this layer, apply them to the overhangs, don't apply the support threshold angle. + if (Polygons enforced_overhangs = intersection(raw_overhangs_calculated ? raw_overhangs : diff(current_layer.lslices, lower_layer.lslices), enforcers_layers[layer_id]); + ! enforced_overhangs.empty()) { + //FIXME this is a hack to make enforcers work on steep overhangs. + enforced_overhangs = diff(offset(enforced_overhangs, + //FIXME this is a fudge constant! + scaled(0.4)), + lower_layer.lslices); + overhangs = overhangs.empty() ? std::move(enforced_overhangs) : union_(overhangs, enforced_overhangs); + } + out[layer_id] = std::move(overhangs); + } + }); + + return out; +} + +/*! + * \brief Precalculates all avoidances, that could be required. + * + * \param storage[in] Background storage to access meshes. + * \param currently_processing_meshes[in] Indexes of all meshes that are processed in this iteration + */ +[[nodiscard]] static LayerIndex precalculate(const Print &print, const std::vector &overhangs, const TreeSupport::TreeSupportSettings &config, const std::vector &object_ids, TreeModelVolumes &volumes) +{ + // calculate top most layer that is relevant for support + LayerIndex max_layer = 0; + for (size_t object_id : object_ids) { + const PrintObject &print_object = *print.get_object(object_id); + int max_support_layer_id = 0; + for (int layer_id = 1; layer_id < int(print_object.layer_count()); ++ layer_id) + if (! overhangs[layer_id].empty()) + max_support_layer_id = layer_id; + max_layer = std::max(max_support_layer_id - int(config.z_distance_top_layers), 0); + } + if (max_layer > 0) + // The actual precalculation happens in TreeModelVolumes. + volumes.precalculate(max_layer); + return max_layer; +} + +//FIXME this is an ugly wrapper interface for a single print object and a phony build volume. +void TreeSupport::generateSupportAreas(PrintObject& print_object) +{ + size_t idx = 0; + for (PrintObject *po : print_object.print()->objects()) { + if (po == &print_object) + break; + ++ idx; + } + this->generateSupportAreas(*print_object.print(), BuildVolume(Pointfs{ Vec2d{ -300., -300. }, Vec2d{ -300., +300. }, Vec2d{ +300., +300. }, Vec2d{ +300., -300. } }, 0.), { idx }); +} + +void TreeSupport::generateSupportAreas(Print &print, const BuildVolume &build_volume, const std::vector &print_object_ids) +{ + g_showed_critical_error = false; + g_showed_performance_warning = false; + + std::vector>> grouped_meshes = group_meshes(print, print_object_ids); + if (grouped_meshes.empty()) + return; + + size_t counter = 0; + + // Process every mesh group. These groups can not be processed parallel, as the processing in each group is parallelized, and nested parallelization is disables and slow. + for (std::pair> &processing : grouped_meshes) + { + // process each combination of meshes + // this struct is used to easy retrieve setting. No other function except those in TreeModelVolumes and generateInitialAreas have knowledge of the existence of multiple meshes being processed. + //FIXME this is a copy + m_config = processing.first; + BOOST_LOG_TRIVIAL(info) << "Processing support tree mesh group " << counter + 1 << " of " << grouped_meshes.size() << " containing " << grouped_meshes[counter].second.size() << " meshes."; + auto t_start = std::chrono::high_resolution_clock::now(); +#if 0 + std::vector exclude(num_support_layers); + // get all already existing support areas and exclude them + tbb::parallel_for(tbb::blocked_range(0, num_support_layers), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + Polygons exlude_at_layer; + append(exlude_at_layer, storage.support.supportLayers[layer_idx].support_bottom); + append(exlude_at_layer, storage.support.supportLayers[layer_idx].support_roof); + for (auto part : storage.support.supportLayers[layer_idx].support_infill_parts) + append(exlude_at_layer, part.outline); + exclude[layer_idx] = union_(exlude_at_layer); + } + }); +#endif +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + m_progress_multiplier = 1.0 / double(m_grouped_meshes.size()); + m_progress_offset = counter == 0 ? 0 : TREE_PROGRESS_TOTAL * (double(counter) * m_progress_multiplier); +#endif // SLIC3R_TREESUPPORT_PROGRESS + PrintObject &print_object = *print.get_object(processing.second.front()); + m_volumes = TreeModelVolumes(print_object, build_volume, m_config.maximum_move_distance, m_config.maximum_move_distance_slow, processing.second.front(), m_progress_multiplier, m_progress_offset, /* additional_excluded_areas */{}); + + //FIXME generating overhangs just for the furst mesh of the group. + assert(processing.second.size() == 1); + std::vector overhangs = generate_overhangs(*print.get_object(processing.second.front())); + + // ### Precalculate avoidances, collision etc. + size_t num_support_layers = precalculate(print, overhangs, processing.first, processing.second, m_volumes); + if (num_support_layers == 0) + continue; + + auto t_precalc = std::chrono::high_resolution_clock::now(); + + // value is the area where support may be placed. As this is calculated in CreateLayerPathing it is saved and reused in drawAreas + std::vector> move_bounds(num_support_layers); + + // ### Place tips of the support tree + SupportGeneratorLayersPtr bottom_contacts(num_support_layers, nullptr); + SupportGeneratorLayersPtr top_contacts(num_support_layers, nullptr); + SupportGeneratorLayersPtr top_interface_layers(num_support_layers, nullptr); + SupportGeneratorLayersPtr intermediate_layers(num_support_layers, nullptr); + SupportGeneratorLayerStorage layer_storage; + + for (size_t mesh_idx : processing.second) + generateInitialAreas(*print.get_object(mesh_idx), overhangs, move_bounds, top_contacts, top_interface_layers, layer_storage); + auto t_gen = std::chrono::high_resolution_clock::now(); + + // ### Propagate the influence areas downwards. + createLayerPathing(move_bounds); + auto t_path = std::chrono::high_resolution_clock::now(); + + // ### Set a point in each influence area + createNodesFromArea(move_bounds); + auto t_place = std::chrono::high_resolution_clock::now(); + + // ### draw these points as circles + drawAreas(*print.get_object(processing.second.front()), overhangs, move_bounds, + bottom_contacts, top_contacts, intermediate_layers, layer_storage); + + auto t_draw = std::chrono::high_resolution_clock::now(); + auto dur_pre_gen = 0.001 * std::chrono::duration_cast(t_precalc - t_start).count(); + auto dur_gen = 0.001 * std::chrono::duration_cast(t_gen - t_precalc).count(); + auto dur_path = 0.001 * std::chrono::duration_cast(t_path - t_gen).count(); + auto dur_place = 0.001 * std::chrono::duration_cast(t_place - t_path).count(); + auto dur_draw = 0.001 * std::chrono::duration_cast(t_draw - t_place).count(); + auto dur_total = 0.001 * std::chrono::duration_cast(t_draw - t_start).count(); + BOOST_LOG_TRIVIAL(info) << + "Total time used creating Tree support for the currently grouped meshes: " << dur_total << " ms. " + "Different subtasks:\nCalculating Avoidance: " << dur_pre_gen << " ms " + "Creating inital influence areas: " << dur_gen << " ms " + "Influence area creation: " << dur_path << "ms " + "Placement of Points in InfluenceAreas: " << dur_place << "ms " + "Drawing result as support " << dur_draw << " ms"; +// if (m_config.branch_radius==2121) +// BOOST_LOG_TRIVIAL(error) << "Why ask questions when you already know the answer twice.\n (This is not a real bug, please dont report it.)"; + + for (auto &layer : move_bounds) { + for (auto elem : layer) { + delete elem->area; + delete elem; + } + } + + auto remove_undefined_layers = [](SupportGeneratorLayersPtr &layers) { + layers.erase(std::remove_if(layers.begin(), layers.end(), [](const SupportGeneratorLayer* ptr) { return ptr == nullptr; }), layers.end()); + }; + remove_undefined_layers(bottom_contacts); + remove_undefined_layers(top_contacts); + remove_undefined_layers(intermediate_layers); + + // Produce the support G-code. + // Used by both classic and tree supports. + SupportParameters support_params(print_object); + support_params.with_sheath = true; + support_params.support_density = 0; + SupportGeneratorLayersPtr interface_layers, base_interface_layers; + SupportGeneratorLayersPtr raft_layers = generate_raft_base(print_object, support_params, print_object.slicing_parameters(), top_contacts, interface_layers, base_interface_layers, intermediate_layers, layer_storage); +#if 1 //#ifdef SLIC3R_DEBUG + SupportGeneratorLayersPtr layers_sorted = +#endif // SLIC3R_DEBUG + generate_support_layers(print_object, raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); + // Don't fill in the tree supports, make them hollow with just a single sheath line. + generate_support_toolpaths(print_object.support_layers(), print_object.config(), support_params, print_object.slicing_parameters(), + raft_layers, bottom_contacts, top_contacts, intermediate_layers, interface_layers, base_interface_layers); + + #if 0 +//#ifdef SLIC3R_DEBUG + { + static int iRun = 0; + ++ iRun; + size_t layer_id = 0; + for (int i = 0; i < int(layers_sorted.size());) { + // Find the last layer with roughly the same print_z, find the minimum layer height of all. + // Due to the floating point inaccuracies, the print_z may not be the same even if in theory they should. + int j = i + 1; + coordf_t zmax = layers_sorted[i]->print_z + EPSILON; + bool empty = layers_sorted[i]->polygons.empty(); + for (; j < layers_sorted.size() && layers_sorted[j]->print_z <= zmax; ++j) + if (!layers_sorted[j]->polygons.empty()) + empty = false; + if (!empty) { + export_print_z_polygons_to_svg( + debug_out_path("support-%d-%lf.svg", iRun, layers_sorted[i]->print_z).c_str(), + layers_sorted.data() + i, j - i); + 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, + *print_object.support_layers()[layer_id]); + ++layer_id; + } + i = j; + } + } +#endif /* SLIC3R_DEBUG */ + + ++ counter; + } + +// storage.support.generated = true; +} + +/*! + * \brief Converts a Polygons object representing a line into the internal format. + * + * \param polylines[in] The Polyline that will be converted. + * \param layer_idx[in] The current layer. + * \return All lines of the \p polylines object, with information for each point regarding in which avoidance it is currently valid in. + */ +[[nodiscard]] static LineInformations convertLinesToInternal( + const TreeModelVolumes &volumes, const TreeSupport::TreeSupportSettings &config, + const Polylines &polylines, LayerIndex layer_idx) +{ + const bool xy_overrides_z = config.support_xy_overrides_z; + + LineInformations result; + // Also checks if the position is valid, if it is NOT, it deletes that point + for (const Polyline &line : polylines) { + LineInformation res_line; + for (Point p : line) { + if (! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::FastSafe, false, !xy_overrides_z), p)) + res_line.emplace_back(p, LineStatus::TO_BP_SAFE); + else if (! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::Fast, false, !xy_overrides_z), p)) + res_line.emplace_back(p, LineStatus::TO_BP); + else if (config.support_rests_on_model && ! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::FastSafe, true, !xy_overrides_z), p)) + res_line.emplace_back(p, LineStatus::TO_MODEL_GRACIOUS_SAFE); + else if (config.support_rests_on_model && ! contains(volumes.getAvoidance(config.getRadius(0), layer_idx, TreeModelVolumes::AvoidanceType::Fast, true, !xy_overrides_z), p)) + res_line.emplace_back(p, LineStatus::TO_MODEL_GRACIOUS); + else if (config.support_rests_on_model && ! contains(volumes.getCollision(config.getRadius(0), layer_idx, !xy_overrides_z), p)) + res_line.emplace_back(p, LineStatus::TO_MODEL); + else if (!res_line.empty()) { + result.emplace_back(res_line); + res_line.clear(); + } + } + if (!res_line.empty()) { + result.emplace_back(res_line); + res_line.clear(); + } + } + + validate_range(result); + return result; +} + +/*! + * \brief Converts lines in internal format into a Polygons object representing these lines. + * + * \param lines[in] The lines that will be converted. + * \return All lines of the \p lines object as a Polygons object. + */ +[[nodiscard]] static Polylines convertInternalToLines(LineInformations lines) +{ + Polylines result; + for (LineInformation line : lines) { + Polyline path; + for (auto point_data : line) + path.points.emplace_back(point_data.first); + result.emplace_back(std::move(path)); + } + validate_range(result); + return result; +} + +/*! + * \brief Evaluates if a point has to be added now. Required for a splitLines call in generateInitialAreas. + * + * \param current_layer[in] The layer on which the point lies, point and its status. + * \return whether the point is valid. + */ +[[nodiscard]] static bool evaluatePointForNextLayerFunction( + const TreeModelVolumes &volumes, const TreeSupport::TreeSupportSettings &config, + size_t current_layer, std::pair &p) +{ + using AvoidanceType = TreeSupport::AvoidanceType; + if (! contains(volumes.getAvoidance(config.getRadius(0), current_layer - 1, p.second == LineStatus::TO_BP_SAFE ? AvoidanceType::FastSafe : AvoidanceType::Fast, false, !config.support_xy_overrides_z), p.first)) + return true; + if (config.support_rests_on_model && (p.second != LineStatus::TO_BP && p.second != LineStatus::TO_BP_SAFE)) + return ! contains( + p.second == LineStatus::TO_MODEL_GRACIOUS || p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE ? + volumes.getAvoidance(config.getRadius(0), current_layer - 1, p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE ? AvoidanceType::FastSafe : AvoidanceType::Fast, true, !config.support_xy_overrides_z) : + volumes.getCollision(config.getRadius(0), current_layer - 1, !config.support_xy_overrides_z), + p.first); + return false; +} + +/*! + * \brief Evaluates which points of some lines are not valid one layer below and which are. Assumes all points are valid on the current layer. Validity is evaluated using supplied lambda. + * + * \param lines[in] The lines that have to be evaluated. + * \param evaluatePoint[in] The function used to evaluate the points. + * \return A pair with which points are still valid in the first slot and which are not in the second slot. + */ +template +[[nodiscard]] static std::pair splitLines(LineInformations lines, EvaluatePointFn evaluatePoint) +{ + // assumes all Points on the current line are valid + + LineInformations keep(1); + LineInformations set_free(1); + enum STATE + { + keeping, + freeing + }; + for (std::vector> line : lines) { + STATE current = keeping; + LineInformation resulting_line; + for (std::pair me : line) { + if (evaluatePoint(me)) { + if (keeping != current) { + if (!resulting_line.empty()) { + set_free.emplace_back(resulting_line); + resulting_line.clear(); + } + current = keeping; + } + resulting_line.emplace_back(me); + } else { + if (freeing != current) { + if (!resulting_line.empty()) { + keep.emplace_back(resulting_line); + resulting_line.clear(); + } + current = freeing; + } + resulting_line.emplace_back(me); + } + } + if (!resulting_line.empty()) { + if (current == keeping) + keep.emplace_back(resulting_line); + else + set_free.emplace_back(resulting_line); + } + } + validate_range(keep); + validate_range(set_free); + return std::pair>>, std::vector>>>(keep, set_free); +} + +// Ported from CURA's PolygonUtils::getNextPointWithDistance() +// Sample a next point at distance "dist" from start_pt on polyline segment (start_idx, start_idx + 1). +// Returns sample point and start index of its segment on polyline if such sample exists. +static std::optional> polyline_sample_next_point_at_distance(const Points &polyline, const Point &start_pt, size_t start_idx, double dist) +{ + const double dist2 = sqr(dist); + const auto dist2i = int64_t(dist2); + static constexpr const auto eps = scaled(0.01); + + for (size_t i = start_idx + 1; i < polyline.size(); ++ i) { + const Point p1 = polyline[i]; + if ((p1 - start_pt).cast().squaredNorm() >= dist2i) { + // The end point is outside the circle with center "start_pt" and radius "dist". + const Point p0 = polyline[i - 1]; + Vec2d v = (p1 - p0).cast(); + double l2v = v.squaredNorm(); + if (l2v < sqr(eps)) { + // Very short segment. + Point c = (p0 + p1) / 2; + if (std::abs((start_pt - c).cast().norm() - dist) < eps) + return std::pair{ c, i - 1 }; + else + continue; + } + Vec2d p0f = (start_pt - p0).cast(); + // Foot point of start_pt into v. + Vec2d foot_pt = v * (p0f.dot(v) / l2v); + // Vector from foot point of "start_pt" to "start_pt". + Vec2d xf = p0f - foot_pt; + // Squared distance of "start_pt" from the ray (p0, p1). + double l2_from_line = xf.squaredNorm(); + double det = dist2 - l2_from_line; + + if (det > - SCALED_EPSILON) { + // The ray (p0, p1) touches or intersects a circle centered at "start_pt" with radius "dist". + // Distance of the circle intersection point from the foot point. + double dist_circle_intersection = std::sqrt(std::max(0., det)); + if ((v - foot_pt).cast().norm() > dist_circle_intersection) { + // Intersection of the circle with the segment (p0, p1) is on the right side (close to p1) from the foot point. + Point p = p0 + (foot_pt + v * (dist_circle_intersection / sqrt(l2v))).cast(); + validate_range(p); + return std::pair{ p, i - 1 }; + } + } + } + } + return {}; +} + +/*! + * \brief Eensures that every line segment is about distance in length. The resulting lines may differ from the original but all points are on the original + * + * \param input[in] The lines on which evenly spaced points should be placed. + * \param distance[in] The distance the points should be from each other. + * \param min_points[in] The amount of points that have to be placed. If not enough can be placed the distance will be reduced to place this many points. + * \return A Polygons object containing the evenly spaced points. Does not represent an area, more a collection of points on lines. + */ +[[nodiscard]] static Polylines ensureMaximumDistancePolyline(const Polylines &input, double distance, size_t min_points) +{ + Polylines result; + for (Polyline part : input) { + if (part.empty()) + continue; + + double len = length(part.points); + Polyline line; + double current_distance = std::max(distance, scaled(0.1)); + if (len < 2 * distance && min_points <= 1) + { + // Insert the opposite point of the first one. + //FIXME pretty expensive + Polyline pl(part); + pl.clip_end(len / 2); + line.points.emplace_back(pl.points.back()); + } + else + { + size_t optimal_end_index = part.size() - 1; + + if (part.front() == part.back()) { + size_t optimal_start_index = 0; + // If the polyline was a polygon, there is a high chance it was an overhang. Overhangs that are <60� tend to be very thin areas, so lets get the beginning and end of them and ensure that they are supported. + // The first point of the line will always be supported, so rotate the order of points in this polyline that one of the two corresponding points that are furthest from each other is in the beginning. + // The other will be manually added (optimal_end_index) + coord_t max_dist2_between_vertecies = 0; + for (size_t idx = 0; idx < part.size() - 1; ++ idx) { + for (size_t inner_idx = 0; inner_idx < part.size() - 1; inner_idx++) { + if ((part[idx] - part[inner_idx]).cast().squaredNorm() > max_dist2_between_vertecies) { + optimal_start_index = idx; + optimal_end_index = inner_idx; + max_dist2_between_vertecies = (part[idx] - part[inner_idx]).cast().squaredNorm(); + } + } + } + std::rotate(part.begin(), part.begin() + optimal_start_index, part.end() - 1); + part[part.size() - 1] = part[0]; // restore that property that this polyline ends where it started. + optimal_end_index = (part.size() + optimal_end_index - optimal_start_index - 1) % (part.size() - 1); + } + + while (line.size() < min_points && current_distance >= scaled(0.1)) + { + line.clear(); + Point current_point = part[0]; + line.points.emplace_back(part[0]); + if (min_points > 1 || (part[0] - part[optimal_end_index]).cast().norm() > current_distance) + line.points.emplace_back(part[optimal_end_index]); + size_t current_index = 0; + std::optional> next_point; + double next_distance = current_distance; + // Get points so that at least min_points are added and they each are current_distance away from each other. If that is impossible, decrease current_distance a bit. + // The input are lines, that means that the line from the last to the first vertex does not have to exist, so exclude all points that are on this line! + while ((next_point = polyline_sample_next_point_at_distance(part.points, current_point, current_index, next_distance))) { + // Not every point that is distance away, is valid, as it may be much closer to another point. This is especially the case when the overhang is very thin. + // So this ensures that the points are actually a certain distance from each other. + // This assurance is only made on a per polygon basis, as different but close polygon may not be able to use support below the other polygon. + double min_distance_to_existing_point = std::numeric_limits::max(); + for (Point p : line) + min_distance_to_existing_point = std::min(min_distance_to_existing_point, (p - next_point->first).cast().norm()); + if (min_distance_to_existing_point >= current_distance) { + // viable point was found. Add to possible result. + line.points.emplace_back(next_point->first); + current_point = next_point->first; + current_index = next_point->second; + next_distance = current_distance; + } else { + if (current_point == next_point->first) { + // In case a fixpoint is encountered, better aggressively overcompensate so the code does not become stuck here... + BOOST_LOG_TRIVIAL(warning) << "Tree Support: Encountered a fixpoint in polyline_sample_next_point_at_distance. This is expected to happen if the distance (currently " << next_distance << + ") is smaller than 100"; + TreeSupport::showError("Encountered issue while placing tips. Some tips may be missing.", true); + if (next_distance > 2 * current_distance) + // This case should never happen, but better safe than sorry. + break; + next_distance += current_distance; + continue; + } + // if the point was too close, the next possible viable point is at least distance-min_distance_to_existing_point away from the one that was just checked. + next_distance = std::max(current_distance - min_distance_to_existing_point, scaled(0.1)); + current_point = next_point->first; + current_index = next_point->second; + } + } + current_distance *= 0.9; + } + } + result.emplace_back(std::move(line)); + } + validate_range(result); + return result; +} + +/*! + * \brief Returns Polylines representing the (infill) lines that will result in slicing the given area + * + * \param area[in] The area that has to be filled with infill. + * \param roof[in] Whether the roofing or regular support settings should be used. + * \param layer_idx[in] The current layer index. + * \param support_infill_distance[in] The distance that should be between the infill lines. + * + * \return A Polygons object that represents the resulting infill lines. + */ +[[nodiscard]] static Polylines generateSupportInfillLines( + const Polygons &polygon, const SupportParameters &support_params, + bool roof, LayerIndex layer_idx, coord_t support_infill_distance) +{ +#if 0 + Polygons gaps; + // as we effectivly use lines to place our supportPoints we may use the Infill class for it, while not made for it it works perfect + + const EFillMethod pattern = roof ? config.roof_pattern : config.support_pattern; + +// const bool zig_zaggify_infill = roof ? pattern == EFillMethod::ZIG_ZAG : config.zig_zaggify_support; + const bool connect_polygons = false; + constexpr coord_t support_roof_overlap = 0; + constexpr size_t infill_multiplier = 1; + constexpr coord_t outline_offset = 0; + const int support_shift = roof ? 0 : support_infill_distance / 2; + const size_t wall_line_count = include_walls && !roof ? config.support_wall_count : 0; + const Point infill_origin; + constexpr Polygons* perimeter_gaps = nullptr; + constexpr bool use_endpieces = true; + const bool connected_zigzags = roof ? false : config.connect_zigzags; + const size_t zag_skip_count = roof ? 0 : config.zag_skip_count; + constexpr coord_t pocket_size = 0; + std::vector angles = roof ? config.support_roof_angles : config.support_infill_angles; + std::vector toolpaths; + + const coord_t z = config.getActualZ(layer_idx); + int divisor = static_cast(angles.size()); + int index = ((layer_idx % divisor) + divisor) % divisor; + const AngleRadians fill_angle = angles[index]; + Infill roof_computation(pattern, true /* zig_zaggify_infill */, connect_polygons, polygon, + roof ? config.support_roof_line_width : config.support_line_width, support_infill_distance, support_roof_overlap, infill_multiplier, + fill_angle, z, support_shift, config.resolution, wall_line_count, infill_origin, + perimeter_gaps, connected_zigzags, use_endpieces, false /* skip_some_zags */, zag_skip_count, pocket_size); + Polygons polygons; + Polygons lines; + roof_computation.generate(toolpaths, polygons, lines, config.settings); + append(lines, to_polylines(polygons)); + return lines; +#else +#ifdef _WIN32 + if (! BoundingBox(Point::new_scale(-170., -170.), Point::new_scale(170., 170.)).contains(get_extents(polygon))) + ::MessageBoxA(nullptr, "TreeSupport infill kravsky", "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // _WIN32 + + const Flow &flow = roof ? support_params.support_material_interface_flow : support_params.support_material_flow; + std::unique_ptr filler = std::unique_ptr(Fill::new_from_type(roof ? support_params.interface_fill_pattern : support_params.base_fill_pattern)); + FillParams fill_params; + + filler->layer_id = layer_idx; + filler->spacing = flow.spacing(); + filler->angle = roof ? + //fixme support_layer.interface_id() instead of layer_idx + (support_params.interface_angle + (layer_idx & 1) ? float(- M_PI / 4.) : float(+ M_PI / 4.)) : + support_params.base_angle; + + fill_params.density = float(roof ? support_params.interface_density : scaled(filler->spacing) / (scaled(filler->spacing) + float(support_infill_distance))); + fill_params.dont_adjust = true; + + Polylines out; + for (ExPolygon &expoly : union_ex(polygon)) { + // The surface type does not matter. + assert(area(expoly) > 0.); +#ifdef _WIN32 + if (area(expoly) <= 0.) + ::MessageBoxA(nullptr, "TreeSupport infill negative area", "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // _WIN32 + assert(intersecting_edges(to_polygons(expoly)).empty()); +#ifdef _WIN32 + if (! intersecting_edges(to_polygons(expoly)).empty()) + ::MessageBoxA(nullptr, "TreeSupport infill self intersections", "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // _WIN32 + Surface surface(stInternal, std::move(expoly)); + try { + Polylines pl = filler->fill_surface(&surface, fill_params); + assert(pl.empty() || get_extents(surface.expolygon).inflated(SCALED_EPSILON).contains(get_extents(pl))); +#ifdef _WIN32 + if (! pl.empty() && ! get_extents(surface.expolygon).inflated(SCALED_EPSILON).contains(get_extents(pl))) + ::MessageBoxA(nullptr, "TreeSupport infill failure", "Bug detected!", MB_OK | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_ICONWARNING); +#endif // _WIN32 + append(out, std::move(pl)); + } catch (InfillFailedException &) { + } + } + validate_range(out); + return out; +#endif +} + +/*! + * \brief Unions two Polygons. Ensures that if the input is non empty that the output also will be non empty. + * \param first[in] The first Polygon. + * \param second[in] The second Polygon. + * \return The union of both Polygons + */ +[[nodiscard]] static Polygons safeUnion(const Polygons first, const Polygons second = Polygons()) +{ + // unionPolygons can slowly remove Polygons under certain circumstances, because of rounding issues (Polygons that have a thin area). + // This does not cause a problem when actually using it on large areas, but as influence areas (representing centerpoints) can be very thin, this does occur so this ugly workaround is needed + // Here is an example of a Polygons object that will loose vertices when unioning, and will be gone after a few times unionPolygons was called: + /* + Polygons example; + Polygon exampleInner; + exampleInner.add(Point(120410,83599));//A + exampleInner.add(Point(120384,83643));//B + exampleInner.add(Point(120399,83618));//C + exampleInner.add(Point(120414,83591));//D + exampleInner.add(Point(120423,83570));//E + exampleInner.add(Point(120419,83580));//F + example.add(exampleInner); + for(int i=0;i<10;i++){ + log("Iteration %d Example area: %f\n",i,area(example)); + example=example.unionPolygons(); + } +*/ + + Polygons result; + if (! first.empty() || ! second.empty()) { + result = union_(first, second); + if (result.empty()) { + BOOST_LOG_TRIVIAL(debug) << "Caught an area destroying union, enlarging areas a bit."; + // just take the few lines we have, and offset them a tiny bit. Needs to be offsetPolylines, as offset may aleady have problems with the area. + result = union_(offset(to_polylines(first), scaled(0.002), jtMiter, 1.2), offset(to_polylines(second), scaled(0.002), jtMiter, 1.2)); + } + } + + return result; +} + +/*! + * \brief Offsets (increases the area of) a polygons object in multiple steps to ensure that it does not lag through over a given obstacle. + * \param me[in] Polygons object that has to be offset. + * \param distance[in] The distance by which me should be offset. Expects values >=0. + * \param collision[in] The area representing obstacles. + * \param last_step_offset_without_check[in] The most it is allowed to offset in one step. + * \param min_amount_offset[in] How many steps have to be done at least. As this uses round offset this increases the amount of vertices, which may be required if Polygons get very small. Required as arcTolerance is not exposed in offset, which should result with a similar result. + * \return The resulting Polygons object. + */ +[[nodiscard]] static Polygons safeOffsetInc(const Polygons& me, coord_t distance, const Polygons& collision, coord_t safe_step_size, coord_t last_step_offset_without_check, size_t min_amount_offset) +{ + bool do_final_difference = last_step_offset_without_check == 0; + Polygons ret = safeUnion(me); // ensure sane input + + // Trim the collision polygons with the region of interest for diff() efficiency. + Polygons collision_trimmed_buffer; + auto collision_trimmed = [&collision_trimmed_buffer, &collision, &ret, distance]() -> const Polygons& { + if (collision_trimmed_buffer.empty() && ! collision.empty()) + collision_trimmed_buffer = clip_for_diff(collision, get_extents(ret).inflated(std::max(0, distance) + SCALED_EPSILON)); + return collision_trimmed_buffer; + }; + + if (distance == 0) + return do_final_difference ? diff(ret, collision_trimmed()) : union_(ret); + if (safe_step_size < 0 || last_step_offset_without_check < 0) { + BOOST_LOG_TRIVIAL(error) << "Offset increase got invalid parameter!"; + TreeSupport::showError("Negative offset distance... How did you manage this ?", true); + return do_final_difference ? diff(ret, collision_trimmed()) : union_(ret); + } + + coord_t step_size = safe_step_size; + int steps = distance > last_step_offset_without_check ? (distance - last_step_offset_without_check) / step_size : 0; + if (distance - steps * step_size > last_step_offset_without_check) { + if ((steps + 1) * step_size <= distance) + // This will be the case when last_step_offset_without_check >= safe_step_size + ++ steps; + else + do_final_difference = true; + } + if (steps + (distance < last_step_offset_without_check || distance % step_size != 0) < min_amount_offset && min_amount_offset > 1) { + // yes one can add a bool as the standard specifies that a result from compare operators has to be 0 or 1 + // reduce the stepsize to ensure it is offset the required amount of times + step_size = distance / min_amount_offset; + if (step_size >= safe_step_size) { + // effectivly reduce last_step_offset_without_check + step_size = safe_step_size; + steps = min_amount_offset; + } else + steps = distance / step_size; + } + // offset in steps + for (int i = 0; i < steps; ++ i) { + ret = diff(offset(ret, step_size, ClipperLib::jtRound, scaled(0.01)), collision_trimmed()); + // ensure that if many offsets are done the performance does not suffer extremely by the new vertices of jtRound. + if (i % 10 == 7) + ret = polygons_simplify(ret, scaled(0.015)); + } + // offset the remainder + float last_offset = distance - steps * step_size; + if (last_offset > SCALED_EPSILON) + ret = offset(ret, distance - steps * step_size, ClipperLib::jtRound, scaled(0.01)); + ret = polygons_simplify(ret, scaled(0.015)); + + if (do_final_difference) + ret = diff(ret, collision_trimmed()); + return union_(ret); +} + +static inline SupportGeneratorLayer& layer_initialize( + SupportGeneratorLayer &layer_new, + const SupporLayerType layer_type, + const SlicingParameters &slicing_params, + const size_t layer_idx) +{ + layer_new.layer_type = layer_type; + layer_new.print_z = slicing_params.object_print_z_min + slicing_params.first_object_layer_height + layer_idx * slicing_params.layer_height; + layer_new.height = layer_idx == 0 ? slicing_params.first_object_layer_height : slicing_params.layer_height; + layer_new.bottom_z = layer_idx == 0 ? slicing_params.object_print_z_min : layer_new.print_z - layer_new.height; + return layer_new; +} + +// Using the std::deque as an allocator. +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, + SupporLayerType layer_type, + const SlicingParameters &slicing_params, + size_t layer_idx) +{ + //FIXME take raft into account. + layer_storage.push_back(SupportGeneratorLayer()); + return layer_initialize(layer_storage.back(), layer_type, slicing_params, layer_idx); +} + +inline SupportGeneratorLayer& layer_allocate( + std::deque &layer_storage, + tbb::spin_mutex& layer_storage_mutex, + SupporLayerType layer_type, + const SlicingParameters &slicing_params, + size_t layer_idx) +{ + tbb::spin_mutex::scoped_lock lock(layer_storage_mutex); + layer_storage.push_back(SupportGeneratorLayer()); + return layer_initialize(layer_storage.back(), layer_type, slicing_params, layer_idx); +} + +void TreeSupport::generateInitialAreas( + const PrintObject &print_object, + const std::vector &overhangs, + std::vector> &move_bounds, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &top_interface_layers, + SupportGeneratorLayerStorage &layer_storage) +{ + Polygon base_circle; + const auto base_radius = scaled(0.01); + for (unsigned int i = 0; i < SUPPORT_TREE_CIRCLE_RESOLUTION; ++ i) { + const double angle = static_cast(i) / SUPPORT_TREE_CIRCLE_RESOLUTION * (2.0 * M_PI); + base_circle.points.emplace_back(coord_t(cos(angle) * base_radius), coord_t(sin(angle) * base_radius)); + } + TreeSupportMeshGroupSettings mesh_group_settings(print_object); + TreeSupportSettings mesh_config{ mesh_group_settings }; + SupportParameters support_params(print_object); + support_params.with_sheath = true; + support_params.support_density = 0; + + const size_t z_distance_delta = mesh_config.z_distance_top_layers + 1; // To ensure z_distance_top_layers are left empty between the overhang (zeroth empty layer), the support has to be added z_distance_top_layers+1 layers below + + const bool xy_overrides_z = mesh_config.support_xy_overrides_z; +#if 0 + if (mesh.overhang_areas.size() <= z_distance_delta) + return; +#endif + + const coord_t connect_length = (mesh_config.support_line_width * 100. / mesh_group_settings.support_tree_top_rate) + std::max(2. * mesh_config.min_radius - 1.0 * mesh_config.support_line_width, 0.0); + // As r*r=x*x+y*y (circle equation): If a circle with center at (0,0) the top most point is at (0,r) as in y=r. + // This calculates how far one has to move on the x-axis so that y=r-support_line_width/2. + // In other words how far does one need to move on the x-axis to be support_line_width/2 away from the circle line. + // As a circle is round this length is identical for every axis as long as the 90 degrees angle between both remains. + const coord_t circle_length_to_half_linewidth_change = mesh_config.min_radius < mesh_config.support_line_width ? mesh_config.min_radius / 2 : sqrt(sqr(mesh_config.min_radius) - sqr(mesh_config.min_radius - mesh_config.support_line_width / 2)); + // Extra support offset to compensate for larger tip radiis. Also outset a bit more when z overwrites xy, because supporting something with a part of a support line is better than not supporting it at all. + //FIXME Vojtech: This is not sufficient for support enforcers to work. + //FIXME There is no account for the support overhang angle. + //FIXME There is no account for the width of the collision regions. + const coord_t extra_outset = std::max(coord_t(0), mesh_config.min_radius - mesh_config.support_line_width) + (xy_overrides_z ? 0 : mesh_config.support_line_width / 2) + //FIXME this is a heuristic value for support enforcers to work. +// + 10 * mesh_config.support_line_width; + ; + const size_t support_roof_layers = mesh_group_settings.support_roof_enable ? (mesh_group_settings.support_roof_height + mesh_config.layer_height / 2) / mesh_config.layer_height : 0; + const bool roof_enabled = support_roof_layers != 0; + const bool force_tip_to_roof = sqr(mesh_config.min_radius) * M_PI > mesh_group_settings.minimum_roof_area && roof_enabled; + //FIXME mesh_group_settings.support_angle does not apply to enforcers and also it does not apply to automatic support angle (by half the external perimeter width). + const coord_t max_overhang_speed = (mesh_group_settings.support_angle < 0.5 * M_PI) ? (coord_t)(tan(mesh_group_settings.support_angle) * mesh_config.layer_height) : std::numeric_limits::max(); + const size_t max_overhang_insert_lag = std::max((size_t)round_up_divide(mesh_config.xy_distance, max_overhang_speed / 2), 2 * mesh_config.z_distance_top_layers); // cap for how much layer below the overhang a new support point may be added, as other than with regular support every new inserted point may cause extra material and time cost. Could also be an user setting or differently calculated. Idea is that if an overhang does not turn valid in double the amount of layers a slope of support angle would take to travel xy_distance, nothing reasonable will come from it. The 2*z_distance_delta is only a catch for when the support angle is very high. + + //FIXME + size_t num_support_layers = print_object.layer_count(); + std::vector> already_inserted(num_support_layers - z_distance_delta); + + std::mutex mutex_layer_storage, mutex_movebounds; + tbb::parallel_for(tbb::blocked_range(1, num_support_layers - z_distance_delta), + [this, &print_object, &overhangs, &mesh_config, &mesh_group_settings, &support_params, + z_distance_delta, xy_overrides_z, force_tip_to_roof, roof_enabled, support_roof_layers, extra_outset, circle_length_to_half_linewidth_change, connect_length, max_overhang_insert_lag, + &base_circle, &mutex_layer_storage, &mutex_movebounds, &top_contacts, &layer_storage, &already_inserted, + &move_bounds, &base_radius](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + if (overhangs[layer_idx + z_distance_delta].empty()) + continue; + // take the least restrictive avoidance possible + Polygons relevant_forbidden; + { + const Polygons &relevant_forbidden_raw = (mesh_config.support_rests_on_model ? + (SUPPORT_TREE_ONLY_GRACIOUS_TO_MODEL ? m_volumes.getAvoidance(mesh_config.getRadius(0), layer_idx, AvoidanceType::Fast, true, !xy_overrides_z) : + m_volumes.getCollision(mesh_config.getRadius(0), layer_idx, !xy_overrides_z)) : + m_volumes.getAvoidance(mesh_config.getRadius(0), layer_idx, AvoidanceType::Fast, false, !xy_overrides_z)); + // prevent rounding errors down the line, points placed directly on the line of the forbidden area may not be added otherwise. + relevant_forbidden = offset(union_ex(relevant_forbidden_raw), scaled(0.005), jtMiter, 1.2); + } + + auto generateLines = [&](const Polygons& area, bool roof, LayerIndex layer_idx) -> Polylines { + const coord_t support_infill_distance = roof ? mesh_group_settings.support_roof_line_distance : mesh_group_settings.support_tree_branch_distance; + return generateSupportInfillLines(area, support_params, roof, layer_idx, support_infill_distance); + }; + + auto addPointAsInfluenceArea = [&](std::pair p, size_t dtt, LayerIndex insert_layer, size_t dont_move_until, bool roof, bool skip_ovalisation) + { + bool to_bp = p.second == LineStatus::TO_BP || p.second == LineStatus::TO_BP_SAFE; + bool gracious = to_bp || p.second == LineStatus::TO_MODEL_GRACIOUS || p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE; + bool safe_radius = p.second == LineStatus::TO_BP_SAFE || p.second == LineStatus::TO_MODEL_GRACIOUS_SAFE; + if (!mesh_config.support_rests_on_model && !to_bp) { + BOOST_LOG_TRIVIAL(warning) << "Tried to add an invalid support point"; + TreeSupport::showError("Unable to add tip. Some overhang may not be supported correctly.", true); + return; + } + Polygon circle; + for (Point corner : base_circle) + circle.points.emplace_back(p.first + corner); + { + std::lock_guard critical_section_movebounds(mutex_movebounds); + if (! already_inserted[insert_layer].count(p.first / ((mesh_config.min_radius + 1) / 10))) { + // normalize the point a bit to also catch points which are so close that inserting it would achieve nothing + already_inserted[insert_layer].emplace(p.first / ((mesh_config.min_radius + 1) / 10)); + SupportElement* elem = new SupportElement(dtt, insert_layer, p.first, to_bp, gracious, !xy_overrides_z, dont_move_until, roof, safe_radius, force_tip_to_roof, skip_ovalisation); + elem->area = new Polygons(); + validate_range(circle); + elem->area->emplace_back(std::move(circle)); + move_bounds[insert_layer].emplace(elem); + } + } + }; + + auto addLinesAsInfluenceAreas = [&](LineInformations lines, size_t roof_tip_layers, LayerIndex insert_layer_idx, bool supports_roof, size_t dont_move_until) + { + validate_range(lines); + // Add tip area as roof (happens when minimum roof area > minimum tip area) if possible + size_t dtt_roof_tip; + for (dtt_roof_tip = 0; dtt_roof_tip < roof_tip_layers && insert_layer_idx - dtt_roof_tip >= 1; dtt_roof_tip++) + { + auto evaluateRoofWillGenerate = [&](std::pair p) { + //FIXME Vojtech: The circle is just shifted, it has a known size, the infill should fit all the time! +#if 0 + Polygon roof_circle; + for (Point corner : base_circle) + roof_circle.points.emplace_back(p.first + corner * mesh_config.min_radius); + return !generateSupportInfillLines({ roof_circle }, mesh_config, true, insert_layer_idx - dtt_roof_tip, mesh_config.support_roof_line_distance).empty(); +#else + return true; +#endif + }; + + std::pair split = + // keep all lines that are still valid on the next layer + splitLines(lines, [this, insert_layer_idx, dtt_roof_tip](std::pair &p){ return evaluatePointForNextLayerFunction(m_volumes, m_config, insert_layer_idx - dtt_roof_tip, p); }); + + for (LineInformation line : split.second) // add all points that would not be valid + for (std::pair point_data : line) + addPointAsInfluenceArea(point_data, 0, insert_layer_idx - dtt_roof_tip, roof_tip_layers - dtt_roof_tip, dtt_roof_tip != 0, false); + + // not all roofs are guaranteed to actually generate lines, so filter these out and add them as points + split = splitLines(split.first, evaluateRoofWillGenerate); + lines = split.first; + + for (LineInformation line : split.second) + for (std::pair point_data : line) + addPointAsInfluenceArea(point_data, 0, insert_layer_idx - dtt_roof_tip, roof_tip_layers - dtt_roof_tip, dtt_roof_tip != 0, false); + + // add all tips as roof to the roof storage + Polygons added_roofs; + for (LineInformation line : lines) + for (std::pair p : line) { + Polygon roof_circle; + for (Point corner : base_circle) + roof_circle.points.emplace_back(p.first + corner * mesh_config.min_radius / base_radius); + added_roofs.emplace_back(roof_circle); + } + if (! added_roofs.empty()) { + added_roofs = union_(added_roofs); + { + std::lock_guard lock(mutex_layer_storage); + SupportGeneratorLayer *&l = top_contacts[insert_layer_idx - dtt_roof_tip]; + if (l == nullptr) + l = &layer_allocate(layer_storage, SupporLayerType::TopContact, print_object.slicing_parameters(), insert_layer_idx - dtt_roof_tip); + append(l->polygons, std::move(added_roofs)); + } + } + } + + for (LineInformation line : lines) { + bool disable_ovalistation = mesh_config.min_radius < 3 * mesh_config.support_line_width && roof_tip_layers == 0 && dtt_roof_tip == 0 && line.size() > 5; // If a line consists of enough tips, the assumption is that it is not a single tip, but part of a simulated support pattern. Ovalisation should be disabled for these to improve the quality of the lines when tip_diameter=line_width + for (auto point_data : line) + addPointAsInfluenceArea(point_data, 0, insert_layer_idx - dtt_roof_tip, dont_move_until > dtt_roof_tip ? dont_move_until - dtt_roof_tip : 0, dtt_roof_tip != 0 || supports_roof, disable_ovalistation); + } + }; + + // every overhang has saved if a roof should be generated for it. This can NOT be done in the for loop as an area may NOT have a roof + // even if it is larger than the minimum_roof_area when it is only larger because of the support horizontal expansion and + // it would not have a roof if the overhang is offset by support roof horizontal expansion instead. (At least this is the current behavior of the regular support) + Polygons overhang_regular; + { + const Polygons &overhang_raw = overhangs[layer_idx + z_distance_delta]; + overhang_regular = mesh_group_settings.support_offset == 0 ? + overhang_raw : + safeOffsetInc(overhang_raw, mesh_group_settings.support_offset, relevant_forbidden, mesh_config.min_radius * 1.75 + mesh_config.xy_min_distance, 0, 1); + // offset ensures that areas that could be supported by a part of a support line, are not considered unsupported overhang + Polygons remaining_overhang = intersection( + diff(mesh_group_settings.support_offset == 0 ? + overhang_raw : + offset(union_ex(overhang_raw), mesh_group_settings.support_offset, jtMiter, 1.2), + offset(union_ex(overhang_regular), mesh_config.support_line_width * 0.5, jtMiter, 1.2)), + relevant_forbidden); + + // Offset the area to compensate for large tip radiis. Offset happens in multiple steps to ensure the tip is as close to the original overhang as possible. + //+mesh_config.support_line_width / 80 to avoid calculating very small (useless) offsets because of rounding errors. + //FIXME likely a better approach would be to find correspondences between the full overhang and the trimmed overhang + // and if there is no correspondence, project the missing points to the clipping curve. + for (coord_t extra_total_offset_acc = 0; ! remaining_overhang.empty() && extra_total_offset_acc + mesh_config.support_line_width / 8 < extra_outset; ) { + const coord_t offset_current_step = std::min( + extra_total_offset_acc + 2 * mesh_config.support_line_width > mesh_config.min_radius ? + mesh_config.support_line_width / 8 : + circle_length_to_half_linewidth_change, + extra_outset - extra_total_offset_acc); + extra_total_offset_acc += offset_current_step; + const Polygons &raw_collision = m_volumes.getCollision(0, layer_idx, true); + const coord_t offset_step = mesh_config.xy_min_distance + mesh_config.support_line_width; + // Reducing the remaining overhang by the areas already supported. + //FIXME 1.5 * extra_total_offset_acc seems to be too much, it may remove some remaining overhang without being supported at all. + remaining_overhang = diff(remaining_overhang, safeOffsetInc(overhang_regular, 1.5 * extra_total_offset_acc, raw_collision, offset_step, 0, 1)); + // Extending the overhangs by the inflated remaining overhangs. + overhang_regular = union_(overhang_regular, diff(safeOffsetInc(remaining_overhang, extra_total_offset_acc, raw_collision, offset_step, 0, 1), relevant_forbidden)); + } + // If the xy distance overrides the z distance, some support needs to be inserted further down. + //=> Analyze which support points do not fit on this layer and check if they will fit a few layers down (while adding them an infinite amount of layers down would technically be closer the the setting description, it would not produce reasonable results. ) + if (xy_overrides_z) + { + LineInformations overhang_lines; + { + //Vojtech: Generate support heads at support_tree_branch_distance spacing by producing a zig-zag infill at support_tree_branch_distance spacing, + // which is then resmapled + // support_line_width to form a line here as otherwise most will be unsupported. Technically this violates branch distance, + // mbut not only is this the only reasonable choice, but it ensures consistent behavior as some infill patterns generate + // each line segment as its own polyline part causing a similar line forming behavior. Also it is assumed that + // the area that is valid a layer below is to small for support roof. + Polylines polylines = ensureMaximumDistancePolyline(generateLines(remaining_overhang, false, layer_idx), mesh_config.min_radius, 1); + if (polylines.size() <= 3) + // add the outer wall to ensure it is correct supported instead + polylines = ensureMaximumDistancePolyline(to_polylines(remaining_overhang), connect_length, 3); + for (const auto &line : polylines) { + LineInformation res_line; + for (Point p : line) + res_line.emplace_back(p, LineStatus::INVALID); + overhang_lines.emplace_back(res_line); + } + validate_range(overhang_lines); + } + + for (size_t lag_ctr = 1; lag_ctr <= max_overhang_insert_lag && !overhang_lines.empty() && layer_idx - coord_t(lag_ctr) >= 1; lag_ctr++) { + // get least restricted avoidance for layer_idx-lag_ctr + const Polygons &relevant_forbidden_below = (mesh_config.support_rests_on_model ? (SUPPORT_TREE_ONLY_GRACIOUS_TO_MODEL ? m_volumes.getAvoidance(mesh_config.getRadius(0), layer_idx - lag_ctr, AvoidanceType::Fast, true, !xy_overrides_z) : m_volumes.getCollision(mesh_config.getRadius(0), layer_idx - lag_ctr, !xy_overrides_z)) : m_volumes.getAvoidance(mesh_config.getRadius(0), layer_idx - lag_ctr, AvoidanceType::Fast, false, !xy_overrides_z)); + // it is not required to offset the forbidden area here as the points wont change: If points here are not inside the forbidden area neither will they be later when placing these points, as these are the same points. + auto evaluatePoint = [&](std::pair p) { return contains(relevant_forbidden_below, p.first); }; + + std::pair split = splitLines(overhang_lines, evaluatePoint); // keep all lines that are invalid + overhang_lines = split.first; + LineInformations fresh_valid_points = convertLinesToInternal(m_volumes, m_config, convertInternalToLines(split.second), layer_idx - lag_ctr); // set all now valid lines to their correct LineStatus. Easiest way is to just discard Avoidance information for each point and evaluate them again. + validate_range(fresh_valid_points); + + addLinesAsInfluenceAreas(fresh_valid_points, (force_tip_to_roof && lag_ctr <= support_roof_layers) ? support_roof_layers : 0, layer_idx - lag_ctr, false, roof_enabled ? support_roof_layers : 0); + } + } + } + + Polygons overhang_roofs; + std::vector> overhang_processing; + if (roof_enabled) { + static constexpr const coord_t support_roof_offset = 0; + overhang_roofs = safeOffsetInc(overhangs[layer_idx + z_distance_delta], support_roof_offset, relevant_forbidden, mesh_config.min_radius * 2 + mesh_config.xy_min_distance, 0, 1); + if (mesh_group_settings.minimum_support_area > 0) + remove_small(overhang_roofs, mesh_group_settings.minimum_roof_area); + overhang_regular = diff(overhang_regular, overhang_roofs); + for (ExPolygon &roof_part : union_ex(overhang_roofs)) + overhang_processing.emplace_back(std::move(roof_part), true); + } + if (mesh_group_settings.minimum_support_area > 0) + remove_small(overhang_regular, mesh_group_settings.minimum_support_area); + + for (ExPolygon &support_part : union_ex(overhang_regular)) + overhang_processing.emplace_back(std::move(support_part), false); + + for (const std::pair &overhang_pair : overhang_processing) { + const bool roof_allowed_for_this_part = overhang_pair.second; + Polygons overhang_outset = to_polygons(overhang_pair.first); + const size_t min_support_points = std::max(coord_t(1), std::min(coord_t(3), coord_t(total_length(overhang_outset) / connect_length))); + LineInformations overhang_lines; + Polygons last_overhang = overhang_outset; + size_t dtt_roof = 0; + // Sometimes roofs could be empty as the pattern does not generate lines if the area is narrow enough (i am looking at you, concentric infill). + // To catch these cases the added roofs are saved to be evaluated later. + std::vector added_roofs(support_roof_layers); + + // Assumption is that roof will support roof further up to avoid a lot of unnecessary branches. Each layer down it is checked whether the roof area + // is still large enough to be a roof and aborted as soon as it is not. This part was already reworked a few times, and there could be an argument + // made to change it again if there are actual issues encountered regarding supporting roofs. + // Main problem is that some patterns change each layer, so just calculating points and checking if they are still valid an layer below is not useful, + // as the pattern may be different one layer below. Same with calculating which points are now no longer being generated as result from + // a decreasing roof, as there is no guarantee that a line will be above these points. Implementing a separate roof support behavior + // for each pattern harms maintainability as it very well could be >100 LOC + if (roof_allowed_for_this_part) { + for (dtt_roof = 0; dtt_roof < support_roof_layers && layer_idx - dtt_roof >= 1; dtt_roof++) { + // here the roof is handled. If roof can not be added the branches will try to not move instead + Polygons forbidden_next; + { + const Polygons &forbidden_next_raw = mesh_config.support_rests_on_model ? + (SUPPORT_TREE_ONLY_GRACIOUS_TO_MODEL ? + m_volumes.getAvoidance(mesh_config.getRadius(0), layer_idx - (dtt_roof + 1), AvoidanceType::Fast, true, !xy_overrides_z) : + m_volumes.getCollision(mesh_config.getRadius(0), layer_idx - (dtt_roof + 1), !xy_overrides_z)) : + m_volumes.getAvoidance(mesh_config.getRadius(0), layer_idx - (dtt_roof + 1), AvoidanceType::Fast, false, !xy_overrides_z); + // prevent rounding errors down the line + forbidden_next = offset(union_ex(forbidden_next_raw), scaled(0.005), jtMiter, 1.2); + } + Polygons overhang_outset_next = diff(overhang_outset, forbidden_next); + if (area(overhang_outset_next) < mesh_group_settings.minimum_roof_area) { + // next layer down the roof area would be to small so we have to insert our roof support here. Also convert squaremicrons to squaremilimeter + size_t dtt_before = dtt_roof > 0 ? dtt_roof - 1 : 0; + if (dtt_roof != 0) { + // Produce support head points supporting an interface layer: First produce the interface lines, then sample them. + overhang_lines = convertLinesToInternal(m_volumes, m_config, + ensureMaximumDistancePolyline(generateLines(last_overhang, true, layer_idx - dtt_before), connect_length, 1), layer_idx - dtt_before); + overhang_lines = splitLines(overhang_lines, + [this, layer_idx, dtt_before](std::pair &p){ return evaluatePointForNextLayerFunction(m_volumes, m_config, layer_idx - dtt_before, p); }).first; + } + break; + } + added_roofs[dtt_roof] = overhang_outset; + last_overhang = overhang_outset; + overhang_outset = overhang_outset_next; + } + } + + size_t layer_generation_dtt = std::max(dtt_roof, size_t(1)) - 1; // 1 inside max and -1 outside to avoid underflow. layer_generation_dtt=dtt_roof-1 if dtt_roof!=0; + // if the roof should be valid, check that the area does generate lines. This is NOT guaranteed. + if (overhang_lines.empty() && dtt_roof != 0 && generateLines(overhang_outset, true, layer_idx - layer_generation_dtt).empty()) + for (size_t idx = 0; idx < dtt_roof; idx++) { + // check for every roof area that it has resulting lines. Remember idx 1 means the 2. layer of roof => higher idx == lower layer + if (generateLines(added_roofs[idx], true, layer_idx - idx).empty()) { + dtt_roof = idx; + layer_generation_dtt = std::max(dtt_roof, size_t(1)) - 1; + break; + } + } + + { + std::lock_guard lock(mutex_layer_storage); + for (size_t idx = 0; idx < dtt_roof; ++ idx) + if (! added_roofs[idx].empty()) { + SupportGeneratorLayer *&l = top_contacts[layer_idx - idx]; + if (l == nullptr) + l = &layer_allocate(layer_storage, SupporLayerType::TopContact, print_object.slicing_parameters(), layer_idx - idx); + // will be unioned in finalizeInterfaceAndSupportAreas + append(l->polygons, std::move(added_roofs[idx])); + } + } + + if (overhang_lines.empty()) { + // support_line_width to form a line here as otherwise most will be unsupported. Technically this violates branch distance, but not only is this the only reasonable choice, + // but it ensures consistant behaviour as some infill patterns generate each line segment as its own polyline part causing a similar line forming behaviour. + // This is not doen when a roof is above as the roof will support the model and the trees only need to support the roof + Polylines polylines = ensureMaximumDistancePolyline(generateLines(overhang_outset, dtt_roof != 0, layer_idx - layer_generation_dtt), dtt_roof == 0 ? mesh_config.min_radius / 2 : connect_length, 1); + size_t point_count = 0; + for (const Polyline &poly : polylines) + point_count += poly.size(); + if (point_count <= min_support_points) { + // add the outer wall (of the overhang) to ensure it is correct supported instead. Try placing the support points in a way that they fully support the outer wall, instead of just the with half of the the support line width. + // I assume that even small overhangs are over one line width wide, so lets try to place the support points in a way that the full support area generated from them + // will support the overhang (if this is not done it may only be half). This WILL NOT be the case when supporting an angle of about < 60� so there is a fallback, + // as some support is better than none. + Polygons reduced_overhang_outset = offset(union_ex(overhang_outset), -mesh_config.support_line_width / 2.2, jtMiter, 1.2); + polylines = ensureMaximumDistancePolyline( + to_polylines(!reduced_overhang_outset.empty() && area(offset(diff_ex(overhang_outset, reduced_overhang_outset), std::max(mesh_config.support_line_width, connect_length), jtMiter, 1.2)) < sqr(scaled(0.001)) ? + reduced_overhang_outset : + overhang_outset), + connect_length, min_support_points); + } + LayerIndex last_insert_layer = layer_idx - dtt_roof; + overhang_lines = convertLinesToInternal(m_volumes, m_config, polylines, last_insert_layer); + } + + if (int(dtt_roof) >= layer_idx && roof_allowed_for_this_part && ! overhang_outset.empty()) { + // reached buildplate + std::lock_guard lock(mutex_layer_storage); + SupportGeneratorLayer*& l = top_contacts[0]; + if (l == nullptr) + l = &layer_allocate(layer_storage, SupporLayerType::TopContact, print_object.slicing_parameters(), 0); + append(l->polygons, std::move(overhang_outset)); + } else // normal trees have to be generated + addLinesAsInfluenceAreas(overhang_lines, force_tip_to_roof ? support_roof_layers - dtt_roof : 0, layer_idx - dtt_roof, dtt_roof > 0, roof_enabled ? support_roof_layers - dtt_roof : 0); + } + } + }); +} + +static unsigned int moveInside(const Polygons &polygons, Point &from, int distance = 0, int64_t maxDist2 = std::numeric_limits::max()) +{ + Point ret = from; + double bestDist2 = std::numeric_limits::max(); + auto bestPoly = static_cast(-1); + bool is_already_on_correct_side_of_boundary = false; // whether [from] is already on the right side of the boundary + for (unsigned int poly_idx = 0; poly_idx < polygons.size(); ++ poly_idx) { + const Polygon &poly = polygons[poly_idx]; + if (poly.size() < 2) + continue; + Point p0 = poly[poly.size() - 2]; + Point p1 = poly.back(); + // because we compare with vSize2 here (no division by zero), we also need to compare by vSize2 inside the loop + // to avoid integer rounding edge cases + bool projected_p_beyond_prev_segment = (p1 - p0).cast().dot((from - p0).cast()) >= (p1 - p0).cast().squaredNorm(); + for (const Point& p2 : poly) { + // X = A + Normal(B-A) * (((B-A) dot (P-A)) / VSize(B-A)); + // = A + (B-A) * ((B-A) dot (P-A)) / VSize2(B-A); + // X = P projected on AB + const Point& a = p1; + const Point& b = p2; + const Point& p = from; + auto ab = (b - a).cast(); + auto ap = (p - a).cast(); + int64_t ab_length2 = ab.squaredNorm(); + if (ab_length2 <= 0) { //A = B, i.e. the input polygon had two adjacent points on top of each other. + p1 = p2; //Skip only one of the points. + continue; + } + int64_t dot_prod = ab.dot(ap); + if (dot_prod <= 0) { // x is projected to before ab + if (projected_p_beyond_prev_segment) { + // case which looks like: > . + projected_p_beyond_prev_segment = false; + Point& x = p1; + + auto dist2 = (x - p).cast().squaredNorm(); + if (dist2 < bestDist2) { + bestDist2 = dist2; + bestPoly = poly_idx; + if (distance == 0) + ret = x; + else { + Vec2d abd = ab.cast(); + Vec2d p1p2 = (p1 - p0).cast(); + double lab = abd.norm(); + double lp1p2 = p1p2.norm(); + // inward direction irrespective of sign of [distance] + auto inward_dir = perp(abd * (scaled(10.0) / lab) + p1p2 * (scaled(10.0) / lp1p2)); + // MM2INT(10.0) to retain precision for the eventual normalization + ret = x + (inward_dir * (distance / inward_dir.norm())).cast(); + is_already_on_correct_side_of_boundary = inward_dir.dot((p - x).cast()) * distance >= 0; + } + } + } else { + projected_p_beyond_prev_segment = false; + p0 = p1; + p1 = p2; + continue; + } + } else if (dot_prod >= ab_length2) { + // x is projected to beyond ab + projected_p_beyond_prev_segment = true; + p0 = p1; + p1 = p2; + continue; + } else { + // x is projected to a point properly on the line segment (not onto a vertex). The case which looks like | . + projected_p_beyond_prev_segment = false; + Point x = a + (ab.cast() * (double(dot_prod) / double(ab_length2))).cast(); + auto dist2 = (p - x).cast().squaredNorm(); + if (dist2 < bestDist2) { + bestDist2 = dist2; + bestPoly = poly_idx; + if (distance == 0) + ret = x; + else { + Vec2d abd = ab.cast(); + Vec2d inward_dir = perp(abd * (distance / abd.norm())); // inward or outward depending on the sign of [distance] + ret = x + inward_dir.cast(); + is_already_on_correct_side_of_boundary = inward_dir.dot((p - x).cast()) >= 0; + } + } + } + p0 = p1; + p1 = p2; + } + } + // when the best point is already inside and we're moving inside, or when the best point is already outside and we're moving outside + if (is_already_on_correct_side_of_boundary) { + if (bestDist2 < distance * distance) + from = ret; + else { + // from = from; // original point stays unaltered. It is already inside by enough distance + } + return bestPoly; + } else if (bestDist2 < maxDist2) { + from = ret; + return bestPoly; + } + return -1; +} + +/*! + * \brief Merges Influence Areas if possible. + * + * Branches which do overlap have to be merged. This helper merges all elements in input with the elements into reduced_new_layer. + * Elements in input_aabb are merged together if possible, while elements reduced_new_layer_aabb are not checked against each other. + * + * \param reduced_aabb[in,out] The already processed elements. + * \param input_aabb[in] Not yet processed elements + * \param to_bp_areas[in] The Elements of the current Layer that will reach the buildplate. Value is the influence area where the center of a circle of support may be placed. + * \param to_model_areas[in] The Elements of the current Layer that do not have to reach the buildplate. Also contains main as every element that can reach the buildplate is not forced to. + * Value is the influence area where the center of a circle of support may be placed. + * \param influence_areas[in] The influence areas without avoidance removed. + * \param insert_bp_areas[out] Elements to be inserted into the main dictionary after the Helper terminates. + * \param insert_model_areas[out] Elements to be inserted into the secondary dictionary after the Helper terminates. + * \param insert_influence[out] Elements to be inserted into the dictionary containing the largest possibly valid influence area (ignoring if the area may not be there because of avoidance) + * \param erase[out] Elements that should be deleted from the above dictionaries. + * \param layer_idx[in] The Index of the current Layer. + */ +static void mergeHelper( + const TreeModelVolumes &volumes, const TreeSupport::TreeSupportSettings &config, + std::map& reduced_aabb, std::map& input_aabb, + const std::unordered_map& to_bp_areas, const std::unordered_map& to_model_areas, + const std::map& influence_areas, + std::unordered_map& insert_bp_areas, std::unordered_map& insert_model_areas, + std::unordered_map& insert_influence, std::vector& erase, const LayerIndex layer_idx) +{ + using SupportElement = TreeSupport::SupportElement; + + const bool first_merge_iteration = reduced_aabb.empty(); // If this is the first iteration, all elements in input have to be merged with each other + for (std::map::iterator influence_iter = input_aabb.begin(); influence_iter != input_aabb.end(); influence_iter++) + { + bool merged = false; + BoundingBox influence_aabb = influence_iter->second; + for (std::map::iterator reduced_check_iter = reduced_aabb.begin(); reduced_check_iter != reduced_aabb.end(); reduced_check_iter++) + { + // As every area has to be checked for overlaps with other areas, some fast heuristic is needed to abort early if clearly possible + // This is so performance critical that using a map lookup instead of the direct access of the cached AABBs can have a surprisingly large performance impact + BoundingBox aabb = reduced_check_iter->second; + if (aabb.overlap(influence_aabb)) { + if (!first_merge_iteration && input_aabb.count(reduced_check_iter->first)) + break; // Do not try to merge elements that already should have been merged. Done for potential performance improvement. + + bool merging_gracious_and_non_gracious = reduced_check_iter->first.to_model_gracious != influence_iter->first.to_model_gracious; // we do not want to merge a gracious with a non gracious area as bad placement could negatively impact the dependability of the whole subtree + bool merging_to_bp = reduced_check_iter->first.to_buildplate && influence_iter->first.to_buildplate; + bool merging_min_and_regular_xy = reduced_check_iter->first.use_min_xy_dist != influence_iter->first.use_min_xy_dist; // could cause some issues with the increase of one area, as it is assumed that if the smaller is increased by the delta to the larger it is engulfed by it already. But because a different collision may be removed from the in drawArea generated circles, this assumption could be wrong. + coord_t increased_to_model_radius = 0; + size_t larger_to_model_dtt = 0; + + if (!merging_to_bp) { + coord_t infl_radius = config.getRadius(influence_iter->first); // get the real radius increase as the user does not care for the collision model. + coord_t redu_radius = config.getRadius(reduced_check_iter->first); + if (reduced_check_iter->first.to_buildplate != influence_iter->first.to_buildplate) { + if (reduced_check_iter->first.to_buildplate) { + if (infl_radius < redu_radius) + increased_to_model_radius = influence_iter->first.increased_to_model_radius + redu_radius - infl_radius; + } else { + if (infl_radius > redu_radius) + increased_to_model_radius = reduced_check_iter->first.increased_to_model_radius + infl_radius - redu_radius; + } + } + larger_to_model_dtt = std::max(influence_iter->first.distance_to_top, reduced_check_iter->first.distance_to_top); + } + + // if a merge could place a stable branch on unstable ground, would be increasing the radius further than allowed to when merging to model and to_bp trees or would merge to model before it is known they will even been drawn the merge is skipped + if (merging_min_and_regular_xy || merging_gracious_and_non_gracious || increased_to_model_radius > config.max_to_model_radius_increase || (!merging_to_bp && larger_to_model_dtt < config.min_dtt_to_model && !reduced_check_iter->first.supports_roof && !influence_iter->first.supports_roof)) + continue; + + Polygons relevant_infl; + Polygons relevant_redu; + if (merging_to_bp) { + relevant_infl = to_bp_areas.count(influence_iter->first) ? to_bp_areas.at(influence_iter->first) : Polygons(); // influence_iter->first is a new element => not required to check if it was changed + relevant_redu = insert_bp_areas.count(reduced_check_iter->first) ? insert_bp_areas[reduced_check_iter->first] : (to_bp_areas.count(reduced_check_iter->first) ? to_bp_areas.at(reduced_check_iter->first) : Polygons()); + } else { + relevant_infl = to_model_areas.count(influence_iter->first) ? to_model_areas.at(influence_iter->first) : Polygons(); + relevant_redu = insert_model_areas.count(reduced_check_iter->first) ? insert_model_areas[reduced_check_iter->first] : (to_model_areas.count(reduced_check_iter->first) ? to_model_areas.at(reduced_check_iter->first) : Polygons()); + } + + const bool red_bigger = config.getCollisionRadius(reduced_check_iter->first) > config.getCollisionRadius(influence_iter->first); + std::pair smaller_rad = red_bigger ? std::pair(influence_iter->first, relevant_infl) : std::pair(reduced_check_iter->first, relevant_redu); + std::pair bigger_rad = red_bigger ? std::pair(reduced_check_iter->first, relevant_redu) : std::pair(influence_iter->first, relevant_infl); + const coord_t real_radius_delta = std::abs(config.getRadius(bigger_rad.first) - config.getRadius(smaller_rad.first)); + const coord_t smaller_collision_radius = config.getCollisionRadius(smaller_rad.first); + + // the area of the bigger radius is used to ensure correct placement regarding the relevant avoidance, so if that would change an invalid area may be created + if (!bigger_rad.first.can_use_safe_radius && smaller_rad.first.can_use_safe_radius) + continue; + + // the bigger radius is used to verify that the area is still valid after the increase with the delta. If there were a point where the big influence area could be valid with can_use_safe_radius the element would already be can_use_safe_radius + // the smaller radius, which gets increased by delta may reach into the area where use_min_xy_dist is no longer required. + bool use_min_radius = bigger_rad.first.use_min_xy_dist && smaller_rad.first.use_min_xy_dist; + + // The idea is that the influence area with the smaller collision radius is increased by the radius difference. + // If this area has any intersections with the influence area of the larger collision radius, a branch (of the larger collision radius) placed in this intersection, has already engulfed the branch of the smaller collision radius. + // Because of this a merge may happen even if the influence areas (that represent possible center points of branches) do not intersect yet. + // Remember that collision radius <= real radius as otherwise this assumption would be false. + Polygons small_rad_increased_by_big_minus_small = safeOffsetInc(smaller_rad.second, real_radius_delta, volumes.getCollision(smaller_collision_radius, layer_idx - 1, use_min_radius), 2 * (config.xy_distance + smaller_collision_radius - 3), 0, 0); // -3 avoids possible rounding errors + Polygons intersect = intersection(small_rad_increased_by_big_minus_small, bigger_rad.second); + + if (area(intersect) > tiny_area_threshold) { // dont use empty as a line is not empty, but for this use-case it very well may be (and would be one layer down as union does not keep lines) + if (area(offset(intersect, scaled(-0.025), jtMiter, 1.2)) <= tiny_area_threshold) // check if the overlap is large enough (Small ares tend to attract rounding errors in clipper). While 25 was guessed as enough, i did not have reason to change it. + continue; + + // Do the actual merge now that the branches are confirmed to be able to intersect. + + // calculate which point is closest to the point of the last merge (or tip center if no merge above it has happened) + // used at the end to estimate where to best place the branch on the bottom most layer + // could be replaced with a random point inside the new area + Point new_pos = reduced_check_iter->first.next_position; + if (! contains(intersect, new_pos)) + moveInside(intersect, new_pos); + + if (increased_to_model_radius == 0) + increased_to_model_radius = std::max(reduced_check_iter->first.increased_to_model_radius, influence_iter->first.increased_to_model_radius); + + SupportElement key(reduced_check_iter->first, influence_iter->first, layer_idx - 1, new_pos, increased_to_model_radius, config); + + Polygons intersect_influence; + Polygons infl_small = insert_influence.count(smaller_rad.first) ? insert_influence[smaller_rad.first] : (influence_areas.count(smaller_rad.first) ? influence_areas.at(smaller_rad.first) : Polygons()); + Polygons infl_big = insert_influence.count(bigger_rad.first) ? insert_influence[bigger_rad.first] : (influence_areas.count(bigger_rad.first) ? influence_areas.at(bigger_rad.first) : Polygons()); + Polygons small_rad_increased_by_big_minus_small_infl = safeOffsetInc(infl_small, real_radius_delta, volumes.getCollision(smaller_collision_radius, layer_idx - 1, use_min_radius), 2 * (config.xy_distance + smaller_collision_radius - 3), 0, 0); + intersect_influence = intersection(small_rad_increased_by_big_minus_small_infl, infl_big); // if the one with the bigger radius with the lower radius removed overlaps we can merge + intersect_influence = safeUnion(intersect_influence, intersect); // Rounding errors again. Do not ask me where or why. + + Polygons intersect_sec; + if (merging_to_bp && config.support_rests_on_model) { + if (key.to_model_gracious) { + Polygons sec_small = insert_model_areas.count(smaller_rad.first) ? insert_model_areas[smaller_rad.first] : (to_model_areas.count(smaller_rad.first) ? to_model_areas.at(smaller_rad.first) : Polygons()); + Polygons sec_big = insert_model_areas.count(bigger_rad.first) ? insert_model_areas[bigger_rad.first] : (to_model_areas.count(bigger_rad.first) ? to_model_areas.at(bigger_rad.first) : Polygons()); + Polygons small_rad_increased_by_big_minus_small_sec = safeOffsetInc(sec_small, real_radius_delta, volumes.getCollision(smaller_collision_radius, layer_idx - 1, use_min_radius), 2 * (config.xy_distance + smaller_collision_radius - 3), 0, 0); + intersect_sec = intersection(small_rad_increased_by_big_minus_small_sec, sec_big); // if the one with the bigger radius with the lower radius removed overlaps we can merge + intersect_influence = safeUnion(intersect_influence, intersect_sec); // still rounding errors + } else + intersect_sec = intersect_influence; + } + + // remove the now merged elements from all buckets, as they do not exist anymore in their old form + insert_bp_areas.erase(reduced_check_iter->first); + insert_bp_areas.erase(influence_iter->first); + insert_model_areas.erase(reduced_check_iter->first); + insert_model_areas.erase(influence_iter->first); + insert_influence.erase(reduced_check_iter->first); + insert_influence.erase(influence_iter->first); + + (merging_to_bp ? insert_bp_areas : insert_model_areas).emplace(key, intersect); + if (merging_to_bp && config.support_rests_on_model) + insert_model_areas.emplace(key, intersect_sec); + insert_influence.emplace(key, intersect_influence); + + erase.emplace_back(reduced_check_iter->first); + erase.emplace_back(influence_iter->first); + Polygons merge = diff_clipped(offset(union_(intersect, intersect_sec), config.getRadius(key), ClipperLib::jtRound, scaled(0.01)), volumes.getCollision(0, layer_idx - 1, false)); // regular union should be preferable here as Polygons tend to only become smaller through rounding errors (smaller!=has smaller area as holes have a negative area.). And if this area disappears because of rounding errors, the only downside is that it can not merge again on this layer. + + reduced_aabb.erase(reduced_check_iter->first); // this invalidates reduced_check_iter + reduced_aabb.emplace(key, get_extents(merge)); + + merged = true; + break; + } + } + } + + if (!merged) + reduced_aabb[influence_iter->first] = influence_aabb; + } +} + +/*! + * \brief Merges Influence Areas if possible. + * + * Branches which do overlap have to be merged. This manages the helper and uses a divide and conquer approach to parallelize this problem. This parallelization can at most accelerate the merging by a factor of 2. + * + * \param to_bp_areas[in] The Elements of the current Layer that will reach the buildplate. + * Value is the influence area where the center of a circle of support may be placed. + * \param to_model_areas[in] The Elements of the current Layer that do not have to reach the buildplate. Also contains main as every element that can reach the buildplate is not forced to. + * Value is the influence area where the center of a circle of support may be placed. + * \param influence_areas[in] The Elements of the current Layer without avoidances removed. This is the largest possible influence area for this layer. + * Value is the influence area where the center of a circle of support may be placed. + * \param layer_idx[in] The current layer. + */ +static void mergeInfluenceAreas( + const TreeModelVolumes &volumes, const TreeSupport::TreeSupportSettings &config, + std::unordered_map& to_bp_areas, std::unordered_map& to_model_areas, std::map& influence_areas, LayerIndex layer_idx) +{ + using SupportElement = TreeSupport::SupportElement; + /* + * Idea behind this is that the calculation of merges can be accelerated a bit using divide and conquer: + * If two groups of areas are already merged, only all elements in group 2 have to be merged into group one. + * This can only accelerate by factor 2 (as half the work is merging the last two groups). + * The actual merge logic is found in mergeHelper. This function only manages parallelization of different mergeHelper calls. + */ + + const size_t input_size = influence_areas.size(); + if (input_size == 0) + return; + + size_t num_threads = std::max(size_t(1), size_t(std::thread::hardware_concurrency())); // For some reason hardware concurrency can return 0; + constexpr int min_elements_per_bucket = 2; + + // max_bucket_count is input_size/min_elements_per_bucket round down to the next 2^n. + // The rounding to 2^n is to ensure improved performance, as every iteration two buckets will be merged, halving the amount of buckets. + // If halving would cause an uneven count, e.g. 3 Then bucket 0 and 1 would have to be merged, and in the next iteration the last remaining buckets. This is assumed to not be optimal performance-wise. + const size_t max_bucket_count = std::pow(2, std::floor(std::log(round_up_divide(input_size, min_elements_per_bucket)))); + int bucket_count = std::min(max_bucket_count, num_threads); // do not use more buckets than available threads. + + // To achieve that every element in a bucket is already correctly merged with other elements in this bucket + // an extra empty bucket is created for each bucket, and the elements are merged into the empty one. + // Each thread will then process two buckets by merging all elements in the second bucket into the first one as mergeHelper will disable not trying to merge elements from the same bucket in this case. + std::vector> buckets_area(2 * bucket_count); + std::vector> buckets_aabb(2 * bucket_count); + + size_t position = 0, counter = 0; + const size_t over_elements = input_size % bucket_count; + const size_t elements_per_step = input_size / bucket_count; + + // split the data in x parts to be able to divide and conquer + // the first "over_elements" of buckets gets elements_per_step+1 elements + for (std::map::iterator iter = influence_areas.begin(); iter != influence_areas.end(); ++ iter) { + buckets_area[position * 2 + 1].emplace(iter->first, iter->second); // only use every second bucket beginning with 1 as this makes the parallel call later easier as we assume everything in a bucket i%2==0 is already processed + ++ counter; + if ((counter == elements_per_step && position >= over_elements) || counter > elements_per_step) { + position++; + counter = 0; + } + } + + // precalculate the AABBs from the influence areas. + tbb::parallel_for(tbb::blocked_range(0, bucket_count), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + // +=2 as in the beginning only uneven buckets will be filled + size_t bucket_idx = 2 * idx + 1; + for (const std::pair& input_pair : buckets_area[bucket_idx]) + buckets_aabb[bucket_idx].emplace(input_pair.first, get_extents(input_pair.second).inflated(config.getRadius(input_pair.first))); + } + }); + + while (buckets_area.size() > 1) { + // Some temporary storage, of elements that have to be inserted or removed from the background storage. Only one per two buckets required + std::vector> insert_main(buckets_area.size() / 2); + std::vector> insert_secondary(buckets_area.size() / 2); + std::vector> insert_influence(buckets_area.size() / 2); + std::vector> erase(buckets_area.size() / 2); + + tbb::parallel_for(tbb::blocked_range(0, buckets_area.size() / 2), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + const size_t bucket_pair_idx = idx * 2; + // Merge bucket_count adjacent to each other, merging uneven bucket numbers into even buckets + mergeHelper(volumes, config, buckets_aabb[bucket_pair_idx], buckets_aabb[bucket_pair_idx + 1], to_bp_areas, to_model_areas, influence_areas, insert_main[bucket_pair_idx / 2], insert_secondary[bucket_pair_idx / 2], insert_influence[bucket_pair_idx / 2], erase[bucket_pair_idx / 2], layer_idx); + // clear now irrelevant max_bucket_count, and delete them later + buckets_area[bucket_pair_idx + 1].clear(); + buckets_aabb[bucket_pair_idx + 1].clear(); + } + }); + + for (size_t i = 0; i + 1 < buckets_area.size(); i += 2) { + for (SupportElement &del : erase[i / 2]) { + to_bp_areas.erase(del); + to_model_areas.erase(del); + influence_areas.erase(del); + } + for (const std::pair &tup : insert_main[i / 2]) + to_bp_areas.emplace(std::move(tup)); + for (const std::pair &tup : insert_secondary[i / 2]) + to_model_areas.emplace(std::move(tup)); + for (const std::pair &tup : insert_influence[i / 2]) + influence_areas.emplace(std::move(tup)); + } + + buckets_area.erase(std::remove_if(buckets_area.begin(), buckets_area.end(), [&](const std::map &x) { return x.empty(); }), buckets_area.end()); + buckets_aabb.erase(std::remove_if(buckets_aabb.begin(), buckets_aabb.end(), [&](const std::map &x) { return x.empty(); }), buckets_aabb.end()); + } +} + + +std::optional TreeSupport::increaseSingleArea(AreaIncreaseSettings settings, LayerIndex layer_idx, SupportElement* parent, const Polygons& relevant_offset, Polygons& to_bp_data, Polygons& to_model_data, Polygons& increased, const coord_t overspeed, const bool mergelayer) +{ + SupportElement current_elem(parent); // also increases DTT by one + Polygons check_layer_data; + if (settings.increase_radius) + current_elem.effective_radius_height += 1; + coord_t radius = m_config.getCollisionRadius(current_elem); + + if (settings.move) { + increased = relevant_offset; + if (overspeed > 0) { + const coord_t safe_movement_distance = (current_elem.use_min_xy_dist ? m_config.xy_min_distance : m_config.xy_distance) + (std::min(m_config.z_distance_top_layers, m_config.z_distance_bottom_layers) > 0 ? m_config.min_feature_size : 0); + // The difference to ensure that the result not only conforms to wall_restriction, but collision/avoidance is done later. The higher last_safe_step_movement_distance comes exactly from the fact that the collision will be subtracted later. + increased = safeOffsetInc(increased, overspeed, m_volumes.getWallRestriction(m_config.getCollisionRadius(*parent), layer_idx, parent->use_min_xy_dist), safe_movement_distance, safe_movement_distance + radius, 1); + } + if (settings.no_error && settings.move) + // as ClipperLib::jtRound has to be used for offsets this simplify is VERY important for performance. + polygons_simplify(increased, scaled(0.025)); + } else + // if no movement is done the areas keep parent area as no move == offset(0) + increased = *parent->area; + + if (mergelayer || current_elem.to_buildplate) { + to_bp_data = safeUnion(diff_clipped(increased, m_volumes.getAvoidance(radius, layer_idx - 1, settings.type, false, settings.use_min_distance))); + if (! current_elem.to_buildplate && area(to_bp_data) > tiny_area_threshold) { + // mostly happening in the tip, but with merges one should check every time, just to be sure. + current_elem.to_buildplate = true; // sometimes nodes that can reach the buildplate are marked as cant reach, tainting subtrees. This corrects it. + BOOST_LOG_TRIVIAL(debug) << "Corrected taint leading to a wrong to model value on layer " << layer_idx - 1 << " targeting " << current_elem.target_height << " with radius " << radius; + } + } + if (m_config.support_rests_on_model) { + if (mergelayer || current_elem.to_model_gracious) + to_model_data = safeUnion(diff_clipped(increased, m_volumes.getAvoidance(radius, layer_idx - 1, settings.type, true, settings.use_min_distance))); + + if (!current_elem.to_model_gracious) { + if (mergelayer && area(to_model_data) >= tiny_area_threshold) { + current_elem.to_model_gracious = true; + BOOST_LOG_TRIVIAL(debug) << "Corrected taint leading to a wrong non gracious value on layer " << layer_idx - 1 << " targeting " << current_elem.target_height << " with radius " << radius; + } else + to_model_data = safeUnion(diff_clipped(increased, m_volumes.getCollision(radius, layer_idx - 1, settings.use_min_distance))); + } + } + + check_layer_data = current_elem.to_buildplate ? to_bp_data : to_model_data; + + if (settings.increase_radius && area(check_layer_data) > tiny_area_threshold) { + auto validWithRadius = [&](coord_t next_radius) { + if (m_volumes.ceilRadius(next_radius, settings.use_min_distance) <= m_volumes.ceilRadius(radius, settings.use_min_distance)) + return true; + + Polygons to_bp_data_2; + if (current_elem.to_buildplate) + to_bp_data_2 = diff_clipped(increased, m_volumes.getAvoidance(next_radius, layer_idx - 1, settings.type, false, settings.use_min_distance)); // regular union as output will not be used later => this area should always be a subset of the safeUnion one (i think) + Polygons to_model_data_2; + if (m_config.support_rests_on_model && !current_elem.to_buildplate) + to_model_data_2 = diff_clipped(increased, + current_elem.to_model_gracious ? + m_volumes.getAvoidance(next_radius, layer_idx - 1, settings.type, true, settings.use_min_distance) : + m_volumes.getCollision(next_radius, layer_idx - 1, settings.use_min_distance)); + Polygons check_layer_data_2 = current_elem.to_buildplate ? to_bp_data_2 : to_model_data_2; + return area(check_layer_data_2) > tiny_area_threshold; + }; + coord_t ceil_radius_before = m_volumes.ceilRadius(radius, settings.use_min_distance); + + if (m_config.getCollisionRadius(current_elem) < m_config.increase_radius_until_radius && m_config.getCollisionRadius(current_elem) < m_config.getRadius(current_elem)) { + coord_t target_radius = std::min(m_config.getRadius(current_elem), m_config.increase_radius_until_radius); + coord_t current_ceil_radius = m_volumes.getRadiusNextCeil(radius, settings.use_min_distance); + + while (current_ceil_radius < target_radius && validWithRadius(m_volumes.getRadiusNextCeil(current_ceil_radius + 1, settings.use_min_distance))) + current_ceil_radius = m_volumes.getRadiusNextCeil(current_ceil_radius + 1, settings.use_min_distance); + size_t resulting_eff_dtt = current_elem.effective_radius_height; + while (resulting_eff_dtt + 1 < current_elem.distance_to_top && m_config.getRadius(resulting_eff_dtt + 1, current_elem.elephant_foot_increases) <= current_ceil_radius && m_config.getRadius(resulting_eff_dtt + 1, current_elem.elephant_foot_increases) <= m_config.getRadius(current_elem)) + resulting_eff_dtt++; + current_elem.effective_radius_height = resulting_eff_dtt; + } + radius = m_config.getCollisionRadius(current_elem); + + const coord_t foot_radius_increase = m_config.branch_radius * (std::max(m_config.diameter_scale_bp_radius - m_config.diameter_angle_scale_factor, 0.0)); + // Is nearly all of the time 1, but sometimes an increase of 1 could cause the radius to become bigger than recommendedMinRadius, which could cause the radius to become bigger than precalculated. + double planned_foot_increase = std::min(1.0, double(m_config.recommendedMinRadius(layer_idx - 1) - m_config.getRadius(current_elem)) / foot_radius_increase); +//FIXME + bool increase_bp_foot = planned_foot_increase > 0 && current_elem.to_buildplate; +// bool increase_bp_foot = false; + + if (increase_bp_foot && m_config.getRadius(current_elem) >= m_config.branch_radius && m_config.getRadius(current_elem) >= m_config.increase_radius_until_radius) + if (validWithRadius(m_config.getRadius(current_elem.effective_radius_height, current_elem.elephant_foot_increases + planned_foot_increase))) { + current_elem.elephant_foot_increases += planned_foot_increase; + radius = m_config.getCollisionRadius(current_elem); + } + + if (ceil_radius_before != m_volumes.ceilRadius(radius, settings.use_min_distance)) { + if (current_elem.to_buildplate) + to_bp_data = safeUnion(diff_clipped(increased, m_volumes.getAvoidance(radius, layer_idx - 1, settings.type, false, settings.use_min_distance))); + if (m_config.support_rests_on_model && (!current_elem.to_buildplate || mergelayer)) + to_model_data = safeUnion(diff_clipped(increased, + current_elem.to_model_gracious ? + m_volumes.getAvoidance(radius, layer_idx - 1, settings.type, true, settings.use_min_distance) : + m_volumes.getCollision(radius, layer_idx - 1, settings.use_min_distance) + )); + check_layer_data = current_elem.to_buildplate ? to_bp_data : to_model_data; + if (area(check_layer_data) < tiny_area_threshold) { + BOOST_LOG_TRIVIAL(error) << "Lost area by doing catch up from " << ceil_radius_before << " to radius " << m_volumes.ceilRadius(m_config.getCollisionRadius(current_elem), settings.use_min_distance); + TreeSupport::showError("Area lost catching up radius. May not cause visible malformation.", true); + } + } + } + + return area(check_layer_data) > tiny_area_threshold ? std::optional(current_elem) : std::optional(); +} + +void TreeSupport::increaseAreas(std::unordered_map& to_bp_areas, std::unordered_map& to_model_areas, std::map& influence_areas, std::vector& bypass_merge_areas, const std::vector& last_layer, const LayerIndex layer_idx, const bool mergelayer) +{ + std::mutex critical_sections; + tbb::parallel_for(tbb::blocked_range(0, last_layer.size()), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + SupportElement* parent = last_layer[idx]; + + SupportElement elem(parent); // also increases dtt + + const Polygons &wall_restriction = m_volumes.getWallRestriction(m_config.getCollisionRadius(*parent), layer_idx, parent->use_min_xy_dist); // Abstract representation of the model outline. If an influence area would move through it, it could teleport through a wall. + + Polygons to_bp_data, to_model_data; + coord_t radius = m_config.getCollisionRadius(elem); + + // When the radius increases, the outer "support wall" of the branch will have been moved farther away from the center (as this is the definition of radius). + // As it is not specified that the support_tree_angle has to be one of the center of the branch, it is here seen as the smaller angle of the outer wall of the branch, to the outer wall of the same branch one layer above. + // As the branch may have become larger the distance between these 2 walls is smaller than the distance of the center points. + // These extra distance is added to the movement distance possible for this layer. + + coord_t extra_speed = 5; // The extra speed is added to both movement distances. Also move 5 microns faster than allowed to avoid rounding errors, this may cause issues at VERY VERY small layer heights. + coord_t extra_slow_speed = 0; // Only added to the slow movement distance. + const coord_t ceiled_parent_radius = m_volumes.ceilRadius(m_config.getCollisionRadius(*parent), parent->use_min_xy_dist); + coord_t projected_radius_increased = m_config.getRadius(parent->effective_radius_height + 1, parent->elephant_foot_increases); + coord_t projected_radius_delta = projected_radius_increased - m_config.getCollisionRadius(*parent); + + // When z distance is more than one layer up and down the Collision used to calculate the wall restriction will always include the wall (and not just the xy_min_distance) of the layer above and below like this (d = blocked area because of z distance): + /* + * layer z+1:dddddiiiiiioooo + * layer z+0:xxxxxdddddddddd + * layer z-1:dddddxxxxxxxxxx + * For more detailed visualisation see calculateWallRestrictions + */ + const coord_t safe_movement_distance = (elem.use_min_xy_dist ? m_config.xy_min_distance : m_config.xy_distance) + (std::min(m_config.z_distance_top_layers, m_config.z_distance_bottom_layers) > 0 ? m_config.min_feature_size : 0); + if (ceiled_parent_radius == m_volumes.ceilRadius(projected_radius_increased, parent->use_min_xy_dist) || projected_radius_increased < m_config.increase_radius_until_radius) + // If it is guaranteed possible to increase the radius, the maximum movement speed can be increased, as it is assumed that the maximum movement speed is the one of the slower moving wall + extra_speed += projected_radius_delta; + else + // if a guaranteed radius increase is not possible, only increase the slow speed + extra_slow_speed += std::min(projected_radius_delta, (m_config.maximum_move_distance + extra_speed) - (m_config.maximum_move_distance_slow + extra_slow_speed)); // Ensure that the slow movement distance can not become larger than the fast one. + + if (m_config.layer_start_bp_radius > layer_idx && m_config.recommendedMinRadius(layer_idx - 1) < m_config.getRadius(elem.effective_radius_height + 1, elem.elephant_foot_increases)) { + // can guarantee elephant foot radius increase + if (ceiled_parent_radius == m_volumes.ceilRadius(m_config.getRadius(parent->effective_radius_height + 1, parent->elephant_foot_increases + 1), parent->use_min_xy_dist)) + extra_speed += m_config.branch_radius * m_config.diameter_scale_bp_radius; + else + extra_slow_speed += std::min(coord_t(m_config.branch_radius * m_config.diameter_scale_bp_radius), m_config.maximum_move_distance - (m_config.maximum_move_distance_slow + extra_slow_speed)); + } + + const coord_t fast_speed = m_config.maximum_move_distance + extra_speed; + const coord_t slow_speed = m_config.maximum_move_distance_slow + extra_speed + extra_slow_speed; + + Polygons offset_slow, offset_fast; + + bool add = false; + bool bypass_merge = false; + constexpr bool increase_radius = true, no_error = true, use_min_radius = true, move = true; // aliases for better readability + + // Determine in which order configurations are checked if they result in a valid influence area. Check will stop if a valid area is found + std::vector order; + auto insertSetting = [&](AreaIncreaseSettings settings, bool back) { + if (std::find(order.begin(), order.end(), settings) == order.end()) { + if (back) + order.emplace_back(settings); + else + order.insert(order.begin(), settings); + } + }; + + const bool parent_moved_slow = elem.last_area_increase.increase_speed < m_config.maximum_move_distance; + const bool avoidance_speed_mismatch = parent_moved_slow && elem.last_area_increase.type != AvoidanceType::Slow; + if (elem.last_area_increase.move && elem.last_area_increase.no_error && elem.can_use_safe_radius && !mergelayer && !avoidance_speed_mismatch && (elem.distance_to_top >= m_config.tip_layers || parent_moved_slow)) + { + // assume that the avoidance type that was best for the parent is best for me. Makes this function about 7% faster. + insertSetting({ elem.last_area_increase.type, elem.last_area_increase.increase_speed < m_config.maximum_move_distance ? slow_speed : fast_speed, increase_radius, elem.last_area_increase.no_error, !use_min_radius, elem.last_area_increase.move }, true); + insertSetting({ elem.last_area_increase.type, elem.last_area_increase.increase_speed < m_config.maximum_move_distance ? slow_speed : fast_speed, !increase_radius, elem.last_area_increase.no_error, !use_min_radius, elem.last_area_increase.move }, true); + } + // branch may still go though a hole, so a check has to be done whether the hole was already passed, and the regular avoidance can be used. + if (!elem.can_use_safe_radius) + { + // if the radius until which it is always increased can not be guaranteed, move fast. This is to avoid holes smaller than the real branch radius. This does not guarantee the avoidance of such holes, but ensures they are avoided if possible. + // order.emplace_back(AvoidanceType::Slow,!increase_radius,no_error,!use_min_radius,move); + insertSetting({ AvoidanceType::Slow, slow_speed, increase_radius, no_error, !use_min_radius, !move }, true); // did we go through the hole + // in many cases the definition of hole is overly restrictive, so to avoid unnecessary fast movement in the tip, it is ignored there for a bit. This CAN cause a branch to go though a hole it otherwise may have avoided. + if (elem.distance_to_top < round_up_divide(m_config.tip_layers, size_t(2))) + insertSetting({ AvoidanceType::Fast, slow_speed, increase_radius, no_error, !use_min_radius, !move }, true); + insertSetting({ AvoidanceType::FastSafe, fast_speed, increase_radius, no_error, !use_min_radius, !move }, true); // did we manage to avoid the hole + insertSetting({ AvoidanceType::FastSafe, fast_speed, !increase_radius, no_error, !use_min_radius, move }, true); + insertSetting({ AvoidanceType::Fast, fast_speed, !increase_radius, no_error, !use_min_radius, move }, true); + } + else + { + insertSetting({ AvoidanceType::Slow, slow_speed, increase_radius, no_error, !use_min_radius, move }, true); + // while moving fast to be able to increase the radius (b) may seems preferable (over a) this can cause the a sudden skip in movement, which looks similar to a layer shift and can reduce stability. + // as such idx have chosen to only use the user setting for radius increases as a friendly recommendation. + insertSetting({ AvoidanceType::Slow, slow_speed, !increase_radius, no_error, !use_min_radius, move }, true); // a + if (elem.distance_to_top < m_config.tip_layers) + { + insertSetting({ AvoidanceType::FastSafe, slow_speed, increase_radius, no_error, !use_min_radius, move }, true); + } + insertSetting({ AvoidanceType::FastSafe, fast_speed, increase_radius, no_error, !use_min_radius, move }, true); // b + insertSetting({ AvoidanceType::FastSafe, fast_speed, !increase_radius, no_error, !use_min_radius, move }, true); + } + + if (elem.use_min_xy_dist) + { + std::vector new_order; + // if the branch currently has to use min_xy_dist check if the configuration would also be valid with the regular xy_distance before checking with use_min_radius (Only happens when Support Distance priority is z overrides xy ) + for (AreaIncreaseSettings settings : order) + { + new_order.emplace_back(settings); + new_order.push_back({ settings.type, settings.increase_speed, settings.increase_radius, settings.no_error, use_min_radius, settings.move }); + } + order = new_order; + } + if (elem.to_buildplate || (elem.to_model_gracious && intersection(*parent->area, m_volumes.getPlaceableAreas(radius, layer_idx)).empty())) // error case + { + // it is normal that we wont be able to find a new area at some point in time if we wont be able to reach layer 0 aka have to connect with the model + insertSetting({ AvoidanceType::Fast, fast_speed, !increase_radius, !no_error, elem.use_min_xy_dist, move }, true); + } + if (elem.distance_to_top < elem.dont_move_until && elem.can_use_safe_radius) // only do not move when holes would be avoided in every case. + // Only do not move when already in a no hole avoidance with the regular xy distance. + insertSetting({ AvoidanceType::Slow, 0, increase_radius, no_error, !use_min_radius, !move }, false); + + Polygons inc_wo_collision; + // Check whether it is faster to calculate the area increased with the fast speed independently from the slow area, or time could be saved by reusing the slow area to calculate the fast one. + // Calculated by comparing the steps saved when calcualting idependently with the saved steps when not. + bool offset_independant_faster = (radius / safe_movement_distance - (((m_config.maximum_move_distance + extra_speed) < (radius + safe_movement_distance)) ? 1 : 0)) > (round_up_divide((extra_speed + extra_slow_speed + m_config.maximum_move_distance_slow), safe_movement_distance)); + for (AreaIncreaseSettings settings : order) + { + if (settings.move) { + if (offset_slow.empty() && (settings.increase_speed == slow_speed || !offset_independant_faster)) { + // offsetting in 2 steps makes our offsetted area rounder preventing (rounding) errors created by to pointy areas. At this point one can see that the Polygons class + // was never made for precision in the single digit micron range. + offset_slow = safeOffsetInc(*parent->area, extra_speed + extra_slow_speed + m_config.maximum_move_distance_slow, wall_restriction, safe_movement_distance, offset_independant_faster ? safe_movement_distance + radius : 0, 2); + } + + if ((settings.increase_speed != slow_speed) && offset_fast.empty()) { + if (offset_independant_faster) + offset_fast = safeOffsetInc(*parent->area, extra_speed + m_config.maximum_move_distance, wall_restriction, safe_movement_distance, offset_independant_faster ? safe_movement_distance + radius : 0, 1); + else { + const coord_t delta_slow_fast = m_config.maximum_move_distance - (m_config.maximum_move_distance_slow + extra_slow_speed); + offset_fast = safeOffsetInc(offset_slow, delta_slow_fast, wall_restriction, safe_movement_distance, safe_movement_distance + radius, offset_independant_faster ? 2 : 1); + } + } + } + std::optional result; + if (!settings.no_error) { + // ERROR CASE + // if the area becomes for whatever reason something that clipper sees as a line, offset would stop working, so ensure that even if if wrongly would be a line, it still actually has an area that can be increased + Polygons lines_offset = offset(to_polylines(*parent->area), scaled(0.005), jtMiter, 1.2); + Polygons base_error_area = union_(*parent->area, lines_offset); + result = increaseSingleArea(settings, layer_idx, parent, base_error_area, to_bp_data, to_model_data, inc_wo_collision, (m_config.maximum_move_distance + extra_speed) * 1.5, mergelayer); +#ifdef TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(error) +#else // TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(warning) +#endif // TREE_SUPPORT_SHOW_ERRORS + << "Influence area could not be increased! Data about the Influence area: " + "Radius: " << radius << " at layer: " << layer_idx - 1 << " NextTarget: " << elem.next_height << " Distance to top: " << elem.distance_to_top << + " Elephant foot increases " << elem.elephant_foot_increases << " use_min_xy_dist " << elem.use_min_xy_dist << " to buildplate " << elem.to_buildplate << + " gracious " << elem.to_model_gracious << " safe " << elem.can_use_safe_radius << " until move " << elem.dont_move_until << " \n " + "Parent " << parent << ": Radius: " << m_config.getCollisionRadius(*parent) << " at layer: " << layer_idx << " NextTarget: " << parent->next_height << + " Distance to top: " << parent->distance_to_top << " Elephant foot increases " << parent->elephant_foot_increases << " use_min_xy_dist " << parent->use_min_xy_dist << + " to buildplate " << parent->to_buildplate << " gracious " << parent->to_model_gracious << " safe " << parent->can_use_safe_radius << " until move " << parent->dont_move_until; + showError("Potentially lost branch!", true); + } else + result = increaseSingleArea(settings, layer_idx, parent, settings.increase_speed == slow_speed ? offset_slow : offset_fast, to_bp_data, to_model_data, inc_wo_collision, 0, mergelayer); + + if (result) + { + elem = *result; + radius = m_config.getCollisionRadius(elem); + elem.last_area_increase = settings; + add = true; + bypass_merge = !settings.move || (settings.use_min_distance && elem.distance_to_top < m_config.tip_layers); // do not merge if the branch should not move or the priority has to be to get farther away from the model. + if (settings.move) + elem.dont_move_until = 0; + else + elem.result_on_layer = parent->result_on_layer; + + elem.can_use_safe_radius = settings.type != AvoidanceType::Fast; + + if (!settings.use_min_distance) + elem.use_min_xy_dist = false; + if (!settings.no_error) +#ifdef TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(error) +#else // TREE_SUPPORT_SHOW_ERRORS + BOOST_LOG_TRIVIAL(info) +#endif // TREE_SUPPORT_SHOW_ERRORS + << "Trying to keep area by moving faster than intended: Success"; + break; + } + else if (!settings.no_error) + BOOST_LOG_TRIVIAL(error) << "Trying to keep area by moving faster than intended: FAILURE! WRONG BRANCHES LIKLY!"; + } + + if (add) { + Polygons max_influence_area = safeUnion(diff_clipped(inc_wo_collision, m_volumes.getCollision(radius, layer_idx - 1, elem.use_min_xy_dist)), safeUnion(to_bp_data, to_model_data)); // union seems useless, but some rounding errors somewhere can cause to_bp_data to be slightly bigger than it should be + { + std::lock_guard critical_section_newLayer(critical_sections); + if (bypass_merge) { + validate_range(max_influence_area); + Polygons* new_area = new Polygons(max_influence_area); + SupportElement* next = new SupportElement(elem, new_area); + bypass_merge_areas.emplace_back(next); + } else { + influence_areas.emplace(elem, max_influence_area); + if (elem.to_buildplate) + to_bp_areas.emplace(elem, to_bp_data); + if (m_config.support_rests_on_model) + to_model_areas.emplace(elem, to_model_data); + } + } + } + else + parent->result_on_layer = Point(-1, -1); // If the bottom most point of a branch is set, later functions will assume that the position is valid, and ignore it. But as branches connecting with the model that are to small have to be culled, the bottom most point has to be not set. A point can be set on the top most tip layer (maybe more if it should not move for a few layers). + } + }); +} + + +void TreeSupport::createLayerPathing(std::vector>& move_bounds) +{ +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + const double data_size_inverse = 1 / double(move_bounds.size()); + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + auto dur_inc = std::chrono::duration_values::zero(); + auto dur_merge = std::chrono::duration_values::zero(); + + LayerIndex last_merge = move_bounds.size(); + bool new_element = false; + + size_t max_merge_every_x_layers = std::min(std::min(5000 / (std::max(m_config.maximum_move_distance, coord_t(100))), 1000 / std::max(m_config.maximum_move_distance_slow, coord_t(20))), 3000 / m_config.layer_height); // Ensures at least one merge operation per 3mm height, 50 layers, 1 mm movement of slow speed or 5mm movement of fast speed (whatever is lowest). Values were guessed. + size_t merge_every_x_layers = 1; + // Calculate the influence areas for each layer below (Top down) + // This is done by first increasing the influence area by the allowed movement distance, and merging them with other influence areas if possible + for (int layer_idx = int(move_bounds.size()) - 1; layer_idx > 0; -- layer_idx) + { + // merging is expensive and only parallelized to a max speedup of 2. As such it may be useful in some cases to only merge every few layers to improve performance. + bool merge_this_layer = size_t(last_merge - layer_idx) >= merge_every_x_layers; + + if (new_element) + { + merge_this_layer = true; + merge_every_x_layers = 1; + } + + std::map influence_areas; // Over this map will be iterated when merging, as such it has to be ordered to ensure deterministic results. + std::unordered_map to_bp_areas, to_model_areas; // The area of these SupportElement is not set, to avoid to much allocation and deallocation on the heap + std::vector bypass_merge_areas; // Different to the other maps of SupportElements as these here have the area already set, as they are already to be inserted into move_bounds. + + auto ta = std::chrono::high_resolution_clock::now(); + + std::vector last_layer; + last_layer.insert(last_layer.begin(), move_bounds[layer_idx].begin(), move_bounds[layer_idx].end()); + + // ### Increase the influence areas by the allowed movement distance + increaseAreas(to_bp_areas, to_model_areas, influence_areas, bypass_merge_areas, last_layer, layer_idx, merge_this_layer); + + auto tb = std::chrono::high_resolution_clock::now(); + if (merge_this_layer) + { + bool reduced_by_merging = false; + size_t count_before_merge = influence_areas.size(); + // ### Calculate which influence areas overlap, and merge them into a new influence area (simplified: an intersection of influence areas that have such an intersection) + mergeInfluenceAreas(m_volumes, m_config, to_bp_areas, to_model_areas, influence_areas, layer_idx); + + last_merge = layer_idx; + reduced_by_merging = count_before_merge > influence_areas.size(); + if (!reduced_by_merging && !new_element) + { + merge_every_x_layers = std::min(max_merge_every_x_layers, merge_every_x_layers + 1); + } + } + auto tc = std::chrono::high_resolution_clock::now(); + + dur_inc += tb - ta; + dur_merge += tc - tb; + + new_element = !move_bounds[layer_idx - 1].empty(); + + // Save calculated elements to output, and allocate Polygons on heap, as they will not be changed again. + for (const std::pair &tup : influence_areas) { + const SupportElement &elem = tup.first; + validate_range(tup.second); + validate_range(safeUnion(tup.second)); + Polygons* new_area = new Polygons(safeUnion(tup.second)); + SupportElement* next = new SupportElement(elem, new_area); + move_bounds[layer_idx - 1].emplace(next); + + if (area(*new_area) < tiny_area_threshold) { + BOOST_LOG_TRIVIAL(error) << "Insert Error of Influence area on layer " << layer_idx - 1 << ". Origin of " << elem.parents.size() << " areas. Was to bp " << elem.to_buildplate; + TreeSupport::showError("Insert error of area after merge.\n", true); + } + } + + // Place already fully constructed elements in the output. + for (SupportElement* elem : bypass_merge_areas) { + if (area(*elem->area) < tiny_area_threshold) { + BOOST_LOG_TRIVIAL(error) << "Insert Error of Influence area bypass on layer " << layer_idx - 1; + TreeSupport::showError("Insert error of area after bypassing merge.\n", true); + } + move_bounds[layer_idx - 1].emplace(elem); + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + progress_total += data_size_inverse * TREE_PROGRESS_AREA_CALC; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); +#endif + } + + BOOST_LOG_TRIVIAL(info) << "Time spent with creating influence areas' subtasks: Increasing areas " << dur_inc.count() / 1000000 << " ms merging areas: " << dur_merge.count() / 1000000 << " ms"; +} + + +void TreeSupport::setPointsOnAreas(const SupportElement* elem) +{ + // Based on the branch center point of the current layer, the point on the next (further up) layer is calculated. + + if (elem->result_on_layer == Point(-1, -1)) + { + BOOST_LOG_TRIVIAL(error) << "Uninitialized support element"; + TreeSupport::showError("Uninitialized support element. A branch may be missing.\n", true); + return; + } + + for (SupportElement* next_elem : elem->parents) + { + if (next_elem->result_on_layer != Point(-1, -1)) // if the value was set somewhere else it it kept. This happens when a branch tries not to move after being unable to create a roof. + continue; + + Point from = elem->result_on_layer; + if (! contains(*next_elem->area, from)) { + moveInside(*next_elem->area, from, 0); // Move inside has edgecases (see tests) so DONT use Polygons.inside to confirm correct move, Error with distance 0 is <= 1 + // it is not required to check if how far this move moved a point as is can be larger than maximum_movement_distance. While this seems like a problem it may for example occur after merges. + } + next_elem->result_on_layer = from; + // do not call recursive because then amount of layers would be restricted by the stack size + } +} + +bool TreeSupport::setToModelContact(std::vector>& move_bounds, SupportElement* first_elem, const LayerIndex layer_idx) +{ + if (first_elem->to_model_gracious) + { + SupportElement* check = first_elem; + + std::vector checked; + LayerIndex last_successfull_layer = layer_idx; + bool set = false; + + // check for every layer upwards, up to the point where this influence area was created (either by initial insert or merge) if the branch could be placed on it, and highest up layer index. + + for (LayerIndex layer_check = layer_idx; check->next_height >= layer_check; layer_check++) + { + if (! intersection(*check->area, m_volumes.getPlaceableAreas(m_config.getCollisionRadius(*check), layer_check)).empty()) { + set = true; + last_successfull_layer = layer_check; + } + checked.emplace_back(check); + if (check->parents.size() == 1) + { + check = check->parents[0]; + } + else + { + break; // reached merge point + } + } + + // Could not find valid placement, even though it should exist => error handling + if (!set) + { + if (SUPPORT_TREE_ONLY_GRACIOUS_TO_MODEL) + { + BOOST_LOG_TRIVIAL(warning) << "No valid placement found for to model gracious element on layer " << layer_idx << ": REMOVING BRANCH"; + TreeSupport::showError("Could not fine valid placement on model! Removing this branch...", true); + for (LayerIndex layer = layer_idx; layer <= first_elem->next_height; layer++) + { + move_bounds[layer].erase(checked[layer - layer_idx]); + delete checked[layer - layer_idx]->area; + delete checked[layer - layer_idx]; + } + } + else + { + BOOST_LOG_TRIVIAL(warning) << "No valid placement found for to model gracious element on layer " << layer_idx; + TreeSupport::showError("Could not fine valid placement on model! Just placing it down anyway. Could cause floating branches.", true); + first_elem->to_model_gracious = false; + return setToModelContact(move_bounds, first_elem, layer_idx); + } + } + + for (LayerIndex layer = layer_idx + 1; layer < last_successfull_layer - 1; layer++) + { + move_bounds[layer].erase(checked[layer - layer_idx]); + delete checked[layer - layer_idx]->area; + delete checked[layer - layer_idx]; + } + + // Guess a point inside the influence area, in which the branch will be placed in. + Point best = checked[last_successfull_layer - layer_idx]->next_position; + if (! contains(*checked[last_successfull_layer - layer_idx]->area, best)) + moveInside(*checked[last_successfull_layer - layer_idx]->area, best); + checked[last_successfull_layer - layer_idx]->result_on_layer = best; + + BOOST_LOG_TRIVIAL(debug) << "Added gracious Support On Model Point (" << best.x() << "," << best.y() << "). The current layer is " << last_successfull_layer; + + return last_successfull_layer != layer_idx; + } + else // can not add graceful => just place it here and hope for the best + { + Point best = first_elem->next_position; + if (! contains(*first_elem->area, best)) + moveInside(*first_elem->area, best); + first_elem->result_on_layer = best; + first_elem->to_model_gracious = false; + BOOST_LOG_TRIVIAL(debug) << "Added NON gracious Support On Model Point (" << best.x() << "," << best.y() << "). The current layer is " << layer_idx; + return false; + } +} + +void TreeSupport::createNodesFromArea(std::vector>& move_bounds) +{ + // Initialize points on layer 0, with a "random" point in the influence area. Point is chosen based on an inaccurate estimate where the branches will split into two, but every point inside the influence area would produce a valid result. + for (SupportElement* init : move_bounds[0]) { + Point p = init->next_position; + if (! contains(*init->area, p)) + moveInside(*init->area, p, 0); + init->result_on_layer = p; + setPointsOnAreas(init); // also set the parent nodes, as these will be required for the first iteration of the loop below + } + + for (LayerIndex layer_idx = 1; layer_idx < LayerIndex(move_bounds.size()); ++ layer_idx) { + std::unordered_set remove; + for (SupportElement* elem : move_bounds[layer_idx]) { + bool removed = false; + // check if the resulting center point is not yet set + if (elem->result_on_layer == Point(-1, -1)) { + if (elem->to_buildplate || (!elem->to_buildplate && elem->distance_to_top < m_config.min_dtt_to_model && !elem->supports_roof)) { + if (elem->to_buildplate) { + BOOST_LOG_TRIVIAL(error) << "Uninitialized Influence area targeting " << elem->target_position.x() << "," << elem->target_position.y() << ") " + "at target_height: " << elem->target_height << " layer: " << layer_idx; + TreeSupport::showError("Uninitialized support element! A branch could be missing or exist partially.", true); + } + remove.emplace(elem); // we dont need to remove yet the parents as they will have a lower dtt and also no result_on_layer set + removed = true; + for (SupportElement* parent : elem->parents) + parent->result_on_layer = Point(-1, -1); // When the roof was not able to generate downwards enough, the top elements may have not moved, and have result_on_layer already set. As this branch needs to be removed => all parents result_on_layer have to be invalidated. + continue; + } else { + // set the point where the branch will be placed on the model + removed = setToModelContact(move_bounds, elem, layer_idx); + if (removed) + remove.emplace(elem); + } + } + + if (!removed) + setPointsOnAreas(elem); // element is valid now setting points in the layer above + } + + // delete all not needed support elements + for (SupportElement* del : remove) { + move_bounds[layer_idx].erase(del); + delete del->area; + delete del; + } + remove.clear(); + } +} + +void TreeSupport::generateBranchAreas( + std::vector> &linear_data, + std::vector> &layer_tree_polygons, + const std::map &inverse_tree_order) +{ +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES + TREE_PROGRESS_AREA_CALC; + constexpr int progress_report_steps = 10; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + Polygon branch_circle; // Pre-generate a circle with correct diameter so that we don't have to recompute those (co)sines every time. + for (unsigned int i = 0; i < SUPPORT_TREE_CIRCLE_RESOLUTION; ++ i) { + const double angle = static_cast(i) / SUPPORT_TREE_CIRCLE_RESOLUTION * (2.0 * M_PI); + branch_circle.points.emplace_back(coord_t(cos(angle) * m_config.branch_radius), coord_t(sin(angle) * m_config.branch_radius)); + } + + std::vector linear_inserts(linear_data.size()); + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + const size_t progress_inserts_check_interval = linear_data.size() / progress_report_steps; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + std::mutex critical_sections; + tbb::parallel_for(tbb::blocked_range(0, linear_data.size()), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + const LayerIndex layer_idx = linear_data[idx].first; + const SupportElement *elem = linear_data[idx].second; + const auto it_elem = inverse_tree_order.find(const_cast(elem)); + const SupportElement* child_elem = it_elem == inverse_tree_order.end() ? nullptr : it_elem->second; + const coord_t radius = m_config.getRadius(*elem); + bool parent_uses_min = false; + + // Calculate multiple ovalized circles, to connect with every parent and child. Also generate regular circle for the current layer. Merge all these into one area. + std::vector> movement_directions{ std::pair(Point(0, 0), radius) }; + if (!elem->skip_ovalisation) { + if (child_elem != nullptr) { + const Point movement = child_elem->result_on_layer - elem->result_on_layer; + movement_directions.emplace_back(movement, radius); + } + for (SupportElement *parent : elem->parents) { + const Point movement = parent->result_on_layer - elem->result_on_layer; + movement_directions.emplace_back(movement, std::max(m_config.getRadius(*parent), m_config.support_line_width)); + parent_uses_min |= parent->use_min_xy_dist; + } + } + + double max_speed = 0; + auto generateArea = [&volumes = m_volumes, layer_idx, elem, &branch_circle, branch_radius = m_config.branch_radius, support_line_width = m_config.support_line_width, &movement_directions, &max_speed, parent_uses_min]( + coord_t aoffset) { + Polygons poly; + + for (std::pair movement : movement_directions) { + max_speed = std::max(max_speed, movement.first.cast().norm()); + + // Visualization: https://jsfiddle.net/0zvcq39L/2/ + // Ovalizes the circle to an ellipse, that contains both old center and new target position. + double used_scale = (movement.second + aoffset) / (1.0 * branch_radius); + Point center_position = elem->result_on_layer + movement.first / 2; + const double moveX = movement.first.x() / (used_scale * branch_radius); + const double moveY = movement.first.y() / (used_scale * branch_radius); + const double vsize_inv = 0.5 / (0.01 + std::sqrt(moveX * moveX + moveY * moveY)); + + double matrix[] = { + used_scale * (1 + moveX * moveX * vsize_inv), + used_scale * (0 + moveX * moveY * vsize_inv), + used_scale * (0 + moveX * moveY * vsize_inv), + used_scale * (1 + moveY * moveY * vsize_inv), + }; + Polygon circle; + for (Point vertex : branch_circle) + circle.points.emplace_back(center_position + Point(matrix[0] * vertex.x() + matrix[1] * vertex.y(), matrix[2] * vertex.x() + matrix[3] * vertex.y())); + poly.emplace_back(std::move(circle)); + } + + poly = diff_clipped(offset(union_(poly), std::min(coord_t(50), support_line_width / 4), jtMiter, 1.2), + volumes.getCollision(0, layer_idx, parent_uses_min || elem->use_min_xy_dist)); // There seem to be some rounding errors, causing a branch to be a tiny bit further away from the model that it has to be. This can cause the tip to be slightly further away front the overhang (x/y wise) than optimal. This fixes it, and for every other part, 0.05mm will not be noticed. + return poly; + }; + + bool fast_relative_movement = max_speed > radius * 0.75; + + // ensure branch area will not overlap with model/collision. This can happen because of e.g. ovalization or increase_until_radius. + linear_inserts[idx] = generateArea(0); + + if (fast_relative_movement || m_config.getRadius(*elem) - m_config.getCollisionRadius(*elem) > m_config.support_line_width) { + // simulate the path the nozzle will take on the outermost wall + // if multiple parts exist, the outer line will not go all around the support part potentially causing support material to be printed mid air + ExPolygons nozzle_path = offset_ex(linear_inserts[idx], -m_config.support_line_width / 2); + if (nozzle_path.size() > 1) { + // Just try to make the area a tiny bit larger. + linear_inserts[idx] = generateArea(m_config.support_line_width / 2); + nozzle_path = offset_ex(linear_inserts[idx], -m_config.support_line_width / 2); + + // if larger area did not fix the problem, all parts off the nozzle path that do not contain the center point are removed, hoping for the best + if (nozzle_path.size() > 1) { + Polygons polygons_with_correct_center; + for (ExPolygon &part : nozzle_path) { + if (part.contains(elem->result_on_layer)) + polygons_with_correct_center = union_(polygons_with_correct_center, part); + else { + // try a fuzzy inside as sometimes the point should be on the border, but is not because of rounding errors... + Point from = elem->result_on_layer; + Polygons to = to_polygons(std::move(part)); + moveInside(to, from, 0); + if ((elem->result_on_layer - from).cast().norm() < scaled(0.025)) + polygons_with_correct_center = union_(polygons_with_correct_center, to); + } + } + // Increase the area again, to ensure the nozzle path when calculated later is very similar to the one assumed above. + linear_inserts[idx] = offset(polygons_with_correct_center, m_config.support_line_width / 2, jtMiter, 1.2); + linear_inserts[idx] = diff_clipped(linear_inserts[idx], m_volumes.getCollision(0, linear_data[idx].first, parent_uses_min || elem->use_min_xy_dist)); + } + } + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + if (idx % progress_inserts_check_interval == 0) { + std::lock_guard critical_section_progress(critical_sections); + progress_total += TREE_PROGRESS_GENERATE_BRANCH_AREAS / progress_report_steps; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } +#endif + } + }); + + // single threaded combining all elements to the right layers. ONLY COPYS DATA! + for (coord_t i = 0; i < static_cast(linear_data.size()); i++) + layer_tree_polygons[linear_data[i].first].emplace(linear_data[i].second, linear_inserts[i]); +} + +void TreeSupport::smoothBranchAreas(std::vector>& layer_tree_polygons) +{ +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES + TREE_PROGRESS_AREA_CALC + TREE_PROGRESS_GENERATE_BRANCH_AREAS; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + const coord_t max_radius_change_per_layer = 1 + m_config.support_line_width / 2; // this is the upper limit a radius may change per layer. +1 to avoid rounding errors + + // smooth upwards + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(layer_tree_polygons.size()) - 1; ++ layer_idx) { + std::vector> processing; + processing.insert(processing.end(), layer_tree_polygons[layer_idx].begin(), layer_tree_polygons[layer_idx].end()); + std::vector>> update_next(processing.size()); // with this a lock can be avoided + + tbb::parallel_for(tbb::blocked_range(0, processing.size()), + [&](const tbb::blocked_range &range) { + for (size_t processing_idx = range.begin(); processing_idx < range.end(); ++ processing_idx) { + std::pair data_pair = processing[processing_idx]; + double max_outer_wall_distance = 0; + bool do_something = false; + for (SupportElement* parent : data_pair.first->parents) + if (m_config.getRadius(*parent) != m_config.getCollisionRadius(*parent)) { + do_something = true; + max_outer_wall_distance = std::max(max_outer_wall_distance, (data_pair.first->result_on_layer - parent->result_on_layer).cast().norm() - (m_config.getRadius(*data_pair.first) - m_config.getRadius(*parent))); + } + max_outer_wall_distance += max_radius_change_per_layer; // As this change is a bit larger than what usually appears, lost radius can be slowly reclaimed over the layers. + if (do_something) { + Polygons max_allowed_area = offset(data_pair.second, float(max_outer_wall_distance), jtMiter, 1.2); + for (SupportElement* parent : data_pair.first->parents) + if (m_config.getRadius(*parent) != m_config.getCollisionRadius(*parent)) + update_next[processing_idx].emplace_back(std::pair(parent, intersection(layer_tree_polygons[layer_idx + 1][parent], max_allowed_area))); + } + } + }); + + for (std::vector> data_vector : update_next) + for (std::pair data_pair : data_vector) + layer_tree_polygons[layer_idx + 1][data_pair.first] = data_pair.second; + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + progress_total += TREE_PROGRESS_SMOOTH_BRANCH_AREAS / 2; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); // It is just assumed that both smoothing loops together are one third of the time spent in this function. This was guessed. As the whole function is only 10%, and the smoothing is hard to predict a progress report in the loop may be not useful. +#endif + + // smooth downwards + std::unordered_set updated_last_iteration; + for (int layer_idx = int(layer_tree_polygons.size()) - 2; layer_idx >= 0; -- layer_idx) { + std::vector> processing; + processing.insert(processing.end(), layer_tree_polygons[layer_idx].begin(), layer_tree_polygons[layer_idx].end()); + std::vector> update_next(processing.size(), std::pair(nullptr, Polygons())); // with this a lock can be avoided + + tbb::parallel_for(tbb::blocked_range(0, processing.size()), + [&](const tbb::blocked_range &range) { + for (size_t processing_idx = range.begin(); processing_idx < range.end(); ++ processing_idx) { + std::pair data_pair = processing[processing_idx]; + bool do_something = false; + Polygons max_allowed_area; + for (size_t idx = 0; idx < data_pair.first->parents.size(); ++ idx) { + SupportElement* parent = data_pair.first->parents[idx]; + coord_t max_outer_line_increase = max_radius_change_per_layer; + Polygons result = offset(layer_tree_polygons[layer_idx + 1][parent], max_outer_line_increase, jtMiter, 1.2); + Point direction = data_pair.first->result_on_layer - parent->result_on_layer; + // move the polygons object + for (auto& outer : result) + for (Point& p : outer) + p += direction; + append(max_allowed_area, std::move(result)); + do_something = do_something || updated_last_iteration.count(parent) || m_config.getCollisionRadius(*parent) != m_config.getRadius(*parent); + } + + if (do_something) { + Polygons result = intersection(max_allowed_area, data_pair.second); + if (area(result) < area(data_pair.second)) + update_next[processing_idx] = std::pair(data_pair.first, result); + } + } + }); + + updated_last_iteration.clear(); + for (std::pair data_pair : update_next) + if (data_pair.first != nullptr) { + updated_last_iteration.emplace(data_pair.first); + layer_tree_polygons[layer_idx][data_pair.first] = data_pair.second; + } + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + progress_total += TREE_PROGRESS_SMOOTH_BRANCH_AREAS / 2; + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); +#endif +} + +void TreeSupport::dropNonGraciousAreas( + std::vector> &layer_tree_polygons, + const std::vector> &linear_data, + std::vector>> &dropped_down_areas, + const std::map &inverse_tree_order) +{ + tbb::parallel_for(tbb::blocked_range(0, linear_data.size()), + [&](const tbb::blocked_range &range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + SupportElement* elem = linear_data[idx].second; + bool non_gracious_model_contact = !elem->to_model_gracious && !inverse_tree_order.count(elem); // if a element has no child, it connects to whatever is below as no support further down for it will exist. + if (non_gracious_model_contact) { + Polygons rest_support = layer_tree_polygons[linear_data[idx].first][elem]; + LayerIndex counter = 1; + while (area(rest_support) > tiny_area_threshold && counter < linear_data[idx].first) { + rest_support = diff_clipped(rest_support, m_volumes.getCollision(0, linear_data[idx].first - counter, false)); + dropped_down_areas[idx].emplace_back(linear_data[idx].first - counter, rest_support); + counter++; + } + } + } + }); +} + +void TreeSupport::finalizeInterfaceAndSupportAreas( + const PrintObject &print_object, + const std::vector &overhangs, + std::vector &support_layer_storage, + std::vector &support_roof_storage, + + SupportGeneratorLayersPtr &bottom_contacts, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage) +{ + InterfacePreference interface_pref = m_config.interface_preference; // InterfacePreference::SUPPORT_LINES_OVERWRITE_INTERFACE; + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + double progress_total = TREE_PROGRESS_PRECALC_AVO + TREE_PROGRESS_PRECALC_COLL + TREE_PROGRESS_GENERATE_NODES + TREE_PROGRESS_AREA_CALC + TREE_PROGRESS_GENERATE_BRANCH_AREAS + TREE_PROGRESS_SMOOTH_BRANCH_AREAS; +#endif // SLIC3R_TREESUPPORTS_PROGRESS + + // Iterate over the generated circles in parallel and clean them up. Also add support floor. + tbb::spin_mutex layer_storage_mutex; + tbb::parallel_for(tbb::blocked_range(0, support_layer_storage.size()), + [&](const tbb::blocked_range &range) { + for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { + // Most of the time in this function is this union call. Can take 300+ ms when a lot of areas are to be unioned. + support_layer_storage[layer_idx] = smooth_outward(union_(support_layer_storage[layer_idx]), m_config.support_line_width); //FIXME was .smooth(50); + //smooth_outward(closing(std::move(bottom), closing_distance + minimum_island_radius, closing_distance, SUPPORT_SURFACES_OFFSET_PARAMETERS), smoothing_distance) : + + // simplify a bit, to ensure the output does not contain outrageous amounts of vertices. Should not be necessary, just a precaution. + support_layer_storage[layer_idx] = polygons_simplify(support_layer_storage[layer_idx], std::min(scaled(0.03), double(m_config.resolution))); + // Subtract support lines of the branches from the roof + SupportGeneratorLayer*& support_roof = top_contacts[layer_idx]; + if (! support_roof_storage[layer_idx].empty() || support_roof != nullptr) { + if (support_roof == nullptr) { + support_roof = &layer_allocate(layer_storage, layer_storage_mutex, SupporLayerType::TopContact, print_object.slicing_parameters(), layer_idx); + support_roof->polygons = union_(support_roof_storage[layer_idx]); + } else + support_roof->polygons = union_(support_roof->polygons, support_roof_storage[layer_idx]); + + if (! support_roof->polygons.empty() && + area(intersection(support_layer_storage[layer_idx], support_roof->polygons)) > tiny_area_threshold) { + switch (interface_pref) { + case InterfacePreference::INTERFACE_AREA_OVERWRITES_SUPPORT: + support_layer_storage[layer_idx] = diff(support_layer_storage[layer_idx], support_roof->polygons); + break; + case InterfacePreference::SUPPORT_AREA_OVERWRITES_INTERFACE: + support_roof->polygons = diff(support_roof->polygons, support_layer_storage[layer_idx]); + break; + //FIXME + #if 1 + case InterfacePreference::INTERFACE_LINES_OVERWRITE_SUPPORT: + case InterfacePreference::SUPPORT_LINES_OVERWRITE_INTERFACE: + assert(false); + [[fallthrough]]; + #else + case InterfacePreference::INTERFACE_LINES_OVERWRITE_SUPPORT: + { + // Hatch the support roof interfaces, offset them by their line width and subtract them from support base. + Polygons interface_lines = offset(to_polylines( + generateSupportInfillLines(support_roof->polygons, true, layer_idx, m_config.support_roof_line_distance)), + m_config.support_roof_line_width / 2); + support_layer_storage[layer_idx] = diff(support_layer_storage[layer_idx], interface_lines); + break; + } + case InterfacePreference::SUPPORT_LINES_OVERWRITE_INTERFACE: + { + // Hatch the support roof interfaces, offset them by their line width and subtract them from support base. + Polygons tree_lines = union_(offset(to_polylines( + generateSupportInfillLines(support_layer_storage[layer_idx], false, layer_idx, m_config.support_line_distance, true)), + m_config.support_line_width / 2)); + // do not draw roof where the tree is. I prefer it this way as otherwise the roof may cut of a branch from its support below. + support_roof->polygons = diff(support_roof->polygons, tree_lines); + break; + } + #endif + case InterfacePreference::NOTHING: + break; + } + } + } + + // Subtract support floors from the support area and add them to the support floor instead. + if (m_config.support_bottom_layers > 0 && !support_layer_storage[layer_idx].empty()) { + SupportGeneratorLayer*& support_bottom = bottom_contacts[layer_idx]; + Polygons layer_outset = diff_clipped( + m_config.support_bottom_offset > 0 ? offset(support_layer_storage[layer_idx], m_config.support_bottom_offset, jtMiter, 1.2) : support_layer_storage[layer_idx], + m_volumes.getCollision(0, layer_idx, false)); + Polygons floor_layer; + size_t layers_below = 0; + while (layers_below <= m_config.support_bottom_layers) { + // one sample at 0 layers below, another at m_config.support_bottom_layers. In-between samples at m_config.performance_interface_skip_layers distance from each other. + const size_t sample_layer = static_cast(std::max(0, (static_cast(layer_idx) - static_cast(layers_below)) - static_cast(m_config.z_distance_bottom_layers))); + //FIXME subtract the wipe tower + append(floor_layer, intersection(layer_outset, overhangs[sample_layer])); + if (layers_below < m_config.support_bottom_layers) + layers_below = std::min(layers_below + m_config.performance_interface_skip_layers, m_config.support_bottom_layers); + else + break; + } + if (! floor_layer.empty()) { + if (support_bottom == nullptr) + support_bottom = &layer_allocate(layer_storage, layer_storage_mutex, SupporLayerType::BottomContact, print_object.slicing_parameters(), layer_idx); + support_bottom->polygons = union_(floor_layer, support_bottom->polygons); + support_layer_storage[layer_idx] = diff_clipped(support_layer_storage[layer_idx], offset(support_bottom->polygons, scaled(0.01), jtMiter, 1.2)); // Subtract the support floor from the normal support. + } + } + + if (! support_layer_storage[layer_idx].empty()) { + SupportGeneratorLayer *&l = intermediate_layers[layer_idx]; + if (l == nullptr) + l = &layer_allocate(layer_storage, layer_storage_mutex, SupporLayerType::Base, print_object.slicing_parameters(), layer_idx); + append(l->polygons, union_(support_layer_storage[layer_idx])); + } + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + { + std::lock_guard critical_section_progress(critical_sections); + progress_total += TREE_PROGRESS_FINALIZE_BRANCH_AREAS / support_layer_storage.size(); + Progress::messageProgress(Progress::Stage::SUPPORT, progress_total * m_progress_multiplier + m_progress_offset, TREE_PROGRESS_TOTAL); + } +#endif +#if 0 + { + std::lock_guard lock(critical_sections); + if (!storage.support.supportLayers[layer_idx].support_infill_parts.empty() || !storage.support.supportLayers[layer_idx].support_roof.empty()) + storage.support.layer_nr_max_filled_layer = std::max(storage.support.layer_nr_max_filled_layer, static_cast(layer_idx)); + } +#endif + } + }); +} + +void TreeSupport::drawAreas( + PrintObject &print_object, + const std::vector &overhangs, + std::vector> &move_bounds, + + SupportGeneratorLayersPtr &bottom_contacts, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage) +{ + std::vector support_layer_storage(move_bounds.size()); + std::vector support_roof_storage(move_bounds.size()); + std::map inverese_tree_order; // in the tree structure only the parents can be accessed. Inverse this to be able to access the children. + std::vector> linear_data; // All SupportElements are put into a layer independent storage to improve parallelization. Was added at a point in time where this function had performance issues. + // These were fixed by creating less initial points, but i do not see a good reason to remove a working performance optimization. + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(move_bounds.size()); ++ layer_idx) { + for (SupportElement* elem : move_bounds[layer_idx]) { + if ((layer_idx > 0 && ((!inverese_tree_order.count(elem) && elem->target_height == layer_idx) || (inverese_tree_order.count(elem) && inverese_tree_order[elem]->result_on_layer == Point(-1, -1))))) // we either come from nowhere at the final layer or we had invalid parents 2. should never happen but just to be sure + continue; + for (SupportElement* par : elem->parents) + if (par->result_on_layer != Point(-1, -1)) + inverese_tree_order.emplace(par, elem); + linear_data.emplace_back(layer_idx, elem); + } + } + + std::vector> layer_tree_polygons(move_bounds.size()); // reorder the processed data by layers again. The map also could be a vector>. + auto t_start = std::chrono::high_resolution_clock::now(); + // Generate the circles that will be the branches. + generateBranchAreas(linear_data, layer_tree_polygons, inverese_tree_order); + auto t_generate = std::chrono::high_resolution_clock::now(); + // In some edgecases a branch may go though a hole, where the regular radius does not fit. This can result in an apparent jump in branch radius. As such this cases need to be caught and smoothed out. + smoothBranchAreas(layer_tree_polygons); + auto t_smooth = std::chrono::high_resolution_clock::now(); + // drop down all trees that connect non gracefully with the model + std::vector>> dropped_down_areas(linear_data.size()); + dropNonGraciousAreas(layer_tree_polygons, linear_data, dropped_down_areas, inverese_tree_order); + auto t_drop = std::chrono::high_resolution_clock::now(); + // single threaded combining all dropped down support areas to the right layers. ONLY COPYS DATA! + for (coord_t i = 0; i < static_cast(dropped_down_areas.size()); i++) + for (std::pair &pair : dropped_down_areas[i]) + append(support_layer_storage[pair.first], std::move(pair.second)); + + // single threaded combining all support areas to the right layers. ONLY COPYS DATA! + for (LayerIndex layer_idx = 0; layer_idx < LayerIndex(layer_tree_polygons.size()); ++ layer_idx) { + auto &this_layer_tree_polygons = layer_tree_polygons[layer_idx]; + auto &this_roofs = support_roof_storage[layer_idx]; + auto &this_layers = support_layer_storage[layer_idx]; + size_t cnt_roofs = 0; + size_t cnt_layers = 0; + for (const std::pair &data_pair : this_layer_tree_polygons) + ++ (data_pair.first->missing_roof_layers > data_pair.first->distance_to_top ? cnt_roofs : cnt_layers); + this_roofs.reserve(this_roofs.size() + cnt_roofs); + this_layers.reserve(this_layers.size() + cnt_layers); + for (const std::pair &data_pair : this_layer_tree_polygons) { + auto &src = const_cast(data_pair.second); + std::move(std::begin(src), std::end(src), std::back_inserter(data_pair.first->missing_roof_layers > data_pair.first->distance_to_top ? this_roofs : this_layers)); + } + } + + finalizeInterfaceAndSupportAreas(print_object, overhangs, support_layer_storage, support_roof_storage, + bottom_contacts, top_contacts, intermediate_layers, layer_storage); + auto t_end = std::chrono::high_resolution_clock::now(); + + auto dur_gen_tips = 0.001 * std::chrono::duration_cast(t_generate - t_start).count(); + auto dur_smooth = 0.001 * std::chrono::duration_cast(t_smooth - t_generate).count(); + auto dur_drop = 0.001 * std::chrono::duration_cast(t_drop - t_smooth).count(); + auto dur_finalize = 0.001 * std::chrono::duration_cast(t_end - t_drop).count(); + + BOOST_LOG_TRIVIAL(info) << + "Time used for drawing subfuctions: generateBranchAreas: " << dur_gen_tips << " ms " + "smoothBranchAreas: " << dur_smooth << " ms " + "dropNonGraciousAreas: " << dur_drop << " ms " + "finalizeInterfaceAndSupportAreas " << dur_finalize << " ms"; +} + +} // namespace Slic3r diff --git a/src/libslic3r/TreeSupport.hpp b/src/libslic3r/TreeSupport.hpp new file mode 100644 index 0000000000..d4e04ef644 --- /dev/null +++ b/src/libslic3r/TreeSupport.hpp @@ -0,0 +1,906 @@ +// Tree supports by Thomas Rahm, losely based on Tree Supports by CuraEngine. +// Original source of Thomas Rahm's tree supports: +// https://github.com/ThomasRahm/CuraEngine +// +// Original CuraEngine copyright: +// Copyright (c) 2021 Ultimaker B.V. +// CuraEngine is released under the terms of the AGPLv3 or higher. + +#ifndef slic3r_TreeSupport_hpp +#define slic3r_TreeSupport_hpp + +#include "TreeModelVolumes.hpp" +#include "Point.hpp" + +#include // For combining hashes + +#include "BoundingBox.hpp" +#include "Utils.hpp" + + #define TREE_SUPPORT_SHOW_ERRORS + +#define SUPPORT_TREE_CIRCLE_RESOLUTION 25 // The number of vertices in each circle. + +#ifdef SLIC3R_TREESUPPORTS_PROGRESS + // The various stages of the process can be weighted differently in the progress bar. + // These weights are obtained experimentally using a small sample size. Sensible weights can differ drastically based on the assumed default settings and model. + #define TREE_PROGRESS_TOTAL 10000 + #define TREE_PROGRESS_PRECALC_COLL TREE_PROGRESS_TOTAL * 0.1 + #define TREE_PROGRESS_PRECALC_AVO TREE_PROGRESS_TOTAL * 0.4 + #define TREE_PROGRESS_GENERATE_NODES TREE_PROGRESS_TOTAL * 0.1 + #define TREE_PROGRESS_AREA_CALC TREE_PROGRESS_TOTAL * 0.3 + #define TREE_PROGRESS_DRAW_AREAS TREE_PROGRESS_TOTAL * 0.1 + #define TREE_PROGRESS_GENERATE_BRANCH_AREAS TREE_PROGRESS_DRAW_AREAS / 3 + #define TREE_PROGRESS_SMOOTH_BRANCH_AREAS TREE_PROGRESS_DRAW_AREAS / 3 + #define TREE_PROGRESS_FINALIZE_BRANCH_AREAS TREE_PROGRESS_DRAW_AREAS / 3 +#endif // SLIC3R_TREESUPPORTS_PROGRESS + +#define SUPPORT_TREE_ONLY_GRACIOUS_TO_MODEL false +#define SUPPORT_TREE_AVOID_SUPPORT_BLOCKER true + +namespace Slic3r +{ + +using LayerIndex = int; + +static constexpr const double SUPPORT_TREE_EXPONENTIAL_FACTOR = 1.5; +static constexpr const coord_t SUPPORT_TREE_EXPONENTIAL_THRESHOLD = scaled(1. * SUPPORT_TREE_EXPONENTIAL_FACTOR); +static constexpr const coord_t SUPPORT_TREE_COLLISION_RESOLUTION = scaled(0.5); + +//FIXME +class Print; +class PrintObject; +class SupportGeneratorLayer; +using SupportGeneratorLayerStorage = std::deque; +using SupportGeneratorLayersPtr = std::vector; +/*! + * \brief Generates a tree structure to support your models. + */ + +class TreeSupport +{ +public: + using AvoidanceType = TreeModelVolumes::AvoidanceType; + enum class InterfacePreference + { + INTERFACE_AREA_OVERWRITES_SUPPORT, + SUPPORT_AREA_OVERWRITES_INTERFACE, + INTERFACE_LINES_OVERWRITE_SUPPORT, + SUPPORT_LINES_OVERWRITE_INTERFACE, + NOTHING + }; + + /*! + * \brief Creates an instance of the tree support generator. + */ + TreeSupport() = default; + + /*! + * \brief Create the areas that need support. + * + * These areas are stored inside the given SliceDataStorage object. + * \param storage The data storage where the mesh data is gotten from and + * where the resulting support areas are stored. + */ + void generateSupportAreas(Print &print, const BuildVolume &build_volume, const std::vector& print_object_ids); + void generateSupportAreas(PrintObject &print_object); + + + //todo Remove! Only relevant for public BETA! + static bool inline showed_critical=false; + static bool inline showed_performance=false; + static void showError(std::string message,bool critical); + + struct TreeSupportSettings; // forward declaration as we need some config values in the merge case + + struct AreaIncreaseSettings + { + AvoidanceType type { AvoidanceType::Fast }; + coord_t increase_speed { 0 }; + bool increase_radius { false }; + bool no_error { false }; + bool use_min_distance { false }; + bool move { false }; + bool operator==(const AreaIncreaseSettings& other) const + { + return increase_radius == other.increase_radius && increase_speed == other.increase_speed && type == other.type && + no_error == other.no_error && use_min_distance == other.use_min_distance && move == other.move; + } + }; + + struct SupportElement + { + explicit SupportElement( + coord_t distance_to_top, size_t target_height, Point target_position, bool to_buildplate, bool to_model_gracious, bool use_min_xy_dist, size_t dont_move_until, + bool supports_roof, bool can_use_safe_radius, bool force_tips_to_roof, bool skip_ovalisation) : + target_height(target_height), target_position(target_position), next_position(target_position), next_height(target_height), effective_radius_height(distance_to_top), + to_buildplate(to_buildplate), distance_to_top(distance_to_top), area(nullptr), result_on_layer(target_position), increased_to_model_radius(0), to_model_gracious(to_model_gracious), + elephant_foot_increases(0), use_min_xy_dist(use_min_xy_dist), supports_roof(supports_roof), dont_move_until(dont_move_until), can_use_safe_radius(can_use_safe_radius), + last_area_increase(AreaIncreaseSettings{ AvoidanceType::Fast, 0, false, false, false, false }), missing_roof_layers(force_tips_to_roof ? dont_move_until : 0), skip_ovalisation(skip_ovalisation) + { + } + + + explicit SupportElement(const SupportElement& elem, Polygons* newArea = nullptr) + : // copy constructor with possibility to set a new area + target_height(elem.target_height), + target_position(elem.target_position), + next_position(elem.next_position), + next_height(elem.next_height), + effective_radius_height(elem.effective_radius_height), + to_buildplate(elem.to_buildplate), + distance_to_top(elem.distance_to_top), + area(newArea != nullptr ? newArea : elem.area), + result_on_layer(elem.result_on_layer), + increased_to_model_radius(elem.increased_to_model_radius), + to_model_gracious(elem.to_model_gracious), + elephant_foot_increases(elem.elephant_foot_increases), + use_min_xy_dist(elem.use_min_xy_dist), + supports_roof(elem.supports_roof), + dont_move_until(elem.dont_move_until), + can_use_safe_radius(elem.can_use_safe_radius), + last_area_increase(elem.last_area_increase), + missing_roof_layers(elem.missing_roof_layers), + skip_ovalisation(elem.skip_ovalisation) + + { + parents.insert(parents.begin(), elem.parents.begin(), elem.parents.end()); + } + + /*! + * \brief Create a new Element for one layer below the element of the pointer supplied. + */ + + explicit SupportElement(SupportElement* element_above) + : target_height(element_above->target_height), + target_position(element_above->target_position), + next_position(element_above->next_position), + next_height(element_above->next_height), + effective_radius_height(element_above->effective_radius_height), + to_buildplate(element_above->to_buildplate), + distance_to_top(element_above->distance_to_top + 1), + area(element_above->area), + result_on_layer(Point(-1, -1)), // set to invalid as we are a new node on a new layer + increased_to_model_radius(element_above->increased_to_model_radius), + to_model_gracious(element_above->to_model_gracious), + elephant_foot_increases(element_above->elephant_foot_increases), + use_min_xy_dist(element_above->use_min_xy_dist), + supports_roof(element_above->supports_roof), + dont_move_until(element_above->dont_move_until), + can_use_safe_radius(element_above->can_use_safe_radius), + last_area_increase(element_above->last_area_increase), + missing_roof_layers(element_above->missing_roof_layers), + skip_ovalisation(false) + { + parents = { element_above }; + } + + // ONLY to be called in merge as it assumes a few assurances made by it. + explicit SupportElement( + const SupportElement& first, const SupportElement& second, size_t next_height, Point next_position, + coord_t increased_to_model_radius, const TreeSupportSettings& config) : + next_position(next_position), next_height(next_height), area(nullptr), increased_to_model_radius(increased_to_model_radius), + use_min_xy_dist(first.use_min_xy_dist || second.use_min_xy_dist), supports_roof(first.supports_roof || second.supports_roof), + dont_move_until(std::max(first.dont_move_until, second.dont_move_until)), can_use_safe_radius(first.can_use_safe_radius || second.can_use_safe_radius), + missing_roof_layers(std::min(first.missing_roof_layers, second.missing_roof_layers)), skip_ovalisation(false) + + { + if (first.target_height > second.target_height) { + target_height = first.target_height; + target_position = first.target_position; + } else { + target_height = second.target_height; + target_position = second.target_position; + } + effective_radius_height = std::max(first.effective_radius_height, second.effective_radius_height); + distance_to_top = std::max(first.distance_to_top, second.distance_to_top); + + to_buildplate = first.to_buildplate && second.to_buildplate; + to_model_gracious = first.to_model_gracious && second.to_model_gracious; // valid as we do not merge non-gracious with gracious + + AddParents(first.parents); + AddParents(second.parents); + + elephant_foot_increases = 0; + if (config.diameter_scale_bp_radius > 0) { + coord_t foot_increase_radius = std::abs(std::max(config.getCollisionRadius(second), config.getCollisionRadius(first)) - config.getCollisionRadius(*this)); + // elephant_foot_increases has to be recalculated, as when a smaller tree with a larger elephant_foot_increases merge with a larger branch + // the elephant_foot_increases may have to be lower as otherwise the radius suddenly increases. This results often in a non integer value. + elephant_foot_increases = foot_increase_radius / (config.branch_radius * (config.diameter_scale_bp_radius - config.diameter_angle_scale_factor)); + } + + // set last settings to the best out of both parents. If this is wrong, it will only cause a small performance penalty instead of weird behavior. + last_area_increase = { + std::min(first.last_area_increase.type, second.last_area_increase.type), + std::min(first.last_area_increase.increase_speed, second.last_area_increase.increase_speed), + first.last_area_increase.increase_radius || second.last_area_increase.increase_radius, + first.last_area_increase.no_error || second.last_area_increase.no_error, + first.last_area_increase.use_min_distance && second.last_area_increase.use_min_distance, + first.last_area_increase.move || second.last_area_increase.move }; + } + + /*! + * \brief The layer this support elements wants reach + */ + LayerIndex target_height; + + /*! + * \brief The position this support elements wants to support on layer=target_height + */ + Point target_position; + + /*! + * \brief The next position this support elements wants to reach. NOTE: This is mainly a suggestion regarding direction inside the influence area. + */ + Point next_position; + + + /*! + * \brief The next height this support elements wants to reach + */ + LayerIndex next_height; + + /*! + * \brief The Effective distance to top of this element regarding radius increases and collision calculations. + */ + + size_t effective_radius_height; + + /*! + * \brief The element trys to reach the buildplate + */ + + bool to_buildplate; + + /*! + * \brief All elements in the layer above the current one that are supported by this element + */ + std::vector parents; + + /*! + * \brief The amount of layers this element is below the topmost layer of this branch. + */ + size_t distance_to_top; + + /*! + * \brief The resulting influence area. + * Will only be set in the results of createLayerPathing, and will be nullptr inside! + */ + Polygons* area; + + /*! + * \brief The resulting center point around which a circle will be drawn later. + * Will be set by setPointsOnAreas + */ + Point result_on_layer = Point(-1, -1); + /*! + * \brief The amount of extra radius we got from merging branches that could have reached the buildplate, but merged with ones that can not. + */ + coord_t increased_to_model_radius; // how much to model we increased only relevant for merging + /*! + * \brief Will the branch be able to rest completely on a flat surface, be it buildplate or model ? + */ + bool to_model_gracious; + + /*! + * \brief Counter about the times the elephant foot was increased. Can be fractions for merge reasons. + */ + double elephant_foot_increases; + + /*! + * \brief Whether the min_xy_distance can be used to get avoidance or similar. Will only be true if support_xy_overrides_z=Z overrides X/Y. + */ + bool use_min_xy_dist; + + /*! + * \brief True if this Element or any parent provides support to a support roof. + */ + bool supports_roof; + + /*! + * \brief The element trys not to move until this dtt is reached, is set to 0 if the element had to move. + */ + size_t dont_move_until; + + /*! + * \brief An influence area is considered safe when it can use the holefree avoidance <=> It will not have to encounter holes on its way downward. + */ + bool can_use_safe_radius; + + /*! + * \brief Settings used to increase the influence area to its current state. + */ + AreaIncreaseSettings last_area_increase; + + /*! + * \brief Amount of roof layers that were not yet added, because the branch needed to move. + */ + size_t missing_roof_layers; + + /*! + * \brief Skip the ovalisation to parent and children when generating the final circles. + */ + bool skip_ovalisation; + + bool operator==(const SupportElement& other) const + { + return target_position == other.target_position && target_height == other.target_height; + } + + bool operator<(const SupportElement& other) const // true if me < other + { + return !(*this == other) && !(*this > other); + } + bool operator>(const SupportElement& other) const + { + // Doesn't really have to make sense, only required for ordering in maps to ensure deterministic behavior. + if (*this == other) + return false; + if (other.target_height != target_height) + return other.target_height < target_height; + return other.target_position.x() == target_position.x() ? other.target_position.y() < target_position.y() : other.target_position.x() < target_position.x(); + } + + void AddParents(const std::vector& adding) + { + for (SupportElement* ptr : adding) + { + parents.emplace_back(ptr); + } + } + }; + + /*! + * \brief This struct contains settings used in the tree support. Thanks to this most functions do not need to know of meshes etc. Also makes the code shorter. + */ + struct TreeSupportSettings + { + TreeSupportSettings() = default; // required for the definition of the config variable in the TreeSupport class. + + explicit TreeSupportSettings(const TreeSupportMeshGroupSettings& mesh_group_settings) + : angle(mesh_group_settings.support_tree_angle), + angle_slow(mesh_group_settings.support_tree_angle_slow), + support_line_width(mesh_group_settings.support_line_width), + layer_height(mesh_group_settings.layer_height), + branch_radius(mesh_group_settings.support_tree_branch_diameter / 2), + min_radius(mesh_group_settings.support_tree_tip_diameter / 2), // The actual radius is 50 microns larger as the resulting branches will be increased by 50 microns to avoid rounding errors effectively increasing the xydistance + maximum_move_distance((angle < M_PI / 2.) ? (coord_t)(tan(angle) * layer_height) : std::numeric_limits::max()), + maximum_move_distance_slow((angle_slow < M_PI / 2.) ? (coord_t)(tan(angle_slow) * layer_height) : std::numeric_limits::max()), + support_bottom_layers(mesh_group_settings.support_bottom_enable ? (mesh_group_settings.support_bottom_height + layer_height / 2) / layer_height : 0), + tip_layers(std::max((branch_radius - min_radius) / (support_line_width / 3), branch_radius / layer_height)), // Ensure lines always stack nicely even if layer height is large + diameter_angle_scale_factor(sin(mesh_group_settings.support_tree_branch_diameter_angle) * layer_height / branch_radius), + max_to_model_radius_increase(mesh_group_settings.support_tree_max_diameter_increase_by_merges_when_support_to_model / 2), + min_dtt_to_model(round_up_divide(mesh_group_settings.support_tree_min_height_to_model, layer_height)), + increase_radius_until_radius(mesh_group_settings.support_tree_branch_diameter / 2), + increase_radius_until_layer(increase_radius_until_radius <= branch_radius ? tip_layers * (increase_radius_until_radius / branch_radius) : (increase_radius_until_radius - branch_radius) / (branch_radius * diameter_angle_scale_factor)), + support_rests_on_model(! mesh_group_settings.support_material_buildplate_only), + xy_distance(mesh_group_settings.support_xy_distance), + bp_radius(mesh_group_settings.support_tree_bp_diameter / 2), + diameter_scale_bp_radius(std::min(sin(0.7) * layer_height / branch_radius, 1.0 / (branch_radius / (support_line_width / 2.0)))), // Either 40? or as much as possible so that 2 lines will overlap by at least 50%, whichever is smaller. + support_xy_overrides_z(mesh_group_settings.support_xy_overrides_z), + xy_min_distance(support_xy_overrides_z ? xy_distance : mesh_group_settings.support_xy_distance_overhang), + z_distance_top_layers(round_up_divide(mesh_group_settings.support_top_distance, layer_height)), + z_distance_bottom_layers(round_up_divide(mesh_group_settings.support_bottom_distance, layer_height)), + performance_interface_skip_layers(round_up_divide(mesh_group_settings.support_interface_skip_height, layer_height)), + support_infill_angles(mesh_group_settings.support_infill_angles), + support_roof_angles(mesh_group_settings.support_roof_angles), + roof_pattern(mesh_group_settings.support_roof_pattern), + support_pattern(mesh_group_settings.support_pattern), + support_roof_line_width(mesh_group_settings.support_roof_line_width), + support_line_spacing(mesh_group_settings.support_line_spacing), + support_bottom_offset(mesh_group_settings.support_bottom_offset), + support_wall_count(mesh_group_settings.support_wall_count), + resolution(mesh_group_settings.resolution), + support_roof_line_distance(mesh_group_settings.support_roof_line_distance), // in the end the actual infill has to be calculated to subtract interface from support areas according to interface_preference. + settings(mesh_group_settings), + min_feature_size(mesh_group_settings.min_feature_size) + + + { + layer_start_bp_radius = (bp_radius - branch_radius) / (branch_radius * diameter_scale_bp_radius); + + // safeOffsetInc can only work in steps of the size xy_min_distance in the worst case => xy_min_distance has to be a bit larger than 0 in this worst case and should be large enough for performance to not suffer extremely + // When for all meshes the z bottom and top distance is more than one layer though the worst case is xy_min_distance + min_feature_size + // This is not the best solution, but the only one to ensure areas can not lag though walls at high maximum_move_distance. + if (has_to_rely_on_min_xy_dist_only) + xy_min_distance = std::max(coord_t(100), xy_min_distance); // If set to low rounding errors WILL cause errors. Best to keep it above 25. + + xy_distance = std::max(xy_distance, xy_min_distance); + + // (logic) from getInterfaceAngles in FFFGcodeWriter. + auto getInterfaceAngles = [&](std::vector& angles, SupportMaterialInterfacePattern pattern) { + if (angles.empty()) + { + if (pattern == SupportMaterialInterfacePattern::smipConcentric) + angles.push_back(0); // Concentric has no rotation. + /* + else if (pattern == SupportMaterialInterfacePattern::TRIANGLES) + angles.push_back(90); // Triangular support interface shouldn't alternate every layer. + */ + else { + if (TreeSupportSettings::some_model_contains_thick_roof) { + // Some roofs are quite thick. + // Alternate between the two kinds of diagonal: / and \ . + angles.push_back(M_PI / 4.); + angles.push_back(3. * M_PI / 4.); + } + if (angles.empty()) + angles.push_back(M_PI / 2.); // Perpendicular to support lines. + } + } + }; + + //getInterfaceAngles(support_infill_angles, support_pattern); + support_infill_angles = { M_PI / 2. }; + getInterfaceAngles(support_roof_angles, roof_pattern); +// const std::unordered_map interface_map = { { "support_area_overwrite_interface_area", InterfacePreference::SUPPORT_AREA_OVERWRITES_INTERFACE }, { "interface_area_overwrite_support_area", InterfacePreference::INTERFACE_AREA_OVERWRITES_SUPPORT }, { "support_lines_overwrite_interface_area", InterfacePreference::SUPPORT_LINES_OVERWRITE_INTERFACE }, { "interface_lines_overwrite_support_area", InterfacePreference::INTERFACE_LINES_OVERWRITE_SUPPORT }, { "nothing", InterfacePreference::NOTHING } }; +// interface_preference = interface_map.at(mesh_group_settings.get("support_interface_priority")); +//FIXME this was the default +// interface_preference = InterfacePreference::SUPPORT_LINES_OVERWRITE_INTERFACE; + interface_preference = InterfacePreference::SUPPORT_AREA_OVERWRITES_INTERFACE; + } + + private: + double angle; + double angle_slow; + std::vector known_z; + + public: + // some static variables dependent on other meshes that are not currently processed. + // Has to be static because TreeSupportConfig will be used in TreeModelVolumes as this reduces redundancy. + inline static bool some_model_contains_thick_roof = false; + inline static bool has_to_rely_on_min_xy_dist_only = false; + /*! + * \brief Width of a single line of support. + */ + coord_t support_line_width; + /*! + * \brief Height of a single layer + */ + coord_t layer_height; + /*! + * \brief Radius of a branch when it has left the tip. + */ + coord_t branch_radius; + /*! + * \brief smallest allowed radius, required to ensure that even at DTT 0 every circle will still be printed + */ + coord_t min_radius; + /*! + * \brief How far an influence area may move outward every layer at most. + */ + coord_t maximum_move_distance; + /*! + * \brief How far every influence area will move outward every layer if possible. + */ + coord_t maximum_move_distance_slow; + /*! + * \brief Amount of bottom layers. 0 if disabled. + */ + size_t support_bottom_layers; + /*! + * \brief Amount of effectiveDTT increases are required to reach branch radius. + */ + size_t tip_layers; + /*! + * \brief Factor by which to increase the branch radius. + */ + double diameter_angle_scale_factor; + /*! + * \brief How much a branch resting on the model may grow in radius by merging with branches that can reach the buildplate. + */ + coord_t max_to_model_radius_increase; + /*! + * \brief If smaller (in layers) than that, all branches to model will be deleted + */ + size_t min_dtt_to_model; + /*! + * \brief Increase radius in the resulting drawn branches, even if the avoidance does not allow it. Will be cut later to still fit. + */ + coord_t increase_radius_until_radius; + /*! + * \brief Same as increase_radius_until_radius, but contains the DTT at which the radius will be reached. + */ + size_t increase_radius_until_layer; + /*! + * \brief True if the branches may connect to the model. + */ + bool support_rests_on_model; + /*! + * \brief How far should support be from the model. + */ + coord_t xy_distance; + /*! + * \brief Radius a branch should have when reaching the buildplate. + */ + coord_t bp_radius; + /*! + * \brief The layer index at which an increase in radius may be required to reach the bp_radius. + */ + coord_t layer_start_bp_radius; + /*! + * \brief Factor by which to increase the branch radius to reach the required bp_radius at layer 0. Note that this radius increase will not happen in the tip, to ensure the tip is structurally sound. + */ + double diameter_scale_bp_radius; + /*! + * \brief Should Z distance override X/Y distance, or the other way around. + */ + bool support_xy_overrides_z; + /*! + * \brief minimum xy_distance. Only relevant when Z overrides XY, otherwise equal to xy_distance- + */ + coord_t xy_min_distance; + /*! + * \brief Amount of layers distance required the top of the support to the model + */ + size_t z_distance_top_layers; + /*! + * \brief Amount of layers distance required from the top of the model to the bottom of a support structure. + */ + size_t z_distance_bottom_layers; + /*! + * \brief used for performance optimization at the support floor. Should have no impact on the resulting tree. + */ + size_t performance_interface_skip_layers; + /*! + * \brief User specified angles for the support infill. + */ + std::vector support_infill_angles; + /*! + * \brief User specified angles for the support roof infill. + */ + std::vector support_roof_angles; + /*! + * \brief Pattern used in the support roof. May contain non relevant data if support roof is disabled. + */ + SupportMaterialInterfacePattern roof_pattern; + /*! + * \brief Pattern used in the support infill. + */ + SupportMaterialPattern support_pattern; + /*! + * \brief Line width of the support roof. + */ + coord_t support_roof_line_width; + /*! + * \brief Distance between support infill lines. + */ + coord_t support_line_spacing; + /*! + * \brief Offset applied to the support floor area. + */ + coord_t support_bottom_offset; + /* + * \brief Amount of walls the support area will have. + */ + int support_wall_count; + /* + * \brief Maximum allowed deviation when simplifying. + */ + coord_t resolution; + /* + * \brief Distance between the lines of the roof. + */ + coord_t support_roof_line_distance; + /* + * \brief How overlaps of an interface area with a support area should be handled. + */ + InterfacePreference interface_preference; + + /* + * \brief The infill class wants a settings object. This one will be the correct one for all settings it uses. + */ + TreeSupportMeshGroupSettings settings; + + /* + * \brief Minimum thickness of any model features. + */ + coord_t min_feature_size; + + public: + bool operator==(const TreeSupportSettings& other) const + { + return branch_radius == other.branch_radius && tip_layers == other.tip_layers && diameter_angle_scale_factor == other.diameter_angle_scale_factor && layer_start_bp_radius == other.layer_start_bp_radius && bp_radius == other.bp_radius && diameter_scale_bp_radius == other.diameter_scale_bp_radius && min_radius == other.min_radius && xy_min_distance == other.xy_min_distance && // as a recalculation of the collision areas is required to set a new min_radius. + xy_distance - xy_min_distance == other.xy_distance - other.xy_min_distance && // if the delta of xy_min_distance and xy_distance is different the collision areas have to be recalculated. + support_rests_on_model == other.support_rests_on_model && increase_radius_until_layer == other.increase_radius_until_layer && min_dtt_to_model == other.min_dtt_to_model && max_to_model_radius_increase == other.max_to_model_radius_increase && maximum_move_distance == other.maximum_move_distance && maximum_move_distance_slow == other.maximum_move_distance_slow && z_distance_bottom_layers == other.z_distance_bottom_layers && support_line_width == other.support_line_width && + support_xy_overrides_z == other.support_xy_overrides_z && support_line_spacing == other.support_line_spacing && support_roof_line_width == other.support_roof_line_width && // can not be set on a per-mesh basis currently, so code to enable processing different roof line width in the same iteration seems useless. + support_bottom_offset == other.support_bottom_offset && support_wall_count == other.support_wall_count && support_pattern == other.support_pattern && roof_pattern == other.roof_pattern && // can not be set on a per-mesh basis currently, so code to enable processing different roof patterns in the same iteration seems useless. + support_roof_angles == other.support_roof_angles && support_infill_angles == other.support_infill_angles && increase_radius_until_radius == other.increase_radius_until_radius && support_bottom_layers == other.support_bottom_layers && layer_height == other.layer_height && z_distance_top_layers == other.z_distance_top_layers && resolution == other.resolution && // Infill generation depends on deviation and resolution. + support_roof_line_distance == other.support_roof_line_distance && interface_preference == other.interface_preference + && min_feature_size == other.min_feature_size // interface_preference should be identical to ensure the tree will correctly interact with the roof. + // The infill class now wants the settings object and reads a lot of settings, and as the infill class is used to calculate support roof lines for interface-preference. Not all of these may be required to be identical, but as I am not sure, better safe than sorry +#if 0 + && (interface_preference == InterfacePreference::INTERFACE_AREA_OVERWRITES_SUPPORT || interface_preference == InterfacePreference::SUPPORT_AREA_OVERWRITES_INTERFACE + // Perimeter generator parameters + || + (settings.get("fill_outline_gaps") == other.settings.get("fill_outline_gaps") && + settings.get("min_bead_width") == other.settings.get("min_bead_width") && + settings.get("wall_transition_angle") == other.settings.get("wall_transition_angle") && + settings.get("wall_transition_length") == other.settings.get("wall_transition_length") && + settings.get("wall_split_middle_threshold") == other.settings.get("wall_split_middle_threshold") && + settings.get("wall_add_middle_threshold") == other.settings.get("wall_add_middle_threshold") && + settings.get("wall_distribution_count") == other.settings.get("wall_distribution_count") && + settings.get("wall_transition_filter_distance") == other.settings.get("wall_transition_filter_distance") && + settings.get("wall_transition_filter_deviation") == other.settings.get("wall_transition_filter_deviation") && + settings.get("wall_line_width_x") == other.settings.get("wall_line_width_x") && + settings.get("meshfix_maximum_extrusion_area_deviation") == other.settings.get("meshfix_maximum_extrusion_area_deviation")) + ) +#endif + ; + } + + + /*! + * \brief Get the Distance to top regarding the real radius this part will have. This is different from distance_to_top, which is can be used to calculate the top most layer of the branch. + * \param elem[in] The SupportElement one wants to know the effectiveDTT + * \return The Effective DTT. + */ + [[nodiscard]] inline size_t getEffectiveDTT(const TreeSupport::SupportElement& elem) const + { + return elem.effective_radius_height < increase_radius_until_layer ? (elem.distance_to_top < increase_radius_until_layer ? elem.distance_to_top : increase_radius_until_layer) : elem.effective_radius_height; + } + + /*! + * \brief Get the Radius part will have based on numeric values. + * \param distance_to_top[in] The effective distance_to_top of the element + * \param elephant_foot_increases[in] The elephant_foot_increases of the element. + * \return The radius an element with these attributes would have. + */ + [[nodiscard]] inline coord_t getRadius(size_t distance_to_top, const double elephant_foot_increases = 0) const + { + return (distance_to_top <= tip_layers ? min_radius + (branch_radius - min_radius) * distance_to_top / tip_layers : // tip + branch_radius + // base + branch_radius * (distance_to_top - tip_layers) * diameter_angle_scale_factor) + + // gradual increase + branch_radius * elephant_foot_increases * (std::max(diameter_scale_bp_radius - diameter_angle_scale_factor, 0.0)); + } + + /*! + * \brief Get the Radius, that this element will have. + * \param elem[in] The Element. + * \return The radius the element has. + */ + [[nodiscard]] inline coord_t getRadius(const TreeSupport::SupportElement& elem) const + { + return getRadius(getEffectiveDTT(elem), elem.elephant_foot_increases); + } + + /*! + * \brief Get the collision Radius of this Element. This can be smaller then the actual radius, as the drawAreas will cut off areas that may collide with the model. + * \param elem[in] The Element. + * \return The collision radius the element has. + */ + [[nodiscard]] inline coord_t getCollisionRadius(const TreeSupport::SupportElement& elem) const + { + return getRadius(elem.effective_radius_height, elem.elephant_foot_increases); + } + + /*! + * \brief Get the Radius an element should at least have at a given layer. + * \param layer_idx[in] The layer. + * \return The radius every element should aim to achieve. + */ + [[nodiscard]] inline coord_t recommendedMinRadius(LayerIndex layer_idx) const + { + double scale = (layer_start_bp_radius - int(layer_idx)) * diameter_scale_bp_radius; + return scale > 0 ? branch_radius + branch_radius * scale : 0; + } + + /*! + * \brief Return on which z in microns the layer will be printed. Used only for support infill line generation. + * \param layer_idx[in] The layer. + * \return The radius every element should aim to achieve. + */ + [[nodiscard]] inline coord_t getActualZ(LayerIndex layer_idx) + { + return layer_idx < coord_t(known_z.size()) ? known_z[layer_idx] : (layer_idx - known_z.size()) * layer_height + known_z.size() ? known_z.back() : 0; + } + + /*! + * \brief Set the z every Layer is printed at. Required for getActualZ to work + * \param z[in] The z every LayerIndex is printed. Vector is used as a map with the index of each element being the corresponding LayerIndex + * \return The radius every element should aim to achieve. + */ + void setActualZ(std::vector& z) + { + known_z = z; + } + }; + +private: + /*! + * \brief Creates the initial influence areas (that can later be propagated down) by placing them below the overhang. + * + * Generates Points where the Model should be supported and creates the areas where these points have to be placed. + * + * \param mesh[in] The mesh that is currently processed. + * \param move_bounds[out] Storage for the influence areas. + * \param storage[in] Background storage, required for adding roofs. + */ + void generateInitialAreas(const PrintObject &print_object, + const std::vector &overhangs, + std::vector> &move_bounds, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &top_interface_layers, + SupportGeneratorLayerStorage &layer_storage); + + /*! + * \brief Checks if an influence area contains a valid subsection and returns the corresponding metadata and the new Influence area. + * + * Calculates an influence areas of the layer below, based on the influence area of one element on the current layer. + * Increases every influence area by maximum_move_distance_slow. If this is not enough, as in we would change our gracious or to_buildplate status the influence areas are instead increased by maximum_move_distance_slow. + * Also ensures that increasing the radius of a branch, does not cause it to change its status (like to_buildplate ). If this were the case, the radius is not increased instead. + * + * Warning: The used format inside this is different as the SupportElement does not have a valid area member. Instead this area is saved as value of the dictionary. This was done to avoid not needed heap allocations. + * + * \param settings[in] Which settings have to be used to check validity. + * \param layer_idx[in] Number of the current layer. + * \param parent[in] The metadata of the parents influence area. + * \param relevant_offset[in] The maximal possible influence area. No guarantee regarding validity with current layer collision required, as it is ensured in-function! + * \param to_bp_data[out] The part of the Influence area that can reach the buildplate. + * \param to_model_data[out] The part of the Influence area that do not have to reach the buildplate. This has overlap with new_layer_data. + * \param increased[out] Area than can reach all further up support points. No assurance is made that the buildplate or the model can be reached in accordance to the user-supplied settings. + * \param overspeed[in] How much should the already offset area be offset again. Usually this is 0. + * \param mergelayer[in] Will the merge method be called on this layer. This information is required as some calculation can be avoided if they are not required for merging. + * \return A valid support element for the next layer regarding the calculated influence areas. Empty if no influence are can be created using the supplied influence area and settings. + */ + std::optional increaseSingleArea(AreaIncreaseSettings settings, LayerIndex layer_idx, SupportElement* parent, const Polygons& relevant_offset, Polygons& to_bp_data, Polygons& to_model_data, Polygons& increased, const coord_t overspeed, const bool mergelayer); + /*! + * \brief Increases influence areas as far as required. + * + * Calculates influence areas of the layer below, based on the influence areas of the current layer. + * Increases every influence area by maximum_move_distance_slow. If this is not enough, as in it would change the gracious or to_buildplate status, the influence areas are instead increased by maximum_move_distance. + * Also ensures that increasing the radius of a branch, does not cause it to change its status (like to_buildplate ). If this were the case, the radius is not increased instead. + * + * Warning: The used format inside this is different as the SupportElement does not have a valid area member. Instead this area is saved as value of the dictionary. This was done to avoid not needed heap allocations. + * + * \param to_bp_areas[out] Influence areas that can reach the buildplate + * \param to_model_areas[out] Influence areas that do not have to reach the buildplate. This has overlap with new_layer_data, as areas that can reach the buildplate are also considered valid areas to the model. + * This redundancy is required if a to_buildplate influence area is allowed to merge with a to model influence area. + * \param influence_areas[out] Area than can reach all further up support points. No assurance is made that the buildplate or the model can be reached in accordance to the user-supplied settings. + * \param bypass_merge_areas[out] Influence areas ready to be added to the layer below that do not need merging. + * \param last_layer[in] Influence areas of the current layer. + * \param layer_idx[in] Number of the current layer. + * \param mergelayer[in] Will the merge method be called on this layer. This information is required as some calculation can be avoided if they are not required for merging. + */ + void increaseAreas(std::unordered_map& to_bp_areas, std::unordered_map& to_model_areas, std::map& influence_areas, std::vector& bypass_merge_areas, const std::vector& last_layer, const LayerIndex layer_idx, const bool mergelayer); + + /*! + * \brief Propagates influence downwards, and merges overlapping ones. + * + * \param move_bounds[in,out] All currently existing influence areas + */ + void createLayerPathing(std::vector>& move_bounds); + + + /*! + * \brief Sets the result_on_layer for all parents based on the SupportElement supplied. + * + * \param elem[in] The SupportElements, which parent's position should be determined. + */ + void setPointsOnAreas(const SupportElement* elem); + /*! + * \brief Get the best point to connect to the model and set the result_on_layer of the relevant SupportElement accordingly. + * + * \param move_bounds[in,out] All currently existing influence areas + * \param first_elem[in,out] SupportElement that did not have its result_on_layer set meaning that it does not have a child element. + * \param layer_idx[in] The current layer. + * \return Should elem be deleted. + */ + bool setToModelContact(std::vector>& move_bounds, SupportElement* first_elem, const LayerIndex layer_idx); + + /*! + * \brief Set the result_on_layer point for all influence areas + * + * \param move_bounds[in,out] All currently existing influence areas + */ + void createNodesFromArea(std::vector>& move_bounds); + + /*! + * \brief Draws circles around result_on_layer points of the influence areas + * + * \param linear_data[in] All currently existing influence areas with the layer they are on + * \param layer_tree_polygons[out] Resulting branch areas with the layerindex they appear on. layer_tree_polygons.size() has to be at least linear_data.size() as each Influence area in linear_data will save have at least one (that's why it's a vector) corresponding branch area in layer_tree_polygons. + * \param inverse_tree_order[in] A mapping that returns the child of every influence area. + */ + void generateBranchAreas(std::vector>& linear_data, std::vector>& layer_tree_polygons, const std::map& inverse_tree_order); + + /*! + * \brief Applies some smoothing to the outer wall, intended to smooth out sudden jumps as they can happen when a branch moves though a hole. + * + * \param layer_tree_polygons[in,out] Resulting branch areas with the layerindex they appear on. + */ + void smoothBranchAreas(std::vector>& layer_tree_polygons); + + /*! + * \brief Drop down areas that do rest non-gracefully on the model to ensure the branch actually rests on something. + * + * \param layer_tree_polygons[in] Resulting branch areas with the layerindex they appear on. + * \param linear_data[in] All currently existing influence areas with the layer they are on + * \param dropped_down_areas[out] Areas that have to be added to support all non-graceful areas. + * \param inverse_tree_order[in] A mapping that returns the child of every influence area. + */ + void dropNonGraciousAreas(std::vector>& layer_tree_polygons, const std::vector>& linear_data, std::vector>>& dropped_down_areas, const std::map& inverse_tree_order); + + /*! + * \brief Generates Support Floor, ensures Support Roof can not cut of branches, and saves the branches as support to storage + * + * \param support_layer_storage[in] Areas where support should be generated. + * \param support_roof_storage[in] Areas where support was replaced with roof. + * \param storage[in,out] The storage where the support should be stored. + */ + void finalizeInterfaceAndSupportAreas( + const PrintObject &print_object, + const std::vector &overhangs, + std::vector &support_layer_storage, + std::vector &support_roof_storage, + + SupportGeneratorLayersPtr &bottom_contacts, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage); + + /*! + * \brief Draws circles around result_on_layer points of the influence areas and applies some post processing. + * + * \param move_bounds[in] All currently existing influence areas + * \param storage[in,out] The storage where the support should be stored. + */ + void drawAreas( + PrintObject &print_object, + const std::vector &overhangs, + std::vector> &move_bounds, + + SupportGeneratorLayersPtr &bottom_contacts, + SupportGeneratorLayersPtr &top_contacts, + SupportGeneratorLayersPtr &intermediate_layers, + SupportGeneratorLayerStorage &layer_storage); + + /*! + * \brief Settings with the indexes of meshes that use these settings. + * + */ + std::vector>> m_grouped_meshes; + + /*! + * \brief Generator for model collision, avoidance and internal guide volumes. + * + */ + TreeModelVolumes m_volumes; + + /*! + * \brief Contains config settings to avoid loading them in every function. This was done to improve readability of the code. + */ + TreeSupportSettings m_config; + + /*! + * \brief The progress multiplier of all values added progress bar. + * Required for the progress bar the behave as expected when areas have to be calculated multiple times + */ + double m_progress_multiplier = 1; + + /*! + * \brief The progress offset added to all values communicated to the progress bar. + * Required for the progress bar the behave as expected when areas have to be calculated multiple times + */ + double m_progress_offset = 0; +}; + + +} // namespace Slic3r + +namespace std +{ +template <> +struct hash +{ + size_t operator()(const Slic3r::TreeSupport::SupportElement& node) const + { + size_t hash_node = Slic3r::PointHash{}(node.target_position); + boost::hash_combine(hash_node, size_t(node.target_height)); + return hash_node; + } +}; +} // namespace std + +#endif /* slic3r_TreeSupport_hpp */ diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index 4939811883..7b6e7267aa 100644 --- a/src/libslic3r/TriangleMesh.cpp +++ b/src/libslic3r/TriangleMesh.cpp @@ -1263,7 +1263,6 @@ size_t its_num_open_edges(const std::vector &face_neighbors) return num_open_edges; } -#if ENABLE_SHOW_NON_MANIFOLD_EDGES std::vector> its_get_open_edges(const indexed_triangle_set& its) { std::vector> ret; @@ -1278,7 +1277,6 @@ std::vector> its_get_open_edges(const indexed_triangle_set& } return ret; } -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES size_t its_num_open_edges(const indexed_triangle_set &its) { @@ -1404,4 +1402,5 @@ bool its_write_stl_binary(const char *file, const char *label, const std::vector return true; } + } // namespace Slic3r diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp index 34c1de8333..028971fadb 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -227,11 +227,9 @@ bool its_is_splittable(const indexed_triangle_set &its, const std::vector size_t its_num_open_edges(const indexed_triangle_set &its); size_t its_num_open_edges(const std::vector &face_neighbors); -#if ENABLE_SHOW_NON_MANIFOLD_EDGES // Calculate and returns the list of unconnected face edges. // Each edge is represented by the indices of the two endpoint vertices std::vector> its_get_open_edges(const indexed_triangle_set& its); -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES // Shrink the vectors of its.vertices and its.faces to a minimum size by reallocating the two vectors. void its_shrink_to_fit(indexed_triangle_set &its); diff --git a/src/libslic3r/Triangulation.cpp b/src/libslic3r/Triangulation.cpp index 36cc0a9ce5..bf8e79d7f8 100644 --- a/src/libslic3r/Triangulation.cpp +++ b/src/libslic3r/Triangulation.cpp @@ -225,6 +225,10 @@ Triangulation::Indices Triangulation::triangulate(const Polygons &polygons) return triangulate(points, edges); } +Triangulation::Indices Triangulation::triangulate(const ExPolygon &expolygon){ + return triangulate({expolygon}); +} + Triangulation::Indices Triangulation::triangulate(const ExPolygons &expolygons){ Points pts = to_points(expolygons); Points d_pts = collect_duplications(pts); diff --git a/src/libslic3r/Triangulation.hpp b/src/libslic3r/Triangulation.hpp index 18c485eaf3..2a6ff811d2 100644 --- a/src/libslic3r/Triangulation.hpp +++ b/src/libslic3r/Triangulation.hpp @@ -32,6 +32,7 @@ public: const HalfEdges &half_edges); static Indices triangulate(const Polygon &polygon); static Indices triangulate(const Polygons &polygons); + static Indices triangulate(const ExPolygon &expolygon); static Indices triangulate(const ExPolygons &expolygons); // Map for convert original index to set without duplication diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index b6c9f4cad6..495bcbc9b7 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -192,6 +192,14 @@ inline INDEX_TYPE next_idx_modulo(INDEX_TYPE idx, const INDEX_TYPE count) return idx; } + +// Return dividend divided by divisor rounded to the nearest integer +template +inline INDEX_TYPE round_up_divide(const INDEX_TYPE dividend, const INDEX_TYPE divisor) +{ + return (dividend + divisor - 1) / divisor; +} + template inline typename CONTAINER_TYPE::size_type prev_idx_modulo(typename CONTAINER_TYPE::size_type idx, const CONTAINER_TYPE &container) { diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index f01ced1ca0..b3e2e44fd7 100644 --- a/src/libslic3r/libslic3r.h +++ b/src/libslic3r/libslic3r.h @@ -361,6 +361,25 @@ constexpr T NaN = std::numeric_limits::quiet_NaN(); constexpr float NaNf = NaN; constexpr double NaNd = NaN; +// Rounding up. +// 1.5 is rounded to 2 +// 1.49 is rounded to 1 +// 0.5 is rounded to 1, +// 0.49 is rounded to 0 +// -0.5 is rounded to 0, +// -0.51 is rounded to -1, +// -1.5 is rounded to -1. +// -1.51 is rounded to -2. +// If input is not a valid float (it is infinity NaN or if it does not fit) +// the float to int conversion produces a max int on Intel and +-max int on ARM. +template +inline IntegerOnly fast_round_up(double a) +{ + // Why does Java Math.round(0.49999999999999994) return 1? + // https://stackoverflow.com/questions/9902968/why-does-math-round0-49999999999999994-return-1 + return a == 0.49999999999999994 ? I(0) : I(floor(a + 0.5)); +} + } // namespace Slic3r #endif diff --git a/src/libslic3r/pchheader.hpp b/src/libslic3r/pchheader.hpp index aeb79e3d84..9017a5deac 100644 --- a/src/libslic3r/pchheader.hpp +++ b/src/libslic3r/pchheader.hpp @@ -133,6 +133,4 @@ #include "libslic3r.h" #include "libslic3r_version.h" -#include - #include diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 4f7b84d10c..2cca334d9d 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -127,9 +127,11 @@ static struct RunOnInit { void disable_multi_threading() { - // Disable parallelization so the Shiny profiler works + // Disable parallelization to simplify debugging. #ifdef TBB_HAS_GLOBAL_CONTROL - tbb::global_control(tbb::global_control::max_allowed_parallelism, 1); + { + static tbb::global_control gc(tbb::global_control::max_allowed_parallelism, 1); + } #else // TBB_HAS_GLOBAL_CONTROL static tbb::task_scheduler_init *tbb_init = new tbb::task_scheduler_init(1); UNUSED(tbb_init); diff --git a/src/nanosvg/README-prusa.txt b/src/nanosvg/README-prusa.txt deleted file mode 100644 index 8388aa8ef3..0000000000 --- a/src/nanosvg/README-prusa.txt +++ /dev/null @@ -1 +0,0 @@ -Upstream source: https://github.com/memononen/nanosvg/tree/c1f6e209c16b18b46aa9f45d7e619acf42c29726 \ No newline at end of file diff --git a/src/nanosvg/nanosvg.h b/src/nanosvg/nanosvg.h deleted file mode 100644 index 57bcb7c2c1..0000000000 --- a/src/nanosvg/nanosvg.h +++ /dev/null @@ -1,2979 +0,0 @@ -/* - * Copyright (c) 2013-14 Mikko Mononen memon@inside.org - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * The SVG parser is based on Anti-Grain Geometry 2.4 SVG example - * Copyright (C) 2002-2004 Maxim Shemanarev (McSeem) (http://www.antigrain.com/) - * - * Arc calculation code based on canvg (https://code.google.com/p/canvg/) - * - * Bounding box calculation based on http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html - * - */ - -#ifndef NANOSVG_H -#define NANOSVG_H - -#ifndef NANOSVG_CPLUSPLUS -#ifdef __cplusplus -extern "C" { -#endif -#endif - -// NanoSVG is a simple stupid single-header-file SVG parse. The output of the parser is a list of cubic bezier shapes. -// -// The library suits well for anything from rendering scalable icons in your editor application to prototyping a game. -// -// NanoSVG supports a wide range of SVG features, but something may be missing, feel free to create a pull request! -// -// The shapes in the SVG images are transformed by the viewBox and converted to specified units. -// That is, you should get the same looking data as your designed in your favorite app. -// -// NanoSVG can return the paths in few different units. For example if you want to render an image, you may choose -// to get the paths in pixels, or if you are feeding the data into a CNC-cutter, you may want to use millimeters. -// -// The units passed to NanoSVG should be one of: 'px', 'pt', 'pc' 'mm', 'cm', or 'in'. -// DPI (dots-per-inch) controls how the unit conversion is done. -// -// If you don't know or care about the units stuff, "px" and 96 should get you going. - - -/* Example Usage: - // Load SVG - NSVGimage* image; - image = nsvgParseFromFile("test.svg", "px", 96); - printf("size: %f x %f\n", image->width, image->height); - // Use... - for (NSVGshape *shape = image->shapes; shape != NULL; shape = shape->next) { - for (NSVGpath *path = shape->paths; path != NULL; path = path->next) { - for (int i = 0; i < path->npts-1; i += 3) { - float* p = &path->pts[i*2]; - drawCubicBez(p[0],p[1], p[2],p[3], p[4],p[5], p[6],p[7]); - } - } - } - // Delete - nsvgDelete(image); -*/ - -enum NSVGpaintType { - NSVG_PAINT_NONE = 0, - NSVG_PAINT_COLOR = 1, - NSVG_PAINT_LINEAR_GRADIENT = 2, - NSVG_PAINT_RADIAL_GRADIENT = 3 -}; - -enum NSVGspreadType { - NSVG_SPREAD_PAD = 0, - NSVG_SPREAD_REFLECT = 1, - NSVG_SPREAD_REPEAT = 2 -}; - -enum NSVGlineJoin { - NSVG_JOIN_MITER = 0, - NSVG_JOIN_ROUND = 1, - NSVG_JOIN_BEVEL = 2 -}; - -enum NSVGlineCap { - NSVG_CAP_BUTT = 0, - NSVG_CAP_ROUND = 1, - NSVG_CAP_SQUARE = 2 -}; - -enum NSVGfillRule { - NSVG_FILLRULE_NONZERO = 0, - NSVG_FILLRULE_EVENODD = 1 -}; - -enum NSVGflags { - NSVG_FLAGS_VISIBLE = 0x01 -}; - -typedef struct NSVGgradientStop { - unsigned int color; - float offset; -} NSVGgradientStop; - -typedef struct NSVGgradient { - float xform[6]; - char spread; - float fx, fy; - int nstops; - NSVGgradientStop stops[1]; -} NSVGgradient; - -typedef struct NSVGpaint { - char type; - union { - unsigned int color; - NSVGgradient* gradient; - }; -} NSVGpaint; - -typedef struct NSVGpath -{ - float* pts; // Cubic bezier points: x0,y0, [cpx1,cpx1,cpx2,cpy2,x1,y1], ... - int npts; // Total number of bezier points. - char closed; // Flag indicating if shapes should be treated as closed. - float bounds[4]; // Tight bounding box of the shape [minx,miny,maxx,maxy]. - struct NSVGpath* next; // Pointer to next path, or NULL if last element. -} NSVGpath; - -typedef struct NSVGshape -{ - char id[64]; // Optional 'id' attr of the shape or its group - NSVGpaint fill; // Fill paint - NSVGpaint stroke; // Stroke paint - float opacity; // Opacity of the shape. - float strokeWidth; // Stroke width (scaled). - float strokeDashOffset; // Stroke dash offset (scaled). - float strokeDashArray[8]; // Stroke dash array (scaled). - char strokeDashCount; // Number of dash values in dash array. - char strokeLineJoin; // Stroke join type. - char strokeLineCap; // Stroke cap type. - float miterLimit; // Miter limit - char fillRule; // Fill rule, see NSVGfillRule. - unsigned char flags; // Logical or of NSVG_FLAGS_* flags - float bounds[4]; // Tight bounding box of the shape [minx,miny,maxx,maxy]. - NSVGpath* paths; // Linked list of paths in the image. - struct NSVGshape* next; // Pointer to next shape, or NULL if last element. -} NSVGshape; - -typedef struct NSVGimage -{ - float width; // Width of the image. - float height; // Height of the image. - NSVGshape* shapes; // Linked list of shapes in the image. -} NSVGimage; - -// Parses SVG file from a file, returns SVG image as paths. -NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi); - -// Parses SVG file from a null terminated string, returns SVG image as paths. -// Important note: changes the string. -NSVGimage* nsvgParse(char* input, const char* units, float dpi); - -// Duplicates a path. -NSVGpath* nsvgDuplicatePath(NSVGpath* p); - -// Deletes an image. -void nsvgDelete(NSVGimage* image); - -#ifndef NANOSVG_CPLUSPLUS -#ifdef __cplusplus -} -#endif -#endif - -#endif // NANOSVG_H - -#ifdef NANOSVG_IMPLEMENTATION - -#include -#include -#include - -#include - -#define NSVG_PI (3.14159265358979323846264338327f) -#define NSVG_KAPPA90 (0.5522847493f) // Length proportional to radius of a cubic bezier handle for 90deg arcs. - -#define NSVG_ALIGN_MIN 0 -#define NSVG_ALIGN_MID 1 -#define NSVG_ALIGN_MAX 2 -#define NSVG_ALIGN_NONE 0 -#define NSVG_ALIGN_MEET 1 -#define NSVG_ALIGN_SLICE 2 - -#define NSVG_NOTUSED(v) do { (void)(1 ? (void)0 : ( (void)(v) ) ); } while(0) -#define NSVG_RGB(r, g, b) (((unsigned int)r) | ((unsigned int)g << 8) | ((unsigned int)b << 16)) - -#ifdef _MSC_VER - #pragma warning (disable: 4996) // Switch off security warnings - #pragma warning (disable: 4100) // Switch off unreferenced formal parameter warnings - #ifdef __cplusplus - #define NSVG_INLINE inline - #else - #define NSVG_INLINE - #endif -#else - #define NSVG_INLINE inline -#endif - - -static int nsvg__isspace(char c) -{ - return strchr(" \t\n\v\f\r", c) != 0; -} - -static int nsvg__isdigit(char c) -{ - return c >= '0' && c <= '9'; -} - -static int nsvg__isnum(char c) -{ - return strchr("0123456789+-.eE", c) != 0; -} - -static NSVG_INLINE float nsvg__minf(float a, float b) { return a < b ? a : b; } -static NSVG_INLINE float nsvg__maxf(float a, float b) { return a > b ? a : b; } - - -// Simple XML parser - -#define NSVG_XML_TAG 1 -#define NSVG_XML_CONTENT 2 -#define NSVG_XML_MAX_ATTRIBS 256 - -static void nsvg__parseContent(char* s, - void (*contentCb)(void* ud, const char* s), - void* ud) -{ - // Trim start white spaces - while (*s && nsvg__isspace(*s)) s++; - if (!*s) return; - - if (contentCb) - (*contentCb)(ud, s); -} - -static void nsvg__parseElement(char* s, - void (*startelCb)(void* ud, const char* el, const char** attr), - void (*endelCb)(void* ud, const char* el), - void* ud) -{ - const char* attr[NSVG_XML_MAX_ATTRIBS]; - int nattr = 0; - char* name; - int start = 0; - int end = 0; - char quote; - - // Skip white space after the '<' - while (*s && nsvg__isspace(*s)) s++; - - // Check if the tag is end tag - if (*s == '/') { - s++; - end = 1; - } else { - start = 1; - } - - // Skip comments, data and preprocessor stuff. - if (!*s || *s == '?' || *s == '!') - return; - - // Get tag name - name = s; - while (*s && !nsvg__isspace(*s)) s++; - if (*s) { *s++ = '\0'; } - - // Get attribs - while (!end && *s && nattr < NSVG_XML_MAX_ATTRIBS-3) { - char* name = NULL; - char* value = NULL; - - // Skip white space before the attrib name - while (*s && nsvg__isspace(*s)) s++; - if (!*s) break; - if (*s == '/') { - end = 1; - break; - } - name = s; - // Find end of the attrib name. - while (*s && !nsvg__isspace(*s) && *s != '=') s++; - if (*s) { *s++ = '\0'; } - // Skip until the beginning of the value. - while (*s && *s != '\"' && *s != '\'') s++; - if (!*s) break; - quote = *s; - s++; - // Store value and find the end of it. - value = s; - while (*s && *s != quote) s++; - if (*s) { *s++ = '\0'; } - - // Store only well formed attributes - if (name && value) { - attr[nattr++] = name; - attr[nattr++] = value; - } - } - - // List terminator - attr[nattr++] = 0; - attr[nattr++] = 0; - - // Call callbacks. - if (start && startelCb) - (*startelCb)(ud, name, attr); - if (end && endelCb) - (*endelCb)(ud, name); -} - -int nsvg__parseXML(char* input, - void (*startelCb)(void* ud, const char* el, const char** attr), - void (*endelCb)(void* ud, const char* el), - void (*contentCb)(void* ud, const char* s), - void* ud) -{ - char* s = input; - char* mark = s; - int state = NSVG_XML_CONTENT; - while (*s) { - if (*s == '<' && state == NSVG_XML_CONTENT) { - // Start of a tag - *s++ = '\0'; - nsvg__parseContent(mark, contentCb, ud); - mark = s; - state = NSVG_XML_TAG; - } else if (*s == '>' && state == NSVG_XML_TAG) { - // Start of a content or new tag. - *s++ = '\0'; - nsvg__parseElement(mark, startelCb, endelCb, ud); - mark = s; - state = NSVG_XML_CONTENT; - } else { - s++; - } - } - - return 1; -} - - -/* Simple SVG parser. */ - -#define NSVG_MAX_ATTR 128 - -enum NSVGgradientUnits { - NSVG_USER_SPACE = 0, - NSVG_OBJECT_SPACE = 1 -}; - -#define NSVG_MAX_DASHES 8 - -enum NSVGunits { - NSVG_UNITS_USER, - NSVG_UNITS_PX, - NSVG_UNITS_PT, - NSVG_UNITS_PC, - NSVG_UNITS_MM, - NSVG_UNITS_CM, - NSVG_UNITS_IN, - NSVG_UNITS_PERCENT, - NSVG_UNITS_EM, - NSVG_UNITS_EX -}; - -typedef struct NSVGcoordinate { - float value; - int units; -} NSVGcoordinate; - -typedef struct NSVGlinearData { - NSVGcoordinate x1, y1, x2, y2; -} NSVGlinearData; - -typedef struct NSVGradialData { - NSVGcoordinate cx, cy, r, fx, fy; -} NSVGradialData; - -typedef struct NSVGgradientData -{ - char id[64]; - char ref[64]; - char type; - union { - NSVGlinearData linear; - NSVGradialData radial; - }; - char spread; - char units; - float xform[6]; - int nstops; - NSVGgradientStop* stops; - struct NSVGgradientData* next; -} NSVGgradientData; - -typedef struct NSVGattrib -{ - char id[64]; - float xform[6]; - unsigned int fillColor; - unsigned int strokeColor; - float opacity; - float fillOpacity; - float strokeOpacity; - char fillGradient[64]; - char strokeGradient[64]; - float strokeWidth; - float strokeDashOffset; - float strokeDashArray[NSVG_MAX_DASHES]; - int strokeDashCount; - char strokeLineJoin; - char strokeLineCap; - float miterLimit; - char fillRule; - float fontSize; - unsigned int stopColor; - float stopOpacity; - float stopOffset; - char hasFill; - char hasStroke; - char visible; -} NSVGattrib; - -typedef struct NSVGparser -{ - NSVGattrib attr[NSVG_MAX_ATTR]; - int attrHead; - float* pts; - int npts; - int cpts; - NSVGpath* plist; - NSVGimage* image; - NSVGgradientData* gradients; - NSVGshape* shapesTail; - float viewMinx, viewMiny, viewWidth, viewHeight; - int alignX, alignY, alignType; - float dpi; - char pathFlag; - char defsFlag; -} NSVGparser; - -static void nsvg__xformIdentity(float* t) -{ - t[0] = 1.0f; t[1] = 0.0f; - t[2] = 0.0f; t[3] = 1.0f; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetTranslation(float* t, float tx, float ty) -{ - t[0] = 1.0f; t[1] = 0.0f; - t[2] = 0.0f; t[3] = 1.0f; - t[4] = tx; t[5] = ty; -} - -static void nsvg__xformSetScale(float* t, float sx, float sy) -{ - t[0] = sx; t[1] = 0.0f; - t[2] = 0.0f; t[3] = sy; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetSkewX(float* t, float a) -{ - t[0] = 1.0f; t[1] = 0.0f; - t[2] = tanf(a); t[3] = 1.0f; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetSkewY(float* t, float a) -{ - t[0] = 1.0f; t[1] = tanf(a); - t[2] = 0.0f; t[3] = 1.0f; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformSetRotation(float* t, float a) -{ - float cs = cosf(a), sn = sinf(a); - t[0] = cs; t[1] = sn; - t[2] = -sn; t[3] = cs; - t[4] = 0.0f; t[5] = 0.0f; -} - -static void nsvg__xformMultiply(float* t, float* s) -{ - float t0 = t[0] * s[0] + t[1] * s[2]; - float t2 = t[2] * s[0] + t[3] * s[2]; - float t4 = t[4] * s[0] + t[5] * s[2] + s[4]; - t[1] = t[0] * s[1] + t[1] * s[3]; - t[3] = t[2] * s[1] + t[3] * s[3]; - t[5] = t[4] * s[1] + t[5] * s[3] + s[5]; - t[0] = t0; - t[2] = t2; - t[4] = t4; -} - -static void nsvg__xformInverse(float* inv, float* t) -{ - double invdet, det = (double)t[0] * t[3] - (double)t[2] * t[1]; - if (det > -1e-6 && det < 1e-6) { - nsvg__xformIdentity(t); - return; - } - invdet = 1.0 / det; - inv[0] = (float)(t[3] * invdet); - inv[2] = (float)(-t[2] * invdet); - inv[4] = (float)(((double)t[2] * t[5] - (double)t[3] * t[4]) * invdet); - inv[1] = (float)(-t[1] * invdet); - inv[3] = (float)(t[0] * invdet); - inv[5] = (float)(((double)t[1] * t[4] - (double)t[0] * t[5]) * invdet); -} - -static void nsvg__xformPremultiply(float* t, float* s) -{ - float s2[6]; - memcpy(s2, s, sizeof(float)*6); - nsvg__xformMultiply(s2, t); - memcpy(t, s2, sizeof(float)*6); -} - -static void nsvg__xformPoint(float* dx, float* dy, float x, float y, float* t) -{ - *dx = x*t[0] + y*t[2] + t[4]; - *dy = x*t[1] + y*t[3] + t[5]; -} - -static void nsvg__xformVec(float* dx, float* dy, float x, float y, float* t) -{ - *dx = x*t[0] + y*t[2]; - *dy = x*t[1] + y*t[3]; -} - -#define NSVG_EPSILON (1e-12) - -static int nsvg__ptInBounds(float* pt, float* bounds) -{ - return pt[0] >= bounds[0] && pt[0] <= bounds[2] && pt[1] >= bounds[1] && pt[1] <= bounds[3]; -} - - -static double nsvg__evalBezier(double t, double p0, double p1, double p2, double p3) -{ - double it = 1.0-t; - return it*it*it*p0 + 3.0*it*it*t*p1 + 3.0*it*t*t*p2 + t*t*t*p3; -} - -static void nsvg__curveBounds(float* bounds, float* curve) -{ - int i, j, count; - double roots[2], a, b, c, b2ac, t, v; - float* v0 = &curve[0]; - float* v1 = &curve[2]; - float* v2 = &curve[4]; - float* v3 = &curve[6]; - - // Start the bounding box by end points - bounds[0] = nsvg__minf(v0[0], v3[0]); - bounds[1] = nsvg__minf(v0[1], v3[1]); - bounds[2] = nsvg__maxf(v0[0], v3[0]); - bounds[3] = nsvg__maxf(v0[1], v3[1]); - - // Bezier curve fits inside the convex hull of it's control points. - // If control points are inside the bounds, we're done. - if (nsvg__ptInBounds(v1, bounds) && nsvg__ptInBounds(v2, bounds)) - return; - - // Add bezier curve inflection points in X and Y. - for (i = 0; i < 2; i++) { - a = -3.0 * v0[i] + 9.0 * v1[i] - 9.0 * v2[i] + 3.0 * v3[i]; - b = 6.0 * v0[i] - 12.0 * v1[i] + 6.0 * v2[i]; - c = 3.0 * v1[i] - 3.0 * v0[i]; - count = 0; - if (fabs(a) < NSVG_EPSILON) { - if (fabs(b) > NSVG_EPSILON) { - t = -c / b; - if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) - roots[count++] = t; - } - } else { - b2ac = b*b - 4.0*c*a; - if (b2ac > NSVG_EPSILON) { - t = (-b + sqrt(b2ac)) / (2.0 * a); - if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) - roots[count++] = t; - t = (-b - sqrt(b2ac)) / (2.0 * a); - if (t > NSVG_EPSILON && t < 1.0-NSVG_EPSILON) - roots[count++] = t; - } - } - for (j = 0; j < count; j++) { - v = nsvg__evalBezier(roots[j], v0[i], v1[i], v2[i], v3[i]); - bounds[0+i] = nsvg__minf(bounds[0+i], (float)v); - bounds[2+i] = nsvg__maxf(bounds[2+i], (float)v); - } - } -} - -static NSVGparser* nsvg__createParser() -{ - NSVGparser* p; - p = (NSVGparser*)malloc(sizeof(NSVGparser)); - if (p == NULL) goto error; - memset(p, 0, sizeof(NSVGparser)); - - p->image = (NSVGimage*)malloc(sizeof(NSVGimage)); - if (p->image == NULL) goto error; - memset(p->image, 0, sizeof(NSVGimage)); - - // Init style - nsvg__xformIdentity(p->attr[0].xform); - memset(p->attr[0].id, 0, sizeof p->attr[0].id); - p->attr[0].fillColor = NSVG_RGB(0,0,0); - p->attr[0].strokeColor = NSVG_RGB(0,0,0); - p->attr[0].opacity = 1; - p->attr[0].fillOpacity = 1; - p->attr[0].strokeOpacity = 1; - p->attr[0].stopOpacity = 1; - p->attr[0].strokeWidth = 1; - p->attr[0].strokeLineJoin = NSVG_JOIN_MITER; - p->attr[0].strokeLineCap = NSVG_CAP_BUTT; - p->attr[0].miterLimit = 4; - p->attr[0].fillRule = NSVG_FILLRULE_NONZERO; - p->attr[0].hasFill = 1; - p->attr[0].visible = 1; - - return p; - -error: - if (p) { - if (p->image) free(p->image); - free(p); - } - return NULL; -} - -static void nsvg__deletePaths(NSVGpath* path) -{ - while (path) { - NSVGpath *next = path->next; - if (path->pts != NULL) - free(path->pts); - free(path); - path = next; - } -} - -static void nsvg__deletePaint(NSVGpaint* paint) -{ - if (paint->type == NSVG_PAINT_LINEAR_GRADIENT || paint->type == NSVG_PAINT_RADIAL_GRADIENT) - free(paint->gradient); -} - -static void nsvg__deleteGradientData(NSVGgradientData* grad) -{ - NSVGgradientData* next; - while (grad != NULL) { - next = grad->next; - free(grad->stops); - free(grad); - grad = next; - } -} - -static void nsvg__deleteParser(NSVGparser* p) -{ - if (p != NULL) { - nsvg__deletePaths(p->plist); - nsvg__deleteGradientData(p->gradients); - nsvgDelete(p->image); - free(p->pts); - free(p); - } -} - -static void nsvg__resetPath(NSVGparser* p) -{ - p->npts = 0; -} - -static void nsvg__addPoint(NSVGparser* p, float x, float y) -{ - if (p->npts+1 > p->cpts) { - p->cpts = p->cpts ? p->cpts*2 : 8; - p->pts = (float*)realloc(p->pts, p->cpts*2*sizeof(float)); - if (!p->pts) return; - } - p->pts[p->npts*2+0] = x; - p->pts[p->npts*2+1] = y; - p->npts++; -} - -static void nsvg__moveTo(NSVGparser* p, float x, float y) -{ - if (p->npts > 0) { - p->pts[(p->npts-1)*2+0] = x; - p->pts[(p->npts-1)*2+1] = y; - } else { - nsvg__addPoint(p, x, y); - } -} - -static void nsvg__lineTo(NSVGparser* p, float x, float y) -{ - float px,py, dx,dy; - if (p->npts > 0) { - px = p->pts[(p->npts-1)*2+0]; - py = p->pts[(p->npts-1)*2+1]; - dx = x - px; - dy = y - py; - nsvg__addPoint(p, px + dx/3.0f, py + dy/3.0f); - nsvg__addPoint(p, x - dx/3.0f, y - dy/3.0f); - nsvg__addPoint(p, x, y); - } -} - -static void nsvg__cubicBezTo(NSVGparser* p, float cpx1, float cpy1, float cpx2, float cpy2, float x, float y) -{ - nsvg__addPoint(p, cpx1, cpy1); - nsvg__addPoint(p, cpx2, cpy2); - nsvg__addPoint(p, x, y); -} - -static NSVGattrib* nsvg__getAttr(NSVGparser* p) -{ - return &p->attr[p->attrHead]; -} - -static void nsvg__pushAttr(NSVGparser* p) -{ - if (p->attrHead < NSVG_MAX_ATTR-1) { - p->attrHead++; - memcpy(&p->attr[p->attrHead], &p->attr[p->attrHead-1], sizeof(NSVGattrib)); - } -} - -static void nsvg__popAttr(NSVGparser* p) -{ - if (p->attrHead > 0) - p->attrHead--; -} - -static float nsvg__actualOrigX(NSVGparser* p) -{ - return p->viewMinx; -} - -static float nsvg__actualOrigY(NSVGparser* p) -{ - return p->viewMiny; -} - -static float nsvg__actualWidth(NSVGparser* p) -{ - return p->viewWidth; -} - -static float nsvg__actualHeight(NSVGparser* p) -{ - return p->viewHeight; -} - -static float nsvg__actualLength(NSVGparser* p) -{ - float w = nsvg__actualWidth(p), h = nsvg__actualHeight(p); - return sqrtf(w*w + h*h) / sqrtf(2.0f); -} - -static float nsvg__convertToPixels(NSVGparser* p, NSVGcoordinate c, float orig, float length) -{ - NSVGattrib* attr = nsvg__getAttr(p); - switch (c.units) { - case NSVG_UNITS_USER: return c.value; - case NSVG_UNITS_PX: return c.value; - case NSVG_UNITS_PT: return c.value / 72.0f * p->dpi; - case NSVG_UNITS_PC: return c.value / 6.0f * p->dpi; - case NSVG_UNITS_MM: return c.value / 25.4f * p->dpi; - case NSVG_UNITS_CM: return c.value / 2.54f * p->dpi; - case NSVG_UNITS_IN: return c.value * p->dpi; - case NSVG_UNITS_EM: return c.value * attr->fontSize; - case NSVG_UNITS_EX: return c.value * attr->fontSize * 0.52f; // x-height of Helvetica. - case NSVG_UNITS_PERCENT: return orig + c.value / 100.0f * length; - default: return c.value; - } - return c.value; -} - -static NSVGgradientData* nsvg__findGradientData(NSVGparser* p, const char* id) -{ - NSVGgradientData* grad = p->gradients; - while (grad) { - if (strcmp(grad->id, id) == 0) - return grad; - grad = grad->next; - } - return NULL; -} - -static NSVGgradient* nsvg__createGradient(NSVGparser* p, const char* id, const float* localBounds, char* paintType) -{ - NSVGattrib* attr = nsvg__getAttr(p); - NSVGgradientData* data = NULL; - NSVGgradientData* ref = NULL; - NSVGgradientStop* stops = NULL; - NSVGgradient* grad; - float ox, oy, sw, sh, sl; - int nstops = 0; - - data = nsvg__findGradientData(p, id); - if (data == NULL) return NULL; - - // TODO: use ref to fill in all unset values too. - ref = data; - while (ref != NULL) { - if (stops == NULL && ref->stops != NULL) { - stops = ref->stops; - nstops = ref->nstops; - break; - } - ref = nsvg__findGradientData(p, ref->ref); - } - if (stops == NULL) return NULL; - - grad = (NSVGgradient*)malloc(sizeof(NSVGgradient) + sizeof(NSVGgradientStop)*(nstops-1)); - if (grad == NULL) return NULL; - - // The shape width and height. - if (data->units == NSVG_OBJECT_SPACE) { - ox = localBounds[0]; - oy = localBounds[1]; - sw = localBounds[2] - localBounds[0]; - sh = localBounds[3] - localBounds[1]; - } else { - ox = nsvg__actualOrigX(p); - oy = nsvg__actualOrigY(p); - sw = nsvg__actualWidth(p); - sh = nsvg__actualHeight(p); - } - sl = sqrtf(sw*sw + sh*sh) / sqrtf(2.0f); - - if (data->type == NSVG_PAINT_LINEAR_GRADIENT) { - float x1, y1, x2, y2, dx, dy; - x1 = nsvg__convertToPixels(p, data->linear.x1, ox, sw); - y1 = nsvg__convertToPixels(p, data->linear.y1, oy, sh); - x2 = nsvg__convertToPixels(p, data->linear.x2, ox, sw); - y2 = nsvg__convertToPixels(p, data->linear.y2, oy, sh); - // Calculate transform aligned to the line - dx = x2 - x1; - dy = y2 - y1; - grad->xform[0] = dy; grad->xform[1] = -dx; - grad->xform[2] = dx; grad->xform[3] = dy; - grad->xform[4] = x1; grad->xform[5] = y1; - } else { - float cx, cy, fx, fy, r; - cx = nsvg__convertToPixels(p, data->radial.cx, ox, sw); - cy = nsvg__convertToPixels(p, data->radial.cy, oy, sh); - fx = nsvg__convertToPixels(p, data->radial.fx, ox, sw); - fy = nsvg__convertToPixels(p, data->radial.fy, oy, sh); - r = nsvg__convertToPixels(p, data->radial.r, 0, sl); - // Calculate transform aligned to the circle - grad->xform[0] = r; grad->xform[1] = 0; - grad->xform[2] = 0; grad->xform[3] = r; - grad->xform[4] = cx; grad->xform[5] = cy; - grad->fx = fx / r; - grad->fy = fy / r; - } - - nsvg__xformMultiply(grad->xform, data->xform); - nsvg__xformMultiply(grad->xform, attr->xform); - - grad->spread = data->spread; - memcpy(grad->stops, stops, nstops*sizeof(NSVGgradientStop)); - grad->nstops = nstops; - - *paintType = data->type; - - return grad; -} - -static float nsvg__getAverageScale(float* t) -{ - float sx = sqrtf(t[0]*t[0] + t[2]*t[2]); - float sy = sqrtf(t[1]*t[1] + t[3]*t[3]); - return (sx + sy) * 0.5f; -} - -static void nsvg__getLocalBounds(float* bounds, NSVGshape *shape, float* xform) -{ - NSVGpath* path; - float curve[4*2], curveBounds[4]; - int i, first = 1; - for (path = shape->paths; path != NULL; path = path->next) { - nsvg__xformPoint(&curve[0], &curve[1], path->pts[0], path->pts[1], xform); - for (i = 0; i < path->npts-1; i += 3) { - nsvg__xformPoint(&curve[2], &curve[3], path->pts[(i+1)*2], path->pts[(i+1)*2+1], xform); - nsvg__xformPoint(&curve[4], &curve[5], path->pts[(i+2)*2], path->pts[(i+2)*2+1], xform); - nsvg__xformPoint(&curve[6], &curve[7], path->pts[(i+3)*2], path->pts[(i+3)*2+1], xform); - nsvg__curveBounds(curveBounds, curve); - if (first) { - bounds[0] = curveBounds[0]; - bounds[1] = curveBounds[1]; - bounds[2] = curveBounds[2]; - bounds[3] = curveBounds[3]; - first = 0; - } else { - bounds[0] = nsvg__minf(bounds[0], curveBounds[0]); - bounds[1] = nsvg__minf(bounds[1], curveBounds[1]); - bounds[2] = nsvg__maxf(bounds[2], curveBounds[2]); - bounds[3] = nsvg__maxf(bounds[3], curveBounds[3]); - } - curve[0] = curve[6]; - curve[1] = curve[7]; - } - } -} - -static void nsvg__addShape(NSVGparser* p) -{ - NSVGattrib* attr = nsvg__getAttr(p); - float scale = 1.0f; - NSVGshape* shape; - NSVGpath* path; - int i; - - if (p->plist == NULL) - return; - - shape = (NSVGshape*)malloc(sizeof(NSVGshape)); - if (shape == NULL) goto error; - memset(shape, 0, sizeof(NSVGshape)); - - memcpy(shape->id, attr->id, sizeof shape->id); - scale = nsvg__getAverageScale(attr->xform); - shape->strokeWidth = attr->strokeWidth * scale; - shape->strokeDashOffset = attr->strokeDashOffset * scale; - shape->strokeDashCount = (char)attr->strokeDashCount; - for (i = 0; i < attr->strokeDashCount; i++) - shape->strokeDashArray[i] = attr->strokeDashArray[i] * scale; - shape->strokeLineJoin = attr->strokeLineJoin; - shape->strokeLineCap = attr->strokeLineCap; - shape->miterLimit = attr->miterLimit; - shape->fillRule = attr->fillRule; - shape->opacity = attr->opacity; - - shape->paths = p->plist; - p->plist = NULL; - - // Calculate shape bounds - shape->bounds[0] = shape->paths->bounds[0]; - shape->bounds[1] = shape->paths->bounds[1]; - shape->bounds[2] = shape->paths->bounds[2]; - shape->bounds[3] = shape->paths->bounds[3]; - for (path = shape->paths->next; path != NULL; path = path->next) { - shape->bounds[0] = nsvg__minf(shape->bounds[0], path->bounds[0]); - shape->bounds[1] = nsvg__minf(shape->bounds[1], path->bounds[1]); - shape->bounds[2] = nsvg__maxf(shape->bounds[2], path->bounds[2]); - shape->bounds[3] = nsvg__maxf(shape->bounds[3], path->bounds[3]); - } - - // Set fill - if (attr->hasFill == 0) { - shape->fill.type = NSVG_PAINT_NONE; - } else if (attr->hasFill == 1) { - shape->fill.type = NSVG_PAINT_COLOR; - shape->fill.color = attr->fillColor; - shape->fill.color |= (unsigned int)(attr->fillOpacity*255) << 24; - } else if (attr->hasFill == 2) { - float inv[6], localBounds[4]; - nsvg__xformInverse(inv, attr->xform); - nsvg__getLocalBounds(localBounds, shape, inv); - shape->fill.gradient = nsvg__createGradient(p, attr->fillGradient, localBounds, &shape->fill.type); - if (shape->fill.gradient == NULL) { - shape->fill.type = NSVG_PAINT_NONE; - } - } - - // Set stroke - if (attr->hasStroke == 0) { - shape->stroke.type = NSVG_PAINT_NONE; - } else if (attr->hasStroke == 1) { - shape->stroke.type = NSVG_PAINT_COLOR; - shape->stroke.color = attr->strokeColor; - shape->stroke.color |= (unsigned int)(attr->strokeOpacity*255) << 24; - } else if (attr->hasStroke == 2) { - float inv[6], localBounds[4]; - nsvg__xformInverse(inv, attr->xform); - nsvg__getLocalBounds(localBounds, shape, inv); - shape->stroke.gradient = nsvg__createGradient(p, attr->strokeGradient, localBounds, &shape->stroke.type); - if (shape->stroke.gradient == NULL) - shape->stroke.type = NSVG_PAINT_NONE; - } - - // Set flags - shape->flags = (attr->visible ? NSVG_FLAGS_VISIBLE : 0x00); - - // Add to tail - if (p->image->shapes == NULL) - p->image->shapes = shape; - else - p->shapesTail->next = shape; - p->shapesTail = shape; - - return; - -error: - if (shape) free(shape); -} - -static void nsvg__addPath(NSVGparser* p, char closed) -{ - NSVGattrib* attr = nsvg__getAttr(p); - NSVGpath* path = NULL; - float bounds[4]; - float* curve; - int i; - - if (p->npts < 4) - return; - - if (closed) - nsvg__lineTo(p, p->pts[0], p->pts[1]); - - path = (NSVGpath*)malloc(sizeof(NSVGpath)); - if (path == NULL) goto error; - memset(path, 0, sizeof(NSVGpath)); - - path->pts = (float*)malloc(p->npts*2*sizeof(float)); - if (path->pts == NULL) goto error; - path->closed = closed; - path->npts = p->npts; - - // Transform path. - for (i = 0; i < p->npts; ++i) - nsvg__xformPoint(&path->pts[i*2], &path->pts[i*2+1], p->pts[i*2], p->pts[i*2+1], attr->xform); - - // Find bounds - for (i = 0; i < path->npts-1; i += 3) { - curve = &path->pts[i*2]; - nsvg__curveBounds(bounds, curve); - if (i == 0) { - path->bounds[0] = bounds[0]; - path->bounds[1] = bounds[1]; - path->bounds[2] = bounds[2]; - path->bounds[3] = bounds[3]; - } else { - path->bounds[0] = nsvg__minf(path->bounds[0], bounds[0]); - path->bounds[1] = nsvg__minf(path->bounds[1], bounds[1]); - path->bounds[2] = nsvg__maxf(path->bounds[2], bounds[2]); - path->bounds[3] = nsvg__maxf(path->bounds[3], bounds[3]); - } - } - - path->next = p->plist; - p->plist = path; - - return; - -error: - if (path != NULL) { - if (path->pts != NULL) free(path->pts); - free(path); - } -} - -// We roll our own string to float because the std library one uses locale and messes things up. -static double nsvg__atof(const char* s) -{ - char* cur = (char*)s; - char* end = NULL; - double res = 0.0, sign = 1.0; - long long intPart = 0, fracPart = 0; - char hasIntPart = 0, hasFracPart = 0; - - // Parse optional sign - if (*cur == '+') { - cur++; - } else if (*cur == '-') { - sign = -1; - cur++; - } - - // Parse integer part - if (nsvg__isdigit(*cur)) { - // Parse digit sequence - intPart = (double)strtoll(cur, &end, 10); - if (cur != end) { - res = (double)intPart; - hasIntPart = 1; - cur = end; - } - } - - // Parse fractional part. - if (*cur == '.') { - cur++; // Skip '.' - if (nsvg__isdigit(*cur)) { - // Parse digit sequence - fracPart = strtoll(cur, &end, 10); - if (cur != end) { - res += (double)fracPart / pow(10.0, (double)(end - cur)); - hasFracPart = 1; - cur = end; - } - } - } - - // A valid number should have integer or fractional part. - if (!hasIntPart && !hasFracPart) - return 0.0; - - // Parse optional exponent - if (*cur == 'e' || *cur == 'E') { - int expPart = 0; - cur++; // skip 'E' - expPart = strtol(cur, &end, 10); // Parse digit sequence with sign - if (cur != end) { - res *= pow(10.0, (double)expPart); - } - } - - return res * sign; -} - - -static const char* nsvg__parseNumber(const char* s, char* it, const int size) -{ - const int last = size-1; - int i = 0; - - // sign - if (*s == '-' || *s == '+') { - if (i < last) it[i++] = *s; - s++; - } - // integer part - while (*s && nsvg__isdigit(*s)) { - if (i < last) it[i++] = *s; - s++; - } - if (*s == '.') { - // decimal point - if (i < last) it[i++] = *s; - s++; - // fraction part - while (*s && nsvg__isdigit(*s)) { - if (i < last) it[i++] = *s; - s++; - } - } - // exponent - if (*s == 'e' || *s == 'E') { - if (i < last) it[i++] = *s; - s++; - if (*s == '-' || *s == '+') { - if (i < last) it[i++] = *s; - s++; - } - while (*s && nsvg__isdigit(*s)) { - if (i < last) it[i++] = *s; - s++; - } - } - it[i] = '\0'; - - return s; -} - -static const char* nsvg__getNextPathItem(const char* s, char* it) -{ - it[0] = '\0'; - // Skip white spaces and commas - while (*s && (nsvg__isspace(*s) || *s == ',')) s++; - if (!*s) return s; - if (*s == '-' || *s == '+' || *s == '.' || nsvg__isdigit(*s)) { - s = nsvg__parseNumber(s, it, 64); - } else { - // Parse command - it[0] = *s++; - it[1] = '\0'; - return s; - } - - return s; -} - -static unsigned int nsvg__parseColorHex(const char* str) -{ - unsigned int c = 0, r = 0, g = 0, b = 0; - int n = 0; - str++; // skip # - // Calculate number of characters. - while(str[n] && !nsvg__isspace(str[n])) - n++; - if (n == 6) { - sscanf(str, "%x", &c); - } else if (n == 3) { - sscanf(str, "%x", &c); - c = (c&0xf) | ((c&0xf0) << 4) | ((c&0xf00) << 8); - c |= c<<4; - } - r = (c >> 16) & 0xff; - g = (c >> 8) & 0xff; - b = c & 0xff; - return NSVG_RGB(r,g,b); -} - -static unsigned int nsvg__parseColorRGB(const char* str) -{ - int r = -1, g = -1, b = -1; - char s1[32]="", s2[32]=""; - sscanf(str + 4, "%d%[%%, \t]%d%[%%, \t]%d", &r, s1, &g, s2, &b); - if (strchr(s1, '%')) { - return NSVG_RGB((r*255)/100,(g*255)/100,(b*255)/100); - } else { - return NSVG_RGB(r,g,b); - } -} - -typedef struct NSVGNamedColor { - const char* name; - unsigned int color; -} NSVGNamedColor; - -NSVGNamedColor nsvg__colors[] = { - - { "red", NSVG_RGB(255, 0, 0) }, - { "green", NSVG_RGB( 0, 128, 0) }, - { "blue", NSVG_RGB( 0, 0, 255) }, - { "yellow", NSVG_RGB(255, 255, 0) }, - { "cyan", NSVG_RGB( 0, 255, 255) }, - { "magenta", NSVG_RGB(255, 0, 255) }, - { "black", NSVG_RGB( 0, 0, 0) }, - { "grey", NSVG_RGB(128, 128, 128) }, - { "gray", NSVG_RGB(128, 128, 128) }, - { "white", NSVG_RGB(255, 255, 255) }, - -#ifdef NANOSVG_ALL_COLOR_KEYWORDS - { "aliceblue", NSVG_RGB(240, 248, 255) }, - { "antiquewhite", NSVG_RGB(250, 235, 215) }, - { "aqua", NSVG_RGB( 0, 255, 255) }, - { "aquamarine", NSVG_RGB(127, 255, 212) }, - { "azure", NSVG_RGB(240, 255, 255) }, - { "beige", NSVG_RGB(245, 245, 220) }, - { "bisque", NSVG_RGB(255, 228, 196) }, - { "blanchedalmond", NSVG_RGB(255, 235, 205) }, - { "blueviolet", NSVG_RGB(138, 43, 226) }, - { "brown", NSVG_RGB(165, 42, 42) }, - { "burlywood", NSVG_RGB(222, 184, 135) }, - { "cadetblue", NSVG_RGB( 95, 158, 160) }, - { "chartreuse", NSVG_RGB(127, 255, 0) }, - { "chocolate", NSVG_RGB(210, 105, 30) }, - { "coral", NSVG_RGB(255, 127, 80) }, - { "cornflowerblue", NSVG_RGB(100, 149, 237) }, - { "cornsilk", NSVG_RGB(255, 248, 220) }, - { "crimson", NSVG_RGB(220, 20, 60) }, - { "darkblue", NSVG_RGB( 0, 0, 139) }, - { "darkcyan", NSVG_RGB( 0, 139, 139) }, - { "darkgoldenrod", NSVG_RGB(184, 134, 11) }, - { "darkgray", NSVG_RGB(169, 169, 169) }, - { "darkgreen", NSVG_RGB( 0, 100, 0) }, - { "darkgrey", NSVG_RGB(169, 169, 169) }, - { "darkkhaki", NSVG_RGB(189, 183, 107) }, - { "darkmagenta", NSVG_RGB(139, 0, 139) }, - { "darkolivegreen", NSVG_RGB( 85, 107, 47) }, - { "darkorange", NSVG_RGB(255, 140, 0) }, - { "darkorchid", NSVG_RGB(153, 50, 204) }, - { "darkred", NSVG_RGB(139, 0, 0) }, - { "darksalmon", NSVG_RGB(233, 150, 122) }, - { "darkseagreen", NSVG_RGB(143, 188, 143) }, - { "darkslateblue", NSVG_RGB( 72, 61, 139) }, - { "darkslategray", NSVG_RGB( 47, 79, 79) }, - { "darkslategrey", NSVG_RGB( 47, 79, 79) }, - { "darkturquoise", NSVG_RGB( 0, 206, 209) }, - { "darkviolet", NSVG_RGB(148, 0, 211) }, - { "deeppink", NSVG_RGB(255, 20, 147) }, - { "deepskyblue", NSVG_RGB( 0, 191, 255) }, - { "dimgray", NSVG_RGB(105, 105, 105) }, - { "dimgrey", NSVG_RGB(105, 105, 105) }, - { "dodgerblue", NSVG_RGB( 30, 144, 255) }, - { "firebrick", NSVG_RGB(178, 34, 34) }, - { "floralwhite", NSVG_RGB(255, 250, 240) }, - { "forestgreen", NSVG_RGB( 34, 139, 34) }, - { "fuchsia", NSVG_RGB(255, 0, 255) }, - { "gainsboro", NSVG_RGB(220, 220, 220) }, - { "ghostwhite", NSVG_RGB(248, 248, 255) }, - { "gold", NSVG_RGB(255, 215, 0) }, - { "goldenrod", NSVG_RGB(218, 165, 32) }, - { "greenyellow", NSVG_RGB(173, 255, 47) }, - { "honeydew", NSVG_RGB(240, 255, 240) }, - { "hotpink", NSVG_RGB(255, 105, 180) }, - { "indianred", NSVG_RGB(205, 92, 92) }, - { "indigo", NSVG_RGB( 75, 0, 130) }, - { "ivory", NSVG_RGB(255, 255, 240) }, - { "khaki", NSVG_RGB(240, 230, 140) }, - { "lavender", NSVG_RGB(230, 230, 250) }, - { "lavenderblush", NSVG_RGB(255, 240, 245) }, - { "lawngreen", NSVG_RGB(124, 252, 0) }, - { "lemonchiffon", NSVG_RGB(255, 250, 205) }, - { "lightblue", NSVG_RGB(173, 216, 230) }, - { "lightcoral", NSVG_RGB(240, 128, 128) }, - { "lightcyan", NSVG_RGB(224, 255, 255) }, - { "lightgoldenrodyellow", NSVG_RGB(250, 250, 210) }, - { "lightgray", NSVG_RGB(211, 211, 211) }, - { "lightgreen", NSVG_RGB(144, 238, 144) }, - { "lightgrey", NSVG_RGB(211, 211, 211) }, - { "lightpink", NSVG_RGB(255, 182, 193) }, - { "lightsalmon", NSVG_RGB(255, 160, 122) }, - { "lightseagreen", NSVG_RGB( 32, 178, 170) }, - { "lightskyblue", NSVG_RGB(135, 206, 250) }, - { "lightslategray", NSVG_RGB(119, 136, 153) }, - { "lightslategrey", NSVG_RGB(119, 136, 153) }, - { "lightsteelblue", NSVG_RGB(176, 196, 222) }, - { "lightyellow", NSVG_RGB(255, 255, 224) }, - { "lime", NSVG_RGB( 0, 255, 0) }, - { "limegreen", NSVG_RGB( 50, 205, 50) }, - { "linen", NSVG_RGB(250, 240, 230) }, - { "maroon", NSVG_RGB(128, 0, 0) }, - { "mediumaquamarine", NSVG_RGB(102, 205, 170) }, - { "mediumblue", NSVG_RGB( 0, 0, 205) }, - { "mediumorchid", NSVG_RGB(186, 85, 211) }, - { "mediumpurple", NSVG_RGB(147, 112, 219) }, - { "mediumseagreen", NSVG_RGB( 60, 179, 113) }, - { "mediumslateblue", NSVG_RGB(123, 104, 238) }, - { "mediumspringgreen", NSVG_RGB( 0, 250, 154) }, - { "mediumturquoise", NSVG_RGB( 72, 209, 204) }, - { "mediumvioletred", NSVG_RGB(199, 21, 133) }, - { "midnightblue", NSVG_RGB( 25, 25, 112) }, - { "mintcream", NSVG_RGB(245, 255, 250) }, - { "mistyrose", NSVG_RGB(255, 228, 225) }, - { "moccasin", NSVG_RGB(255, 228, 181) }, - { "navajowhite", NSVG_RGB(255, 222, 173) }, - { "navy", NSVG_RGB( 0, 0, 128) }, - { "oldlace", NSVG_RGB(253, 245, 230) }, - { "olive", NSVG_RGB(128, 128, 0) }, - { "olivedrab", NSVG_RGB(107, 142, 35) }, - { "orange", NSVG_RGB(255, 165, 0) }, - { "orangered", NSVG_RGB(255, 69, 0) }, - { "orchid", NSVG_RGB(218, 112, 214) }, - { "palegoldenrod", NSVG_RGB(238, 232, 170) }, - { "palegreen", NSVG_RGB(152, 251, 152) }, - { "paleturquoise", NSVG_RGB(175, 238, 238) }, - { "palevioletred", NSVG_RGB(219, 112, 147) }, - { "papayawhip", NSVG_RGB(255, 239, 213) }, - { "peachpuff", NSVG_RGB(255, 218, 185) }, - { "peru", NSVG_RGB(205, 133, 63) }, - { "pink", NSVG_RGB(255, 192, 203) }, - { "plum", NSVG_RGB(221, 160, 221) }, - { "powderblue", NSVG_RGB(176, 224, 230) }, - { "purple", NSVG_RGB(128, 0, 128) }, - { "rosybrown", NSVG_RGB(188, 143, 143) }, - { "royalblue", NSVG_RGB( 65, 105, 225) }, - { "saddlebrown", NSVG_RGB(139, 69, 19) }, - { "salmon", NSVG_RGB(250, 128, 114) }, - { "sandybrown", NSVG_RGB(244, 164, 96) }, - { "seagreen", NSVG_RGB( 46, 139, 87) }, - { "seashell", NSVG_RGB(255, 245, 238) }, - { "sienna", NSVG_RGB(160, 82, 45) }, - { "silver", NSVG_RGB(192, 192, 192) }, - { "skyblue", NSVG_RGB(135, 206, 235) }, - { "slateblue", NSVG_RGB(106, 90, 205) }, - { "slategray", NSVG_RGB(112, 128, 144) }, - { "slategrey", NSVG_RGB(112, 128, 144) }, - { "snow", NSVG_RGB(255, 250, 250) }, - { "springgreen", NSVG_RGB( 0, 255, 127) }, - { "steelblue", NSVG_RGB( 70, 130, 180) }, - { "tan", NSVG_RGB(210, 180, 140) }, - { "teal", NSVG_RGB( 0, 128, 128) }, - { "thistle", NSVG_RGB(216, 191, 216) }, - { "tomato", NSVG_RGB(255, 99, 71) }, - { "turquoise", NSVG_RGB( 64, 224, 208) }, - { "violet", NSVG_RGB(238, 130, 238) }, - { "wheat", NSVG_RGB(245, 222, 179) }, - { "whitesmoke", NSVG_RGB(245, 245, 245) }, - { "yellowgreen", NSVG_RGB(154, 205, 50) }, -#endif -}; - -static unsigned int nsvg__parseColorName(const char* str) -{ - int i, ncolors = sizeof(nsvg__colors) / sizeof(NSVGNamedColor); - - for (i = 0; i < ncolors; i++) { - if (strcmp(nsvg__colors[i].name, str) == 0) { - return nsvg__colors[i].color; - } - } - - return NSVG_RGB(128, 128, 128); -} - -static unsigned int nsvg__parseColor(const char* str) -{ - size_t len = 0; - while(*str == ' ') ++str; - len = strlen(str); - if (len >= 1 && *str == '#') - return nsvg__parseColorHex(str); - else if (len >= 4 && str[0] == 'r' && str[1] == 'g' && str[2] == 'b' && str[3] == '(') - return nsvg__parseColorRGB(str); - return nsvg__parseColorName(str); -} - -static float nsvg__parseOpacity(const char* str) -{ - float val = nsvg__atof(str); - if (val < 0.0f) val = 0.0f; - if (val > 1.0f) val = 1.0f; - return val; -} - -static float nsvg__parseMiterLimit(const char* str) -{ - float val = nsvg__atof(str); - if (val < 0.0f) val = 0.0f; - return val; -} - -static int nsvg__parseUnits(const char* units) -{ - if (units[0] == 'p' && units[1] == 'x') - return NSVG_UNITS_PX; - else if (units[0] == 'p' && units[1] == 't') - return NSVG_UNITS_PT; - else if (units[0] == 'p' && units[1] == 'c') - return NSVG_UNITS_PC; - else if (units[0] == 'm' && units[1] == 'm') - return NSVG_UNITS_MM; - else if (units[0] == 'c' && units[1] == 'm') - return NSVG_UNITS_CM; - else if (units[0] == 'i' && units[1] == 'n') - return NSVG_UNITS_IN; - else if (units[0] == '%') - return NSVG_UNITS_PERCENT; - else if (units[0] == 'e' && units[1] == 'm') - return NSVG_UNITS_EM; - else if (units[0] == 'e' && units[1] == 'x') - return NSVG_UNITS_EX; - return NSVG_UNITS_USER; -} - -static NSVGcoordinate nsvg__parseCoordinateRaw(const char* str) -{ - NSVGcoordinate coord = {0, NSVG_UNITS_USER}; - char buf[64]; - coord.units = nsvg__parseUnits(nsvg__parseNumber(str, buf, 64)); - coord.value = nsvg__atof(buf); - return coord; -} - -static NSVGcoordinate nsvg__coord(float v, int units) -{ - NSVGcoordinate coord = {v, units}; - return coord; -} - -static float nsvg__parseCoordinate(NSVGparser* p, const char* str, float orig, float length) -{ - NSVGcoordinate coord = nsvg__parseCoordinateRaw(str); - return nsvg__convertToPixels(p, coord, orig, length); -} - -static int nsvg__parseTransformArgs(const char* str, float* args, int maxNa, int* na) -{ - const char* end; - const char* ptr; - char it[64]; - - *na = 0; - ptr = str; - while (*ptr && *ptr != '(') ++ptr; - if (*ptr == 0) - return 1; - end = ptr; - while (*end && *end != ')') ++end; - if (*end == 0) - return 1; - - while (ptr < end) { - if (*ptr == '-' || *ptr == '+' || *ptr == '.' || nsvg__isdigit(*ptr)) { - if (*na >= maxNa) return 0; - ptr = nsvg__parseNumber(ptr, it, 64); - args[(*na)++] = (float)nsvg__atof(it); - } else { - ++ptr; - } - } - return (int)(end - str); -} - - -static int nsvg__parseMatrix(float* xform, const char* str) -{ - float t[6]; - int na = 0; - int len = nsvg__parseTransformArgs(str, t, 6, &na); - if (na != 6) return len; - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseTranslate(float* xform, const char* str) -{ - float args[2]; - float t[6]; - int na = 0; - int len = nsvg__parseTransformArgs(str, args, 2, &na); - if (na == 1) args[1] = 0.0; - - nsvg__xformSetTranslation(t, args[0], args[1]); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseScale(float* xform, const char* str) -{ - float args[2]; - int na = 0; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 2, &na); - if (na == 1) args[1] = args[0]; - nsvg__xformSetScale(t, args[0], args[1]); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseSkewX(float* xform, const char* str) -{ - float args[1]; - int na = 0; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 1, &na); - nsvg__xformSetSkewX(t, args[0]/180.0f*NSVG_PI); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseSkewY(float* xform, const char* str) -{ - float args[1]; - int na = 0; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 1, &na); - nsvg__xformSetSkewY(t, args[0]/180.0f*NSVG_PI); - memcpy(xform, t, sizeof(float)*6); - return len; -} - -static int nsvg__parseRotate(float* xform, const char* str) -{ - float args[3]; - int na = 0; - float m[6]; - float t[6]; - int len = nsvg__parseTransformArgs(str, args, 3, &na); - if (na == 1) - args[1] = args[2] = 0.0f; - nsvg__xformIdentity(m); - - if (na > 1) { - nsvg__xformSetTranslation(t, -args[1], -args[2]); - nsvg__xformMultiply(m, t); - } - - nsvg__xformSetRotation(t, args[0]/180.0f*NSVG_PI); - nsvg__xformMultiply(m, t); - - if (na > 1) { - nsvg__xformSetTranslation(t, args[1], args[2]); - nsvg__xformMultiply(m, t); - } - - memcpy(xform, m, sizeof(float)*6); - - return len; -} - -static void nsvg__parseTransform(float* xform, const char* str) -{ - float t[6]; - nsvg__xformIdentity(xform); - while (*str) - { - if (strncmp(str, "matrix", 6) == 0) - str += nsvg__parseMatrix(t, str); - else if (strncmp(str, "translate", 9) == 0) - str += nsvg__parseTranslate(t, str); - else if (strncmp(str, "scale", 5) == 0) - str += nsvg__parseScale(t, str); - else if (strncmp(str, "rotate", 6) == 0) - str += nsvg__parseRotate(t, str); - else if (strncmp(str, "skewX", 5) == 0) - str += nsvg__parseSkewX(t, str); - else if (strncmp(str, "skewY", 5) == 0) - str += nsvg__parseSkewY(t, str); - else{ - ++str; - continue; - } - - nsvg__xformPremultiply(xform, t); - } -} - -static void nsvg__parseUrl(char* id, const char* str) -{ - int i = 0; - str += 4; // "url("; - if (*str == '#') - str++; - while (i < 63 && *str != ')') { - id[i] = *str++; - i++; - } - id[i] = '\0'; -} - -static char nsvg__parseLineCap(const char* str) -{ - if (strcmp(str, "butt") == 0) - return NSVG_CAP_BUTT; - else if (strcmp(str, "round") == 0) - return NSVG_CAP_ROUND; - else if (strcmp(str, "square") == 0) - return NSVG_CAP_SQUARE; - // TODO: handle inherit. - return NSVG_CAP_BUTT; -} - -static char nsvg__parseLineJoin(const char* str) -{ - if (strcmp(str, "miter") == 0) - return NSVG_JOIN_MITER; - else if (strcmp(str, "round") == 0) - return NSVG_JOIN_ROUND; - else if (strcmp(str, "bevel") == 0) - return NSVG_JOIN_BEVEL; - // TODO: handle inherit. - return NSVG_JOIN_MITER; -} - -static char nsvg__parseFillRule(const char* str) -{ - if (strcmp(str, "nonzero") == 0) - return NSVG_FILLRULE_NONZERO; - else if (strcmp(str, "evenodd") == 0) - return NSVG_FILLRULE_EVENODD; - // TODO: handle inherit. - return NSVG_FILLRULE_NONZERO; -} - -static const char* nsvg__getNextDashItem(const char* s, char* it) -{ - int n = 0; - it[0] = '\0'; - // Skip white spaces and commas - while (*s && (nsvg__isspace(*s) || *s == ',')) s++; - // Advance until whitespace, comma or end. - while (*s && (!nsvg__isspace(*s) && *s != ',')) { - if (n < 63) - it[n++] = *s; - s++; - } - it[n++] = '\0'; - return s; -} - -static int nsvg__parseStrokeDashArray(NSVGparser* p, const char* str, float* strokeDashArray) -{ - char item[64]; - int count = 0, i; - float sum = 0.0f; - - // Handle "none" - if (str[0] == 'n') - return 0; - - // Parse dashes - while (*str) { - str = nsvg__getNextDashItem(str, item); - if (!*item) break; - if (count < NSVG_MAX_DASHES) - strokeDashArray[count++] = fabsf(nsvg__parseCoordinate(p, item, 0.0f, nsvg__actualLength(p))); - } - - for (i = 0; i < count; i++) - sum += strokeDashArray[i]; - if (sum <= 1e-6f) - count = 0; - - return count; -} - -static void nsvg__parseStyle(NSVGparser* p, const char* str); - -static int nsvg__parseAttr(NSVGparser* p, const char* name, const char* value) -{ - float xform[6]; - NSVGattrib* attr = nsvg__getAttr(p); - if (!attr) return 0; - - if (strcmp(name, "style") == 0) { - nsvg__parseStyle(p, value); - } else if (strcmp(name, "display") == 0) { - if (strcmp(value, "none") == 0) - attr->visible = 0; - // Don't reset ->visible on display:inline, one display:none hides the whole subtree - - } else if (strcmp(name, "fill") == 0) { - if (strcmp(value, "none") == 0) { - attr->hasFill = 0; - } else if (strncmp(value, "url(", 4) == 0) { - attr->hasFill = 2; - nsvg__parseUrl(attr->fillGradient, value); - } else { - attr->hasFill = 1; - attr->fillColor = nsvg__parseColor(value); - } - } else if (strcmp(name, "opacity") == 0) { - attr->opacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "fill-opacity") == 0) { - attr->fillOpacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "stroke") == 0) { - if (strcmp(value, "none") == 0) { - attr->hasStroke = 0; - } else if (strncmp(value, "url(", 4) == 0) { - attr->hasStroke = 2; - nsvg__parseUrl(attr->strokeGradient, value); - } else { - attr->hasStroke = 1; - attr->strokeColor = nsvg__parseColor(value); - } - } else if (strcmp(name, "stroke-width") == 0) { - attr->strokeWidth = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); - } else if (strcmp(name, "stroke-dasharray") == 0) { - attr->strokeDashCount = nsvg__parseStrokeDashArray(p, value, attr->strokeDashArray); - } else if (strcmp(name, "stroke-dashoffset") == 0) { - attr->strokeDashOffset = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); - } else if (strcmp(name, "stroke-opacity") == 0) { - attr->strokeOpacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "stroke-linecap") == 0) { - attr->strokeLineCap = nsvg__parseLineCap(value); - } else if (strcmp(name, "stroke-linejoin") == 0) { - attr->strokeLineJoin = nsvg__parseLineJoin(value); - } else if (strcmp(name, "stroke-miterlimit") == 0) { - attr->miterLimit = nsvg__parseMiterLimit(value); - } else if (strcmp(name, "fill-rule") == 0) { - attr->fillRule = nsvg__parseFillRule(value); - } else if (strcmp(name, "font-size") == 0) { - attr->fontSize = nsvg__parseCoordinate(p, value, 0.0f, nsvg__actualLength(p)); - } else if (strcmp(name, "transform") == 0) { - nsvg__parseTransform(xform, value); - nsvg__xformPremultiply(attr->xform, xform); - } else if (strcmp(name, "stop-color") == 0) { - attr->stopColor = nsvg__parseColor(value); - } else if (strcmp(name, "stop-opacity") == 0) { - attr->stopOpacity = nsvg__parseOpacity(value); - } else if (strcmp(name, "offset") == 0) { - attr->stopOffset = nsvg__parseCoordinate(p, value, 0.0f, 1.0f); - } else if (strcmp(name, "id") == 0) { - strncpy(attr->id, value, 63); - attr->id[63] = '\0'; - } else { - return 0; - } - return 1; -} - -static int nsvg__parseNameValue(NSVGparser* p, const char* start, const char* end) -{ - const char* str; - const char* val; - char name[512]; - char value[512]; - int n; - - str = start; - while (str < end && *str != ':') ++str; - - val = str; - - // Right Trim - while (str > start && (*str == ':' || nsvg__isspace(*str))) --str; - ++str; - - n = (int)(str - start); - if (n > 511) n = 511; - if (n) memcpy(name, start, n); - name[n] = 0; - - while (val < end && (*val == ':' || nsvg__isspace(*val))) ++val; - - n = (int)(end - val); - if (n > 511) n = 511; - if (n) memcpy(value, val, n); - value[n] = 0; - - return nsvg__parseAttr(p, name, value); -} - -static void nsvg__parseStyle(NSVGparser* p, const char* str) -{ - const char* start; - const char* end; - - while (*str) { - // Left Trim - while(*str && nsvg__isspace(*str)) ++str; - start = str; - while(*str && *str != ';') ++str; - end = str; - - // Right Trim - while (end > start && (*end == ';' || nsvg__isspace(*end))) --end; - ++end; - - nsvg__parseNameValue(p, start, end); - if (*str) ++str; - } -} - -static void nsvg__parseAttribs(NSVGparser* p, const char** attr) -{ - int i; - for (i = 0; attr[i]; i += 2) - { - if (strcmp(attr[i], "style") == 0) - nsvg__parseStyle(p, attr[i + 1]); - else - nsvg__parseAttr(p, attr[i], attr[i + 1]); - } -} - -static int nsvg__getArgsPerElement(char cmd) -{ - switch (cmd) { - case 'v': - case 'V': - case 'h': - case 'H': - return 1; - case 'm': - case 'M': - case 'l': - case 'L': - case 't': - case 'T': - return 2; - case 'q': - case 'Q': - case 's': - case 'S': - return 4; - case 'c': - case 'C': - return 6; - case 'a': - case 'A': - return 7; - } - return 0; -} - -static void nsvg__pathMoveTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) { - *cpx += args[0]; - *cpy += args[1]; - } else { - *cpx = args[0]; - *cpy = args[1]; - } - nsvg__moveTo(p, *cpx, *cpy); -} - -static void nsvg__pathLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) { - *cpx += args[0]; - *cpy += args[1]; - } else { - *cpx = args[0]; - *cpy = args[1]; - } - nsvg__lineTo(p, *cpx, *cpy); -} - -static void nsvg__pathHLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) - *cpx += args[0]; - else - *cpx = args[0]; - nsvg__lineTo(p, *cpx, *cpy); -} - -static void nsvg__pathVLineTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - if (rel) - *cpy += args[0]; - else - *cpy = args[0]; - nsvg__lineTo(p, *cpx, *cpy); -} - -static void nsvg__pathCubicBezTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x2, y2, cx1, cy1, cx2, cy2; - - if (rel) { - cx1 = *cpx + args[0]; - cy1 = *cpy + args[1]; - cx2 = *cpx + args[2]; - cy2 = *cpy + args[3]; - x2 = *cpx + args[4]; - y2 = *cpy + args[5]; - } else { - cx1 = args[0]; - cy1 = args[1]; - cx2 = args[2]; - cy2 = args[3]; - x2 = args[4]; - y2 = args[5]; - } - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx2; - *cpy2 = cy2; - *cpx = x2; - *cpy = y2; -} - -static void nsvg__pathCubicBezShortTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x1, y1, x2, y2, cx1, cy1, cx2, cy2; - - x1 = *cpx; - y1 = *cpy; - if (rel) { - cx2 = *cpx + args[0]; - cy2 = *cpy + args[1]; - x2 = *cpx + args[2]; - y2 = *cpy + args[3]; - } else { - cx2 = args[0]; - cy2 = args[1]; - x2 = args[2]; - y2 = args[3]; - } - - cx1 = 2*x1 - *cpx2; - cy1 = 2*y1 - *cpy2; - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx2; - *cpy2 = cy2; - *cpx = x2; - *cpy = y2; -} - -static void nsvg__pathQuadBezTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x1, y1, x2, y2, cx, cy; - float cx1, cy1, cx2, cy2; - - x1 = *cpx; - y1 = *cpy; - if (rel) { - cx = *cpx + args[0]; - cy = *cpy + args[1]; - x2 = *cpx + args[2]; - y2 = *cpy + args[3]; - } else { - cx = args[0]; - cy = args[1]; - x2 = args[2]; - y2 = args[3]; - } - - // Convert to cubic bezier - cx1 = x1 + 2.0f/3.0f*(cx - x1); - cy1 = y1 + 2.0f/3.0f*(cy - y1); - cx2 = x2 + 2.0f/3.0f*(cx - x2); - cy2 = y2 + 2.0f/3.0f*(cy - y2); - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx; - *cpy2 = cy; - *cpx = x2; - *cpy = y2; -} - -static void nsvg__pathQuadBezShortTo(NSVGparser* p, float* cpx, float* cpy, - float* cpx2, float* cpy2, float* args, int rel) -{ - float x1, y1, x2, y2, cx, cy; - float cx1, cy1, cx2, cy2; - - x1 = *cpx; - y1 = *cpy; - if (rel) { - x2 = *cpx + args[0]; - y2 = *cpy + args[1]; - } else { - x2 = args[0]; - y2 = args[1]; - } - - cx = 2*x1 - *cpx2; - cy = 2*y1 - *cpy2; - - // Convert to cubix bezier - cx1 = x1 + 2.0f/3.0f*(cx - x1); - cy1 = y1 + 2.0f/3.0f*(cy - y1); - cx2 = x2 + 2.0f/3.0f*(cx - x2); - cy2 = y2 + 2.0f/3.0f*(cy - y2); - - nsvg__cubicBezTo(p, cx1,cy1, cx2,cy2, x2,y2); - - *cpx2 = cx; - *cpy2 = cy; - *cpx = x2; - *cpy = y2; -} - -static float nsvg__sqr(float x) { return x*x; } -static float nsvg__vmag(float x, float y) { return sqrtf(x*x + y*y); } - -static float nsvg__vecrat(float ux, float uy, float vx, float vy) -{ - return (ux*vx + uy*vy) / (nsvg__vmag(ux,uy) * nsvg__vmag(vx,vy)); -} - -static float nsvg__vecang(float ux, float uy, float vx, float vy) -{ - float r = nsvg__vecrat(ux,uy, vx,vy); - if (r < -1.0f) r = -1.0f; - if (r > 1.0f) r = 1.0f; - return ((ux*vy < uy*vx) ? -1.0f : 1.0f) * acosf(r); -} - -static void nsvg__pathArcTo(NSVGparser* p, float* cpx, float* cpy, float* args, int rel) -{ - // Ported from canvg (https://code.google.com/p/canvg/) - float rx, ry, rotx; - float x1, y1, x2, y2, cx, cy, dx, dy, d; - float x1p, y1p, cxp, cyp, s, sa, sb; - float ux, uy, vx, vy, a1, da; - float x, y, tanx, tany, a, px = 0, py = 0, ptanx = 0, ptany = 0, t[6]; - float sinrx, cosrx; - int fa, fs; - int i, ndivs; - float hda, kappa; - - rx = fabsf(args[0]); // y radius - ry = fabsf(args[1]); // x radius - rotx = args[2] / 180.0f * NSVG_PI; // x rotation angle - fa = fabsf(args[3]) > 1e-6 ? 1 : 0; // Large arc - fs = fabsf(args[4]) > 1e-6 ? 1 : 0; // Sweep direction - x1 = *cpx; // start point - y1 = *cpy; - if (rel) { // end point - x2 = *cpx + args[5]; - y2 = *cpy + args[6]; - } else { - x2 = args[5]; - y2 = args[6]; - } - - dx = x1 - x2; - dy = y1 - y2; - d = sqrtf(dx*dx + dy*dy); - if (d < 1e-6f || rx < 1e-6f || ry < 1e-6f) { - // The arc degenerates to a line - nsvg__lineTo(p, x2, y2); - *cpx = x2; - *cpy = y2; - return; - } - - sinrx = sinf(rotx); - cosrx = cosf(rotx); - - // Convert to center point parameterization. - // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes - // 1) Compute x1', y1' - x1p = cosrx * dx / 2.0f + sinrx * dy / 2.0f; - y1p = -sinrx * dx / 2.0f + cosrx * dy / 2.0f; - d = nsvg__sqr(x1p)/nsvg__sqr(rx) + nsvg__sqr(y1p)/nsvg__sqr(ry); - if (d > 1) { - d = sqrtf(d); - rx *= d; - ry *= d; - } - // 2) Compute cx', cy' - s = 0.0f; - sa = nsvg__sqr(rx)*nsvg__sqr(ry) - nsvg__sqr(rx)*nsvg__sqr(y1p) - nsvg__sqr(ry)*nsvg__sqr(x1p); - sb = nsvg__sqr(rx)*nsvg__sqr(y1p) + nsvg__sqr(ry)*nsvg__sqr(x1p); - if (sa < 0.0f) sa = 0.0f; - if (sb > 0.0f) - s = sqrtf(sa / sb); - if (fa == fs) - s = -s; - cxp = s * rx * y1p / ry; - cyp = s * -ry * x1p / rx; - - // 3) Compute cx,cy from cx',cy' - cx = (x1 + x2)/2.0f + cosrx*cxp - sinrx*cyp; - cy = (y1 + y2)/2.0f + sinrx*cxp + cosrx*cyp; - - // 4) Calculate theta1, and delta theta. - ux = (x1p - cxp) / rx; - uy = (y1p - cyp) / ry; - vx = (-x1p - cxp) / rx; - vy = (-y1p - cyp) / ry; - a1 = nsvg__vecang(1.0f,0.0f, ux,uy); // Initial angle - da = nsvg__vecang(ux,uy, vx,vy); // Delta angle - -// if (vecrat(ux,uy,vx,vy) <= -1.0f) da = NSVG_PI; -// if (vecrat(ux,uy,vx,vy) >= 1.0f) da = 0; - - if (fs == 0 && da > 0) - da -= 2 * NSVG_PI; - else if (fs == 1 && da < 0) - da += 2 * NSVG_PI; - - // Approximate the arc using cubic spline segments. - t[0] = cosrx; t[1] = sinrx; - t[2] = -sinrx; t[3] = cosrx; - t[4] = cx; t[5] = cy; - - // Split arc into max 90 degree segments. - // The loop assumes an iteration per end point (including start and end), this +1. - ndivs = (int)(fabsf(da) / (NSVG_PI*0.5f) + 1.0f); - hda = (da / (float)ndivs) / 2.0f; - kappa = fabsf(4.0f / 3.0f * (1.0f - cosf(hda)) / sinf(hda)); - if (da < 0.0f) - kappa = -kappa; - - for (i = 0; i <= ndivs; i++) { - a = a1 + da * ((float)i/(float)ndivs); - dx = cosf(a); - dy = sinf(a); - nsvg__xformPoint(&x, &y, dx*rx, dy*ry, t); // position - nsvg__xformVec(&tanx, &tany, -dy*rx * kappa, dx*ry * kappa, t); // tangent - if (i > 0) - nsvg__cubicBezTo(p, px+ptanx,py+ptany, x-tanx, y-tany, x, y); - px = x; - py = y; - ptanx = tanx; - ptany = tany; - } - - *cpx = x2; - *cpy = y2; -} - -static void nsvg__parsePath(NSVGparser* p, const char** attr) -{ - const char* s = NULL; - char cmd = '\0'; - float args[10]; - int nargs; - int rargs = 0; - float cpx, cpy, cpx2, cpy2; - const char* tmp[4]; - char closedFlag; - int i; - char item[64]; - - for (i = 0; attr[i]; i += 2) { - if (strcmp(attr[i], "d") == 0) { - s = attr[i + 1]; - } else { - tmp[0] = attr[i]; - tmp[1] = attr[i + 1]; - tmp[2] = 0; - tmp[3] = 0; - nsvg__parseAttribs(p, tmp); - } - } - - if (s) { - nsvg__resetPath(p); - cpx = 0; cpy = 0; - cpx2 = 0; cpy2 = 0; - closedFlag = 0; - nargs = 0; - - while (*s) { - s = nsvg__getNextPathItem(s, item); - if (!*item) break; - if (nsvg__isnum(item[0])) { - if (nargs < 10) - args[nargs++] = (float)nsvg__atof(item); - if (nargs >= rargs) { - switch (cmd) { - case 'm': - case 'M': - nsvg__pathMoveTo(p, &cpx, &cpy, args, cmd == 'm' ? 1 : 0); - // Moveto can be followed by multiple coordinate pairs, - // which should be treated as linetos. - cmd = (cmd == 'm') ? 'l' : 'L'; - rargs = nsvg__getArgsPerElement(cmd); - cpx2 = cpx; cpy2 = cpy; - break; - case 'l': - case 'L': - nsvg__pathLineTo(p, &cpx, &cpy, args, cmd == 'l' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - case 'H': - case 'h': - nsvg__pathHLineTo(p, &cpx, &cpy, args, cmd == 'h' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - case 'V': - case 'v': - nsvg__pathVLineTo(p, &cpx, &cpy, args, cmd == 'v' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - case 'C': - case 'c': - nsvg__pathCubicBezTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 'c' ? 1 : 0); - break; - case 'S': - case 's': - nsvg__pathCubicBezShortTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 's' ? 1 : 0); - break; - case 'Q': - case 'q': - nsvg__pathQuadBezTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 'q' ? 1 : 0); - break; - case 'T': - case 't': - nsvg__pathQuadBezShortTo(p, &cpx, &cpy, &cpx2, &cpy2, args, cmd == 't' ? 1 : 0); - break; - case 'A': - case 'a': - nsvg__pathArcTo(p, &cpx, &cpy, args, cmd == 'a' ? 1 : 0); - cpx2 = cpx; cpy2 = cpy; - break; - default: - if (nargs >= 2) { - cpx = args[nargs-2]; - cpy = args[nargs-1]; - cpx2 = cpx; cpy2 = cpy; - } - break; - } - nargs = 0; - } - } else { - cmd = item[0]; - rargs = nsvg__getArgsPerElement(cmd); - if (cmd == 'M' || cmd == 'm') { - // Commit path. - if (p->npts > 0) - nsvg__addPath(p, closedFlag); - // Start new subpath. - nsvg__resetPath(p); - closedFlag = 0; - nargs = 0; - } else if (cmd == 'Z' || cmd == 'z') { - closedFlag = 1; - // Commit path. - if (p->npts > 0) { - // Move current point to first point - cpx = p->pts[0]; - cpy = p->pts[1]; - cpx2 = cpx; cpy2 = cpy; - nsvg__addPath(p, closedFlag); - } - // Start new subpath. - nsvg__resetPath(p); - nsvg__moveTo(p, cpx, cpy); - closedFlag = 0; - nargs = 0; - } - } - } - // Commit path. - if (p->npts) - nsvg__addPath(p, closedFlag); - } - - nsvg__addShape(p); -} - -static void nsvg__parseRect(NSVGparser* p, const char** attr) -{ - float x = 0.0f; - float y = 0.0f; - float w = 0.0f; - float h = 0.0f; - float rx = -1.0f; // marks not set - float ry = -1.0f; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "x") == 0) x = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "y") == 0) y = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "width") == 0) w = nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p)); - if (strcmp(attr[i], "height") == 0) h = nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p)); - if (strcmp(attr[i], "rx") == 0) rx = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p))); - if (strcmp(attr[i], "ry") == 0) ry = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p))); - } - } - - if (rx < 0.0f && ry > 0.0f) rx = ry; - if (ry < 0.0f && rx > 0.0f) ry = rx; - if (rx < 0.0f) rx = 0.0f; - if (ry < 0.0f) ry = 0.0f; - if (rx > w/2.0f) rx = w/2.0f; - if (ry > h/2.0f) ry = h/2.0f; - - if (w != 0.0f && h != 0.0f) { - nsvg__resetPath(p); - - if (rx < 0.00001f || ry < 0.0001f) { - nsvg__moveTo(p, x, y); - nsvg__lineTo(p, x+w, y); - nsvg__lineTo(p, x+w, y+h); - nsvg__lineTo(p, x, y+h); - } else { - // Rounded rectangle - nsvg__moveTo(p, x+rx, y); - nsvg__lineTo(p, x+w-rx, y); - nsvg__cubicBezTo(p, x+w-rx*(1-NSVG_KAPPA90), y, x+w, y+ry*(1-NSVG_KAPPA90), x+w, y+ry); - nsvg__lineTo(p, x+w, y+h-ry); - nsvg__cubicBezTo(p, x+w, y+h-ry*(1-NSVG_KAPPA90), x+w-rx*(1-NSVG_KAPPA90), y+h, x+w-rx, y+h); - nsvg__lineTo(p, x+rx, y+h); - nsvg__cubicBezTo(p, x+rx*(1-NSVG_KAPPA90), y+h, x, y+h-ry*(1-NSVG_KAPPA90), x, y+h-ry); - nsvg__lineTo(p, x, y+ry); - nsvg__cubicBezTo(p, x, y+ry*(1-NSVG_KAPPA90), x+rx*(1-NSVG_KAPPA90), y, x+rx, y); - } - - nsvg__addPath(p, 1); - - nsvg__addShape(p); - } -} - -static void nsvg__parseCircle(NSVGparser* p, const char** attr) -{ - float cx = 0.0f; - float cy = 0.0f; - float r = 0.0f; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "cx") == 0) cx = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "cy") == 0) cy = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "r") == 0) r = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualLength(p))); - } - } - - if (r > 0.0f) { - nsvg__resetPath(p); - - nsvg__moveTo(p, cx+r, cy); - nsvg__cubicBezTo(p, cx+r, cy+r*NSVG_KAPPA90, cx+r*NSVG_KAPPA90, cy+r, cx, cy+r); - nsvg__cubicBezTo(p, cx-r*NSVG_KAPPA90, cy+r, cx-r, cy+r*NSVG_KAPPA90, cx-r, cy); - nsvg__cubicBezTo(p, cx-r, cy-r*NSVG_KAPPA90, cx-r*NSVG_KAPPA90, cy-r, cx, cy-r); - nsvg__cubicBezTo(p, cx+r*NSVG_KAPPA90, cy-r, cx+r, cy-r*NSVG_KAPPA90, cx+r, cy); - - nsvg__addPath(p, 1); - - nsvg__addShape(p); - } -} - -static void nsvg__parseEllipse(NSVGparser* p, const char** attr) -{ - float cx = 0.0f; - float cy = 0.0f; - float rx = 0.0f; - float ry = 0.0f; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "cx") == 0) cx = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "cy") == 0) cy = nsvg__parseCoordinate(p, attr[i+1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "rx") == 0) rx = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualWidth(p))); - if (strcmp(attr[i], "ry") == 0) ry = fabsf(nsvg__parseCoordinate(p, attr[i+1], 0.0f, nsvg__actualHeight(p))); - } - } - - if (rx > 0.0f && ry > 0.0f) { - - nsvg__resetPath(p); - - nsvg__moveTo(p, cx+rx, cy); - nsvg__cubicBezTo(p, cx+rx, cy+ry*NSVG_KAPPA90, cx+rx*NSVG_KAPPA90, cy+ry, cx, cy+ry); - nsvg__cubicBezTo(p, cx-rx*NSVG_KAPPA90, cy+ry, cx-rx, cy+ry*NSVG_KAPPA90, cx-rx, cy); - nsvg__cubicBezTo(p, cx-rx, cy-ry*NSVG_KAPPA90, cx-rx*NSVG_KAPPA90, cy-ry, cx, cy-ry); - nsvg__cubicBezTo(p, cx+rx*NSVG_KAPPA90, cy-ry, cx+rx, cy-ry*NSVG_KAPPA90, cx+rx, cy); - - nsvg__addPath(p, 1); - - nsvg__addShape(p); - } -} - -static void nsvg__parseLine(NSVGparser* p, const char** attr) -{ - float x1 = 0.0; - float y1 = 0.0; - float x2 = 0.0; - float y2 = 0.0; - int i; - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "x1") == 0) x1 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "y1") == 0) y1 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - if (strcmp(attr[i], "x2") == 0) x2 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigX(p), nsvg__actualWidth(p)); - if (strcmp(attr[i], "y2") == 0) y2 = nsvg__parseCoordinate(p, attr[i + 1], nsvg__actualOrigY(p), nsvg__actualHeight(p)); - } - } - - nsvg__resetPath(p); - - nsvg__moveTo(p, x1, y1); - nsvg__lineTo(p, x2, y2); - - nsvg__addPath(p, 0); - - nsvg__addShape(p); -} - -static void nsvg__parsePoly(NSVGparser* p, const char** attr, int closeFlag) -{ - int i; - const char* s; - float args[2]; - int nargs, npts = 0; - char item[64]; - - nsvg__resetPath(p); - - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "points") == 0) { - s = attr[i + 1]; - nargs = 0; - while (*s) { - s = nsvg__getNextPathItem(s, item); - args[nargs++] = (float)nsvg__atof(item); - if (nargs >= 2) { - if (npts == 0) - nsvg__moveTo(p, args[0], args[1]); - else - nsvg__lineTo(p, args[0], args[1]); - nargs = 0; - npts++; - } - } - } - } - } - - nsvg__addPath(p, (char)closeFlag); - - nsvg__addShape(p); -} - -static void nsvg__parseSVG(NSVGparser* p, const char** attr) -{ - int i; - for (i = 0; attr[i]; i += 2) { - if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "width") == 0) { - p->image->width = nsvg__parseCoordinate(p, attr[i + 1], 0.0f, 0.0f); - } else if (strcmp(attr[i], "height") == 0) { - p->image->height = nsvg__parseCoordinate(p, attr[i + 1], 0.0f, 0.0f); - } else if (strcmp(attr[i], "viewBox") == 0) { - const char *s = attr[i + 1]; - char buf[64]; - s = nsvg__parseNumber(s, buf, 64); - p->viewMinx = nsvg__atof(buf); - while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; - if (!*s) return; - s = nsvg__parseNumber(s, buf, 64); - p->viewMiny = nsvg__atof(buf); - while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; - if (!*s) return; - s = nsvg__parseNumber(s, buf, 64); - p->viewWidth = nsvg__atof(buf); - while (*s && (nsvg__isspace(*s) || *s == '%' || *s == ',')) s++; - if (!*s) return; - s = nsvg__parseNumber(s, buf, 64); - p->viewHeight = nsvg__atof(buf); - } else if (strcmp(attr[i], "preserveAspectRatio") == 0) { - if (strstr(attr[i + 1], "none") != 0) { - // No uniform scaling - p->alignType = NSVG_ALIGN_NONE; - } else { - // Parse X align - if (strstr(attr[i + 1], "xMin") != 0) - p->alignX = NSVG_ALIGN_MIN; - else if (strstr(attr[i + 1], "xMid") != 0) - p->alignX = NSVG_ALIGN_MID; - else if (strstr(attr[i + 1], "xMax") != 0) - p->alignX = NSVG_ALIGN_MAX; - // Parse X align - if (strstr(attr[i + 1], "yMin") != 0) - p->alignY = NSVG_ALIGN_MIN; - else if (strstr(attr[i + 1], "yMid") != 0) - p->alignY = NSVG_ALIGN_MID; - else if (strstr(attr[i + 1], "yMax") != 0) - p->alignY = NSVG_ALIGN_MAX; - // Parse meet/slice - p->alignType = NSVG_ALIGN_MEET; - if (strstr(attr[i + 1], "slice") != 0) - p->alignType = NSVG_ALIGN_SLICE; - } - } - } - } -} - -static void nsvg__parseGradient(NSVGparser* p, const char** attr, char type) -{ - int i; - NSVGgradientData* grad = (NSVGgradientData*)malloc(sizeof(NSVGgradientData)); - if (grad == NULL) return; - memset(grad, 0, sizeof(NSVGgradientData)); - grad->units = NSVG_OBJECT_SPACE; - grad->type = type; - if (grad->type == NSVG_PAINT_LINEAR_GRADIENT) { - grad->linear.x1 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); - grad->linear.y1 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); - grad->linear.x2 = nsvg__coord(100.0f, NSVG_UNITS_PERCENT); - grad->linear.y2 = nsvg__coord(0.0f, NSVG_UNITS_PERCENT); - } else if (grad->type == NSVG_PAINT_RADIAL_GRADIENT) { - grad->radial.cx = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); - grad->radial.cy = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); - grad->radial.r = nsvg__coord(50.0f, NSVG_UNITS_PERCENT); - } - - nsvg__xformIdentity(grad->xform); - - for (i = 0; attr[i]; i += 2) { - if (strcmp(attr[i], "id") == 0) { - strncpy(grad->id, attr[i+1], 63); - grad->id[63] = '\0'; - } else if (!nsvg__parseAttr(p, attr[i], attr[i + 1])) { - if (strcmp(attr[i], "gradientUnits") == 0) { - if (strcmp(attr[i+1], "objectBoundingBox") == 0) - grad->units = NSVG_OBJECT_SPACE; - else - grad->units = NSVG_USER_SPACE; - } else if (strcmp(attr[i], "gradientTransform") == 0) { - nsvg__parseTransform(grad->xform, attr[i + 1]); - } else if (strcmp(attr[i], "cx") == 0) { - grad->radial.cx = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "cy") == 0) { - grad->radial.cy = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "r") == 0) { - grad->radial.r = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "fx") == 0) { - grad->radial.fx = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "fy") == 0) { - grad->radial.fy = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "x1") == 0) { - grad->linear.x1 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "y1") == 0) { - grad->linear.y1 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "x2") == 0) { - grad->linear.x2 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "y2") == 0) { - grad->linear.y2 = nsvg__parseCoordinateRaw(attr[i + 1]); - } else if (strcmp(attr[i], "spreadMethod") == 0) { - if (strcmp(attr[i+1], "pad") == 0) - grad->spread = NSVG_SPREAD_PAD; - else if (strcmp(attr[i+1], "reflect") == 0) - grad->spread = NSVG_SPREAD_REFLECT; - else if (strcmp(attr[i+1], "repeat") == 0) - grad->spread = NSVG_SPREAD_REPEAT; - } else if (strcmp(attr[i], "xlink:href") == 0) { - const char *href = attr[i+1]; - strncpy(grad->ref, href+1, 62); - grad->ref[62] = '\0'; - } - } - } - - grad->next = p->gradients; - p->gradients = grad; -} - -static void nsvg__parseGradientStop(NSVGparser* p, const char** attr) -{ - NSVGattrib* curAttr = nsvg__getAttr(p); - NSVGgradientData* grad; - NSVGgradientStop* stop; - int i, idx; - - curAttr->stopOffset = 0; - curAttr->stopColor = 0; - curAttr->stopOpacity = 1.0f; - - for (i = 0; attr[i]; i += 2) { - nsvg__parseAttr(p, attr[i], attr[i + 1]); - } - - // Add stop to the last gradient. - grad = p->gradients; - if (grad == NULL) return; - - grad->nstops++; - grad->stops = (NSVGgradientStop*)realloc(grad->stops, sizeof(NSVGgradientStop)*grad->nstops); - if (grad->stops == NULL) return; - - // Insert - idx = grad->nstops-1; - for (i = 0; i < grad->nstops-1; i++) { - if (curAttr->stopOffset < grad->stops[i].offset) { - idx = i; - break; - } - } - if (idx != grad->nstops-1) { - for (i = grad->nstops-1; i > idx; i--) - grad->stops[i] = grad->stops[i-1]; - } - - stop = &grad->stops[idx]; - stop->color = curAttr->stopColor; - stop->color |= (unsigned int)(curAttr->stopOpacity*255) << 24; - stop->offset = curAttr->stopOffset; -} - -static void nsvg__startElement(void* ud, const char* el, const char** attr) -{ - NSVGparser* p = (NSVGparser*)ud; - - if (p->defsFlag) { - // Skip everything but gradients in defs - if (strcmp(el, "linearGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_LINEAR_GRADIENT); - } else if (strcmp(el, "radialGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_RADIAL_GRADIENT); - } else if (strcmp(el, "stop") == 0) { - nsvg__parseGradientStop(p, attr); - } - return; - } - - if (strcmp(el, "g") == 0) { - nsvg__pushAttr(p); - nsvg__parseAttribs(p, attr); - } else if (strcmp(el, "path") == 0) { - if (p->pathFlag) // Do not allow nested paths. - return; - nsvg__pushAttr(p); - nsvg__parsePath(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "rect") == 0) { - nsvg__pushAttr(p); - nsvg__parseRect(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "circle") == 0) { - nsvg__pushAttr(p); - nsvg__parseCircle(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "ellipse") == 0) { - nsvg__pushAttr(p); - nsvg__parseEllipse(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "line") == 0) { - nsvg__pushAttr(p); - nsvg__parseLine(p, attr); - nsvg__popAttr(p); - } else if (strcmp(el, "polyline") == 0) { - nsvg__pushAttr(p); - nsvg__parsePoly(p, attr, 0); - nsvg__popAttr(p); - } else if (strcmp(el, "polygon") == 0) { - nsvg__pushAttr(p); - nsvg__parsePoly(p, attr, 1); - nsvg__popAttr(p); - } else if (strcmp(el, "linearGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_LINEAR_GRADIENT); - } else if (strcmp(el, "radialGradient") == 0) { - nsvg__parseGradient(p, attr, NSVG_PAINT_RADIAL_GRADIENT); - } else if (strcmp(el, "stop") == 0) { - nsvg__parseGradientStop(p, attr); - } else if (strcmp(el, "defs") == 0) { - p->defsFlag = 1; - } else if (strcmp(el, "svg") == 0) { - nsvg__parseSVG(p, attr); - } -} - -static void nsvg__endElement(void* ud, const char* el) -{ - NSVGparser* p = (NSVGparser*)ud; - - if (strcmp(el, "g") == 0) { - nsvg__popAttr(p); - } else if (strcmp(el, "path") == 0) { - p->pathFlag = 0; - } else if (strcmp(el, "defs") == 0) { - p->defsFlag = 0; - } -} - -static void nsvg__content(void* ud, const char* s) -{ - NSVG_NOTUSED(ud); - NSVG_NOTUSED(s); - // empty -} - -static void nsvg__imageBounds(NSVGparser* p, float* bounds) -{ - NSVGshape* shape; - shape = p->image->shapes; - if (shape == NULL) { - bounds[0] = bounds[1] = bounds[2] = bounds[3] = 0.0; - return; - } - bounds[0] = shape->bounds[0]; - bounds[1] = shape->bounds[1]; - bounds[2] = shape->bounds[2]; - bounds[3] = shape->bounds[3]; - for (shape = shape->next; shape != NULL; shape = shape->next) { - bounds[0] = nsvg__minf(bounds[0], shape->bounds[0]); - bounds[1] = nsvg__minf(bounds[1], shape->bounds[1]); - bounds[2] = nsvg__maxf(bounds[2], shape->bounds[2]); - bounds[3] = nsvg__maxf(bounds[3], shape->bounds[3]); - } -} - -static float nsvg__viewAlign(float content, float container, int type) -{ - if (type == NSVG_ALIGN_MIN) - return 0; - else if (type == NSVG_ALIGN_MAX) - return container - content; - // mid - return (container - content) * 0.5f; -} - -static void nsvg__scaleGradient(NSVGgradient* grad, float tx, float ty, float sx, float sy) -{ - float t[6]; - nsvg__xformSetTranslation(t, tx, ty); - nsvg__xformMultiply (grad->xform, t); - - nsvg__xformSetScale(t, sx, sy); - nsvg__xformMultiply (grad->xform, t); -} - -static void nsvg__scaleToViewbox(NSVGparser* p, const char* units) -{ - NSVGshape* shape; - NSVGpath* path; - float tx, ty, sx, sy, us, bounds[4], t[6], avgs; - int i; - float* pt; - - // Guess image size if not set completely. - nsvg__imageBounds(p, bounds); - - if (p->viewWidth == 0) { - if (p->image->width > 0) { - p->viewWidth = p->image->width; - } else { - p->viewMinx = bounds[0]; - p->viewWidth = bounds[2] - bounds[0]; - } - } - if (p->viewHeight == 0) { - if (p->image->height > 0) { - p->viewHeight = p->image->height; - } else { - p->viewMiny = bounds[1]; - p->viewHeight = bounds[3] - bounds[1]; - } - } - if (p->image->width == 0) - p->image->width = p->viewWidth; - if (p->image->height == 0) - p->image->height = p->viewHeight; - - tx = -p->viewMinx; - ty = -p->viewMiny; - sx = p->viewWidth > 0 ? p->image->width / p->viewWidth : 0; - sy = p->viewHeight > 0 ? p->image->height / p->viewHeight : 0; - // Unit scaling - us = 1.0f / nsvg__convertToPixels(p, nsvg__coord(1.0f, nsvg__parseUnits(units)), 0.0f, 1.0f); - - // Fix aspect ratio - if (p->alignType == NSVG_ALIGN_MEET) { - // fit whole image into viewbox - sx = sy = nsvg__minf(sx, sy); - tx += nsvg__viewAlign(p->viewWidth*sx, p->image->width, p->alignX) / sx; - ty += nsvg__viewAlign(p->viewHeight*sy, p->image->height, p->alignY) / sy; - } else if (p->alignType == NSVG_ALIGN_SLICE) { - // fill whole viewbox with image - sx = sy = nsvg__maxf(sx, sy); - tx += nsvg__viewAlign(p->viewWidth*sx, p->image->width, p->alignX) / sx; - ty += nsvg__viewAlign(p->viewHeight*sy, p->image->height, p->alignY) / sy; - } - - // Transform - sx *= us; - sy *= us; - avgs = (sx+sy) / 2.0f; - for (shape = p->image->shapes; shape != NULL; shape = shape->next) { - shape->bounds[0] = (shape->bounds[0] + tx) * sx; - shape->bounds[1] = (shape->bounds[1] + ty) * sy; - shape->bounds[2] = (shape->bounds[2] + tx) * sx; - shape->bounds[3] = (shape->bounds[3] + ty) * sy; - for (path = shape->paths; path != NULL; path = path->next) { - path->bounds[0] = (path->bounds[0] + tx) * sx; - path->bounds[1] = (path->bounds[1] + ty) * sy; - path->bounds[2] = (path->bounds[2] + tx) * sx; - path->bounds[3] = (path->bounds[3] + ty) * sy; - for (i =0; i < path->npts; i++) { - pt = &path->pts[i*2]; - pt[0] = (pt[0] + tx) * sx; - pt[1] = (pt[1] + ty) * sy; - } - } - - if (shape->fill.type == NSVG_PAINT_LINEAR_GRADIENT || shape->fill.type == NSVG_PAINT_RADIAL_GRADIENT) { - nsvg__scaleGradient(shape->fill.gradient, tx,ty, sx,sy); - memcpy(t, shape->fill.gradient->xform, sizeof(float)*6); - nsvg__xformInverse(shape->fill.gradient->xform, t); - } - if (shape->stroke.type == NSVG_PAINT_LINEAR_GRADIENT || shape->stroke.type == NSVG_PAINT_RADIAL_GRADIENT) { - nsvg__scaleGradient(shape->stroke.gradient, tx,ty, sx,sy); - memcpy(t, shape->stroke.gradient->xform, sizeof(float)*6); - nsvg__xformInverse(shape->stroke.gradient->xform, t); - } - - shape->strokeWidth *= avgs; - shape->strokeDashOffset *= avgs; - for (i = 0; i < shape->strokeDashCount; i++) - shape->strokeDashArray[i] *= avgs; - } -} - -NSVGimage* nsvgParse(char* input, const char* units, float dpi) -{ - NSVGparser* p; - NSVGimage* ret = 0; - - p = nsvg__createParser(); - if (p == NULL) { - return NULL; - } - p->dpi = dpi; - - nsvg__parseXML(input, nsvg__startElement, nsvg__endElement, nsvg__content, p); - - // Scale to viewBox - nsvg__scaleToViewbox(p, units); - - ret = p->image; - p->image = NULL; - - nsvg__deleteParser(p); - - return ret; -} - -#include - -NSVGimage* nsvgParseFromFile(const char* filename, const char* units, float dpi) -{ - FILE* fp = NULL; - size_t size; - char* data = NULL; - NSVGimage* image = NULL; - - fp = boost::nowide::fopen(filename, "rb"); - if (!fp) goto error; - fseek(fp, 0, SEEK_END); - size = ftell(fp); - fseek(fp, 0, SEEK_SET); - data = (char*)malloc(size+1); - if (data == NULL) goto error; - if (fread(data, 1, size, fp) != size) goto error; - data[size] = '\0'; // Must be null terminated. - fclose(fp); - - image = nsvgParse(data, units, dpi); - free(data); - return image; - -error: - if (fp) fclose(fp); - if (data) free(data); - if (image) nsvgDelete(image); - return NULL; -} - -NSVGpath* nsvgDuplicatePath(NSVGpath* p) -{ - NSVGpath* res = NULL; - - if (p == NULL) - return NULL; - - res = (NSVGpath*)malloc(sizeof(NSVGpath)); - if (res == NULL) goto error; - memset(res, 0, sizeof(NSVGpath)); - - res->pts = (float*)malloc(p->npts*2*sizeof(float)); - if (res->pts == NULL) goto error; - memcpy(res->pts, p->pts, p->npts * sizeof(float) * 2); - res->npts = p->npts; - - memcpy(res->bounds, p->bounds, sizeof(p->bounds)); - - res->closed = p->closed; - - return res; - -error: - if (res != NULL) { - free(res->pts); - free(res); - } - return NULL; -} - -void nsvgDelete(NSVGimage* image) -{ - NSVGshape *snext, *shape; - if (image == NULL) return; - shape = image->shapes; - while (shape != NULL) { - snext = shape->next; - nsvg__deletePaths(shape->paths); - nsvg__deletePaint(&shape->fill); - nsvg__deletePaint(&shape->stroke); - free(shape); - shape = snext; - } - free(image); -} - -#endif diff --git a/src/nanosvg/nanosvgrast.h b/src/nanosvg/nanosvgrast.h deleted file mode 100644 index b740c316ca..0000000000 --- a/src/nanosvg/nanosvgrast.h +++ /dev/null @@ -1,1452 +0,0 @@ -/* - * Copyright (c) 2013-14 Mikko Mononen memon@inside.org - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would be - * appreciated but is not required. - * 2. Altered source versions must be plainly marked as such, and must not be - * misrepresented as being the original software. - * 3. This notice may not be removed or altered from any source distribution. - * - * The polygon rasterization is heavily based on stb_truetype rasterizer - * by Sean Barrett - http://nothings.org/ - * - */ - -#ifndef NANOSVGRAST_H -#define NANOSVGRAST_H - -#ifndef NANOSVGRAST_CPLUSPLUS -#ifdef __cplusplus -extern "C" { -#endif -#endif - -typedef struct NSVGrasterizer NSVGrasterizer; - -/* Example Usage: - // Load SVG - NSVGimage* image; - image = nsvgParseFromFile("test.svg", "px", 96); - - // Create rasterizer (can be used to render multiple images). - struct NSVGrasterizer* rast = nsvgCreateRasterizer(); - // Allocate memory for image - unsigned char* img = malloc(w*h*4); - // Rasterize - nsvgRasterize(rast, image, 0,0,1, img, w, h, w*4); -*/ - -// Allocated rasterizer context. -NSVGrasterizer* nsvgCreateRasterizer(); - -// Rasterizes SVG image, returns RGBA image (non-premultiplied alpha) -// r - pointer to rasterizer context -// image - pointer to image to rasterize -// tx,ty - image offset (applied after scaling) -// scale - image scale -// dst - pointer to destination image data, 4 bytes per pixel (RGBA) -// w - width of the image to render -// h - height of the image to render -// stride - number of bytes per scaleline in the destination buffer -void nsvgRasterize(NSVGrasterizer* r, - NSVGimage* image, float tx, float ty, float scale, - unsigned char* dst, int w, int h, int stride); - -// Deletes rasterizer context. -void nsvgDeleteRasterizer(NSVGrasterizer*); - - -#ifndef NANOSVGRAST_CPLUSPLUS -#ifdef __cplusplus -} -#endif -#endif - -#endif // NANOSVGRAST_H - -#ifdef NANOSVGRAST_IMPLEMENTATION - -#include - -#define NSVG__SUBSAMPLES 5 -#define NSVG__FIXSHIFT 10 -#define NSVG__FIX (1 << NSVG__FIXSHIFT) -#define NSVG__FIXMASK (NSVG__FIX-1) -#define NSVG__MEMPAGE_SIZE 1024 - -typedef struct NSVGedge { - float x0,y0, x1,y1; - int dir; - struct NSVGedge* next; -} NSVGedge; - -typedef struct NSVGpoint { - float x, y; - float dx, dy; - float len; - float dmx, dmy; - unsigned char flags; -} NSVGpoint; - -typedef struct NSVGactiveEdge { - int x,dx; - float ey; - int dir; - struct NSVGactiveEdge *next; -} NSVGactiveEdge; - -typedef struct NSVGmemPage { - unsigned char mem[NSVG__MEMPAGE_SIZE]; - int size; - struct NSVGmemPage* next; -} NSVGmemPage; - -typedef struct NSVGcachedPaint { - char type; - char spread; - float xform[6]; - unsigned int colors[256]; -} NSVGcachedPaint; - -struct NSVGrasterizer -{ - float px, py; - - float tessTol; - float distTol; - - NSVGedge* edges; - int nedges; - int cedges; - - NSVGpoint* points; - int npoints; - int cpoints; - - NSVGpoint* points2; - int npoints2; - int cpoints2; - - NSVGactiveEdge* freelist; - NSVGmemPage* pages; - NSVGmemPage* curpage; - - unsigned char* scanline; - int cscanline; - - unsigned char* bitmap; - int width, height, stride; -}; - -NSVGrasterizer* nsvgCreateRasterizer() -{ - NSVGrasterizer* r = (NSVGrasterizer*)malloc(sizeof(NSVGrasterizer)); - if (r == NULL) goto error; - memset(r, 0, sizeof(NSVGrasterizer)); - - r->tessTol = 0.25f; - r->distTol = 0.01f; - - return r; - -error: - nsvgDeleteRasterizer(r); - return NULL; -} - -void nsvgDeleteRasterizer(NSVGrasterizer* r) -{ - NSVGmemPage* p; - - if (r == NULL) return; - - p = r->pages; - while (p != NULL) { - NSVGmemPage* next = p->next; - free(p); - p = next; - } - - if (r->edges) free(r->edges); - if (r->points) free(r->points); - if (r->points2) free(r->points2); - if (r->scanline) free(r->scanline); - - free(r); -} - -static NSVGmemPage* nsvg__nextPage(NSVGrasterizer* r, NSVGmemPage* cur) -{ - NSVGmemPage *newp; - - // If using existing chain, return the next page in chain - if (cur != NULL && cur->next != NULL) { - return cur->next; - } - - // Alloc new page - newp = (NSVGmemPage*)malloc(sizeof(NSVGmemPage)); - if (newp == NULL) return NULL; - memset(newp, 0, sizeof(NSVGmemPage)); - - // Add to linked list - if (cur != NULL) - cur->next = newp; - else - r->pages = newp; - - return newp; -} - -static void nsvg__resetPool(NSVGrasterizer* r) -{ - NSVGmemPage* p = r->pages; - while (p != NULL) { - p->size = 0; - p = p->next; - } - r->curpage = r->pages; -} - -static unsigned char* nsvg__alloc(NSVGrasterizer* r, int size) -{ - unsigned char* buf; - if (size > NSVG__MEMPAGE_SIZE) return NULL; - if (r->curpage == NULL || r->curpage->size+size > NSVG__MEMPAGE_SIZE) { - r->curpage = nsvg__nextPage(r, r->curpage); - } - buf = &r->curpage->mem[r->curpage->size]; - r->curpage->size += size; - return buf; -} - -static int nsvg__ptEquals(float x1, float y1, float x2, float y2, float tol) -{ - float dx = x2 - x1; - float dy = y2 - y1; - return dx*dx + dy*dy < tol*tol; -} - -static void nsvg__addPathPoint(NSVGrasterizer* r, float x, float y, int flags) -{ - NSVGpoint* pt; - - if (r->npoints > 0) { - pt = &r->points[r->npoints-1]; - if (nsvg__ptEquals(pt->x,pt->y, x,y, r->distTol)) { - pt->flags = (unsigned char)(pt->flags | flags); - return; - } - } - - if (r->npoints+1 > r->cpoints) { - r->cpoints = r->cpoints > 0 ? r->cpoints * 2 : 64; - r->points = (NSVGpoint*)realloc(r->points, sizeof(NSVGpoint) * r->cpoints); - if (r->points == NULL) return; - } - - pt = &r->points[r->npoints]; - pt->x = x; - pt->y = y; - pt->flags = (unsigned char)flags; - r->npoints++; -} - -static void nsvg__appendPathPoint(NSVGrasterizer* r, NSVGpoint pt) -{ - if (r->npoints+1 > r->cpoints) { - r->cpoints = r->cpoints > 0 ? r->cpoints * 2 : 64; - r->points = (NSVGpoint*)realloc(r->points, sizeof(NSVGpoint) * r->cpoints); - if (r->points == NULL) return; - } - r->points[r->npoints] = pt; - r->npoints++; -} - -static void nsvg__duplicatePoints(NSVGrasterizer* r) -{ - if (r->npoints > r->cpoints2) { - r->cpoints2 = r->npoints; - r->points2 = (NSVGpoint*)realloc(r->points2, sizeof(NSVGpoint) * r->cpoints2); - if (r->points2 == NULL) return; - } - - memcpy(r->points2, r->points, sizeof(NSVGpoint) * r->npoints); - r->npoints2 = r->npoints; -} - -static void nsvg__addEdge(NSVGrasterizer* r, float x0, float y0, float x1, float y1) -{ - NSVGedge* e; - - // Skip horizontal edges - if (y0 == y1) - return; - - if (r->nedges+1 > r->cedges) { - r->cedges = r->cedges > 0 ? r->cedges * 2 : 64; - r->edges = (NSVGedge*)realloc(r->edges, sizeof(NSVGedge) * r->cedges); - if (r->edges == NULL) return; - } - - e = &r->edges[r->nedges]; - r->nedges++; - - if (y0 < y1) { - e->x0 = x0; - e->y0 = y0; - e->x1 = x1; - e->y1 = y1; - e->dir = 1; - } else { - e->x0 = x1; - e->y0 = y1; - e->x1 = x0; - e->y1 = y0; - e->dir = -1; - } -} - -static float nsvg__normalize(float *x, float* y) -{ - float d = sqrtf((*x)*(*x) + (*y)*(*y)); - if (d > 1e-6f) { - float id = 1.0f / d; - *x *= id; - *y *= id; - } - return d; -} - -static float nsvg__absf(float x) { return x < 0 ? -x : x; } - -static void nsvg__flattenCubicBez(NSVGrasterizer* r, - float x1, float y1, float x2, float y2, - float x3, float y3, float x4, float y4, - int level, int type) -{ - float x12,y12,x23,y23,x34,y34,x123,y123,x234,y234,x1234,y1234; - float dx,dy,d2,d3; - - if (level > 10) return; - - x12 = (x1+x2)*0.5f; - y12 = (y1+y2)*0.5f; - x23 = (x2+x3)*0.5f; - y23 = (y2+y3)*0.5f; - x34 = (x3+x4)*0.5f; - y34 = (y3+y4)*0.5f; - x123 = (x12+x23)*0.5f; - y123 = (y12+y23)*0.5f; - - dx = x4 - x1; - dy = y4 - y1; - d2 = nsvg__absf(((x2 - x4) * dy - (y2 - y4) * dx)); - d3 = nsvg__absf(((x3 - x4) * dy - (y3 - y4) * dx)); - - if ((d2 + d3)*(d2 + d3) < r->tessTol * (dx*dx + dy*dy)) { - nsvg__addPathPoint(r, x4, y4, type); - return; - } - - x234 = (x23+x34)*0.5f; - y234 = (y23+y34)*0.5f; - x1234 = (x123+x234)*0.5f; - y1234 = (y123+y234)*0.5f; - - nsvg__flattenCubicBez(r, x1,y1, x12,y12, x123,y123, x1234,y1234, level+1, 0); - nsvg__flattenCubicBez(r, x1234,y1234, x234,y234, x34,y34, x4,y4, level+1, type); -} - -static void nsvg__flattenShape(NSVGrasterizer* r, NSVGshape* shape, float scale) -{ - int i, j; - NSVGpath* path; - - for (path = shape->paths; path != NULL; path = path->next) { - r->npoints = 0; - // Flatten path - nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); - for (i = 0; i < path->npts-1; i += 3) { - float* p = &path->pts[i*2]; - nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, 0); - } - // Close path - nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, 0); - // Build edges - for (i = 0, j = r->npoints-1; i < r->npoints; j = i++) - nsvg__addEdge(r, r->points[j].x, r->points[j].y, r->points[i].x, r->points[i].y); - } -} - -enum NSVGpointFlags -{ - NSVG_PT_CORNER = 0x01, - NSVG_PT_BEVEL = 0x02, - NSVG_PT_LEFT = 0x04 -}; - -static void nsvg__initClosed(NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float dx = p1->x - p0->x; - float dy = p1->y - p0->y; - float len = nsvg__normalize(&dx, &dy); - float px = p0->x + dx*len*0.5f, py = p0->y + dy*len*0.5f; - float dlx = dy, dly = -dx; - float lx = px - dlx*w, ly = py - dly*w; - float rx = px + dlx*w, ry = py + dly*w; - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__buttCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int connect) -{ - float w = lineWidth * 0.5f; - float px = p->x, py = p->y; - float dlx = dy, dly = -dx; - float lx = px - dlx*w, ly = py - dly*w; - float rx = px + dlx*w, ry = py + dly*w; - - nsvg__addEdge(r, lx, ly, rx, ry); - - if (connect) { - nsvg__addEdge(r, left->x, left->y, lx, ly); - nsvg__addEdge(r, rx, ry, right->x, right->y); - } - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__squareCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int connect) -{ - float w = lineWidth * 0.5f; - float px = p->x - dx*w, py = p->y - dy*w; - float dlx = dy, dly = -dx; - float lx = px - dlx*w, ly = py - dly*w; - float rx = px + dlx*w, ry = py + dly*w; - - nsvg__addEdge(r, lx, ly, rx, ry); - - if (connect) { - nsvg__addEdge(r, left->x, left->y, lx, ly); - nsvg__addEdge(r, rx, ry, right->x, right->y); - } - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -#ifndef NSVG_PI -#define NSVG_PI (3.14159265358979323846264338327f) -#endif - -static void nsvg__roundCap(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p, float dx, float dy, float lineWidth, int ncap, int connect) -{ - int i; - float w = lineWidth * 0.5f; - float px = p->x, py = p->y; - float dlx = dy, dly = -dx; - float lx = 0, ly = 0, rx = 0, ry = 0, prevx = 0, prevy = 0; - - for (i = 0; i < ncap; i++) { - float a = (float)i/(float)(ncap-1)*NSVG_PI; - float ax = cosf(a) * w, ay = sinf(a) * w; - float x = px - dlx*ax - dx*ay; - float y = py - dly*ax - dy*ay; - - if (i > 0) - nsvg__addEdge(r, prevx, prevy, x, y); - - prevx = x; - prevy = y; - - if (i == 0) { - lx = x; ly = y; - } else if (i == ncap-1) { - rx = x; ry = y; - } - } - - if (connect) { - nsvg__addEdge(r, left->x, left->y, lx, ly); - nsvg__addEdge(r, rx, ry, right->x, right->y); - } - - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__bevelJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float dlx0 = p0->dy, dly0 = -p0->dx; - float dlx1 = p1->dy, dly1 = -p1->dx; - float lx0 = p1->x - (dlx0 * w), ly0 = p1->y - (dly0 * w); - float rx0 = p1->x + (dlx0 * w), ry0 = p1->y + (dly0 * w); - float lx1 = p1->x - (dlx1 * w), ly1 = p1->y - (dly1 * w); - float rx1 = p1->x + (dlx1 * w), ry1 = p1->y + (dly1 * w); - - nsvg__addEdge(r, lx0, ly0, left->x, left->y); - nsvg__addEdge(r, lx1, ly1, lx0, ly0); - - nsvg__addEdge(r, right->x, right->y, rx0, ry0); - nsvg__addEdge(r, rx0, ry0, rx1, ry1); - - left->x = lx1; left->y = ly1; - right->x = rx1; right->y = ry1; -} - -static void nsvg__miterJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float dlx0 = p0->dy, dly0 = -p0->dx; - float dlx1 = p1->dy, dly1 = -p1->dx; - float lx0, rx0, lx1, rx1; - float ly0, ry0, ly1, ry1; - - if (p1->flags & NSVG_PT_LEFT) { - lx0 = lx1 = p1->x - p1->dmx * w; - ly0 = ly1 = p1->y - p1->dmy * w; - nsvg__addEdge(r, lx1, ly1, left->x, left->y); - - rx0 = p1->x + (dlx0 * w); - ry0 = p1->y + (dly0 * w); - rx1 = p1->x + (dlx1 * w); - ry1 = p1->y + (dly1 * w); - nsvg__addEdge(r, right->x, right->y, rx0, ry0); - nsvg__addEdge(r, rx0, ry0, rx1, ry1); - } else { - lx0 = p1->x - (dlx0 * w); - ly0 = p1->y - (dly0 * w); - lx1 = p1->x - (dlx1 * w); - ly1 = p1->y - (dly1 * w); - nsvg__addEdge(r, lx0, ly0, left->x, left->y); - nsvg__addEdge(r, lx1, ly1, lx0, ly0); - - rx0 = rx1 = p1->x + p1->dmx * w; - ry0 = ry1 = p1->y + p1->dmy * w; - nsvg__addEdge(r, right->x, right->y, rx1, ry1); - } - - left->x = lx1; left->y = ly1; - right->x = rx1; right->y = ry1; -} - -static void nsvg__roundJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p0, NSVGpoint* p1, float lineWidth, int ncap) -{ - int i, n; - float w = lineWidth * 0.5f; - float dlx0 = p0->dy, dly0 = -p0->dx; - float dlx1 = p1->dy, dly1 = -p1->dx; - float a0 = atan2f(dly0, dlx0); - float a1 = atan2f(dly1, dlx1); - float da = a1 - a0; - float lx, ly, rx, ry; - - if (da < NSVG_PI) da += NSVG_PI*2; - if (da > NSVG_PI) da -= NSVG_PI*2; - - n = (int)ceilf((nsvg__absf(da) / NSVG_PI) * (float)ncap); - if (n < 2) n = 2; - if (n > ncap) n = ncap; - - lx = left->x; - ly = left->y; - rx = right->x; - ry = right->y; - - for (i = 0; i < n; i++) { - float u = (float)i/(float)(n-1); - float a = a0 + u*da; - float ax = cosf(a) * w, ay = sinf(a) * w; - float lx1 = p1->x - ax, ly1 = p1->y - ay; - float rx1 = p1->x + ax, ry1 = p1->y + ay; - - nsvg__addEdge(r, lx1, ly1, lx, ly); - nsvg__addEdge(r, rx, ry, rx1, ry1); - - lx = lx1; ly = ly1; - rx = rx1; ry = ry1; - } - - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static void nsvg__straightJoin(NSVGrasterizer* r, NSVGpoint* left, NSVGpoint* right, NSVGpoint* p1, float lineWidth) -{ - float w = lineWidth * 0.5f; - float lx = p1->x - (p1->dmx * w), ly = p1->y - (p1->dmy * w); - float rx = p1->x + (p1->dmx * w), ry = p1->y + (p1->dmy * w); - - nsvg__addEdge(r, lx, ly, left->x, left->y); - nsvg__addEdge(r, right->x, right->y, rx, ry); - - left->x = lx; left->y = ly; - right->x = rx; right->y = ry; -} - -static int nsvg__curveDivs(float r, float arc, float tol) -{ - float da = acosf(r / (r + tol)) * 2.0f; - int divs = (int)ceilf(arc / da); - if (divs < 2) divs = 2; - return divs; -} - -static void nsvg__expandStroke(NSVGrasterizer* r, NSVGpoint* points, int npoints, int closed, int lineJoin, int lineCap, float lineWidth) -{ - int ncap = nsvg__curveDivs(lineWidth*0.5f, NSVG_PI, r->tessTol); // Calculate divisions per half circle. - NSVGpoint left = {0,0,0,0,0,0,0,0}, right = {0,0,0,0,0,0,0,0}, firstLeft = {0,0,0,0,0,0,0,0}, firstRight = {0,0,0,0,0,0,0,0}; - NSVGpoint* p0, *p1; - int j, s, e; - - // Build stroke edges - if (closed) { - // Looping - p0 = &points[npoints-1]; - p1 = &points[0]; - s = 0; - e = npoints; - } else { - // Add cap - p0 = &points[0]; - p1 = &points[1]; - s = 1; - e = npoints-1; - } - - if (closed) { - nsvg__initClosed(&left, &right, p0, p1, lineWidth); - firstLeft = left; - firstRight = right; - } else { - // Add cap - float dx = p1->x - p0->x; - float dy = p1->y - p0->y; - nsvg__normalize(&dx, &dy); - if (lineCap == NSVG_CAP_BUTT) - nsvg__buttCap(r, &left, &right, p0, dx, dy, lineWidth, 0); - else if (lineCap == NSVG_CAP_SQUARE) - nsvg__squareCap(r, &left, &right, p0, dx, dy, lineWidth, 0); - else if (lineCap == NSVG_CAP_ROUND) - nsvg__roundCap(r, &left, &right, p0, dx, dy, lineWidth, ncap, 0); - } - - for (j = s; j < e; ++j) { - if (p1->flags & NSVG_PT_CORNER) { - if (lineJoin == NSVG_JOIN_ROUND) - nsvg__roundJoin(r, &left, &right, p0, p1, lineWidth, ncap); - else if (lineJoin == NSVG_JOIN_BEVEL || (p1->flags & NSVG_PT_BEVEL)) - nsvg__bevelJoin(r, &left, &right, p0, p1, lineWidth); - else - nsvg__miterJoin(r, &left, &right, p0, p1, lineWidth); - } else { - nsvg__straightJoin(r, &left, &right, p1, lineWidth); - } - p0 = p1++; - } - - if (closed) { - // Loop it - nsvg__addEdge(r, firstLeft.x, firstLeft.y, left.x, left.y); - nsvg__addEdge(r, right.x, right.y, firstRight.x, firstRight.y); - } else { - // Add cap - float dx = p1->x - p0->x; - float dy = p1->y - p0->y; - nsvg__normalize(&dx, &dy); - if (lineCap == NSVG_CAP_BUTT) - nsvg__buttCap(r, &right, &left, p1, -dx, -dy, lineWidth, 1); - else if (lineCap == NSVG_CAP_SQUARE) - nsvg__squareCap(r, &right, &left, p1, -dx, -dy, lineWidth, 1); - else if (lineCap == NSVG_CAP_ROUND) - nsvg__roundCap(r, &right, &left, p1, -dx, -dy, lineWidth, ncap, 1); - } -} - -static void nsvg__prepareStroke(NSVGrasterizer* r, float miterLimit, int lineJoin) -{ - int i, j; - NSVGpoint* p0, *p1; - - p0 = &r->points[r->npoints-1]; - p1 = &r->points[0]; - for (i = 0; i < r->npoints; i++) { - // Calculate segment direction and length - p0->dx = p1->x - p0->x; - p0->dy = p1->y - p0->y; - p0->len = nsvg__normalize(&p0->dx, &p0->dy); - // Advance - p0 = p1++; - } - - // calculate joins - p0 = &r->points[r->npoints-1]; - p1 = &r->points[0]; - for (j = 0; j < r->npoints; j++) { - float dlx0, dly0, dlx1, dly1, dmr2, cross; - dlx0 = p0->dy; - dly0 = -p0->dx; - dlx1 = p1->dy; - dly1 = -p1->dx; - // Calculate extrusions - p1->dmx = (dlx0 + dlx1) * 0.5f; - p1->dmy = (dly0 + dly1) * 0.5f; - dmr2 = p1->dmx*p1->dmx + p1->dmy*p1->dmy; - if (dmr2 > 0.000001f) { - float s2 = 1.0f / dmr2; - if (s2 > 600.0f) { - s2 = 600.0f; - } - p1->dmx *= s2; - p1->dmy *= s2; - } - - // Clear flags, but keep the corner. - p1->flags = (p1->flags & NSVG_PT_CORNER) ? NSVG_PT_CORNER : 0; - - // Keep track of left turns. - cross = p1->dx * p0->dy - p0->dx * p1->dy; - if (cross > 0.0f) - p1->flags |= NSVG_PT_LEFT; - - // Check to see if the corner needs to be beveled. - if (p1->flags & NSVG_PT_CORNER) { - if ((dmr2 * miterLimit*miterLimit) < 1.0f || lineJoin == NSVG_JOIN_BEVEL || lineJoin == NSVG_JOIN_ROUND) { - p1->flags |= NSVG_PT_BEVEL; - } - } - - p0 = p1++; - } -} - -static void nsvg__flattenShapeStroke(NSVGrasterizer* r, NSVGshape* shape, float scale) -{ - int i, j, closed; - NSVGpath* path; - NSVGpoint* p0, *p1; - float miterLimit = shape->miterLimit; - int lineJoin = shape->strokeLineJoin; - int lineCap = shape->strokeLineCap; - float lineWidth = shape->strokeWidth * scale; - - for (path = shape->paths; path != NULL; path = path->next) { - // Flatten path - r->npoints = 0; - nsvg__addPathPoint(r, path->pts[0]*scale, path->pts[1]*scale, NSVG_PT_CORNER); - for (i = 0; i < path->npts-1; i += 3) { - float* p = &path->pts[i*2]; - nsvg__flattenCubicBez(r, p[0]*scale,p[1]*scale, p[2]*scale,p[3]*scale, p[4]*scale,p[5]*scale, p[6]*scale,p[7]*scale, 0, NSVG_PT_CORNER); - } - if (r->npoints < 2) - continue; - - closed = path->closed; - - // If the first and last points are the same, remove the last, mark as closed path. - p0 = &r->points[r->npoints-1]; - p1 = &r->points[0]; - if (nsvg__ptEquals(p0->x,p0->y, p1->x,p1->y, r->distTol)) { - r->npoints--; - p0 = &r->points[r->npoints-1]; - closed = 1; - } - - if (shape->strokeDashCount > 0) { - int idash = 0, dashState = 1; - float totalDist = 0, dashLen, allDashLen, dashOffset; - NSVGpoint cur; - - if (closed) - nsvg__appendPathPoint(r, r->points[0]); - - // Duplicate points -> points2. - nsvg__duplicatePoints(r); - - r->npoints = 0; - cur = r->points2[0]; - nsvg__appendPathPoint(r, cur); - - // Figure out dash offset. - allDashLen = 0; - for (j = 0; j < shape->strokeDashCount; j++) - allDashLen += shape->strokeDashArray[j]; - if (shape->strokeDashCount & 1) - allDashLen *= 2.0f; - // Find location inside pattern - dashOffset = fmodf(shape->strokeDashOffset, allDashLen); - if (dashOffset < 0.0f) - dashOffset += allDashLen; - - while (dashOffset > shape->strokeDashArray[idash]) { - dashOffset -= shape->strokeDashArray[idash]; - idash = (idash + 1) % shape->strokeDashCount; - } - dashLen = (shape->strokeDashArray[idash] - dashOffset) * scale; - - for (j = 1; j < r->npoints2; ) { - float dx = r->points2[j].x - cur.x; - float dy = r->points2[j].y - cur.y; - float dist = sqrtf(dx*dx + dy*dy); - - if ((totalDist + dist) > dashLen) { - // Calculate intermediate point - float d = (dashLen - totalDist) / dist; - float x = cur.x + dx * d; - float y = cur.y + dy * d; - nsvg__addPathPoint(r, x, y, NSVG_PT_CORNER); - - // Stroke - if (r->npoints > 1 && dashState) { - nsvg__prepareStroke(r, miterLimit, lineJoin); - nsvg__expandStroke(r, r->points, r->npoints, 0, lineJoin, lineCap, lineWidth); - } - // Advance dash pattern - dashState = !dashState; - idash = (idash+1) % shape->strokeDashCount; - dashLen = shape->strokeDashArray[idash] * scale; - // Restart - cur.x = x; - cur.y = y; - cur.flags = NSVG_PT_CORNER; - totalDist = 0.0f; - r->npoints = 0; - nsvg__appendPathPoint(r, cur); - } else { - totalDist += dist; - cur = r->points2[j]; - nsvg__appendPathPoint(r, cur); - j++; - } - } - // Stroke any leftover path - if (r->npoints > 1 && dashState) - nsvg__expandStroke(r, r->points, r->npoints, 0, lineJoin, lineCap, lineWidth); - } else { - nsvg__prepareStroke(r, miterLimit, lineJoin); - nsvg__expandStroke(r, r->points, r->npoints, closed, lineJoin, lineCap, lineWidth); - } - } -} - -static int nsvg__cmpEdge(const void *p, const void *q) -{ - const NSVGedge* a = (const NSVGedge*)p; - const NSVGedge* b = (const NSVGedge*)q; - - if (a->y0 < b->y0) return -1; - if (a->y0 > b->y0) return 1; - return 0; -} - - -static NSVGactiveEdge* nsvg__addActive(NSVGrasterizer* r, NSVGedge* e, float startPoint) -{ - NSVGactiveEdge* z; - - if (r->freelist != NULL) { - // Restore from freelist. - z = r->freelist; - r->freelist = z->next; - } else { - // Alloc new edge. - z = (NSVGactiveEdge*)nsvg__alloc(r, sizeof(NSVGactiveEdge)); - if (z == NULL) return NULL; - } - - float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); -// STBTT_assert(e->y0 <= start_point); - // round dx down to avoid going too far - if (dxdy < 0) - z->dx = (int)(-floorf(NSVG__FIX * -dxdy)); - else - z->dx = (int)floorf(NSVG__FIX * dxdy); - z->x = (int)floorf(NSVG__FIX * (e->x0 + dxdy * (startPoint - e->y0))); -// z->x -= off_x * FIX; - z->ey = e->y1; - z->next = 0; - z->dir = e->dir; - - return z; -} - -static void nsvg__freeActive(NSVGrasterizer* r, NSVGactiveEdge* z) -{ - z->next = r->freelist; - r->freelist = z; -} - -static void nsvg__fillScanline(unsigned char* scanline, int len, int x0, int x1, int maxWeight, int* xmin, int* xmax) -{ - int i = x0 >> NSVG__FIXSHIFT; - int j = x1 >> NSVG__FIXSHIFT; - if (i < *xmin) *xmin = i; - if (j > *xmax) *xmax = j; - if (i < len && j >= 0) { - if (i == j) { - // x0,x1 are the same pixel, so compute combined coverage - scanline[i] = (unsigned char)(scanline[i] + ((x1 - x0) * maxWeight >> NSVG__FIXSHIFT)); - } else { - if (i >= 0) // add antialiasing for x0 - scanline[i] = (unsigned char)(scanline[i] + (((NSVG__FIX - (x0 & NSVG__FIXMASK)) * maxWeight) >> NSVG__FIXSHIFT)); - else - i = -1; // clip - - if (j < len) // add antialiasing for x1 - scanline[j] = (unsigned char)(scanline[j] + (((x1 & NSVG__FIXMASK) * maxWeight) >> NSVG__FIXSHIFT)); - else - j = len; // clip - - for (++i; i < j; ++i) // fill pixels between x0 and x1 - scanline[i] = (unsigned char)(scanline[i] + maxWeight); - } - } -} - -// note: this routine clips fills that extend off the edges... ideally this -// wouldn't happen, but it could happen if the truetype glyph bounding boxes -// are wrong, or if the user supplies a too-small bitmap -static void nsvg__fillActiveEdges(unsigned char* scanline, int len, NSVGactiveEdge* e, int maxWeight, int* xmin, int* xmax, char fillRule) -{ - // non-zero winding fill - int x0 = 0, w = 0; - - if (fillRule == NSVG_FILLRULE_NONZERO) { - // Non-zero - while (e != NULL) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w += e->dir; - } else { - int x1 = e->x; w += e->dir; - // if we went to zero, we need to draw - if (w == 0) - nsvg__fillScanline(scanline, len, x0, x1, maxWeight, xmin, xmax); - } - e = e->next; - } - } else if (fillRule == NSVG_FILLRULE_EVENODD) { - // Even-odd - while (e != NULL) { - if (w == 0) { - // if we're currently at zero, we need to record the edge start point - x0 = e->x; w = 1; - } else { - int x1 = e->x; w = 0; - nsvg__fillScanline(scanline, len, x0, x1, maxWeight, xmin, xmax); - } - e = e->next; - } - } -} - -static float nsvg__clampf(float a, float mn, float mx) { return a < mn ? mn : (a > mx ? mx : a); } - -static unsigned int nsvg__RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a) -{ - return (r) | (g << 8) | (b << 16) | (a << 24); -} - -static unsigned int nsvg__lerpRGBA(unsigned int c0, unsigned int c1, float u) -{ - int iu = (int)(nsvg__clampf(u, 0.0f, 1.0f) * 256.0f); - int r = (((c0) & 0xff)*(256-iu) + (((c1) & 0xff)*iu)) >> 8; - int g = (((c0>>8) & 0xff)*(256-iu) + (((c1>>8) & 0xff)*iu)) >> 8; - int b = (((c0>>16) & 0xff)*(256-iu) + (((c1>>16) & 0xff)*iu)) >> 8; - int a = (((c0>>24) & 0xff)*(256-iu) + (((c1>>24) & 0xff)*iu)) >> 8; - return nsvg__RGBA((unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a); -} - -static unsigned int nsvg__applyOpacity(unsigned int c, float u) -{ - int iu = (int)(nsvg__clampf(u, 0.0f, 1.0f) * 256.0f); - int r = (c) & 0xff; - int g = (c>>8) & 0xff; - int b = (c>>16) & 0xff; - int a = (((c>>24) & 0xff)*iu) >> 8; - return nsvg__RGBA((unsigned char)r, (unsigned char)g, (unsigned char)b, (unsigned char)a); -} - -static inline int nsvg__div255(int x) -{ - return ((x+1) * 257) >> 16; -} - -static void nsvg__scanlineSolid(unsigned char* dst, int count, unsigned char* cover, int x, int y, - float tx, float ty, float scale, NSVGcachedPaint* cache) -{ - - if (cache->type == NSVG_PAINT_COLOR) { - int i, cr, cg, cb, ca; - cr = cache->colors[0] & 0xff; - cg = (cache->colors[0] >> 8) & 0xff; - cb = (cache->colors[0] >> 16) & 0xff; - ca = (cache->colors[0] >> 24) & 0xff; - - for (i = 0; i < count; i++) { - int r,g,b; - int a = nsvg__div255((int)cover[0] * ca); - int ia = 255 - a; - // Premultiply - r = nsvg__div255(cr * a); - g = nsvg__div255(cg * a); - b = nsvg__div255(cb * a); - - // Blend over - r += nsvg__div255(ia * (int)dst[0]); - g += nsvg__div255(ia * (int)dst[1]); - b += nsvg__div255(ia * (int)dst[2]); - a += nsvg__div255(ia * (int)dst[3]); - - dst[0] = (unsigned char)r; - dst[1] = (unsigned char)g; - dst[2] = (unsigned char)b; - dst[3] = (unsigned char)a; - - cover++; - dst += 4; - } - } else if (cache->type == NSVG_PAINT_LINEAR_GRADIENT) { - // TODO: spread modes. - // TODO: plenty of opportunities to optimize. - float fx, fy, dx, gy; - float* t = cache->xform; - int i, cr, cg, cb, ca; - unsigned int c; - - fx = ((float)x - tx) / scale; - fy = ((float)y - ty) / scale; - dx = 1.0f / scale; - - for (i = 0; i < count; i++) { - int r,g,b,a,ia; - gy = fx*t[1] + fy*t[3] + t[5]; - c = cache->colors[(int)nsvg__clampf(gy*255.0f, 0, 255.0f)]; - cr = (c) & 0xff; - cg = (c >> 8) & 0xff; - cb = (c >> 16) & 0xff; - ca = (c >> 24) & 0xff; - - a = nsvg__div255((int)cover[0] * ca); - ia = 255 - a; - - // Premultiply - r = nsvg__div255(cr * a); - g = nsvg__div255(cg * a); - b = nsvg__div255(cb * a); - - // Blend over - r += nsvg__div255(ia * (int)dst[0]); - g += nsvg__div255(ia * (int)dst[1]); - b += nsvg__div255(ia * (int)dst[2]); - a += nsvg__div255(ia * (int)dst[3]); - - dst[0] = (unsigned char)r; - dst[1] = (unsigned char)g; - dst[2] = (unsigned char)b; - dst[3] = (unsigned char)a; - - cover++; - dst += 4; - fx += dx; - } - } else if (cache->type == NSVG_PAINT_RADIAL_GRADIENT) { - // TODO: spread modes. - // TODO: plenty of opportunities to optimize. - // TODO: focus (fx,fy) - float fx, fy, dx, gx, gy, gd; - float* t = cache->xform; - int i, cr, cg, cb, ca; - unsigned int c; - - fx = ((float)x - tx) / scale; - fy = ((float)y - ty) / scale; - dx = 1.0f / scale; - - for (i = 0; i < count; i++) { - int r,g,b,a,ia; - gx = fx*t[0] + fy*t[2] + t[4]; - gy = fx*t[1] + fy*t[3] + t[5]; - gd = sqrtf(gx*gx + gy*gy); - c = cache->colors[(int)nsvg__clampf(gd*255.0f, 0, 255.0f)]; - cr = (c) & 0xff; - cg = (c >> 8) & 0xff; - cb = (c >> 16) & 0xff; - ca = (c >> 24) & 0xff; - - a = nsvg__div255((int)cover[0] * ca); - ia = 255 - a; - - // Premultiply - r = nsvg__div255(cr * a); - g = nsvg__div255(cg * a); - b = nsvg__div255(cb * a); - - // Blend over - r += nsvg__div255(ia * (int)dst[0]); - g += nsvg__div255(ia * (int)dst[1]); - b += nsvg__div255(ia * (int)dst[2]); - a += nsvg__div255(ia * (int)dst[3]); - - dst[0] = (unsigned char)r; - dst[1] = (unsigned char)g; - dst[2] = (unsigned char)b; - dst[3] = (unsigned char)a; - - cover++; - dst += 4; - fx += dx; - } - } -} - -static void nsvg__rasterizeSortedEdges(NSVGrasterizer *r, float tx, float ty, float scale, NSVGcachedPaint* cache, char fillRule) -{ - NSVGactiveEdge *active = NULL; - int y, s; - int e = 0; - int maxWeight = (255 / NSVG__SUBSAMPLES); // weight per vertical scanline - int xmin, xmax; - - for (y = 0; y < r->height; y++) { - memset(r->scanline, 0, r->width); - xmin = r->width; - xmax = 0; - for (s = 0; s < NSVG__SUBSAMPLES; ++s) { - // find center of pixel for this scanline - float scany = (float)(y*NSVG__SUBSAMPLES + s) + 0.5f; - NSVGactiveEdge **step = &active; - - // update all active edges; - // remove all active edges that terminate before the center of this scanline - while (*step) { - NSVGactiveEdge *z = *step; - if (z->ey <= scany) { - *step = z->next; // delete from list -// NSVG__assert(z->valid); - nsvg__freeActive(r, z); - } else { - z->x += z->dx; // advance to position for current scanline - step = &((*step)->next); // advance through list - } - } - - // resort the list if needed - for (;;) { - int changed = 0; - step = &active; - while (*step && (*step)->next) { - if ((*step)->x > (*step)->next->x) { - NSVGactiveEdge* t = *step; - NSVGactiveEdge* q = t->next; - t->next = q->next; - q->next = t; - *step = q; - changed = 1; - } - step = &(*step)->next; - } - if (!changed) break; - } - - // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline - while (e < r->nedges && r->edges[e].y0 <= scany) { - if (r->edges[e].y1 > scany) { - NSVGactiveEdge* z = nsvg__addActive(r, &r->edges[e], scany); - if (z == NULL) break; - // find insertion point - if (active == NULL) { - active = z; - } else if (z->x < active->x) { - // insert at front - z->next = active; - active = z; - } else { - // find thing to insert AFTER - NSVGactiveEdge* p = active; - while (p->next && p->next->x < z->x) - p = p->next; - // at this point, p->next->x is NOT < z->x - z->next = p->next; - p->next = z; - } - } - e++; - } - - // now process all active edges in non-zero fashion - if (active != NULL) - nsvg__fillActiveEdges(r->scanline, r->width, active, maxWeight, &xmin, &xmax, fillRule); - } - // Blit - if (xmin < 0) xmin = 0; - if (xmax > r->width-1) xmax = r->width-1; - if (xmin <= xmax) { - nsvg__scanlineSolid(&r->bitmap[y * r->stride] + xmin*4, xmax-xmin+1, &r->scanline[xmin], xmin, y, tx,ty, scale, cache); - } - } - -} - -static void nsvg__unpremultiplyAlpha(unsigned char* image, int w, int h, int stride) -{ - int x,y; - - // Unpremultiply - for (y = 0; y < h; y++) { - unsigned char *row = &image[y*stride]; - for (x = 0; x < w; x++) { - int r = row[0], g = row[1], b = row[2], a = row[3]; - if (a != 0) { - row[0] = (unsigned char)(r*255/a); - row[1] = (unsigned char)(g*255/a); - row[2] = (unsigned char)(b*255/a); - } - row += 4; - } - } - - // Defringe - for (y = 0; y < h; y++) { - unsigned char *row = &image[y*stride]; - for (x = 0; x < w; x++) { - int r = 0, g = 0, b = 0, a = row[3], n = 0; - if (a == 0) { - if (x-1 > 0 && row[-1] != 0) { - r += row[-4]; - g += row[-3]; - b += row[-2]; - n++; - } - if (x+1 < w && row[7] != 0) { - r += row[4]; - g += row[5]; - b += row[6]; - n++; - } - if (y-1 > 0 && row[-stride+3] != 0) { - r += row[-stride]; - g += row[-stride+1]; - b += row[-stride+2]; - n++; - } - if (y+1 < h && row[stride+3] != 0) { - r += row[stride]; - g += row[stride+1]; - b += row[stride+2]; - n++; - } - if (n > 0) { - row[0] = (unsigned char)(r/n); - row[1] = (unsigned char)(g/n); - row[2] = (unsigned char)(b/n); - } - } - row += 4; - } - } -} - - -static void nsvg__initPaint(NSVGcachedPaint* cache, NSVGpaint* paint, float opacity) -{ - int i, j; - NSVGgradient* grad; - - cache->type = paint->type; - - if (paint->type == NSVG_PAINT_COLOR) { - cache->colors[0] = nsvg__applyOpacity(paint->color, opacity); - return; - } - - grad = paint->gradient; - - cache->spread = grad->spread; - memcpy(cache->xform, grad->xform, sizeof(float)*6); - - if (grad->nstops == 0) { - for (i = 0; i < 256; i++) - cache->colors[i] = 0; - } if (grad->nstops == 1) { - for (i = 0; i < 256; i++) - cache->colors[i] = nsvg__applyOpacity(grad->stops[i].color, opacity); - } else { - unsigned int ca, cb = 0; - float ua, ub, du, u; - int ia, ib, count; - - ca = nsvg__applyOpacity(grad->stops[0].color, opacity); - ua = nsvg__clampf(grad->stops[0].offset, 0, 1); - ub = nsvg__clampf(grad->stops[grad->nstops-1].offset, ua, 1); - ia = (int)(ua * 255.0f); - ib = (int)(ub * 255.0f); - for (i = 0; i < ia; i++) { - cache->colors[i] = ca; - } - - for (i = 0; i < grad->nstops-1; i++) { - ca = nsvg__applyOpacity(grad->stops[i].color, opacity); - cb = nsvg__applyOpacity(grad->stops[i+1].color, opacity); - ua = nsvg__clampf(grad->stops[i].offset, 0, 1); - ub = nsvg__clampf(grad->stops[i+1].offset, 0, 1); - ia = (int)(ua * 255.0f); - ib = (int)(ub * 255.0f); - count = ib - ia; - if (count <= 0) continue; - u = 0; - du = 1.0f / (float)count; - for (j = 0; j < count; j++) { - cache->colors[ia+j] = nsvg__lerpRGBA(ca,cb,u); - u += du; - } - } - - for (i = ib; i < 256; i++) - cache->colors[i] = cb; - } - -} - -/* -static void dumpEdges(NSVGrasterizer* r, const char* name) -{ - float xmin = 0, xmax = 0, ymin = 0, ymax = 0; - NSVGedge *e = NULL; - int i; - if (r->nedges == 0) return; - FILE* fp = fopen(name, "w"); - if (fp == NULL) return; - - xmin = xmax = r->edges[0].x0; - ymin = ymax = r->edges[0].y0; - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - xmin = nsvg__minf(xmin, e->x0); - xmin = nsvg__minf(xmin, e->x1); - xmax = nsvg__maxf(xmax, e->x0); - xmax = nsvg__maxf(xmax, e->x1); - ymin = nsvg__minf(ymin, e->y0); - ymin = nsvg__minf(ymin, e->y1); - ymax = nsvg__maxf(ymax, e->y0); - ymax = nsvg__maxf(ymax, e->y1); - } - - fprintf(fp, "", xmin, ymin, (xmax - xmin), (ymax - ymin)); - - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - fprintf(fp ,"", e->x0,e->y0, e->x1,e->y1); - } - - for (i = 0; i < r->npoints; i++) { - if (i+1 < r->npoints) - fprintf(fp ,"", r->points[i].x, r->points[i].y, r->points[i+1].x, r->points[i+1].y); - fprintf(fp ,"", r->points[i].x, r->points[i].y, r->points[i].flags == 0 ? "#f00" : "#0f0"); - } - - fprintf(fp, ""); - fclose(fp); -} -*/ - -void nsvgRasterize(NSVGrasterizer* r, - NSVGimage* image, float tx, float ty, float scale, - unsigned char* dst, int w, int h, int stride) -{ - NSVGshape *shape = NULL; - NSVGedge *e = NULL; - NSVGcachedPaint cache; - int i; - - r->bitmap = dst; - r->width = w; - r->height = h; - r->stride = stride; - - if (w > r->cscanline) { - r->cscanline = w; - r->scanline = (unsigned char*)realloc(r->scanline, w); - if (r->scanline == NULL) return; - } - - for (i = 0; i < h; i++) - memset(&dst[i*stride], 0, w*4); - - for (shape = image->shapes; shape != NULL; shape = shape->next) { - if (!(shape->flags & NSVG_FLAGS_VISIBLE)) - continue; - - if (shape->fill.type != NSVG_PAINT_NONE) { - nsvg__resetPool(r); - r->freelist = NULL; - r->nedges = 0; - - nsvg__flattenShape(r, shape, scale); - - // Scale and translate edges - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - e->x0 = tx + e->x0; - e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; - e->x1 = tx + e->x1; - e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; - } - - // Rasterize edges - qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); - - // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule - nsvg__initPaint(&cache, &shape->fill, shape->opacity); - - nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, shape->fillRule); - } - if (shape->stroke.type != NSVG_PAINT_NONE && (shape->strokeWidth * scale) > 0.01f) { - nsvg__resetPool(r); - r->freelist = NULL; - r->nedges = 0; - - nsvg__flattenShapeStroke(r, shape, scale); - -// dumpEdges(r, "edge.svg"); - - // Scale and translate edges - for (i = 0; i < r->nedges; i++) { - e = &r->edges[i]; - e->x0 = tx + e->x0; - e->y0 = (ty + e->y0) * NSVG__SUBSAMPLES; - e->x1 = tx + e->x1; - e->y1 = (ty + e->y1) * NSVG__SUBSAMPLES; - } - - // Rasterize edges - qsort(r->edges, r->nedges, sizeof(NSVGedge), nsvg__cmpEdge); - - // now, traverse the scanlines and find the intersections on each scanline, use non-zero rule - nsvg__initPaint(&cache, &shape->stroke, shape->opacity); - - nsvg__rasterizeSortedEdges(r, tx,ty,scale, &cache, NSVG_FILLRULE_NONZERO); - } - } - - nsvg__unpremultiplyAlpha(dst, w, h, stride); - - r->bitmap = NULL; - r->width = 0; - r->height = 0; - r->stride = 0; -} - -#endif diff --git a/src/occt_wrapper/CMakeLists.txt b/src/occt_wrapper/CMakeLists.txt new file mode 100644 index 0000000000..8ab9fb4be8 --- /dev/null +++ b/src/occt_wrapper/CMakeLists.txt @@ -0,0 +1,62 @@ +cmake_minimum_required(VERSION 3.13) +project(OCCTWrapper) + +if (APPLE) + # TODO: we need to fix notarization with the separate shared library + add_library(OCCTWrapper STATIC OCCTWrapper.cpp) +else () + add_library(OCCTWrapper MODULE OCCTWrapper.cpp) +endif () + +set_target_properties(OCCTWrapper + PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/src" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/src" + PREFIX "" +) + +include(GenerateExportHeader) + +generate_export_header(OCCTWrapper) + +find_package(OpenCASCADE 7.6.2 REQUIRED) + +set(OCCT_LIBS + TKXDESTEP + TKSTEP + TKSTEP209 + TKSTEPAttr + TKSTEPBase + TKXCAF + TKXSBase + TKVCAF + TKCAF + TKLCAF + TKCDF + TKV3d + TKService + TKMesh + TKBO + TKPrim + TKHLR + TKShHealing + TKTopAlgo + TKGeomAlgo + TKBRep + TKGeomBase + TKG3d + TKG2d + TKMath + TKernel +) + +slic3r_remap_configs("${OCCT_LIBS}" RelWithDebInfo Release) + +target_include_directories(OCCTWrapper PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(OCCTWrapper PUBLIC ${OpenCASCADE_INCLUDE_DIR}) +target_link_libraries(OCCTWrapper ${OCCT_LIBS}) + +include(GNUInstallDirs) + +install(TARGETS OCCTWrapper DESTINATION "${CMAKE_INSTALL_BINDIR}") + diff --git a/src/occt_wrapper/OCCTWrapper.cpp b/src/occt_wrapper/OCCTWrapper.cpp new file mode 100644 index 0000000000..e41d8953ff --- /dev/null +++ b/src/occt_wrapper/OCCTWrapper.cpp @@ -0,0 +1,201 @@ +#include "OCCTWrapper.hpp" + +#include "occtwrapper_export.h" + +#include + +#ifdef _WIN32 +#define DIR_SEPARATOR '\\' +#else +#define DIR_SEPARATOR '/' +#endif + +#include "STEPCAFControl_Reader.hxx" +#include "BRepMesh_IncrementalMesh.hxx" +#include "XCAFDoc_DocumentTool.hxx" +#include "XCAFDoc_ShapeTool.hxx" +#include "XCAFApp_Application.hxx" +#include "TopoDS_Builder.hxx" +#include "TopoDS.hxx" +#include "TDataStd_Name.hxx" +#include "BRepBuilderAPI_Transform.hxx" +#include "TopExp_Explorer.hxx" +#include "BRep_Tool.hxx" + +const double STEP_TRANS_CHORD_ERROR = 0.005; +const double STEP_TRANS_ANGLE_RES = 1; + +// const int LOAD_STEP_STAGE_READ_FILE = 0; +// const int LOAD_STEP_STAGE_GET_SOLID = 1; +// const int LOAD_STEP_STAGE_GET_MESH = 2; + +namespace Slic3r { + +struct NamedSolid { + NamedSolid(const TopoDS_Shape& s, + const std::string& n) : solid{s}, name{n} {} + const TopoDS_Shape solid; + const std::string name; +}; + +static void getNamedSolids(const TopLoc_Location& location, const Handle(XCAFDoc_ShapeTool) shapeTool, + const TDF_Label label, std::vector& namedSolids) +{ + TDF_Label referredLabel{label}; + if (shapeTool->IsReference(label)) + shapeTool->GetReferredShape(label, referredLabel); + + std::string name; + Handle(TDataStd_Name) shapeName; + if (referredLabel.FindAttribute(TDataStd_Name::GetID(), shapeName)) + name = TCollection_AsciiString(shapeName->Get()).ToCString(); + + TopLoc_Location localLocation = location * shapeTool->GetLocation(label); + TDF_LabelSequence components; + if (shapeTool->GetComponents(referredLabel, components)) { + for (Standard_Integer compIndex = 1; compIndex <= components.Length(); ++compIndex) { + getNamedSolids(localLocation, shapeTool, components.Value(compIndex), namedSolids); + } + } else { + TopoDS_Shape shape; + shapeTool->GetShape(referredLabel, shape); + TopAbs_ShapeEnum shape_type = shape.ShapeType(); + BRepBuilderAPI_Transform transform(shape, localLocation, Standard_True); + switch (shape_type) { + case TopAbs_COMPOUND: + namedSolids.emplace_back(TopoDS::Compound(transform.Shape()), name); + break; + case TopAbs_COMPSOLID: + namedSolids.emplace_back(TopoDS::CompSolid(transform.Shape()), name); + break; + case TopAbs_SOLID: + namedSolids.emplace_back(TopoDS::Solid(transform.Shape()), name); + break; + default: + break; + } + } +} + +extern "C" OCCTWRAPPER_EXPORT bool load_step_internal(const char *path, OCCTResult* res /*BBS:, ImportStepProgressFn proFn*/) +{ +try { + //bool cb_cancel = false; + //if (proFn) { + // proFn(LOAD_STEP_STAGE_READ_FILE, 0, 1, cb_cancel); + // if (cb_cancel) + // return false; + //} + + + std::vector namedSolids; + Handle(TDocStd_Document) document; + Handle(XCAFApp_Application) application = XCAFApp_Application::GetApplication(); + application->NewDocument(path, document); + STEPCAFControl_Reader reader; + reader.SetNameMode(true); + //BBS: Todo, read file is slow which cause the progress_bar no update and gui no response + IFSelect_ReturnStatus stat = reader.ReadFile(path); + if (stat != IFSelect_RetDone || !reader.Transfer(document)) { + application->Close(document); + res->error_str = std::string{"Could not read '"} + path + "'"; + return false; + } + Handle(XCAFDoc_ShapeTool) shapeTool = XCAFDoc_DocumentTool::ShapeTool(document->Main()); + TDF_LabelSequence topLevelShapes; + shapeTool->GetFreeShapes(topLevelShapes); + + Standard_Integer topShapeLength = topLevelShapes.Length() + 1; + for (Standard_Integer iLabel = 1; iLabel < topShapeLength; ++iLabel) { + //if (proFn) { + // proFn(LOAD_STEP_STAGE_GET_SOLID, iLabel, topShapeLength, cb_cancel); + // if (cb_cancel) { + // shapeTool.reset(nullptr); + // application->Close(document); + // return false; + // } + //} + getNamedSolids(TopLoc_Location{}, shapeTool, topLevelShapes.Value(iLabel), namedSolids); + } + + + + // Now the object name. Set it to filename without suffix. + // This will later be changed if only one volume is loaded. + const char *last_slash = strrchr(path, DIR_SEPARATOR); + std::string obj_name((last_slash == nullptr) ? path : last_slash + 1); + res->object_name = obj_name; + + for (size_t i = 0; i < namedSolids.size(); ++i) { + //BBS:if (proFn) { + // proFn(LOAD_STEP_STAGE_GET_MESH, i, namedSolids.size(), cb_cancel); + // if (cb_cancel) { + // model->delete_object(new_object); + // shapeTool.reset(nullptr); + // application->Close(document); + // return false; + // } + //} + + res->volumes.emplace_back(); + auto& vertices = res->volumes.back().vertices; + auto& indices = res->volumes.back().indices; + + BRepMesh_IncrementalMesh mesh(namedSolids[i].solid, STEP_TRANS_CHORD_ERROR, false, STEP_TRANS_ANGLE_RES, true); + + for (TopExp_Explorer anExpSF(namedSolids[i].solid, TopAbs_FACE); anExpSF.More(); anExpSF.Next()) { + const int aNodeOffset = int(vertices.size()); + const TopoDS_Shape& aFace = anExpSF.Current(); + TopLoc_Location aLoc; + Handle(Poly_Triangulation) aTriangulation = BRep_Tool::Triangulation(TopoDS::Face(aFace), aLoc); + if (aTriangulation.IsNull()) + continue; + + // First copy vertices (will create duplicates). + gp_Trsf aTrsf = aLoc.Transformation(); + for (Standard_Integer aNodeIter = 1; aNodeIter <= aTriangulation->NbNodes(); ++aNodeIter) { + gp_Pnt aPnt = aTriangulation->Node(aNodeIter); + aPnt.Transform(aTrsf); + vertices.push_back({float(aPnt.X()), float(aPnt.Y()), float(aPnt.Z())}); + } + // Now the indices. + const TopAbs_Orientation anOrientation = anExpSF.Current().Orientation(); + for (Standard_Integer aTriIter = 1; aTriIter <= aTriangulation->NbTriangles(); ++aTriIter) { + Poly_Triangle aTri = aTriangulation->Triangle(aTriIter); + + Standard_Integer anId[3]; + aTri.Get(anId[0], anId[1], anId[2]); + if (anOrientation == TopAbs_REVERSED) + std::swap(anId[1], anId[2]); + + // Account for the vertices we already have from previous faces. + // anId is 1-based index ! + indices.push_back({anId[0] - 1 + aNodeOffset, + anId[1] - 1 + aNodeOffset, + anId[2] - 1 + aNodeOffset}); + } + } + + res->volumes.back().volume_name = namedSolids[i].name; + + if (vertices.empty()) + res->volumes.pop_back(); + } + + shapeTool.reset(nullptr); + application->Close(document); + + if (res->volumes.empty()) + return false; +} catch (const std::exception& ex) { + res->error_str = ex.what(); + return false; +} catch (...) { + res->error_str = "An exception was thrown in load_step_internal."; + return false; +} + + return true; +} + +}; // namespace Slic3r diff --git a/src/occt_wrapper/OCCTWrapper.hpp b/src/occt_wrapper/OCCTWrapper.hpp new file mode 100644 index 0000000000..e87becb70f --- /dev/null +++ b/src/occt_wrapper/OCCTWrapper.hpp @@ -0,0 +1,27 @@ + +#ifndef occtwrapper_OCCTWrapper_hpp_ +#define occtwrapper_OCCTWrapper_hpp_ + +#include +#include +#include + +namespace Slic3r { + +struct OCCTVolume { + std::string volume_name; + std::vector> vertices; + std::vector> indices; +}; + +struct OCCTResult { + std::string error_str; + std::string object_name; + std::vector volumes; +}; + +using LoadStepFn = bool (*)(const char *path, OCCTResult* occt_result); + +}; // namespace Slic3r + +#endif // occtwrapper_OCCTWrapper_hpp_ diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index e1f3934d86..51bc9d4b66 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -27,6 +27,8 @@ set(SLIC3R_GUI_SOURCES GUI/GLShader.hpp GUI/GLCanvas3D.hpp GUI/GLCanvas3D.cpp + GUI/SceneRaycaster.hpp + GUI/SceneRaycaster.cpp GUI/OpenGLManager.hpp GUI/OpenGLManager.cpp GUI/Selection.hpp @@ -258,7 +260,6 @@ set(SLIC3R_GUI_SOURCES Utils/PresetUpdater.hpp Utils/Process.cpp Utils/Process.hpp - Utils/Profile.hpp Utils/RaycastManager.cpp Utils/RaycastManager.hpp Utils/UndoRedo.cpp @@ -299,7 +300,7 @@ endforeach() encoding_check(libslic3r_gui) -target_link_libraries(libslic3r_gui libslic3r avrdude libcereal imgui GLEW::GLEW OpenGL::GL hidapi libcurl ${wxWidgets_LIBRARIES}) +target_link_libraries(libslic3r_gui libslic3r avrdude libcereal imgui GLEW::GLEW OpenGL::GL hidapi libcurl ${wxWidgets_LIBRARIES} NanoSVG::nanosvg NanoSVG::nanosvgrast) if (MSVC) target_link_libraries(libslic3r_gui Setupapi.lib) diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp index 503c35a9b7..4319a28cf1 100644 --- a/src/slic3r/GUI/3DBed.cpp +++ b/src/slic3r/GUI/3DBed.cpp @@ -11,10 +11,10 @@ #include "GUI_App.hpp" #include "GLCanvas3D.hpp" -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "Plater.hpp" #include "Camera.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include @@ -110,22 +110,23 @@ const float Bed3D::Axes::DefaultTipLength = 5.0f; void Bed3D::Axes::render() { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL auto render_axis = [this](GLShaderProgram* shader, const Transform3d& transform) { const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d matrix = camera.get_view_matrix() * transform; - shader->set_uniform("view_model_matrix", matrix); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * transform); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * transform.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); #else auto render_axis = [this](const Transform3f& transform) { glsafe(::glPushMatrix()); glsafe(::glMultMatrixf(transform.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL }; if (!m_arrow.is_initialized()) @@ -143,38 +144,29 @@ void Bed3D::Axes::render() // x axis #if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::X()); -#else - m_arrow.set_color(-1, ColorRGBA::X()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 })); #else + m_arrow.set_color(-1, ColorRGBA::X()); render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // y axis #if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::Y()); -#else - m_arrow.set_color(-1, ColorRGBA::Y()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 })); #else + m_arrow.set_color(-1, ColorRGBA::Y()); render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // z axis #if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::Z()); -#else - m_arrow.set_color(-1, ColorRGBA::Z()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(shader, Geometry::assemble_transform(m_origin)); #else + m_arrow.set_color(-1, ColorRGBA::Z()); render_axis(Geometry::assemble_transform(m_origin).cast()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); @@ -257,6 +249,11 @@ bool Bed3D::set_shape(const Pointfs& bed_shape, const double max_print_height, c m_axes.set_origin({ 0.0, 0.0, static_cast(GROUND_Z) }); m_axes.set_stem_length(0.1f * static_cast(m_build_volume.bounding_volume().max_size())); +#if ENABLE_RAYCAST_PICKING + // unregister from picking + wxGetApp().plater()->canvas3D()->remove_raycasters_for_picking(SceneRaycaster::EType::Bed); +#endif // ENABLE_RAYCAST_PICKING + // Let the calee to update the UI. return true; } @@ -271,7 +268,7 @@ Point Bed3D::point_projection(const Point& point) const return m_polygon.point_projection(point); } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture) { render_internal(canvas, view_matrix, projection_matrix, bottom, scale_factor, show_axes, show_texture, false); @@ -291,15 +288,15 @@ void Bed3D::render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_fact { render_internal(canvas, bottom, scale_factor, false, false, true); } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking) #else void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { m_scale_factor = scale_factor; @@ -309,14 +306,18 @@ void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, glsafe(::glEnable(GL_DEPTH_TEST)); #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_model.model.set_color(picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR); +#else m_model.set_color(picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR); +#endif // ENABLE_RAYCAST_PICKING #else m_model.set_color(-1, picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR); #endif // ENABLE_LEGACY_OPENGL_REMOVAL switch (m_type) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL case Type::System: { render_system(canvas, view_matrix, projection_matrix, bottom, show_texture); break; } default: case Type::Custom: { render_custom(canvas, view_matrix, projection_matrix, bottom, show_texture, picking); break; } @@ -324,7 +325,7 @@ void Bed3D::render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, case Type::System: { render_system(canvas, bottom, show_texture); break; } default: case Type::Custom: { render_custom(canvas, bottom, show_texture, picking); break; } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } glsafe(::glDisable(GL_DEPTH_TEST)); @@ -341,6 +342,8 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box() const // Reset the build volume Z, we don't want to zoom to the top of the build volume if it is empty. out.min.z() = 0.0; out.max.z() = 0.0; + // extend to origin in case origin is off bed + out.merge(m_axes.get_origin()); // extend to contain axes out.merge(m_axes.get_origin() + m_axes.get_total_length() * Vec3d::Ones()); #if ENABLE_WORLD_COORDINATE @@ -349,7 +352,11 @@ BoundingBoxf3 Bed3D::calc_extended_bounding_box() const out.merge(out.min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, out.max.z())); #endif // ENABLE_WORLD_COORDINATE // extend to contain model, if any +#if ENABLE_RAYCAST_PICKING + BoundingBoxf3 model_bb = m_model.model.get_bounding_box(); +#else BoundingBoxf3 model_bb = m_model.get_bounding_box(); +#endif // ENABLE_RAYCAST_PICKING if (model_bb.defined) { model_bb.translate(m_model_offset); out.merge(model_bb); @@ -399,7 +406,16 @@ void Bed3D::init_triangles() init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); } +#if ENABLE_RAYCAST_PICKING + if (m_model.model.get_filename().empty() && m_model.mesh_raycaster == nullptr) + // register for picking + register_raycasters_for_picking(init_data, Transform3d::Identity()); +#endif // ENABLE_RAYCAST_PICKING + m_triangles.init_from(std::move(init_data)); +#if ENABLE_RAYCAST_PICKING + m_triangles.set_color(DEFAULT_MODEL_COLOR); +#endif // ENABLE_RAYCAST_PICKING } void Bed3D::init_gridlines() @@ -546,17 +562,17 @@ void Bed3D::render_axes() { if (m_build_volume.valid()) #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL m_axes.render(Transform3d::Identity(), 0.25f); #else m_axes.render(0.25f); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #else m_axes.render(); #endif // ENABLE_WORLD_COORDINATE } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture) { if (!bottom) @@ -578,21 +594,21 @@ void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) else if (bottom) render_contour(); } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix) #else void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (m_texture_filename.empty()) { m_texture.reset(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_default(bottom, false, true, view_matrix, projection_matrix); #else render_default(bottom, false, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return; } @@ -605,11 +621,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) if (m_temp_texture.get_id() == 0 || m_temp_texture.get_source() != m_texture_filename) { // generate a temporary lower resolution texture to show while no main texture levels have been compressed if (!m_temp_texture.load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8)) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_default(bottom, false, true, view_matrix, projection_matrix); #else render_default(bottom, false, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return; } canvas.request_extra_frame(); @@ -617,11 +633,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) // starts generating the main texture, compression will run asynchronously if (!m_texture.load_from_svg_file(m_texture_filename, true, true, true, max_tex_size)) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_default(bottom, false, true, view_matrix, projection_matrix); #else render_default(bottom, false, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return; } } @@ -629,11 +645,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) // generate a temporary lower resolution texture to show while no main texture levels have been compressed if (m_temp_texture.get_id() == 0 || m_temp_texture.get_source() != m_texture_filename) { if (!m_temp_texture.load_from_file(m_texture_filename, false, GLTexture::None, false)) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_default(bottom, false, true, view_matrix, projection_matrix); #else render_default(bottom, false, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return; } canvas.request_extra_frame(); @@ -641,20 +657,20 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) // starts generating the main texture, compression will run asynchronously if (!m_texture.load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true)) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_default(bottom, false, true, view_matrix, projection_matrix); #else render_default(bottom, false, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return; } } else { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_default(bottom, false, true, view_matrix, projection_matrix); #else render_default(bottom, false, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return; } } @@ -675,10 +691,8 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) GLShaderProgram* shader = wxGetApp().get_shader("printbed"); if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", projection_matrix); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("transparent_background", bottom); shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg")); @@ -772,18 +786,26 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix) #else void Bed3D::render_model() -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (m_model_filename.empty()) return; +#if ENABLE_RAYCAST_PICKING + if (m_model.model.get_filename() != m_model_filename && m_model.model.init_from_file(m_model_filename)) { +#else if (m_model.get_filename() != m_model_filename && m_model.init_from_file(m_model_filename)) { +#endif // ENABLE_RAYCAST_PICKING #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_model.model.set_color(DEFAULT_MODEL_COLOR); +#else m_model.set_color(DEFAULT_MODEL_COLOR); +#endif // ENABLE_RAYCAST_PICKING #else m_model.set_color(-1, DEFAULT_MODEL_COLOR); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -791,72 +813,86 @@ void Bed3D::render_model() // 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 m_model_offset = to_3d(m_build_volume.bounding_volume2d().center(), -0.03); +#if ENABLE_RAYCAST_PICKING + // register for picking + register_raycasters_for_picking(m_model.model.get_geometry(), Geometry::assemble_transform(m_model_offset)); +#endif // ENABLE_RAYCAST_PICKING + // update extended bounding box m_extended_bounding_box = this->calc_extended_bounding_box(); } +#if ENABLE_RAYCAST_PICKING + if (!m_model.model.get_filename().empty()) { +#else if (!m_model.get_filename().empty()) { +#endif // ENABLE_RAYCAST_PICKING GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); if (shader != nullptr) { shader->start_using(); shader->set_uniform("emission_factor", 0.0f); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d matrix = view_matrix * Geometry::assemble_transform(m_model_offset); - shader->set_uniform("view_model_matrix", matrix); +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d model_matrix = Geometry::assemble_transform(m_model_offset); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); shader->set_uniform("projection_matrix", projection_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_model_offset.x(), m_model_offset.y(), m_model_offset.z())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_model.model.render(); +#else m_model.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_RAYCAST_PICKING +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } } } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::render_custom(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture, bool picking) #else void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (m_texture_filename.empty() && m_model_filename.empty()) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_default(bottom, picking, show_texture, view_matrix, projection_matrix); #else render_default(bottom, picking, show_texture); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return; } +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!bottom) -#if ENABLE_GL_SHADERS_ATTRIBUTES render_model(view_matrix, projection_matrix); -#else - render_model(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (show_texture) -#if ENABLE_GL_SHADERS_ATTRIBUTES render_texture(bottom, canvas, view_matrix, projection_matrix); else if (bottom) render_contour(view_matrix, projection_matrix); #else + if (!bottom) + render_model(); + + if (show_texture) render_texture(bottom, canvas); else if (bottom) render_contour(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Bed3D::render_default(bool bottom, bool picking, bool show_texture, const Transform3d& view_matrix, const Transform3d& projection_matrix) #else void Bed3D::render_default(bool bottom, bool picking, bool show_texture) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { m_texture.reset(); @@ -868,33 +904,54 @@ void Bed3D::render_default(bool bottom, bool picking, bool show_texture) if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", projection_matrix); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); +#if ENABLE_RAYCAST_PICKING + const bool has_model = !m_model.model.get_filename().empty(); +#else const bool has_model = !m_model.get_filename().empty(); +#endif // ENABLE_RAYCAST_PICKING if (!has_model && !bottom) { // draw background glsafe(::glDepthMask(GL_FALSE)); +#if !ENABLE_RAYCAST_PICKING m_triangles.set_color(picking ? PICKING_MODEL_COLOR : DEFAULT_MODEL_COLOR); +#endif // !ENABLE_RAYCAST_PICKING m_triangles.render(); glsafe(::glDepthMask(GL_TRUE)); } +#if ENABLE_RAYCAST_PICKING + if (show_texture) { + // draw grid +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.5f * m_scale_factor)); + m_gridlines.set_color(has_model && !bottom ? DEFAULT_SOLID_GRID_COLOR : DEFAULT_TRANSPARENT_GRID_COLOR); + m_gridlines.render(); + } + else + render_contour(view_matrix, projection_matrix); +#else if (!picking && show_texture) { // draw grid - glsafe(::glLineWidth(1.5f * m_scale_factor)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.5f * m_scale_factor)); m_gridlines.set_color(has_model && !bottom ? DEFAULT_SOLID_GRID_COLOR : DEFAULT_TRANSPARENT_GRID_COLOR); m_gridlines.render(); } else if (!show_texture) render_contour(view_matrix, projection_matrix); +#endif // ENABLE_RAYCAST_PICKING glsafe(::glDisable(GL_BLEND)); @@ -946,18 +1003,18 @@ void Bed3D::render_contour(const Transform3d& view_matrix, const Transform3d& pr GLShaderProgram* shader = wxGetApp().get_shader("flat"); if (shader != nullptr) { shader->start_using(); - -#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", view_matrix); shader->set_uniform("projection_matrix", projection_matrix); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glEnable(GL_BLEND)); glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); // draw contour - glsafe(::glLineWidth(1.5f * m_scale_factor)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.5f * m_scale_factor)); m_contourlines.render(); glsafe(::glDisable(GL_BLEND)); @@ -987,5 +1044,26 @@ void Bed3D::release_VBOs() } #endif // !ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING +void Bed3D::register_raycasters_for_picking(const GLModel::Geometry& geometry, const Transform3d& trafo) +{ + assert(m_model.mesh_raycaster == nullptr); + + indexed_triangle_set its; + its.vertices.reserve(geometry.vertices_count()); + for (size_t i = 0; i < geometry.vertices_count(); ++i) { + its.vertices.emplace_back(geometry.extract_position_3(i)); + } + its.indices.reserve(geometry.indices_count() / 3); + for (size_t i = 0; i < geometry.indices_count() / 3; ++i) { + const size_t tri_id = i * 3; + its.indices.emplace_back(geometry.extract_index(tri_id), geometry.extract_index(tri_id + 1), geometry.extract_index(tri_id + 2)); + } + + m_model.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + wxGetApp().plater()->canvas3D()->add_raycaster_for_picking(SceneRaycaster::EType::Bed, 0, *m_model.mesh_raycaster, trafo); +} +#endif // ENABLE_RAYCAST_PICKING + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp index 3c48a39019..7f0dff19d0 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -8,6 +8,9 @@ #else #include "GLModel.hpp" #endif // ENABLE_WORLD_COORDINATE +#if ENABLE_RAYCAST_PICKING +#include "MeshUtils.hpp" +#endif // ENABLE_RAYCAST_PICKING #include "libslic3r/BuildVolume.hpp" #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -108,7 +111,11 @@ private: GLTexture m_texture; // temporary texture shown until the main texture has still no levels compressed GLTexture m_temp_texture; +#if ENABLE_RAYCAST_PICKING + PickingModel m_model; +#else GLModel m_model; +#endif // ENABLE_RAYCAST_PICKING Vec3d m_model_offset{ Vec3d::Zero() }; #if !ENABLE_LEGACY_OPENGL_REMOVAL unsigned int m_vbo_id{ 0 }; @@ -151,13 +158,13 @@ public: bool contains(const Point& point) const; Point point_projection(const Point& point) const; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture); void render_for_picking(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor); #else void render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture); void render_for_picking(GLCanvas3D& canvas, bool bottom, float scale_factor); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL private: // Calculate an extended bounding box from axes and current model for visualization purposes. @@ -172,15 +179,15 @@ private: void calc_contourlines(const ExPolygon& poly); #endif // ENABLE_LEGACY_OPENGL_REMOVAL static std::tuple detect_type(const Pointfs& shape); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_internal(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking); #else void render_internal(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes, bool show_texture, bool picking); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void render_axes(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_system(GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_texture); void render_texture(bool bottom, GLCanvas3D& canvas, const Transform3d& view_matrix, const Transform3d& projection_matrix); void render_model(const Transform3d& view_matrix, const Transform3d& projection_matrix); @@ -194,11 +201,13 @@ private: void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture, bool picking); void render_default(bool bottom, bool picking, bool show_texture); void render_contour(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if !ENABLE_LEGACY_OPENGL_REMOVAL void release_VBOs(); -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_RAYCAST_PICKING + void register_raycasters_for_picking(const GLModel::Geometry& geometry, const Transform3d& trafo); +#endif // ENABLE_RAYCAST_PICKING }; } // GUI diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp index 88af4b5b4f..575383df6a 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -13,9 +13,9 @@ #include "GUI_App.hpp" #include "Plater.hpp" #include "BitmapCache.hpp" -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "Camera.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include "libslic3r/BuildVolume.hpp" #include "libslic3r/ExtrusionEntity.hpp" @@ -301,7 +301,7 @@ void GLVolume::SinkingContours::render() { update(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); if (shader == nullptr) return; @@ -312,11 +312,11 @@ void GLVolume::SinkingContours::render() #else glsafe(::glPushMatrix()); glsafe(::glTranslated(m_shift.x(), m_shift.y(), m_shift.z())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_model.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } void GLVolume::SinkingContours::update() @@ -393,13 +393,15 @@ void GLVolume::SinkingContours::update() #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_SHOW_NON_MANIFOLD_EDGES void GLVolume::NonManifoldEdges::render() { update(); - glsafe(::glLineWidth(2.0f)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + if (!GUI::OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(2.0f)); +#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); if (shader == nullptr) return; @@ -407,19 +409,22 @@ void GLVolume::NonManifoldEdges::render() const GUI::Camera& camera = GUI::wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix() * m_parent.world_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.5f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + m_model.set_color(complementary(m_parent.render_color)); #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(m_parent.world_matrix().data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_model.set_color(complementary(m_parent.render_color)); -#else m_model.set_color(-1, complementary(m_parent.render_color)); #endif // ENABLE_LEGACY_OPENGL_REMOVAL m_model.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } void GLVolume::NonManifoldEdges::update() @@ -478,7 +483,6 @@ void GLVolume::NonManifoldEdges::update() m_update_needed = false; } -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES const ColorRGBA GLVolume::SELECTED_COLOR = ColorRGBA::GREEN(); const ColorRGBA GLVolume::HOVER_SELECT_COLOR = { 0.4f, 0.9f, 0.1f, 1.0f }; @@ -499,9 +503,7 @@ const std::array GLVolume::MODEL_COLOR = { { GLVolume::GLVolume(float r, float g, float b, float a) : m_sla_shift_z(0.0) , m_sinking_contours(*this) -#if ENABLE_SHOW_NON_MANIFOLD_EDGES , m_non_manifold_edges(*this) -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES // geometry_id == 0 -> invalid , geometry_id(std::pair(0, 0)) , extruder_id(0) @@ -711,19 +713,15 @@ void GLVolume::render() if (!is_active) return; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = GUI::wxGetApp().get_current_shader(); if (shader == nullptr) return; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (this->is_left_handed()) - glFrontFace(GL_CW); + glsafe(::glFrontFace(GL_CW)); glsafe(::glCullFace(GL_BACK)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(world_matrix().data())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_LEGACY_OPENGL_REMOVAL if (tverts_range == std::make_pair(0, -1)) @@ -731,15 +729,14 @@ void GLVolume::render() else model.render(this->tverts_range); #else + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixd(world_matrix().data())); this->indexed_vertex_array.render(this->tverts_range, this->qverts_range); + glsafe(::glPopMatrix()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - if (this->is_left_handed()) - glFrontFace(GL_CCW); + glsafe(::glFrontFace(GL_CCW)); } bool GLVolume::is_sla_support() const { return this->composite_id.volume_id == -int(slaposSupportTree); } @@ -763,12 +760,10 @@ void GLVolume::render_sinking_contours() m_sinking_contours.render(); } -#if ENABLE_SHOW_NON_MANIFOLD_EDGES void GLVolume::render_non_manifold_edges() { m_non_manifold_edges.render(); } -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES #if ENABLE_LEGACY_OPENGL_REMOVAL std::vector GLVolumeCollection::load_object( @@ -812,15 +807,27 @@ int GLVolumeCollection::load_object_volume( const ModelVolume *model_volume = model_object->volumes[volume_idx]; const int extruder_id = model_volume->extruder_id(); const ModelInstance *instance = model_object->instances[instance_idx]; +#if ENABLE_RAYCAST_PICKING + std::shared_ptr mesh = model_volume->mesh_ptr(); +#else const TriangleMesh &mesh = model_volume->mesh(); +#endif // ENABLE_RAYCAST_PICKING this->volumes.emplace_back(new GLVolume()); GLVolume& v = *this->volumes.back(); v.set_color(color_from_model_volume(*model_volume)); #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_SMOOTH_NORMALS - v.model.init_from(mesh, true); + v.model.init_from(*mesh, true); +#if ENABLE_RAYCAST_PICKING + v.mesh_raycaster = std::make_unique(mesh); +#endif // ENABLE_RAYCAST_PICKING +#else +#if ENABLE_RAYCAST_PICKING + v.model.init_from(*mesh); + v.mesh_raycaster = std::make_unique(mesh); #else v.model.init_from(mesh); +#endif // ENABLE_RAYCAST_PICKING #endif // ENABLE_SMOOTH_NORMALS #else #if ENABLE_SMOOTH_NORMALS @@ -885,8 +892,11 @@ void GLVolumeCollection::load_object_auxiliary( v.model.init_from(mesh, true); #else v.model.init_from(mesh); -#endif // ENABLE_SMOOTH_NORMALS v.model.set_color((milestone == slaposPad) ? GLVolume::SLA_PAD_COLOR : GLVolume::SLA_SUPPORT_COLOR); +#if ENABLE_RAYCAST_PICKING + v.mesh_raycaster = std::make_unique(std::make_shared(mesh)); +#endif // ENABLE_RAYCAST_PICKING +#endif // ENABLE_SMOOTH_NORMALS #else #if ENABLE_SMOOTH_NORMALS v.indexed_vertex_array.load_mesh(mesh, true); @@ -912,13 +922,25 @@ void GLVolumeCollection::load_object_auxiliary( #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL +#if ENABLE_OPENGL_ES +int GLVolumeCollection::load_wipe_tower_preview( + float pos_x, float pos_y, float width, float depth, float height, + float rotation_angle, bool size_unknown, float brim_width, TriangleMesh* out_mesh) +#else int GLVolumeCollection::load_wipe_tower_preview( float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width) +#endif // ENABLE_OPENGL_ES +#else +#if ENABLE_OPENGL_ES +int GLVolumeCollection::load_wipe_tower_preview( + int obj_idx, float pos_x, float pos_y, float width, float depth, float height, + float rotation_angle, bool size_unknown, float brim_width, TriangleMesh* out_mesh) #else int GLVolumeCollection::load_wipe_tower_preview( int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width) +#endif // ENABLE_OPENGL_ES #endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL #else #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL @@ -949,8 +971,115 @@ int GLVolumeCollection::load_wipe_tower_preview( // Too narrow tower would interfere with the teeth. The estimate is not precise anyway. depth = std::max(depth, 10.f); float min_width = 30.f; + +#if ENABLE_RAYCAST_PICKING + const float scaled_brim_height = 0.2f / height; +#endif // ENABLE_RAYCAST_PICKING + // 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: +#if ENABLE_RAYCAST_PICKING + // We split the box in three main pieces, + // the two laterals are identical and the central is the one containing the jagged geometry + + // lateral parts generator + auto generate_lateral = [&](float min_x, float max_x) { + const std::vector vertices = { + { min_x, -(depth + brim_width), 0.0f }, + { max_x, -(depth + brim_width), 0.0f }, + { min_x, -(depth + brim_width), scaled_brim_height }, + { max_x, -(depth + brim_width), scaled_brim_height }, + { min_x, -depth, scaled_brim_height }, + { max_x, -depth, scaled_brim_height }, + { min_x, -depth, 1.0f }, + { max_x, -depth, 1.0f }, + { min_x, 0.0f, 1.0f }, + { max_x, 0.0f, 1.0f }, + { min_x, 0.0f, scaled_brim_height }, + { max_x, 0.0f, scaled_brim_height }, + { min_x, brim_width, scaled_brim_height }, + { max_x, brim_width, scaled_brim_height }, + { min_x, brim_width, 0.0f }, + { max_x, brim_width, 0.0f } + }; + const std::vector triangles = { + { 0, 1, 3 }, { 0, 3, 2 }, { 2, 3, 5 }, { 2, 5, 4 }, { 4, 5, 7 }, { 4, 7, 6 }, { 6, 7, 9 }, { 6, 9, 8 }, + { 8, 9, 11 }, { 8, 11, 10 }, { 10, 11, 13 }, { 10, 13, 12 }, { 12, 13, 15 }, { 12, 15, 14 }, { 14, 15, 1 }, { 14, 1, 0 } + }; + + indexed_triangle_set its; + its.vertices.reserve(vertices.size()); + for (const Vec3f& v : vertices) { + its.vertices.emplace_back(v.x(), v.y() + depth, v.z()); + } + its.indices.reserve(triangles.size()); + for (const Vec3i& t : triangles) { + its.indices.emplace_back(t); + } + return its; + }; + + // central parts generator + auto generate_central = [&]() { + const std::vector vertices = { + { 38.453f, -(depth + brim_width), 0.0f }, + { 61.547f, -(depth + brim_width), 0.0f }, + { 38.453f, -(depth + brim_width), scaled_brim_height }, + { 61.547f, -(depth + brim_width), scaled_brim_height }, + { 38.453f, -depth, scaled_brim_height }, + { 61.547f, -depth, scaled_brim_height }, + { 38.453f, -depth, 1.0f }, + { 61.547f, -depth, 1.0f }, + { 38.453f, 0.0f, 1.0f }, + { 38.453f + 0.57735f * brim_width, brim_width, 1.0f }, + { 44.2265f, 10.0f, 1.0f }, + { 50.0f - 0.57735f * brim_width, brim_width, 1.0f }, + { 50.0f, 0.0f, 1.0f }, + { 55.7735f, -10.0f, 1.0f }, + { 61.547f, 0.0f, 1.0f }, + { 38.453f, 0.0f, scaled_brim_height }, + { 38.453f, brim_width, scaled_brim_height }, + { 38.453f + 0.57735f * brim_width, brim_width, scaled_brim_height }, + { 50.0f - 0.57735f * brim_width, brim_width, scaled_brim_height }, + { 50.0f, 0.0f, scaled_brim_height }, + { 55.7735f, -10.0f, scaled_brim_height }, + { 61.547f, 0.0f, scaled_brim_height }, + { 61.547f, brim_width, scaled_brim_height }, + { 38.453f, brim_width, 0.0f }, + { 38.453f + 0.57735f * brim_width, brim_width, 0.0f }, + { 44.2265f, 10.0f, 0.0f }, + { 50.0f - 0.57735f * brim_width, brim_width, 0.0f }, + { 61.547f, brim_width, 0.0f } + }; + + const std::vector triangles = { + { 0, 1, 3 }, { 0, 3, 2 }, { 2, 3, 5 }, { 2, 5, 4 }, { 4, 5, 7 }, { 4, 7, 6 }, { 7, 14, 13 }, { 7, 13, 6 }, + { 6, 13, 12 }, { 6, 12, 8 }, { 8, 12, 11 }, { 8, 11, 9 }, { 9, 11, 10 }, { 18, 19, 22 }, { 22, 19, 21 }, { 19, 20, 21 }, + { 15, 17, 16 }, { 17, 15, 8 }, { 17, 8, 9 }, { 21, 13, 14 }, { 21, 20, 13 }, { 20, 19, 12 }, { 20, 12, 13 }, { 19, 18, 11 }, + { 19, 11, 12 }, { 27, 26, 18 }, { 27, 18, 22 }, { 26, 25, 18 }, { 18, 25, 11 }, { 11, 25, 10 }, { 25, 24, 17 }, { 25, 17, 9 }, + { 25, 9, 10 }, { 24, 23, 16 }, { 24, 16, 17 }, { 1, 26, 27 }, { 1, 23, 26 }, { 1, 0, 23 }, { 0, 23, 24 }, { 24, 25, 26 } + }; + + indexed_triangle_set its; + its.vertices.reserve(vertices.size()); + for (const Vec3f& v : vertices) { + its.vertices.emplace_back(v.x(), v.y() + depth, v.z()); + } + its.indices.reserve(triangles.size()); + for (const Vec3i& t : triangles) { + its.indices.emplace_back(t); + } + return its; + }; + + TriangleMesh tooth_mesh; + indexed_triangle_set data = generate_lateral(0.0f, 38.453f); + tooth_mesh.merge(TriangleMesh(std::move(data))); + data = generate_central(); + tooth_mesh.merge(TriangleMesh(std::move(data))); + data = generate_lateral(61.547f, 100.0f); + tooth_mesh.merge(TriangleMesh(std::move(data))); +#else 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 } }; static constexpr const int out_facets_idx[][3] = { @@ -965,6 +1094,7 @@ int GLVolumeCollection::load_wipe_tower_preview( for (const int *face : out_facets_idx) its.indices.emplace_back(face); TriangleMesh tooth_mesh(std::move(its)); +#endif // ENABLE_RAYCAST_PICKING // 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 the required width @@ -972,24 +1102,114 @@ int GLVolumeCollection::load_wipe_tower_preview( size_t n = std::max(1, int(width / min_width)); // How many shall be merged? for (size_t i = 0; i < n; ++i) { mesh.merge(tooth_mesh); +#if ENABLE_RAYCAST_PICKING + tooth_mesh.translate(100.0f, 0.0f, 0.0f); +#else tooth_mesh.translate(min_width, 0.f, 0.f); +#endif // ENABLE_RAYCAST_PICKING } +#if ENABLE_RAYCAST_PICKING + // Now we add the caps along the X axis + const float scaled_brim_width_x = brim_width * n * width / min_width; + auto generate_negx_cap = [&]() { + const std::vector vertices = { + { -scaled_brim_width_x, -(depth + brim_width), 0.0f }, + { 0.0f, -(depth + brim_width), 0.0f }, + { -scaled_brim_width_x, -(depth + brim_width), scaled_brim_height }, + { 0.0f, -(depth + brim_width), scaled_brim_height }, + { 0.0f, -depth, scaled_brim_height }, + { 0.0f, -depth, 1.0f }, + { 0.0f, 0.0f, 1.0f }, + { 0.0f, 0.0f, scaled_brim_height }, + { 0.0f, brim_width, scaled_brim_height }, + { -scaled_brim_width_x, brim_width, scaled_brim_height }, + { 0.0f, brim_width, 0.0f }, + { -scaled_brim_width_x, brim_width, 0.0f } + }; + + const std::vector triangles = { + { 0, 1, 3 }, { 0, 3, 2 }, { 2, 3, 4 }, { 2, 4, 9 }, { 9, 4, 7 }, { 9, 7, 8 }, { 9, 8, 10 }, { 9, 10, 11 }, + { 11, 10, 1 }, { 11, 1, 0 }, { 11, 0, 2 }, { 11, 2, 9 }, { 7, 4, 5 }, { 7, 5, 6 } + }; + + indexed_triangle_set its; + its.vertices.reserve(vertices.size()); + for (const Vec3f& v : vertices) { + its.vertices.emplace_back(v.x(), v.y() + depth, v.z()); + } + its.indices.reserve(triangles.size()); + for (const Vec3i& t : triangles) { + its.indices.emplace_back(t); + } + return its; + }; + + auto generate_posx_cap = [&]() { + const float posx_cap_x = n * 100.0f; + const std::vector vertices = { + { posx_cap_x, -(depth + brim_width), 0.0f }, + { posx_cap_x + scaled_brim_width_x, -(depth + brim_width), 0.0f }, + { posx_cap_x, -(depth + brim_width), scaled_brim_height }, + { posx_cap_x + scaled_brim_width_x, -(depth + brim_width), scaled_brim_height }, + { posx_cap_x, -depth, scaled_brim_height }, + { posx_cap_x, -depth, 1.0f }, + { posx_cap_x, 0.0f, 1.0f }, + { posx_cap_x, 0.0f, scaled_brim_height }, + { posx_cap_x, brim_width, scaled_brim_height }, + { posx_cap_x + scaled_brim_width_x, brim_width, scaled_brim_height }, + { posx_cap_x, brim_width, 0.0f }, + { posx_cap_x + scaled_brim_width_x, brim_width, 0.0f } + }; + + const std::vector triangles = { + { 0, 1, 3 }, { 0, 3, 2 }, { 2, 3, 4 }, { 4, 3, 9 }, { 4, 9, 7 }, { 7, 9, 8 }, { 8, 9, 11 }, { 8, 11, 10 }, + { 10, 11, 1 }, { 10, 1, 0 }, { 1, 11, 9 }, { 1, 9, 3 }, { 4, 7, 6 }, { 4, 6, 5 } + }; + + indexed_triangle_set its; + its.vertices.reserve(vertices.size()); + for (const Vec3f& v : vertices) { + its.vertices.emplace_back(v.x(), v.y() + depth, v.z()); + } + its.indices.reserve(triangles.size()); + for (const Vec3i& t : triangles) { + its.indices.emplace_back(t); + } + return its; + }; + + data = generate_negx_cap(); + mesh.merge(TriangleMesh(std::move(data))); + data = generate_posx_cap(); + mesh.merge(TriangleMesh(std::move(data))); + mesh.scale(Vec3f(width / (n * 100.0f), 1.0f, height)); // Scaling to proper width +#else mesh.scale(Vec3f(width / (n * min_width), 1.f, height)); // Scaling to proper width +#endif // ENABLE_RAYCAST_PICKING } else mesh = make_cube(width, depth, height); +#if !ENABLE_RAYCAST_PICKING // We'll make another mesh to show the brim (fixed layer height): TriangleMesh brim_mesh = make_cube(width + 2.f * brim_width, depth + 2.f * brim_width, 0.2f); brim_mesh.translate(-brim_width, -brim_width, 0.f); mesh.merge(brim_mesh); +#endif // !ENABLE_RAYCAST_PICKING volumes.emplace_back(new GLVolume(color)); GLVolume& v = *volumes.back(); #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_OPENGL_ES + if (out_mesh != nullptr) + *out_mesh = mesh; +#endif // ENABLE_OPENGL_ES v.model.init_from(mesh); v.model.set_color(color); +#if ENABLE_RAYCAST_PICKING + v.mesh_raycaster = std::make_unique(std::make_shared(mesh)); +#endif // ENABLE_RAYCAST_PICKING #else v.indexed_vertex_array.load_mesh(mesh); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -1078,12 +1298,12 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo return list; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, std::function filter_func) const #else void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func) const -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { GLVolumeWithIdAndZList to_render = volumes_to_render(volumes, type, view_matrix, filter_func); if (to_render.empty()) @@ -1095,7 +1315,11 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* sink_shader = GUI::wxGetApp().get_shader("flat"); +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* edges_shader = GUI::OpenGLManager::get_gl_info().is_core_profile() ? GUI::wxGetApp().get_shader("dashed_thick_lines") : GUI::wxGetApp().get_shader("flat"); +#else GLShaderProgram* edges_shader = GUI::wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE #endif // ENABLE_LEGACY_OPENGL_REMOVAL ScopeGuard transparent_sg; @@ -1138,13 +1362,11 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab sink_shader->stop_using(); } shader->start_using(); +#else + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - shader->set_uniform("z_range", m_z_range); shader->set_uniform("clipping_plane", m_clipping_plane); shader->set_uniform("print_volume.type", static_cast(m_print_volume.type)); @@ -1166,15 +1388,14 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #if ENABLE_LEGACY_OPENGL_REMOVAL volume.first->model.set_color(volume.first->render_color); + const Transform3d model_matrix = volume.first->world_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + shader->set_uniform("projection_matrix", projection_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); #else shader->set_uniform("uniform_color", volume.first->render_color); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d matrix = view_matrix * volume.first->world_matrix(); - shader->set_uniform("view_model_matrix", matrix); - shader->set_uniform("projection_matrix", projection_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES volume.first->render(); #if ENABLE_ENVIRONMENT_MAP @@ -1185,10 +1406,10 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } if (m_show_sinking_contours) { @@ -1219,7 +1440,6 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_SHOW_NON_MANIFOLD_EDGES #if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); if (edges_shader != nullptr) { @@ -1235,7 +1455,6 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab } shader->start_using(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES if (disable_cullface) glsafe(::glEnable(GL_CULL_FACE)); @@ -1441,6 +1660,13 @@ static void thick_lines_to_geometry( double width_initial = 0.0; double bottom_z_initial = 0.0; + // Reserve for a smooth path. Likley the path will not be that smooth, but better than nothing. + // Allocated 1.5x more data than minimum. + // Number of indices, not triangles. + geometry.reserve_more_indices((lines.size() * 8 * 3) * 3 / 2); + // Number of vertices, not floats. + geometry.reserve_more_vertices(((lines.size() + 1) * 4) * 3 / 2); + // loop once more in case of closed loops const size_t lines_end = closed ? (lines.size() + 1) : lines.size(); for (size_t ii = 0; ii < lines_end; ++ii) { diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp index 4ef0952235..b48ad90a82 100644 --- a/src/slic3r/GUI/3DScene.hpp +++ b/src/slic3r/GUI/3DScene.hpp @@ -1,813 +1,817 @@ -#ifndef slic3r_3DScene_hpp_ -#define slic3r_3DScene_hpp_ - -#include "libslic3r/libslic3r.h" -#include "libslic3r/Point.hpp" -#include "libslic3r/Line.hpp" -#include "libslic3r/TriangleMesh.hpp" -#include "libslic3r/Utils.hpp" -#include "libslic3r/Geometry.hpp" -#include "libslic3r/Color.hpp" - -#include "GLModel.hpp" - -#include -#include - -#ifndef NDEBUG -#define HAS_GLSAFE -#endif // NDEBUG - -#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 // HAS_GLSAFE - inline void glAssertRecentCall() { } - #define glsafe(cmd) cmd - #define glcheck() -#endif // HAS_GLSAFE - -namespace Slic3r { -class SLAPrintObject; -enum SLAPrintObjectStep : unsigned int; -class BuildVolume; -class DynamicPrintConfig; -class ExtrusionPath; -class ExtrusionMultiPath; -class ExtrusionLoop; -class ExtrusionEntity; -class ExtrusionEntityCollection; -class ModelObject; -class ModelVolume; -enum ModelInstanceEPrintVolumeState : unsigned char; - -// Return appropriate color based on the ModelVolume. -extern ColorRGBA color_from_model_volume(const ModelVolume& model_volume); - -#if !ENABLE_LEGACY_OPENGL_REMOVAL -// A container for interleaved arrays of 3D vertices and normals, -// possibly indexed by triangles and / or quads. -class GLIndexedVertexArray { -public: - // Only Eigen types of Nx16 size are vectorized. This bounding box will not be vectorized. - static_assert(sizeof(Eigen::AlignedBox) == 24, "Eigen::AlignedBox is not being vectorized, thus it does not need to be aligned"); - using BoundingBox = Eigen::AlignedBox; - - GLIndexedVertexArray() { m_bounding_box.setEmpty(); } - GLIndexedVertexArray(const GLIndexedVertexArray &rhs) : - vertices_and_normals_interleaved(rhs.vertices_and_normals_interleaved), - triangle_indices(rhs.triangle_indices), - quad_indices(rhs.quad_indices), - m_bounding_box(rhs.m_bounding_box) - { assert(! rhs.has_VBOs()); m_bounding_box.setEmpty(); } - GLIndexedVertexArray(GLIndexedVertexArray &&rhs) : - vertices_and_normals_interleaved(std::move(rhs.vertices_and_normals_interleaved)), - triangle_indices(std::move(rhs.triangle_indices)), - quad_indices(std::move(rhs.quad_indices)), - m_bounding_box(rhs.m_bounding_box) - { assert(! rhs.has_VBOs()); } - - ~GLIndexedVertexArray() { release_geometry(); } - - GLIndexedVertexArray& operator=(const GLIndexedVertexArray &rhs) - { - assert(vertices_and_normals_interleaved_VBO_id == 0); - assert(triangle_indices_VBO_id == 0); - assert(quad_indices_VBO_id == 0); - assert(rhs.vertices_and_normals_interleaved_VBO_id == 0); - assert(rhs.triangle_indices_VBO_id == 0); - assert(rhs.quad_indices_VBO_id == 0); - this->vertices_and_normals_interleaved = rhs.vertices_and_normals_interleaved; - this->triangle_indices = rhs.triangle_indices; - this->quad_indices = rhs.quad_indices; - this->m_bounding_box = rhs.m_bounding_box; - this->vertices_and_normals_interleaved_size = rhs.vertices_and_normals_interleaved_size; - this->triangle_indices_size = rhs.triangle_indices_size; - this->quad_indices_size = rhs.quad_indices_size; - return *this; - } - - GLIndexedVertexArray& operator=(GLIndexedVertexArray &&rhs) - { - assert(vertices_and_normals_interleaved_VBO_id == 0); - assert(triangle_indices_VBO_id == 0); - assert(quad_indices_VBO_id == 0); - assert(rhs.vertices_and_normals_interleaved_VBO_id == 0); - assert(rhs.triangle_indices_VBO_id == 0); - assert(rhs.quad_indices_VBO_id == 0); - this->vertices_and_normals_interleaved = std::move(rhs.vertices_and_normals_interleaved); - this->triangle_indices = std::move(rhs.triangle_indices); - this->quad_indices = std::move(rhs.quad_indices); - this->m_bounding_box = rhs.m_bounding_box; - this->vertices_and_normals_interleaved_size = rhs.vertices_and_normals_interleaved_size; - this->triangle_indices_size = rhs.triangle_indices_size; - this->quad_indices_size = rhs.quad_indices_size; - return *this; - } - - // Vertices and their normals, interleaved to be used by void glInterleavedArrays(GL_N3F_V3F, 0, x) - std::vector vertices_and_normals_interleaved; - std::vector triangle_indices; - std::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 }; - -#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 - - void load_its_flat_shading(const indexed_triangle_set &its); - - inline bool has_VBOs() const { return vertices_and_normals_interleaved_VBO_id != 0; } - - inline void reserve(size_t sz) { - this->vertices_and_normals_interleaved.reserve(sz * 6); - this->triangle_indices.reserve(sz * 3); - this->quad_indices.reserve(sz * 4); - } - - inline void 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(); - m_bounding_box.extend(Vec3f(x, y, z)); - }; - - 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)); - } - - template - inline void push_geometry(const Eigen::MatrixBase& p, const Eigen::MatrixBase& n) { - push_geometry(float(p(0)), float(p(1)), float(p(2)), float(n(0)), float(n(1)), float(n(2))); - } - - inline void 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(); - }; - - inline void push_quad(int idx1, int idx2, int idx3, int idx4) { - assert(this->vertices_and_normals_interleaved_VBO_id == 0); - if (this->vertices_and_normals_interleaved_VBO_id != 0) - return; - - if (this->quad_indices.size() + 4 > this->vertices_and_normals_interleaved.capacity()) - this->quad_indices.reserve(next_highest_power_of_2(this->quad_indices.size() + 4)); - this->quad_indices.emplace_back(idx1); - this->quad_indices.emplace_back(idx2); - this->quad_indices.emplace_back(idx3); - this->quad_indices.emplace_back(idx4); - this->quad_indices_size = this->quad_indices.size(); - }; - - // 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(bool opengl_initialized); - // Release the geometry data, release OpenGL VBOs. - void release_geometry(); - - void render() const; - void render(const std::pair& tverts_range, const std::pair& qverts_range) const; - - // Is there any geometry data stored? - bool empty() const { return vertices_and_normals_interleaved_size == 0; } - - void 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; - m_bounding_box.setEmpty(); - } - - // Shrink the internal storage to tighly fit the data stored. - void shrink_to_fit() { - this->vertices_and_normals_interleaved.shrink_to_fit(); - this->triangle_indices.shrink_to_fit(); - this->quad_indices.shrink_to_fit(); - } - - const BoundingBox& bounding_box() const { return m_bounding_box; } - - // Return an estimate of the memory consumed by this class. - size_t cpu_memory_used() const { return sizeof(*this) + vertices_and_normals_interleaved.capacity() * sizeof(float) + triangle_indices.capacity() * sizeof(int) + quad_indices.capacity() * sizeof(int); } - // Return an estimate of the memory held by GPU vertex buffers. - size_t gpu_memory_used() const - { - size_t memsize = 0; - if (this->vertices_and_normals_interleaved_VBO_id != 0) - memsize += this->vertices_and_normals_interleaved_size * 4; - if (this->triangle_indices_VBO_id != 0) - memsize += this->triangle_indices_size * 4; - if (this->quad_indices_VBO_id != 0) - memsize += this->quad_indices_size * 4; - return memsize; - } - size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); } - -private: - BoundingBox m_bounding_box; -}; -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - -class GLVolume { -public: - static const ColorRGBA SELECTED_COLOR; - static const ColorRGBA HOVER_SELECT_COLOR; - static const ColorRGBA HOVER_DESELECT_COLOR; - static const ColorRGBA OUTSIDE_COLOR; - static const ColorRGBA SELECTED_OUTSIDE_COLOR; - static const ColorRGBA DISABLED_COLOR; - static const ColorRGBA SLA_SUPPORT_COLOR; - static const ColorRGBA SLA_PAD_COLOR; - static const ColorRGBA NEUTRAL_COLOR; - static const std::array MODEL_COLOR; - - enum EHoverState : unsigned char - { - HS_None, - HS_Hover, - HS_Select, - HS_Deselect - }; - - GLVolume(float r = 1.0f, float g = 1.0f, float b = 1.0f, float a = 1.0f); - GLVolume(const ColorRGBA& color) : GLVolume(color.r(), color.g(), color.b(), color.a()) {} - -private: - Geometry::Transformation m_instance_transformation; - Geometry::Transformation m_volume_transformation; - - // Shift in z required by sla supports+pad - double m_sla_shift_z; - // Bounding box of this volume, in unscaled coordinates. - std::optional m_transformed_bounding_box; - // Convex hull of the volume, if any. - std::shared_ptr m_convex_hull; - // Bounding box of this volume, in unscaled coordinates. - std::optional m_transformed_convex_hull_bounding_box; - // Bounding box of the non sinking part of this volume, in unscaled coordinates. - std::optional m_transformed_non_sinking_bounding_box; - - class SinkingContours - { - static const float HalfWidth; - GLVolume& m_parent; - GUI::GLModel m_model; - BoundingBoxf3 m_old_box; - Vec3d m_shift{ Vec3d::Zero() }; - - public: - SinkingContours(GLVolume& volume) : m_parent(volume) {} - void render(); - - private: - void update(); - }; - - SinkingContours m_sinking_contours; - -#if ENABLE_SHOW_NON_MANIFOLD_EDGES - class NonManifoldEdges - { - GLVolume& m_parent; - GUI::GLModel m_model; - bool m_update_needed{ true }; - - public: - NonManifoldEdges(GLVolume& volume) : m_parent(volume) {} - void render(); - void set_as_dirty() { m_update_needed = true; } - - private: - void update(); - }; - - NonManifoldEdges m_non_manifold_edges; -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES - -public: - // Color of the triangles / quads held by this volume. - ColorRGBA color; - // Color used to render this volume. - ColorRGBA render_color; - - struct CompositeID { - CompositeID(int object_id, int volume_id, int instance_id) : object_id(object_id), volume_id(volume_id), instance_id(instance_id) {} - CompositeID() : object_id(-1), volume_id(-1), instance_id(-1) {} - // Object ID, which is equal to the index of the respective ModelObject in Model.objects array. - int object_id; - // Volume ID, which is equal to the index of the respective ModelVolume in ModelObject.volumes array. - // If negative, it is an index of a geometry produced by the PrintObject for the respective ModelObject, - // and which has no associated ModelVolume in ModelObject.volumes. For example, SLA supports. - // Volume with a negative volume_id cannot be picked independently, it will pick the associated instance. - int volume_id; - // Instance ID, which is equal to the index of the respective ModelInstance in ModelObject.instances array. - 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, - // for generated volumes it is the timestamp generated by PrintState::invalidate() or PrintState::set_done(), - // and the associated ModelInstanceID. - // Valid geometry_id should always be positive. - std::pair geometry_id; - // An ID containing the extruder ID (used to select color). - 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; - // 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; - // Whether or not to force rendering of sinking contours - bool force_sinking_contours : 1; - }; - - // Is mouse or rectangle selection over this object to select/deselect it ? - EHoverState hover; - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GUI::GLModel model; -#else - // Interleaved triangles & normals with indexed triangles & quads. - GLIndexedVertexArray indexed_vertex_array; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - // Ranges of triangle and quad indices to be rendered. - std::pair tverts_range; -#if !ENABLE_LEGACY_OPENGL_REMOVAL - std::pair qverts_range; -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - - // If the qverts or tverts contain thick extrusions, then offsets keeps pointers of the starts - // of the extrusions per layer. - std::vector print_zs; - // Offset into qverts & tverts, or offsets into indices stored into an OpenGL name_index_buffer. - std::vector offsets; - - // Bounding box of this volume, in unscaled coordinates. - BoundingBoxf3 bounding_box() const { -#if ENABLE_LEGACY_OPENGL_REMOVAL - return this->model.get_bounding_box(); -#else - BoundingBoxf3 out; - if (!this->indexed_vertex_array.bounding_box().isEmpty()) { - out.min = this->indexed_vertex_array.bounding_box().min().cast(); - out.max = this->indexed_vertex_array.bounding_box().max().cast(); - out.defined = true; - } - return out; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } - - void set_color(const ColorRGBA& rgba) { color = rgba; } - void set_render_color(const ColorRGBA& rgba) { render_color = rgba; } - // Sets render color in dependence of current state - void set_render_color(bool force_transparent); - // set color according to model volume - void set_color_from_model_volume(const ModelVolume& model_volume); - - const Geometry::Transformation& get_instance_transformation() const { return m_instance_transformation; } - void set_instance_transformation(const Geometry::Transformation& transformation) { m_instance_transformation = transformation; set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE - void set_instance_transformation(const Transform3d& transform) { m_instance_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } - - Vec3d get_instance_offset() const { return m_instance_transformation.get_offset(); } -#else - const Vec3d& get_instance_offset() const { return m_instance_transformation.get_offset(); } -#endif // ENABLE_WORLD_COORDINATE - double get_instance_offset(Axis axis) const { return m_instance_transformation.get_offset(axis); } - - void set_instance_offset(const Vec3d& offset) { m_instance_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } - void set_instance_offset(Axis axis, double offset) { m_instance_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } - -#if ENABLE_WORLD_COORDINATE - Vec3d get_instance_rotation() const { return m_instance_transformation.get_rotation(); } -#else - const Vec3d& get_instance_rotation() const { return m_instance_transformation.get_rotation(); } -#endif // ENABLE_WORLD_COORDINATE - double get_instance_rotation(Axis axis) const { return m_instance_transformation.get_rotation(axis); } - - void set_instance_rotation(const Vec3d& rotation) { m_instance_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } - void set_instance_rotation(Axis axis, double rotation) { m_instance_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); } - - Vec3d get_instance_scaling_factor() const { return m_instance_transformation.get_scaling_factor(); } - double get_instance_scaling_factor(Axis axis) const { return m_instance_transformation.get_scaling_factor(axis); } - - void set_instance_scaling_factor(const Vec3d& scaling_factor) { m_instance_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } - void set_instance_scaling_factor(Axis axis, double scaling_factor) { m_instance_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } - -#if ENABLE_WORLD_COORDINATE - Vec3d get_instance_mirror() const { return m_instance_transformation.get_mirror(); } -#else - const Vec3d& get_instance_mirror() const { return m_instance_transformation.get_mirror(); } -#endif // ENABLE_WORLD_COORDINATE - double get_instance_mirror(Axis axis) const { return m_instance_transformation.get_mirror(axis); } - - void set_instance_mirror(const Vec3d& mirror) { m_instance_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } - void set_instance_mirror(Axis axis, double mirror) { m_instance_transformation.set_mirror(axis, mirror); set_bounding_boxes_as_dirty(); } - - const Geometry::Transformation& get_volume_transformation() const { return m_volume_transformation; } - void set_volume_transformation(const Geometry::Transformation& transformation) { m_volume_transformation = transformation; set_bounding_boxes_as_dirty(); } -#if ENABLE_WORLD_COORDINATE - void set_volume_transformation(const Transform3d& transform) { m_volume_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } - - Vec3d get_volume_offset() const { return m_volume_transformation.get_offset(); } -#else - const Vec3d& get_volume_offset() const { return m_volume_transformation.get_offset(); } -#endif // ENABLE_WORLD_COORDINATE - double get_volume_offset(Axis axis) const { return m_volume_transformation.get_offset(axis); } - - void set_volume_offset(const Vec3d& offset) { m_volume_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } - void set_volume_offset(Axis axis, double offset) { m_volume_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } - -#if ENABLE_WORLD_COORDINATE - Vec3d get_volume_rotation() const { return m_volume_transformation.get_rotation(); } -#else - const Vec3d& get_volume_rotation() const { return m_volume_transformation.get_rotation(); } -#endif // ENABLE_WORLD_COORDINATE - double get_volume_rotation(Axis axis) const { return m_volume_transformation.get_rotation(axis); } - - void set_volume_rotation(const Vec3d& rotation) { m_volume_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } - void set_volume_rotation(Axis axis, double rotation) { m_volume_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); } - -#if ENABLE_WORLD_COORDINATE - Vec3d get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } -#else - const Vec3d& get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } -#endif // ENABLE_WORLD_COORDINATE - double get_volume_scaling_factor(Axis axis) const { return m_volume_transformation.get_scaling_factor(axis); } - - void set_volume_scaling_factor(const Vec3d& scaling_factor) { m_volume_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } - void set_volume_scaling_factor(Axis axis, double scaling_factor) { m_volume_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } - -#if ENABLE_WORLD_COORDINATE - Vec3d get_volume_mirror() const { return m_volume_transformation.get_mirror(); } -#else - const Vec3d& get_volume_mirror() const { return m_volume_transformation.get_mirror(); } -#endif // ENABLE_WORLD_COORDINATE - double get_volume_mirror(Axis axis) const { return m_volume_transformation.get_mirror(axis); } - - void set_volume_mirror(const Vec3d& mirror) { m_volume_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } - void set_volume_mirror(Axis axis, double mirror) { m_volume_transformation.set_mirror(axis, mirror); set_bounding_boxes_as_dirty(); } - - double get_sla_shift_z() const { return m_sla_shift_z; } - void set_sla_shift_z(double z) { m_sla_shift_z = z; } - - void set_convex_hull(std::shared_ptr convex_hull) { m_convex_hull = std::move(convex_hull); } - void set_convex_hull(const TriangleMesh &convex_hull) { m_convex_hull = std::make_shared(convex_hull); } - void set_convex_hull(TriangleMesh &&convex_hull) { m_convex_hull = std::make_shared(std::move(convex_hull)); } - - int object_idx() const { return this->composite_id.object_id; } - int volume_idx() const { return this->composite_id.volume_id; } - int instance_idx() const { return this->composite_id.instance_id; } - - Transform3d world_matrix() const; - bool is_left_handed() const; - - const BoundingBoxf3& transformed_bounding_box() const; - // non-caching variant - BoundingBoxf3 transformed_convex_hull_bounding_box(const Transform3d &trafo) const; - // caching variant - const BoundingBoxf3& transformed_convex_hull_bounding_box() const; - // non-caching variant - BoundingBoxf3 transformed_non_sinking_bounding_box(const Transform3d& trafo) const; - // caching variant - const BoundingBoxf3& transformed_non_sinking_bounding_box() const; - // convex hull - const TriangleMesh* convex_hull() const { return m_convex_hull.get(); } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - bool empty() const { return this->model.is_empty(); } -#else - bool empty() const { return this->indexed_vertex_array.empty(); } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - void set_range(double low, double high); - - void render(); - -#if !ENABLE_LEGACY_OPENGL_REMOVAL - void finalize_geometry(bool opengl_initialized) { this->indexed_vertex_array.finalize_geometry(opengl_initialized); } - void release_geometry() { this->indexed_vertex_array.release_geometry(); } -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - - void set_bounding_boxes_as_dirty() { - m_transformed_bounding_box.reset(); - m_transformed_convex_hull_bounding_box.reset(); - m_transformed_non_sinking_bounding_box.reset(); - } - - bool is_sla_support() const; - bool is_sla_pad() const; - - bool is_sinking() const; - bool is_below_printbed() const; - void render_sinking_contours(); -#if ENABLE_SHOW_NON_MANIFOLD_EDGES - void render_non_manifold_edges(); -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES - - // Return an estimate of the memory consumed by this class. - size_t cpu_memory_used() const { -#if ENABLE_LEGACY_OPENGL_REMOVAL - return sizeof(*this) + this->model.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) + - this->offsets.capacity() * sizeof(size_t); - } - // Return an estimate of the memory held by GPU vertex buffers. - size_t gpu_memory_used() const { return this->model.gpu_memory_used(); } -#else - //FIXME what to do wih m_convex_hull? - return sizeof(*this) - sizeof(this->indexed_vertex_array) + this->indexed_vertex_array.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) + this->offsets.capacity() * sizeof(size_t); - } - // Return an estimate of the memory held by GPU vertex buffers. - size_t gpu_memory_used() const { return this->indexed_vertex_array.gpu_memory_used(); } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); } -}; - -typedef std::vector GLVolumePtrs; -typedef std::pair> GLVolumeWithIdAndZ; -typedef std::vector GLVolumeWithIdAndZList; - -class GLVolumeCollection -{ -public: - enum class ERenderType : unsigned char - { - Opaque, - Transparent, - All - }; - - struct PrintVolume - { - // see: Bed3D::EShapeType - int type{ 0 }; - // data contains: - // Rectangle: - // [0] = min.x, [1] = min.y, [2] = max.x, [3] = max.y - // Circle: - // [0] = center.x, [1] = center.y, [3] = radius - std::array data; - // [0] = min z, [1] = max z - std::array zs; - }; - -private: - PrintVolume m_print_volume; - - // z range for clipping in shaders - std::array m_z_range; - - // plane coeffs for clipping in shaders - std::array m_clipping_plane; - - struct Slope - { - // toggle for slope rendering - bool active{ false }; - float normal_z; - }; - - Slope m_slope; - bool m_show_sinking_contours{ false }; -#if ENABLE_SHOW_NON_MANIFOLD_EDGES - bool m_show_non_manifold_edges{ true }; -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES - -public: - GLVolumePtrs volumes; - - GLVolumeCollection() { set_default_slope_normal_z(); } - ~GLVolumeCollection() { clear(); } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - std::vector load_object( - const ModelObject* model_object, - int obj_idx, - const std::vector& instance_idxs); - - int load_object_volume( - const ModelObject* model_object, - int obj_idx, - int volume_idx, - int instance_idx); - - // Load SLA auxiliary GLVolumes (for support trees or pad). - void load_object_auxiliary( - const SLAPrintObject* print_object, - int obj_idx, - // pairs of - const std::vector>& instances, - SLAPrintObjectStep milestone, - // Timestamp of the last change of the milestone - size_t timestamp); - -#if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL - int load_wipe_tower_preview( - float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width); -#else - int load_wipe_tower_preview( - int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width); -#endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL -#else - std::vector load_object( - const ModelObject *model_object, - int obj_idx, - const std::vector &instance_idxs, - bool opengl_initialized); - - int load_object_volume( - const ModelObject *model_object, - int obj_idx, - int volume_idx, - int instance_idx, - bool opengl_initialized); - - // Load SLA auxiliary GLVolumes (for support trees or pad). - void load_object_auxiliary( - const SLAPrintObject *print_object, - int obj_idx, - // pairs of - const std::vector>& instances, - SLAPrintObjectStep milestone, - // Timestamp of the last change of the milestone - size_t timestamp, - bool opengl_initialized); - -#if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL - int load_wipe_tower_preview( - float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized); -#else - int load_wipe_tower_preview( - int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized); -#endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLVolume* new_toolpath_volume(const ColorRGBA& rgba); - GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba); -#else - GLVolume* new_toolpath_volume(const ColorRGBA& rgba, size_t reserve_vbo_floats = 0); - GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba, size_t reserve_vbo_floats = 0); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - // Render the volumes by OpenGL. -#if ENABLE_GL_SHADERS_ATTRIBUTES - void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, - std::function filter_func = std::function()) const; -#else - void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func = std::function()) const; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - -#if !ENABLE_LEGACY_OPENGL_REMOVAL - // 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(bool opengl_initialized) { for (auto* v : volumes) v->finalize_geometry(opengl_initialized); } - // Release the geometry data assigned to the volumes. - // If OpenGL VBOs were allocated, an OpenGL context has to be active to release them. - void release_geometry() { for (auto *v : volumes) v->release_geometry(); } -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - // Clear the geometry - void clear() { for (auto *v : volumes) delete v; volumes.clear(); } - - bool empty() const { return volumes.empty(); } - void set_range(double low, double high) { for (GLVolume* vol : this->volumes) vol->set_range(low, high); } - - void set_print_volume(const PrintVolume& print_volume) { m_print_volume = print_volume; } - - 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 std::array& coeffs) { m_clipping_plane = coeffs; } - - const std::array& get_z_range() const { return m_z_range; } - const std::array& get_clipping_plane() const { return m_clipping_plane; } - - 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)); } - void set_show_sinking_contours(bool show) { m_show_sinking_contours = show; } -#if ENABLE_SHOW_NON_MANIFOLD_EDGES - void set_show_non_manifold_edges(bool show) { m_show_non_manifold_edges = show; } -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES - - // 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 Slic3r::BuildVolume& build_volume, ModelInstanceEPrintVolumeState* out_state) const; - void reset_outside_state(); - - void update_colors_by_extruder(const DynamicPrintConfig* config); - - // Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection - std::vector get_current_print_zs(bool active_only) const; - - // Return an estimate of the memory consumed by this class. - size_t cpu_memory_used() const; - // Return an estimate of the memory held by GPU vertex buffers. - size_t gpu_memory_used() const; - size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); } - // Return CPU, GPU and total memory log line. - std::string log_memory_info() const; - -private: - GLVolumeCollection(const GLVolumeCollection &other); - GLVolumeCollection& operator=(const GLVolumeCollection &); -}; - -GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCollection::ERenderType type, const Transform3d& view_matrix, std::function filter_func = nullptr); - -struct _3DScene -{ -#if ENABLE_LEGACY_OPENGL_REMOVAL - static void thick_lines_to_verts(const Lines& lines, const std::vector& widths, const std::vector& heights, bool closed, double top_z, GUI::GLModel::Geometry& geometry); - static void thick_lines_to_verts(const Lines3& lines, const std::vector& widths, const std::vector& heights, bool closed, GUI::GLModel::Geometry& geometry); - static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); - static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); - static void extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); - static void extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); - static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); -#else - 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); - static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, GLVolume& volume); - static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GLVolume& volume); - static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GLVolume& volume); - static void extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GLVolume& volume); - static void extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GLVolume& volume); - static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GLVolume& volume); - static void polyline3_to_verts(const Polyline3& polyline, double width, double height, GLVolume& volume); - static void point3_to_verts(const Vec3crd& point, double width, double height, GLVolume& volume); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -}; - -} - -#endif +#ifndef slic3r_3DScene_hpp_ +#define slic3r_3DScene_hpp_ + +#include "libslic3r/libslic3r.h" +#include "libslic3r/Point.hpp" +#include "libslic3r/Line.hpp" +#include "libslic3r/TriangleMesh.hpp" +#include "libslic3r/Utils.hpp" +#include "libslic3r/Geometry.hpp" +#include "libslic3r/Color.hpp" + +#include "GLModel.hpp" +#if ENABLE_RAYCAST_PICKING +#include "MeshUtils.hpp" +#endif // ENABLE_RAYCAST_PICKING + +#include +#include + +#ifndef NDEBUG +#define HAS_GLSAFE +#endif // NDEBUG + +#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 // HAS_GLSAFE + inline void glAssertRecentCall() { } + #define glsafe(cmd) cmd + #define glcheck() +#endif // HAS_GLSAFE + +namespace Slic3r { +class SLAPrintObject; +enum SLAPrintObjectStep : unsigned int; +class BuildVolume; +class DynamicPrintConfig; +class ExtrusionPath; +class ExtrusionMultiPath; +class ExtrusionLoop; +class ExtrusionEntity; +class ExtrusionEntityCollection; +class ModelObject; +class ModelVolume; +enum ModelInstanceEPrintVolumeState : unsigned char; + +// Return appropriate color based on the ModelVolume. +extern ColorRGBA color_from_model_volume(const ModelVolume& model_volume); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL +// A container for interleaved arrays of 3D vertices and normals, +// possibly indexed by triangles and / or quads. +class GLIndexedVertexArray { +public: + // Only Eigen types of Nx16 size are vectorized. This bounding box will not be vectorized. + static_assert(sizeof(Eigen::AlignedBox) == 24, "Eigen::AlignedBox is not being vectorized, thus it does not need to be aligned"); + using BoundingBox = Eigen::AlignedBox; + + GLIndexedVertexArray() { m_bounding_box.setEmpty(); } + GLIndexedVertexArray(const GLIndexedVertexArray &rhs) : + vertices_and_normals_interleaved(rhs.vertices_and_normals_interleaved), + triangle_indices(rhs.triangle_indices), + quad_indices(rhs.quad_indices), + m_bounding_box(rhs.m_bounding_box) + { assert(! rhs.has_VBOs()); m_bounding_box.setEmpty(); } + GLIndexedVertexArray(GLIndexedVertexArray &&rhs) : + vertices_and_normals_interleaved(std::move(rhs.vertices_and_normals_interleaved)), + triangle_indices(std::move(rhs.triangle_indices)), + quad_indices(std::move(rhs.quad_indices)), + m_bounding_box(rhs.m_bounding_box) + { assert(! rhs.has_VBOs()); } + + ~GLIndexedVertexArray() { release_geometry(); } + + GLIndexedVertexArray& operator=(const GLIndexedVertexArray &rhs) + { + assert(vertices_and_normals_interleaved_VBO_id == 0); + assert(triangle_indices_VBO_id == 0); + assert(quad_indices_VBO_id == 0); + assert(rhs.vertices_and_normals_interleaved_VBO_id == 0); + assert(rhs.triangle_indices_VBO_id == 0); + assert(rhs.quad_indices_VBO_id == 0); + this->vertices_and_normals_interleaved = rhs.vertices_and_normals_interleaved; + this->triangle_indices = rhs.triangle_indices; + this->quad_indices = rhs.quad_indices; + this->m_bounding_box = rhs.m_bounding_box; + this->vertices_and_normals_interleaved_size = rhs.vertices_and_normals_interleaved_size; + this->triangle_indices_size = rhs.triangle_indices_size; + this->quad_indices_size = rhs.quad_indices_size; + return *this; + } + + GLIndexedVertexArray& operator=(GLIndexedVertexArray &&rhs) + { + assert(vertices_and_normals_interleaved_VBO_id == 0); + assert(triangle_indices_VBO_id == 0); + assert(quad_indices_VBO_id == 0); + assert(rhs.vertices_and_normals_interleaved_VBO_id == 0); + assert(rhs.triangle_indices_VBO_id == 0); + assert(rhs.quad_indices_VBO_id == 0); + this->vertices_and_normals_interleaved = std::move(rhs.vertices_and_normals_interleaved); + this->triangle_indices = std::move(rhs.triangle_indices); + this->quad_indices = std::move(rhs.quad_indices); + this->m_bounding_box = rhs.m_bounding_box; + this->vertices_and_normals_interleaved_size = rhs.vertices_and_normals_interleaved_size; + this->triangle_indices_size = rhs.triangle_indices_size; + this->quad_indices_size = rhs.quad_indices_size; + return *this; + } + + // Vertices and their normals, interleaved to be used by void glInterleavedArrays(GL_N3F_V3F, 0, x) + std::vector vertices_and_normals_interleaved; + std::vector triangle_indices; + std::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 }; + +#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 + + void load_its_flat_shading(const indexed_triangle_set &its); + + inline bool has_VBOs() const { return vertices_and_normals_interleaved_VBO_id != 0; } + + inline void reserve(size_t sz) { + this->vertices_and_normals_interleaved.reserve(sz * 6); + this->triangle_indices.reserve(sz * 3); + this->quad_indices.reserve(sz * 4); + } + + inline void 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(); + m_bounding_box.extend(Vec3f(x, y, z)); + }; + + 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)); + } + + template + inline void push_geometry(const Eigen::MatrixBase& p, const Eigen::MatrixBase& n) { + push_geometry(float(p(0)), float(p(1)), float(p(2)), float(n(0)), float(n(1)), float(n(2))); + } + + inline void 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(); + }; + + inline void push_quad(int idx1, int idx2, int idx3, int idx4) { + assert(this->vertices_and_normals_interleaved_VBO_id == 0); + if (this->vertices_and_normals_interleaved_VBO_id != 0) + return; + + if (this->quad_indices.size() + 4 > this->vertices_and_normals_interleaved.capacity()) + this->quad_indices.reserve(next_highest_power_of_2(this->quad_indices.size() + 4)); + this->quad_indices.emplace_back(idx1); + this->quad_indices.emplace_back(idx2); + this->quad_indices.emplace_back(idx3); + this->quad_indices.emplace_back(idx4); + this->quad_indices_size = this->quad_indices.size(); + }; + + // 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(bool opengl_initialized); + // Release the geometry data, release OpenGL VBOs. + void release_geometry(); + + void render() const; + void render(const std::pair& tverts_range, const std::pair& qverts_range) const; + + // Is there any geometry data stored? + bool empty() const { return vertices_and_normals_interleaved_size == 0; } + + void 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; + m_bounding_box.setEmpty(); + } + + // Shrink the internal storage to tighly fit the data stored. + void shrink_to_fit() { + this->vertices_and_normals_interleaved.shrink_to_fit(); + this->triangle_indices.shrink_to_fit(); + this->quad_indices.shrink_to_fit(); + } + + const BoundingBox& bounding_box() const { return m_bounding_box; } + + // Return an estimate of the memory consumed by this class. + size_t cpu_memory_used() const { return sizeof(*this) + vertices_and_normals_interleaved.capacity() * sizeof(float) + triangle_indices.capacity() * sizeof(int) + quad_indices.capacity() * sizeof(int); } + // Return an estimate of the memory held by GPU vertex buffers. + size_t gpu_memory_used() const + { + size_t memsize = 0; + if (this->vertices_and_normals_interleaved_VBO_id != 0) + memsize += this->vertices_and_normals_interleaved_size * 4; + if (this->triangle_indices_VBO_id != 0) + memsize += this->triangle_indices_size * 4; + if (this->quad_indices_VBO_id != 0) + memsize += this->quad_indices_size * 4; + return memsize; + } + size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); } + +private: + BoundingBox m_bounding_box; +}; +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + +class GLVolume { +public: + static const ColorRGBA SELECTED_COLOR; + static const ColorRGBA HOVER_SELECT_COLOR; + static const ColorRGBA HOVER_DESELECT_COLOR; + static const ColorRGBA OUTSIDE_COLOR; + static const ColorRGBA SELECTED_OUTSIDE_COLOR; + static const ColorRGBA DISABLED_COLOR; + static const ColorRGBA SLA_SUPPORT_COLOR; + static const ColorRGBA SLA_PAD_COLOR; + static const ColorRGBA NEUTRAL_COLOR; + static const std::array MODEL_COLOR; + + enum EHoverState : unsigned char + { + HS_None, + HS_Hover, + HS_Select, + HS_Deselect + }; + + GLVolume(float r = 1.0f, float g = 1.0f, float b = 1.0f, float a = 1.0f); + GLVolume(const ColorRGBA& color) : GLVolume(color.r(), color.g(), color.b(), color.a()) {} + +private: + Geometry::Transformation m_instance_transformation; + Geometry::Transformation m_volume_transformation; + + // Shift in z required by sla supports+pad + double m_sla_shift_z; + // Bounding box of this volume, in unscaled coordinates. + std::optional m_transformed_bounding_box; + // Convex hull of the volume, if any. + std::shared_ptr m_convex_hull; + // Bounding box of this volume, in unscaled coordinates. + std::optional m_transformed_convex_hull_bounding_box; + // Bounding box of the non sinking part of this volume, in unscaled coordinates. + std::optional m_transformed_non_sinking_bounding_box; + + class SinkingContours + { + static const float HalfWidth; + GLVolume& m_parent; + GUI::GLModel m_model; + BoundingBoxf3 m_old_box; + Vec3d m_shift{ Vec3d::Zero() }; + + public: + SinkingContours(GLVolume& volume) : m_parent(volume) {} + void render(); + + private: + void update(); + }; + + SinkingContours m_sinking_contours; + + class NonManifoldEdges + { + GLVolume& m_parent; + GUI::GLModel m_model; + bool m_update_needed{ true }; + + public: + NonManifoldEdges(GLVolume& volume) : m_parent(volume) {} + void render(); + void set_as_dirty() { m_update_needed = true; } + + private: + void update(); + }; + + NonManifoldEdges m_non_manifold_edges; + +public: + // Color of the triangles / quads held by this volume. + ColorRGBA color; + // Color used to render this volume. + ColorRGBA render_color; + + struct CompositeID { + CompositeID(int object_id, int volume_id, int instance_id) : object_id(object_id), volume_id(volume_id), instance_id(instance_id) {} + CompositeID() : object_id(-1), volume_id(-1), instance_id(-1) {} + // Object ID, which is equal to the index of the respective ModelObject in Model.objects array. + int object_id; + // Volume ID, which is equal to the index of the respective ModelVolume in ModelObject.volumes array. + // If negative, it is an index of a geometry produced by the PrintObject for the respective ModelObject, + // and which has no associated ModelVolume in ModelObject.volumes. For example, SLA supports. + // Volume with a negative volume_id cannot be picked independently, it will pick the associated instance. + int volume_id; + // Instance ID, which is equal to the index of the respective ModelInstance in ModelObject.instances array. + 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, + // for generated volumes it is the timestamp generated by PrintState::invalidate() or PrintState::set_done(), + // and the associated ModelInstanceID. + // Valid geometry_id should always be positive. + std::pair geometry_id; + // An ID containing the extruder ID (used to select color). + 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; + // 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; + // Whether or not to force rendering of sinking contours + bool force_sinking_contours : 1; + }; + + // Is mouse or rectangle selection over this object to select/deselect it ? + EHoverState hover; + +#if ENABLE_LEGACY_OPENGL_REMOVAL + GUI::GLModel model; +#if ENABLE_RAYCAST_PICKING + // raycaster used for picking + std::unique_ptr mesh_raycaster; +#endif // ENABLE_RAYCAST_PICKING +#else + // Interleaved triangles & normals with indexed triangles & quads. + GLIndexedVertexArray indexed_vertex_array; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + // Ranges of triangle and quad indices to be rendered. + std::pair tverts_range; +#if !ENABLE_LEGACY_OPENGL_REMOVAL + std::pair qverts_range; +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + + // If the qverts or tverts contain thick extrusions, then offsets keeps pointers of the starts + // of the extrusions per layer. + std::vector print_zs; + // Offset into qverts & tverts, or offsets into indices stored into an OpenGL name_index_buffer. + std::vector offsets; + + // Bounding box of this volume, in unscaled coordinates. + BoundingBoxf3 bounding_box() const { +#if ENABLE_LEGACY_OPENGL_REMOVAL + return this->model.get_bounding_box(); +#else + BoundingBoxf3 out; + if (!this->indexed_vertex_array.bounding_box().isEmpty()) { + out.min = this->indexed_vertex_array.bounding_box().min().cast(); + out.max = this->indexed_vertex_array.bounding_box().max().cast(); + out.defined = true; + } + return out; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + } + + void set_color(const ColorRGBA& rgba) { color = rgba; } + void set_render_color(const ColorRGBA& rgba) { render_color = rgba; } + // Sets render color in dependence of current state + void set_render_color(bool force_transparent); + // set color according to model volume + void set_color_from_model_volume(const ModelVolume& model_volume); + + const Geometry::Transformation& get_instance_transformation() const { return m_instance_transformation; } + void set_instance_transformation(const Geometry::Transformation& transformation) { m_instance_transformation = transformation; set_bounding_boxes_as_dirty(); } +#if ENABLE_WORLD_COORDINATE + void set_instance_transformation(const Transform3d& transform) { m_instance_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } + + Vec3d get_instance_offset() const { return m_instance_transformation.get_offset(); } +#else + const Vec3d& get_instance_offset() const { return m_instance_transformation.get_offset(); } +#endif // ENABLE_WORLD_COORDINATE + double get_instance_offset(Axis axis) const { return m_instance_transformation.get_offset(axis); } + + void set_instance_offset(const Vec3d& offset) { m_instance_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } + void set_instance_offset(Axis axis, double offset) { m_instance_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } + +#if ENABLE_WORLD_COORDINATE + Vec3d get_instance_rotation() const { return m_instance_transformation.get_rotation(); } +#else + const Vec3d& get_instance_rotation() const { return m_instance_transformation.get_rotation(); } +#endif // ENABLE_WORLD_COORDINATE + double get_instance_rotation(Axis axis) const { return m_instance_transformation.get_rotation(axis); } + + void set_instance_rotation(const Vec3d& rotation) { m_instance_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } + void set_instance_rotation(Axis axis, double rotation) { m_instance_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); } + + Vec3d get_instance_scaling_factor() const { return m_instance_transformation.get_scaling_factor(); } + double get_instance_scaling_factor(Axis axis) const { return m_instance_transformation.get_scaling_factor(axis); } + + void set_instance_scaling_factor(const Vec3d& scaling_factor) { m_instance_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } + void set_instance_scaling_factor(Axis axis, double scaling_factor) { m_instance_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } + +#if ENABLE_WORLD_COORDINATE + Vec3d get_instance_mirror() const { return m_instance_transformation.get_mirror(); } +#else + const Vec3d& get_instance_mirror() const { return m_instance_transformation.get_mirror(); } +#endif // ENABLE_WORLD_COORDINATE + double get_instance_mirror(Axis axis) const { return m_instance_transformation.get_mirror(axis); } + + void set_instance_mirror(const Vec3d& mirror) { m_instance_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } + void set_instance_mirror(Axis axis, double mirror) { m_instance_transformation.set_mirror(axis, mirror); set_bounding_boxes_as_dirty(); } + + const Geometry::Transformation& get_volume_transformation() const { return m_volume_transformation; } + void set_volume_transformation(const Geometry::Transformation& transformation) { m_volume_transformation = transformation; set_bounding_boxes_as_dirty(); } +#if ENABLE_WORLD_COORDINATE + void set_volume_transformation(const Transform3d& transform) { m_volume_transformation.set_matrix(transform); set_bounding_boxes_as_dirty(); } + + Vec3d get_volume_offset() const { return m_volume_transformation.get_offset(); } +#else + const Vec3d& get_volume_offset() const { return m_volume_transformation.get_offset(); } +#endif // ENABLE_WORLD_COORDINATE + double get_volume_offset(Axis axis) const { return m_volume_transformation.get_offset(axis); } + + void set_volume_offset(const Vec3d& offset) { m_volume_transformation.set_offset(offset); set_bounding_boxes_as_dirty(); } + void set_volume_offset(Axis axis, double offset) { m_volume_transformation.set_offset(axis, offset); set_bounding_boxes_as_dirty(); } + +#if ENABLE_WORLD_COORDINATE + Vec3d get_volume_rotation() const { return m_volume_transformation.get_rotation(); } +#else + const Vec3d& get_volume_rotation() const { return m_volume_transformation.get_rotation(); } +#endif // ENABLE_WORLD_COORDINATE + double get_volume_rotation(Axis axis) const { return m_volume_transformation.get_rotation(axis); } + + void set_volume_rotation(const Vec3d& rotation) { m_volume_transformation.set_rotation(rotation); set_bounding_boxes_as_dirty(); } + void set_volume_rotation(Axis axis, double rotation) { m_volume_transformation.set_rotation(axis, rotation); set_bounding_boxes_as_dirty(); } + +#if ENABLE_WORLD_COORDINATE + Vec3d get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } +#else + const Vec3d& get_volume_scaling_factor() const { return m_volume_transformation.get_scaling_factor(); } +#endif // ENABLE_WORLD_COORDINATE + double get_volume_scaling_factor(Axis axis) const { return m_volume_transformation.get_scaling_factor(axis); } + + void set_volume_scaling_factor(const Vec3d& scaling_factor) { m_volume_transformation.set_scaling_factor(scaling_factor); set_bounding_boxes_as_dirty(); } + void set_volume_scaling_factor(Axis axis, double scaling_factor) { m_volume_transformation.set_scaling_factor(axis, scaling_factor); set_bounding_boxes_as_dirty(); } + +#if ENABLE_WORLD_COORDINATE + Vec3d get_volume_mirror() const { return m_volume_transformation.get_mirror(); } +#else + const Vec3d& get_volume_mirror() const { return m_volume_transformation.get_mirror(); } +#endif // ENABLE_WORLD_COORDINATE + double get_volume_mirror(Axis axis) const { return m_volume_transformation.get_mirror(axis); } + + void set_volume_mirror(const Vec3d& mirror) { m_volume_transformation.set_mirror(mirror); set_bounding_boxes_as_dirty(); } + void set_volume_mirror(Axis axis, double mirror) { m_volume_transformation.set_mirror(axis, mirror); set_bounding_boxes_as_dirty(); } + + double get_sla_shift_z() const { return m_sla_shift_z; } + void set_sla_shift_z(double z) { m_sla_shift_z = z; } + + void set_convex_hull(std::shared_ptr convex_hull) { m_convex_hull = std::move(convex_hull); } + void set_convex_hull(const TriangleMesh &convex_hull) { m_convex_hull = std::make_shared(convex_hull); } + void set_convex_hull(TriangleMesh &&convex_hull) { m_convex_hull = std::make_shared(std::move(convex_hull)); } + + int object_idx() const { return this->composite_id.object_id; } + int volume_idx() const { return this->composite_id.volume_id; } + int instance_idx() const { return this->composite_id.instance_id; } + + Transform3d world_matrix() const; + bool is_left_handed() const; + + const BoundingBoxf3& transformed_bounding_box() const; + // non-caching variant + BoundingBoxf3 transformed_convex_hull_bounding_box(const Transform3d &trafo) const; + // caching variant + const BoundingBoxf3& transformed_convex_hull_bounding_box() const; + // non-caching variant + BoundingBoxf3 transformed_non_sinking_bounding_box(const Transform3d& trafo) const; + // caching variant + const BoundingBoxf3& transformed_non_sinking_bounding_box() const; + // convex hull + const TriangleMesh* convex_hull() const { return m_convex_hull.get(); } + +#if ENABLE_LEGACY_OPENGL_REMOVAL + bool empty() const { return this->model.is_empty(); } +#else + bool empty() const { return this->indexed_vertex_array.empty(); } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + void set_range(double low, double high); + + void render(); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + void finalize_geometry(bool opengl_initialized) { this->indexed_vertex_array.finalize_geometry(opengl_initialized); } + void release_geometry() { this->indexed_vertex_array.release_geometry(); } +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + + void set_bounding_boxes_as_dirty() { + m_transformed_bounding_box.reset(); + m_transformed_convex_hull_bounding_box.reset(); + m_transformed_non_sinking_bounding_box.reset(); + } + + bool is_sla_support() const; + bool is_sla_pad() const; + + bool is_sinking() const; + bool is_below_printbed() const; + void render_sinking_contours(); + void render_non_manifold_edges(); + + // Return an estimate of the memory consumed by this class. + size_t cpu_memory_used() const { +#if ENABLE_LEGACY_OPENGL_REMOVAL + return sizeof(*this) + this->model.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) + + this->offsets.capacity() * sizeof(size_t); + } + // Return an estimate of the memory held by GPU vertex buffers. + size_t gpu_memory_used() const { return this->model.gpu_memory_used(); } +#else + //FIXME what to do wih m_convex_hull? + return sizeof(*this) - sizeof(this->indexed_vertex_array) + this->indexed_vertex_array.cpu_memory_used() + this->print_zs.capacity() * sizeof(coordf_t) + this->offsets.capacity() * sizeof(size_t); + } + // Return an estimate of the memory held by GPU vertex buffers. + size_t gpu_memory_used() const { return this->indexed_vertex_array.gpu_memory_used(); } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); } +}; + +typedef std::vector GLVolumePtrs; +typedef std::pair> GLVolumeWithIdAndZ; +typedef std::vector GLVolumeWithIdAndZList; + +class GLVolumeCollection +{ +public: + enum class ERenderType : unsigned char + { + Opaque, + Transparent, + All + }; + + struct PrintVolume + { + // see: Bed3D::EShapeType + int type{ 0 }; + // data contains: + // Rectangle: + // [0] = min.x, [1] = min.y, [2] = max.x, [3] = max.y + // Circle: + // [0] = center.x, [1] = center.y, [3] = radius + std::array data; + // [0] = min z, [1] = max z + std::array zs; + }; + +private: + PrintVolume m_print_volume; + + // z range for clipping in shaders + std::array m_z_range; + + // plane coeffs for clipping in shaders + std::array m_clipping_plane; + + struct Slope + { + // toggle for slope rendering + bool active{ false }; + float normal_z; + }; + + Slope m_slope; + bool m_show_sinking_contours{ false }; + bool m_show_non_manifold_edges{ true }; + +public: + GLVolumePtrs volumes; + + GLVolumeCollection() { set_default_slope_normal_z(); } + ~GLVolumeCollection() { clear(); } + +#if ENABLE_LEGACY_OPENGL_REMOVAL + std::vector load_object( + const ModelObject* model_object, + int obj_idx, + const std::vector& instance_idxs); + + int load_object_volume( + const ModelObject* model_object, + int obj_idx, + int volume_idx, + int instance_idx); + + // Load SLA auxiliary GLVolumes (for support trees or pad). + void load_object_auxiliary( + const SLAPrintObject* print_object, + int obj_idx, + // pairs of + const std::vector>& instances, + SLAPrintObjectStep milestone, + // Timestamp of the last change of the milestone + size_t timestamp); + +#if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL +#if ENABLE_OPENGL_ES + int load_wipe_tower_preview( + float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, TriangleMesh* out_mesh = nullptr); +#else + int load_wipe_tower_preview( + float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width); +#endif // ENABLE_OPENGL_ES +#else +#if ENABLE_OPENGL_ES + int load_wipe_tower_preview( + int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, TriangleMesh* out_mesh = nullptr); +#else + int load_wipe_tower_preview( + int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width); +#endif // ENABLE_OPENGL_ES +#endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL +#else + std::vector load_object( + const ModelObject *model_object, + int obj_idx, + const std::vector &instance_idxs, + bool opengl_initialized); + + int load_object_volume( + const ModelObject *model_object, + int obj_idx, + int volume_idx, + int instance_idx, + bool opengl_initialized); + + // Load SLA auxiliary GLVolumes (for support trees or pad). + void load_object_auxiliary( + const SLAPrintObject *print_object, + int obj_idx, + // pairs of + const std::vector>& instances, + SLAPrintObjectStep milestone, + // Timestamp of the last change of the milestone + size_t timestamp, + bool opengl_initialized); + +#if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL + int load_wipe_tower_preview( + float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized); +#else + int load_wipe_tower_preview( + int obj_idx, float pos_x, float pos_y, float width, float depth, float height, float rotation_angle, bool size_unknown, float brim_width, bool opengl_initialized); +#endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLVolume* new_toolpath_volume(const ColorRGBA& rgba); + GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba); + // Render the volumes by OpenGL. + void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, const Transform3d& projection_matrix, + std::function filter_func = std::function()) const; +#else + GLVolume* new_toolpath_volume(const ColorRGBA& rgba, size_t reserve_vbo_floats = 0); + GLVolume* new_nontoolpath_volume(const ColorRGBA& rgba, size_t reserve_vbo_floats = 0); + // Render the volumes by OpenGL. + void render(ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function filter_func = std::function()) const; + // 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(bool opengl_initialized) { for (auto* v : volumes) v->finalize_geometry(opengl_initialized); } + // Release the geometry data assigned to the volumes. + // If OpenGL VBOs were allocated, an OpenGL context has to be active to release them. + void release_geometry() { for (auto* v : volumes) v->release_geometry(); } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + // Clear the geometry + void clear() { for (auto *v : volumes) delete v; volumes.clear(); } + + bool empty() const { return volumes.empty(); } + void set_range(double low, double high) { for (GLVolume* vol : this->volumes) vol->set_range(low, high); } + + void set_print_volume(const PrintVolume& print_volume) { m_print_volume = print_volume; } + + 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 std::array& coeffs) { m_clipping_plane = coeffs; } + + const std::array& get_z_range() const { return m_z_range; } + const std::array& get_clipping_plane() const { return m_clipping_plane; } + + 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)); } + void set_show_sinking_contours(bool show) { m_show_sinking_contours = show; } + void set_show_non_manifold_edges(bool show) { m_show_non_manifold_edges = show; } + + // 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 Slic3r::BuildVolume& build_volume, ModelInstanceEPrintVolumeState* out_state) const; + void reset_outside_state(); + + void update_colors_by_extruder(const DynamicPrintConfig* config); + + // Returns a vector containing the sorted list of all the print_zs of the volumes contained in this collection + std::vector get_current_print_zs(bool active_only) const; + + // Return an estimate of the memory consumed by this class. + size_t cpu_memory_used() const; + // Return an estimate of the memory held by GPU vertex buffers. + size_t gpu_memory_used() const; + size_t total_memory_used() const { return this->cpu_memory_used() + this->gpu_memory_used(); } + // Return CPU, GPU and total memory log line. + std::string log_memory_info() const; + +private: + GLVolumeCollection(const GLVolumeCollection &other); + GLVolumeCollection& operator=(const GLVolumeCollection &); +}; + +GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCollection::ERenderType type, const Transform3d& view_matrix, std::function filter_func = nullptr); + +struct _3DScene +{ +#if ENABLE_LEGACY_OPENGL_REMOVAL + static void thick_lines_to_verts(const Lines& lines, const std::vector& widths, const std::vector& heights, bool closed, double top_z, GUI::GLModel::Geometry& geometry); + static void thick_lines_to_verts(const Lines3& lines, const std::vector& widths, const std::vector& heights, bool closed, GUI::GLModel::Geometry& geometry); + static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); + static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); + static void extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); + static void extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); + static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GUI::GLModel::Geometry& geometry); +#else + 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); + static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, GLVolume& volume); + static void extrusionentity_to_verts(const ExtrusionPath& extrusion_path, float print_z, const Point& copy, GLVolume& volume); + static void extrusionentity_to_verts(const ExtrusionLoop& extrusion_loop, float print_z, const Point& copy, GLVolume& volume); + static void extrusionentity_to_verts(const ExtrusionMultiPath& extrusion_multi_path, float print_z, const Point& copy, GLVolume& volume); + static void extrusionentity_to_verts(const ExtrusionEntityCollection& extrusion_entity_collection, float print_z, const Point& copy, GLVolume& volume); + static void extrusionentity_to_verts(const ExtrusionEntity* extrusion_entity, float print_z, const Point& copy, GLVolume& volume); + static void polyline3_to_verts(const Polyline3& polyline, double width, double height, GLVolume& volume); + static void point3_to_verts(const Vec3crd& point, double width, double height, GLVolume& volume); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +}; + +} + +#endif diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index 103f321fd8..4b8b5caa42 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -114,7 +114,6 @@ void CopyrightsDialog::fill_entries() { "Expat" , "1998-2000 Thai Open Source Software Center Ltd and Clark Cooper" "2001-2016 Expat maintainers" , "http://www.libexpat.org/" }, { "AVRDUDE" , "2018 Free Software Foundation, Inc." , "http://savannah.nongnu.org/projects/avrdude" }, - { "Shinyprofiler" , "2007-2010 Aidin Abedi" , "http://code.google.com/p/shinyprofiler/" }, { "Real-Time DXT1/DXT5 C compression library" , "Based on original by fabian \"ryg\" giesen v1.04. " "Custom version, modified by Yann Collet" , "https://github.com/Cyan4973/RygsDXTc" }, @@ -127,7 +126,9 @@ void CopyrightsDialog::fill_entries() { "fast_float" , "Daniel Lemire, João Paulo Magalhaes and contributors", "https://github.com/fastfloat/fast_float" }, { "CuraEngine (Arachne, etc.)" - , "Ultimaker", "https://github.com/Ultimaker/CuraEngine" } + , "Ultimaker", "https://github.com/Ultimaker/CuraEngine" }, + { "Open CASCADE Technology" + , "Open Cascade SAS", "https://github.com/Open-Cascade-SAS/OCCT" } }; } @@ -223,8 +224,7 @@ AboutDialog::AboutDialog() main_sizer->Add(hsizer, 0, wxEXPAND | wxALL, 20); // logo - m_logo_bitmap = ScalableBitmap(this, wxGetApp().logo_name(), 192); - m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bitmap.bmp()); + m_logo = new wxStaticBitmap(this, wxID_ANY, *get_bmp_bundle(wxGetApp().logo_name(), 192)); hsizer->Add(m_logo, 1, wxALIGN_CENTER_VERTICAL); wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL); @@ -324,8 +324,8 @@ AboutDialog::AboutDialog() void AboutDialog::on_dpi_changed(const wxRect &suggested_rect) { - m_logo_bitmap.msw_rescale(); - m_logo->SetBitmap(m_logo_bitmap.bmp()); +// m_logo_bitmap.msw_rescale(); +// m_logo->SetBitmap(m_logo_bitmap.bmp()); const wxFont& font = GetFont(); const int fs = font.GetPointSize() - 1; diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 37e527d649..53790e076b 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -23,6 +23,7 @@ #include "libslic3r/Format/SL1.hpp" #include "libslic3r/Thread.hpp" #include "libslic3r/libslic3r.h" +#include "libslic3r/BuildVolume.hpp" #include #include @@ -144,7 +145,21 @@ std::string BackgroundSlicingProcess::output_filepath_for_project(const boost::f void BackgroundSlicingProcess::process_fff() { assert(m_print == m_fff_print); - m_print->process(); + + // Checks that the print does not exceed the max print height + const BuildVolume& build_volume = GUI::wxGetApp().mainframe->m_plater->build_volume(); + auto objects = m_fff_print->objects(); + for (auto obj : objects) { + std::vector layer_height_profile; + PrintObject::update_layer_height_profile(*obj->model_object(), obj->slicing_parameters(), layer_height_profile); + auto layers = generate_object_layers(obj->slicing_parameters(), layer_height_profile); + if (!layers.empty() && layers.back() > build_volume.max_print_height()) { + throw Slic3r::SlicingError("The print is taller than the maximum allowed height. You might want to reduce the size of your model" + " or change current print settings and retry."); + } + } + + m_print->process(); wxCommandEvent evt(m_event_slicing_completed_id); // Post the Slicing Finished message for the G-code viewer to update. // Passing the timestamp diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp index b585798d32..7fb0ce635e 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -15,10 +15,8 @@ #include #endif /* __WXGTK2__ */ -//#define NANOSVG_IMPLEMENTATION -#include "nanosvg/nanosvg.h" -#define NANOSVGRAST_IMPLEMENTATION -#include "nanosvg/nanosvgrast.h" +#include +#include namespace Slic3r { namespace GUI { @@ -62,7 +60,168 @@ static wxBitmap wxImage_to_wxBitmap_with_alpha(wxImage &&image, float scale = 1. #endif } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height) +wxBitmapBundle* BitmapCache::insert_bndl(const std::string& name, const std::vector& bmps) +{ + wxVector bitmaps; + + std::set scales = {1.0}; +#ifndef __linux__ + +#ifdef __APPLE__ + scales.emplace(m_scale); +#else + size_t disp_cnt = wxDisplay::GetCount(); + for (size_t disp = 0; disp < disp_cnt; ++disp) + scales.emplace(wxDisplay(disp).GetScaleFactor()); +#endif + +#endif // !__linux__ + + for (double scale : scales) { + size_t width = 0; + size_t height = 0; + for (const wxBitmapBundle* bmp_bndl : bmps) { +#ifdef __APPLE__ + wxSize size = bmp_bndl->GetDefaultSize(); +#else + wxSize size = bmp_bndl->GetPreferredBitmapSizeAtScale(scale); +#endif + width += size.GetWidth(); + height = std::max(height, size.GetHeight()); + } + + std::string bitmap_key = name + "," +float_to_string_decimal_point(scale); + +#ifdef __WXGTK2__ + // Broken alpha workaround + wxImage image(width, height); + image.InitAlpha(); + // Fill in with a white color. + memset(image.GetData(), 0x0ff, width * height * 3); + // Fill in with full transparency. + memset(image.GetAlpha(), 0, width * height); + size_t x = 0; + for (const wxBitmapBundle* bmp_bndl : bmps) { + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetDefaultSize()); + if (bmp.GetWidth() > 0) { + if (bmp.GetDepth() == 32) { + wxAlphaPixelData data(bmp); + //FIXME The following method is missing from wxWidgets 3.1.1. + // It looks like the wxWidgets 3.0.3 called the wrapped bitmap's UseAlpha(). + //data.UseAlpha(); + if (data) { + for (int r = 0; r < bmp.GetHeight(); ++r) { + wxAlphaPixelData::Iterator src(data); + src.Offset(data, 0, r); + unsigned char* dst_pixels = image.GetData() + (x + r * width) * 3; + unsigned char* dst_alpha = image.GetAlpha() + x + r * width; + for (int c = 0; c < bmp.GetWidth(); ++c, ++src) { + *dst_pixels++ = src.Red(); + *dst_pixels++ = src.Green(); + *dst_pixels++ = src.Blue(); + *dst_alpha++ = src.Alpha(); + } + } + } + } + else if (bmp.GetDepth() == 24) { + wxNativePixelData data(bmp); + if (data) { + for (int r = 0; r < bmp.GetHeight(); ++r) { + wxNativePixelData::Iterator src(data); + src.Offset(data, 0, r); + unsigned char* dst_pixels = image.GetData() + (x + r * width) * 3; + unsigned char* dst_alpha = image.GetAlpha() + x + r * width; + for (int c = 0; c < bmp.GetWidth(); ++c, ++src) { + *dst_pixels++ = src.Red(); + *dst_pixels++ = src.Green(); + *dst_pixels++ = src.Blue(); + *dst_alpha++ = wxALPHA_OPAQUE; + } + } + } + } + } + x += bmp.GetScaledWidth(); + } + + bitmaps.push_back(* this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image)))); + +#else + + wxBitmap* bitmap = this->insert(bitmap_key, width, height, scale); + wxMemoryDC memDC; + memDC.SelectObject(*bitmap); + memDC.SetBackground(*wxTRANSPARENT_BRUSH); + memDC.Clear(); + size_t x = 0; + for (const wxBitmapBundle* bmp_bndl : bmps) { + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetPreferredBitmapSizeAtScale(scale)); + + if (bmp.GetWidth() > 0) + memDC.DrawBitmap(bmp, x, 0, true); + // we should "move" with step equal to non-scaled width +#ifdef __APPLE__ + x += bmp.GetScaledWidth(); +#else + x += bmp.GetWidth(); +#endif + } + memDC.SelectObject(wxNullBitmap); + bitmaps.push_back(*bitmap); + +#endif + } + + return insert_bndl(name, bitmaps); +} + +wxBitmapBundle* BitmapCache::insert_bndl(const std::string &bitmap_key, const char* data, size_t width, size_t height) +{ + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + bndl = new wxBitmapBundle(wxBitmapBundle::FromSVG(data, wxSize(width, height))); + m_bndl_map[bitmap_key] = bndl; + } + else { + bndl = it->second; + *bndl = wxBitmapBundle::FromSVG(data, wxSize(width, height)); + } + return bndl; +} + +wxBitmapBundle* BitmapCache::insert_bndl(const std::string& bitmap_key, const wxBitmapBundle& bmp) +{ + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + bndl = new wxBitmapBundle(bmp); + m_bndl_map[bitmap_key] = bndl; + } + else { + bndl = it->second; + *bndl = wxBitmapBundle(bmp); + } + return bndl; +} + +wxBitmapBundle* BitmapCache::insert_bndl(const std::string& bitmap_key, const wxVector& bmps) +{ + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + bndl = new wxBitmapBundle(wxBitmapBundle::FromBitmaps(bmps)); + m_bndl_map[bitmap_key] = bndl; + } + else { + bndl = it->second; + *bndl = wxBitmapBundle::FromBitmaps(bmps); + } + return bndl; +} + +wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_t height, double scale/* = -1.0*/) { wxBitmap *bitmap = nullptr; auto it = m_map.find(bitmap_key); @@ -78,7 +237,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_ // 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); + bitmap->CreateScaled(width, height, -1, scale < 0.0 ? m_scale : scale); #endif m_map[bitmap_key] = bitmap; } else { @@ -107,110 +266,6 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp return bitmap; } -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp, const wxBitmap &bmp2) -{ - // Copying the wxBitmaps is cheap as the bitmap's content is reference counted. - const wxBitmap bmps[2] = { bmp, bmp2 }; - return this->insert(bitmap_key, bmps, bmps + 2); -} - -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3) -{ - // Copying the wxBitmaps is cheap as the bitmap's content is reference counted. - const wxBitmap bmps[3] = { bmp, bmp2, bmp3 }; - return this->insert(bitmap_key, bmps, bmps + 3); -} - -wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *begin, const wxBitmap *end) -{ - size_t width = 0; - size_t height = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { -#ifdef __APPLE__ - width += bmp->GetScaledWidth(); - height = std::max(height, bmp->GetScaledHeight()); -#else - width += bmp->GetWidth(); - height = std::max(height, bmp->GetHeight()); -#endif - } - -#ifdef __WXGTK2__ - // Broken alpha workaround - wxImage image(width, height); - image.InitAlpha(); - // Fill in with a white color. - memset(image.GetData(), 0x0ff, width * height * 3); - // Fill in with full transparency. - memset(image.GetAlpha(), 0, width * height); - size_t x = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { - if (bmp->GetWidth() > 0) { - if (bmp->GetDepth() == 32) { - wxAlphaPixelData data(*const_cast(bmp)); - //FIXME The following method is missing from wxWidgets 3.1.1. - // It looks like the wxWidgets 3.0.3 called the wrapped bitmap's UseAlpha(). - //data.UseAlpha(); - if (data) { - for (int r = 0; r < bmp->GetHeight(); ++ r) { - wxAlphaPixelData::Iterator src(data); - src.Offset(data, 0, r); - unsigned char *dst_pixels = image.GetData() + (x + r * width) * 3; - unsigned char *dst_alpha = image.GetAlpha() + x + r * width; - for (int c = 0; c < bmp->GetWidth(); ++ c, ++ src) { - *dst_pixels ++ = src.Red(); - *dst_pixels ++ = src.Green(); - *dst_pixels ++ = src.Blue(); - *dst_alpha ++ = src.Alpha(); - } - } - } - } else if (bmp->GetDepth() == 24) { - wxNativePixelData data(*const_cast(bmp)); - if (data) { - for (int r = 0; r < bmp->GetHeight(); ++ r) { - wxNativePixelData::Iterator src(data); - src.Offset(data, 0, r); - unsigned char *dst_pixels = image.GetData() + (x + r * width) * 3; - unsigned char *dst_alpha = image.GetAlpha() + x + r * width; - for (int c = 0; c < bmp->GetWidth(); ++ c, ++ src) { - *dst_pixels ++ = src.Red(); - *dst_pixels ++ = src.Green(); - *dst_pixels ++ = src.Blue(); - *dst_alpha ++ = wxALPHA_OPAQUE; - } - } - } - } - } - x += bmp->GetWidth(); - } - return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image))); - -#else - - wxBitmap *bitmap = this->insert(bitmap_key, width, height); - wxMemoryDC memDC; - memDC.SelectObject(*bitmap); - memDC.SetBackground(*wxTRANSPARENT_BRUSH); - memDC.Clear(); - size_t x = 0; - for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { - if (bmp->GetWidth() > 0) - memDC.DrawBitmap(*bmp, x, 0, true); -#ifdef __APPLE__ - // we should "move" with step equal to non-scaled width - x += bmp->GetScaledWidth(); -#else - x += bmp->GetWidth(); -#endif - } - memDC.SelectObject(wxNullBitmap); - return bitmap; - -#endif -} - wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale/* = false*/) { wxImage image(width, height); @@ -299,6 +354,92 @@ error: return NULL; } +void BitmapCache::nsvgGetDataFromFileWithReplace(const char* filename, std::string& data_str, const std::map& replaces) +{ + FILE* fp = NULL; + size_t size; + char* data = NULL; + + fp = boost::nowide::fopen(filename, "rb"); + if (!fp) goto error; + fseek(fp, 0, SEEK_END); + size = ftell(fp); + fseek(fp, 0, SEEK_SET); + data = (char*)malloc(size + 1); + if (data == NULL) goto error; + if (fread(data, 1, size, fp) != size) goto error; + data[size] = '\0'; // Must be null terminated. + fclose(fp); + + data_str.assign(data); + for (auto val : replaces) + boost::replace_all(data_str, val.first, val.second); + + free(data); + return; + +error: + if (fp) fclose(fp); + if (data) free(data); + return; +} + +wxBitmapBundle* BitmapCache::from_svg(const std::string& bitmap_name, unsigned target_width, unsigned target_height, + const bool dark_mode, const std::string& new_color /*= ""*/) +{ + if (target_width == 0) + target_width = target_height; + std::string bitmap_key = bitmap_name + (target_height != 0 ? + "-h" + std::to_string(target_height) : + "-w" + std::to_string(target_width)) + + (dark_mode ? "-dm" : "") + + new_color; + + auto it = m_bndl_map.find(bitmap_key); + if (it != m_bndl_map.end()) + return it->second; + + // map of color replaces + std::map replaces; + if (dark_mode) + replaces["\"#808080\""] = "\"#FFFFFF\""; + if (!new_color.empty()) + replaces["\"#ED6B21\""] = "\"" + new_color + "\""; + + std::string str; + nsvgGetDataFromFileWithReplace(Slic3r::var(bitmap_name + ".svg").c_str(), str, replaces); + if (str.empty()) + return nullptr; + + return insert_bndl(bitmap_key, str.data(), target_width, target_height); +} + +wxBitmapBundle* BitmapCache::from_png(const std::string& bitmap_name, unsigned width, unsigned height) +{ + std::string bitmap_key = bitmap_name + (height != 0 ? + "-h" + std::to_string(height) : + "-w" + std::to_string(width)); + + auto it = m_bndl_map.find(bitmap_key); + if (it != m_bndl_map.end()) + return it->second; + + wxImage image; + if (!image.LoadFile(Slic3r::GUI::from_u8(Slic3r::var(bitmap_name + ".png")), wxBITMAP_TYPE_PNG) || + image.GetWidth() == 0 || image.GetHeight() == 0) + return nullptr; + + if (height != 0 && unsigned(image.GetHeight()) != height) + width = unsigned(0.5f + float(image.GetWidth()) * height / image.GetHeight()); + else if (width != 0 && unsigned(image.GetWidth()) != width) + height = unsigned(0.5f + float(image.GetHeight()) * width / image.GetWidth()); + + if (height != 0 && width != 0) + image.Rescale(width, height, wxIMAGE_QUALITY_BILINEAR); + + return this->insert_bndl(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image))); +} + wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, const bool grayscale/* = false*/, const bool dark_mode/* = false*/, const std::string& new_color /*= ""*/) { @@ -354,47 +495,130 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ } //we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/, size_t border_width /*= 0*/, bool dark_mode/* = false*/) +//wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false* /, size_t border_width /*= 0* /, bool dark_mode/* = false* /) +//{ +// double scale = suppress_scaling ? 1.0f : m_scale; +// width *= scale; +// height *= scale; +// +// wxImage image(width, height); +// image.InitAlpha(); +// unsigned char* imgdata = image.GetData(); +// unsigned char* imgalpha = image.GetAlpha(); +// for (size_t i = 0; i < width * height; ++ i) { +// *imgdata ++ = r; +// *imgdata ++ = g; +// *imgdata ++ = b; +// *imgalpha ++ = transparency; +// } +// +// // Add border, make white/light spools easier to see +// if (border_width > 0) { +// +// // Restrict to width of image +// if (border_width > height) border_width = height - 1; +// if (border_width > width) border_width = width - 1; +// +// auto px_data = (uint8_t*)image.GetData(); +// auto a_data = (uint8_t*)image.GetAlpha(); +// +// for (size_t x = 0; x < width; ++x) { +// for (size_t y = 0; y < height; ++y) { +// if (x < border_width || y < border_width || +// x >= (width - border_width) || y >= (height - border_width)) { +// const size_t idx = (x + y * width); +// const size_t idx_rgb = (x + y * width) * 3; +// px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; +// a_data[idx] = 255u; +// } +// } +// } +// } +// +// return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); +//} + +//we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap +wxBitmapBundle BitmapCache::mksolid(size_t width_in, size_t height_in, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, size_t border_width /*= 0*/, bool dark_mode/* = false*/) { - double scale = suppress_scaling ? 1.0f : m_scale; - width *= scale; - height *= scale; + wxVector bitmaps; - wxImage image(width, height); - image.InitAlpha(); - unsigned char* imgdata = image.GetData(); - unsigned char* imgalpha = image.GetAlpha(); - for (size_t i = 0; i < width * height; ++ i) { - *imgdata ++ = r; - *imgdata ++ = g; - *imgdata ++ = b; - *imgalpha ++ = transparency; - } + std::set scales = { 1.0 }; +#ifndef __linux__ - // Add border, make white/light spools easier to see - if (border_width > 0) { +#ifdef __APPLE__ + scales.emplace(m_scale); +#else + size_t disp_cnt = wxDisplay::GetCount(); + for (size_t disp = 0; disp < disp_cnt; ++disp) + scales.emplace(wxDisplay(disp).GetScaleFactor()); +#endif - // Restrict to width of image - if (border_width > height) border_width = height - 1; - if (border_width > width) border_width = width - 1; +#endif // !__linux__ - auto px_data = (uint8_t*)image.GetData(); - auto a_data = (uint8_t*)image.GetAlpha(); + for (double scale : scales) { + size_t width = width_in * scale; + size_t height = height_in * scale; - for (size_t x = 0; x < width; ++x) { - for (size_t y = 0; y < height; ++y) { - if (x < border_width || y < border_width || - x >= (width - border_width) || y >= (height - border_width)) { - const size_t idx = (x + y * width); - const size_t idx_rgb = (x + y * width) * 3; - px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; - a_data[idx] = 255u; + wxImage image(width, height); + image.InitAlpha(); + unsigned char* imgdata = image.GetData(); + unsigned char* imgalpha = image.GetAlpha(); + for (size_t i = 0; i < width * height; ++i) { + *imgdata++ = r; + *imgdata++ = g; + *imgdata++ = b; + *imgalpha++ = transparency; + } + + // Add border, make white/light spools easier to see + if (border_width > 0) { + + // Restrict to width of image + if (border_width > height) border_width = height - 1; + if (border_width > width) border_width = width - 1; + + auto px_data = (uint8_t*)image.GetData(); + auto a_data = (uint8_t*)image.GetAlpha(); + + for (size_t x = 0; x < width; ++x) { + for (size_t y = 0; y < height; ++y) { + if (x < border_width || y < border_width || + x >= (width - border_width) || y >= (height - border_width)) { + const size_t idx = (x + y * width); + const size_t idx_rgb = (x + y * width) * 3; + px_data[idx_rgb] = px_data[idx_rgb + 1] = px_data[idx_rgb + 2] = dark_mode ? 245u : 110u; + a_data[idx] = 255u; + } } } } - } - return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); + bitmaps.push_back(wxImage_to_wxBitmap_with_alpha(std::move(image), scale)); + } + return wxBitmapBundle::FromBitmaps(bitmaps); +} + +wxBitmapBundle* BitmapCache::mksolid_bndl(size_t width, size_t height, const std::string& color, size_t border_width, bool dark_mode) +{ + std::string bitmap_key = (color.empty() ? "empty" : color) + "-h" + std::to_string(height) + "-w" + std::to_string(width) + (dark_mode ? "-dm" : ""); + + wxBitmapBundle* bndl = nullptr; + auto it = m_bndl_map.find(bitmap_key); + if (it == m_bndl_map.end()) { + if (color.empty()) + bndl = new wxBitmapBundle(mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT, size_t(0))); + else { + ColorRGB rgb;// [3] ; + decode_color(color, rgb); + bndl = new wxBitmapBundle(mksolid(width, height, rgb.r_uchar(), rgb.g_uchar(), rgb.b_uchar(), wxALPHA_OPAQUE, border_width, dark_mode)); + } + m_bndl_map[bitmap_key] = bndl; + } + else + return it->second; + + return bndl; } } // namespace GUI diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index 5af90c5f7b..6ba9ae15b2 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -24,15 +24,19 @@ public: void clear(); double scale() { return m_scale; } + wxBitmapBundle* find_bndl(const std::string &name) { auto it = m_bndl_map.find(name); return (it == m_bndl_map.end()) ? nullptr : it->second; } + const wxBitmapBundle* find_bndl(const std::string &name) const { return const_cast(this)->find_bndl(name); } 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); } - wxBitmap* insert(const std::string &name, size_t width, size_t height); + wxBitmapBundle* insert_bndl(const std::string& bitmap_key, const char* data, size_t width, size_t height); + wxBitmapBundle* insert_bndl(const std::string& bitmap_key, const wxBitmapBundle &bmp); + wxBitmapBundle* insert_bndl(const std::string& bitmap_key, const wxVector& bmps); + wxBitmapBundle* insert_bndl(const std::string& name, const std::vector& bmps); + wxBitmapBundle* insert_raw_rgba_bndl(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale = false); + + wxBitmap* insert(const std::string &name, size_t width, size_t height, double scale = -1.0); wxBitmap* insert(const std::string &name, const wxBitmap &bmp); - wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2); - wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); - wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } - wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); wxBitmap* insert_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. @@ -42,15 +46,21 @@ public: // And makes replases befor parsing // replace_map containes old_value->new_value static NSVGimage* nsvgParseFromFileWithReplace(const char* filename, const char* units, float dpi, const std::map& replaces); + // Gets a data from SVG file and makes replases + // replace_map containes old_value->new_value + static void nsvgGetDataFromFileWithReplace(const char* filename, std::string& data_str, const std::map& replaces); + wxBitmapBundle* from_svg(const std::string& bitmap_name, unsigned target_width, unsigned target_height, const bool dark_mode, const std::string& new_color = ""); + wxBitmapBundle* from_png(const std::string& bitmap_name, unsigned width, unsigned height); // Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width. wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false, const std::string& new_color = ""); - wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false); - wxBitmap mksolid(size_t width, size_t height, const ColorRGB& rgb, bool suppress_scaling = false, size_t border_width = 0, bool dark_mode = false) { return mksolid(width, height, rgb.r_uchar(), rgb.g_uchar(), rgb.b_uchar(), wxALPHA_OPAQUE, suppress_scaling, border_width, dark_mode); } - wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } + wxBitmapBundle mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, size_t border_width = 0, bool dark_mode = false); + wxBitmapBundle* mksolid_bndl(size_t width, size_t height, const std::string& color = std::string(), size_t border_width = 0, bool dark_mode = false); + wxBitmapBundle* mkclear_bndl(size_t width, size_t height) { return mksolid_bndl(width, height); } private: std::map m_map; + std::map m_bndl_map; 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 }; diff --git a/src/slic3r/GUI/BitmapComboBox.cpp b/src/slic3r/GUI/BitmapComboBox.cpp index 3396c627be..70c985cf90 100644 --- a/src/slic3r/GUI/BitmapComboBox.cpp +++ b/src/slic3r/GUI/BitmapComboBox.cpp @@ -54,17 +54,6 @@ using Slic3r::GUI::format_wxstr; namespace Slic3r { namespace GUI { -/* For PresetComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina - * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean - * "please scale this to such and such" but rather - * "the wxImage is already sized for backing scale such and such". ) - * Unfortunately, the constructor changes the size of wxBitmap too. - * Thus We need to use unscaled size value for bitmaps that we use - * to avoid scaled size of control items. - * For this purpose control drawing methods and - * control size calculation methods (virtual) are overridden. - **/ - BitmapComboBox::BitmapComboBox(wxWindow* parent, wxWindowID id/* = wxID_ANY*/, const wxString& value/* = wxEmptyString*/, @@ -90,72 +79,6 @@ BitmapComboBox::~BitmapComboBox() { } -#ifdef __APPLE__ -bool BitmapComboBox::OnAddBitmap(const wxBitmap& bitmap) -{ - if (bitmap.IsOk()) - { - // we should use scaled! size values of bitmap - int width = (int)bitmap.GetScaledWidth(); - int height = (int)bitmap.GetScaledHeight(); - - if (m_usedImgSize.x < 0) - { - // If size not yet determined, get it from this image. - m_usedImgSize.x = width; - m_usedImgSize.y = height; - - // Adjust control size to vertically fit the bitmap - wxWindow* ctrl = GetControl(); - ctrl->InvalidateBestSize(); - wxSize newSz = ctrl->GetBestSize(); - wxSize sz = ctrl->GetSize(); - if (newSz.y > sz.y) - ctrl->SetSize(sz.x, newSz.y); - else - DetermineIndent(); - } - - wxCHECK_MSG(width == m_usedImgSize.x && height == m_usedImgSize.y, - false, - "you can only add images of same size"); - - return true; - } - - return false; -} - -void BitmapComboBox::OnDrawItem(wxDC& dc, - const wxRect& rect, - int item, - int flags) const -{ - const wxBitmap& bmp = *(static_cast(m_bitmaps[item])); - if (bmp.IsOk()) - { - // we should use scaled! size values of bitmap - wxCoord w = bmp.GetScaledWidth(); - wxCoord h = bmp.GetScaledHeight(); - - const int imgSpacingLeft = 4; - - // Draw the image centered - dc.DrawBitmap(bmp, - rect.x + (m_usedImgSize.x - w) / 2 + imgSpacingLeft, - rect.y + (rect.height - h) / 2, - true); - } - - wxString text = GetString(item); - if (!text.empty()) - dc.DrawText(text, - rect.x + m_imgAreaWidth + 1, - rect.y + (rect.height - dc.GetCharHeight()) / 2); -} -#endif - - #ifdef _WIN32 int BitmapComboBox::Append(const wxString& item) @@ -166,18 +89,11 @@ int BitmapComboBox::Append(const wxString& item) //2. But then set width to 0 value for no using of bitmap left and right spacing //3. Set this empty bitmap to the at list one item and BitmapCombobox will be recreated correct - wxBitmap bitmap(1, int(1.6 * wxGetApp().em_unit() + 1)); - { - // bitmap.SetWidth(0); is depricated now - // so, use next code - bitmap.UnShare();// AllocExclusive(); - bitmap.GetGDIImageData()->m_width = 0; - } - + wxBitmapBundle bitmap = *get_empty_bmp_bundle(1, 16); OnAddBitmap(bitmap); + const int n = wxComboBox::Append(item); - if (n != wxNOT_FOUND) - DoSetItemBitmap(n, bitmap); + return n; } diff --git a/src/slic3r/GUI/BitmapComboBox.hpp b/src/slic3r/GUI/BitmapComboBox.hpp index a77bf401d6..545213fc3c 100644 --- a/src/slic3r/GUI/BitmapComboBox.hpp +++ b/src/slic3r/GUI/BitmapComboBox.hpp @@ -29,28 +29,13 @@ BitmapComboBox(wxWindow* parent, #ifdef _WIN32 int Append(const wxString& item); #endif - int Append(const wxString& item, const wxBitmap& bitmap) + int Append(const wxString& item, const wxBitmapBundle& bitmap) { return wxBitmapComboBox::Append(item, bitmap); } protected: -#ifdef __APPLE__ -/* For PresetComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina - * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean - * "please scale this to such and such" but rather - * "the wxImage is already sized for backing scale such and such". ) - * Unfortunately, the constructor changes the size of wxBitmap too. - * Thus We need to use unscaled size value for bitmaps that we use - * to avoid scaled size of control items. - * For this purpose control drawing methods and - * control size calculation methods (virtual) are overridden. - **/ -bool OnAddBitmap(const wxBitmap& bitmap) override; -void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const override; -#endif - #ifdef _WIN32 bool MSWOnDraw(WXDRAWITEMSTRUCT* item) override; void DrawBackground_(wxDC& dc, const wxRect& rect, int WXUNUSED(item), int flags) const; diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 09d8bdb525..9298aa615b 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -5,6 +5,8 @@ #include #include +#include + #include #include #include diff --git a/src/slic3r/GUI/BonjourDialog.hpp b/src/slic3r/GUI/BonjourDialog.hpp index fb177c4b53..8bfc076c44 100644 --- a/src/slic3r/GUI/BonjourDialog.hpp +++ b/src/slic3r/GUI/BonjourDialog.hpp @@ -1,8 +1,11 @@ #ifndef slic3r_BonjourDialog_hpp_ #define slic3r_BonjourDialog_hpp_ +#include #include +#include + #include #include diff --git a/src/slic3r/GUI/ButtonsDescription.cpp b/src/slic3r/GUI/ButtonsDescription.cpp index 2c5262d47c..37daffd9d2 100644 --- a/src/slic3r/GUI/ButtonsDescription.cpp +++ b/src/slic3r/GUI/ButtonsDescription.cpp @@ -17,9 +17,6 @@ void ButtonsDescription::FillSizerWithTextColorDescriptions(wxSizer* sizer, wxWi wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(3, 5, 5); sizer->Add(grid_sizer, 0, wxEXPAND); - ScalableBitmap bmp_delete = ScalableBitmap(parent, "cross"); - ScalableBitmap bmp_delete_focus = ScalableBitmap(parent, "cross_focus"); - auto add_color = [grid_sizer, parent](wxColourPickerCtrl** color_picker, const wxColour& color, const wxColour& def_color, wxString label_text) { // wrap the label_text to the max 80 characters if (label_text.Len() > 80) { diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 1370484c3d..56980c43a5 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -91,6 +91,80 @@ void Camera::select_view(const std::string& direction) look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); } +#if ENABLE_RAYCAST_PICKING +double Camera::get_near_left() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(0, 2) - 1.0) / m_projection_matrix.matrix()(0, 0); + default: + case EType::Ortho: + return -1.0 / m_projection_matrix.matrix()(0, 0) - 0.5 * m_projection_matrix.matrix()(0, 0) * m_projection_matrix.matrix()(0, 3); + } +} + +double Camera::get_near_right() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(0, 2) + 1.0) / m_projection_matrix.matrix()(0, 0); + default: + case EType::Ortho: + return 1.0 / m_projection_matrix.matrix()(0, 0) - 0.5 * m_projection_matrix.matrix()(0, 0) * m_projection_matrix.matrix()(0, 3); + } +} + +double Camera::get_near_top() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(1, 2) + 1.0) / m_projection_matrix.matrix()(1, 1); + default: + case EType::Ortho: + return 1.0 / m_projection_matrix.matrix()(1, 1) - 0.5 * m_projection_matrix.matrix()(1, 1) * m_projection_matrix.matrix()(1, 3); + } +} + +double Camera::get_near_bottom() const +{ + switch (m_type) + { + case EType::Perspective: + return m_frustrum_zs.first * (m_projection_matrix.matrix()(1, 2) - 1.0) / m_projection_matrix.matrix()(1, 1); + default: + case EType::Ortho: + return -1.0 / m_projection_matrix.matrix()(1, 1) - 0.5 * m_projection_matrix.matrix()(1, 1) * m_projection_matrix.matrix()(1, 3); + } +} + +double Camera::get_near_width() const +{ + switch (m_type) + { + case EType::Perspective: + return 2.0 * m_frustrum_zs.first / m_projection_matrix.matrix()(0, 0); + default: + case EType::Ortho: + return 2.0 / m_projection_matrix.matrix()(0, 0); + } +} + +double Camera::get_near_height() const +{ + switch (m_type) + { + case EType::Perspective: + return 2.0 * m_frustrum_zs.first / m_projection_matrix.matrix()(1, 1); + default: + case EType::Ortho: + return 2.0 / m_projection_matrix.matrix()(1, 1); + } +} +#endif // ENABLE_RAYCAST_PICKING + double Camera::get_fov() const { switch (m_type) @@ -103,6 +177,21 @@ double Camera::get_fov() const }; } +#if ENABLE_RAYCAST_PICKING +void Camera::set_viewport(int x, int y, unsigned int w, unsigned int h) +{ +#if ENABLE_LEGACY_OPENGL_REMOVAL + m_viewport = { 0, 0, int(w), int(h) }; +#else + glsafe(::glGetIntegerv(GL_VIEWPORT, m_viewport.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} + +void Camera::apply_viewport() const +{ + glsafe(::glViewport(m_viewport[0], m_viewport[1], m_viewport[2], m_viewport[3])); +} +#else void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) { glsafe(::glViewport(0, 0, w, h)); @@ -112,6 +201,7 @@ void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) glsafe(::glGetIntegerv(GL_VIEWPORT, m_viewport.data())); #endif // ENABLE_LEGACY_OPENGL_REMOVAL } +#endif // ENABLE_RAYCAST_PICKING #if !ENABLE_LEGACY_OPENGL_REMOVAL void Camera::apply_view_matrix() @@ -170,6 +260,9 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa } #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + apply_projection(-w, w, -h, h, m_frustrum_zs.first, m_frustrum_zs.second); +#else switch (m_type) { default: @@ -197,6 +290,7 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa break; } } +#endif // ENABLE_RAYCAST_PICKING #else glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glLoadIdentity()); @@ -221,6 +315,37 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa #endif // ENABLE_LEGACY_OPENGL_REMOVAL } +#if ENABLE_RAYCAST_PICKING +void Camera::apply_projection(double left, double right, double bottom, double top, double near_z, double far_z) +{ + assert(left != right && bottom != top && near_z != far_z); + const double inv_dx = 1.0 / (right - left); + const double inv_dy = 1.0 / (top - bottom); + const double inv_dz = 1.0 / (far_z - near_z); + + switch (m_type) + { + default: + case EType::Ortho: + { + m_projection_matrix.matrix() << 2.0 * inv_dx, 0.0, 0.0, -(left + right) * inv_dx, + 0.0, 2.0 * inv_dy, 0.0, -(bottom + top) * inv_dy, + 0.0, 0.0, -2.0 * inv_dz, -(near_z + far_z) * inv_dz, + 0.0, 0.0, 0.0, 1.0; + break; + } + case EType::Perspective: + { + m_projection_matrix.matrix() << 2.0 * near_z * inv_dx, 0.0, (left + right) * inv_dx, 0.0, + 0.0, 2.0 * near_z * inv_dy, (bottom + top) * inv_dy, 0.0, + 0.0, 0.0, -(near_z + far_z) * inv_dz, -2.0 * near_z * far_z * inv_dz, + 0.0, 0.0, -1.0, 0.0; + break; + } + } +} +#endif // ENABLE_RAYCAST_PICKING + void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) { // Calculate the zoom factor needed to adjust the view around the given box. diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index a1d7426882..b2672e14e5 100644 --- a/src/slic3r/GUI/Camera.hpp +++ b/src/slic3r/GUI/Camera.hpp @@ -89,9 +89,23 @@ public: double get_far_z() const { return m_frustrum_zs.second; } const std::pair& get_z_range() const { return m_frustrum_zs; } +#if ENABLE_RAYCAST_PICKING + double get_near_left() const; + double get_near_right() const; + double get_near_top() const; + double get_near_bottom() const; + double get_near_width() const; + double get_near_height() const; +#endif // ENABLE_RAYCAST_PICKING + double get_fov() const; +#if ENABLE_RAYCAST_PICKING + void set_viewport(int x, int y, unsigned int w, unsigned int h); + void apply_viewport() const; +#else void apply_viewport(int x, int y, unsigned int w, unsigned int h); +#endif // ENABLE_RAYCAST_PICKING #if !ENABLE_LEGACY_OPENGL_REMOVAL void apply_view_matrix(); #endif // !ENABLE_LEGACY_OPENGL_REMOVAL @@ -99,6 +113,10 @@ public: // If larger z span is needed, pass the desired values of near and far z (negative values are ignored) void apply_projection(const BoundingBoxf3& box, double near_z = -1.0, double far_z = -1.0); +#if ENABLE_RAYCAST_PICKING + void apply_projection(double left, double right, double bottom, double top, double near_z, double far_z); +#endif // ENABLE_RAYCAST_PICKING + void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor); void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor); diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index eb6d012dd6..96bf2fe020 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -323,8 +323,6 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) toggle_field("wall_transition_filter_deviation", have_arachne); toggle_field("wall_transition_angle", have_arachne); toggle_field("wall_distribution_count", have_arachne); - toggle_field("wall_split_middle_threshold", have_arachne); - toggle_field("wall_add_middle_threshold", have_arachne); toggle_field("min_feature_size", have_arachne); toggle_field("min_bead_width", have_arachne); toggle_field("thin_walls", !have_arachne); @@ -363,21 +361,26 @@ void ConfigManipulation::update_print_sla_config(DynamicPrintConfig* config, con void ConfigManipulation::toggle_print_sla_options(DynamicPrintConfig* config) { bool supports_en = config->opt_bool("supports_enable"); + sla::SupportTreeType treetype = config->opt_enum("support_tree_type"); + bool is_default_tree = treetype == sla::SupportTreeType::Default; + bool is_branching_tree = treetype == sla::SupportTreeType::Branching; toggle_field("support_head_front_diameter", supports_en); 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_max_bridges_on_pillar", supports_en && is_default_tree); + toggle_field("support_pillar_connection_mode", supports_en && is_default_tree); + toggle_field("support_tree_type", supports_en); toggle_field("support_buildplate_only", supports_en); toggle_field("support_base_diameter", supports_en); toggle_field("support_base_height", supports_en); toggle_field("support_base_safety_distance", supports_en); toggle_field("support_critical_angle", supports_en); toggle_field("support_max_bridge_length", supports_en); - toggle_field("support_max_pillar_link_distance", supports_en); + toggle_field("support_max_pillar_link_distance", supports_en && is_default_tree); + toggle_field("support_pillar_widening_factor", supports_en && is_branching_tree); toggle_field("support_points_density_relative", supports_en); toggle_field("support_points_minimal_distance", supports_en); diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 813804f0d5..d95848300e 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -1609,7 +1609,7 @@ ConfigWizardIndex::ConfigWizardIndex(wxWindow *parent) #ifndef __WXOSX__ SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX #endif //__WXOSX__ - SetMinSize(bg.bmp().GetSize()); + SetMinSize(bg.GetSize()); const wxSize size = GetTextExtent("m"); em_w = size.x; @@ -1734,8 +1734,8 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) wxPaintDC dc(this); - const auto bullet_w = bullet_black.bmp().GetSize().GetWidth(); - const auto bullet_h = bullet_black.bmp().GetSize().GetHeight(); + const auto bullet_w = bullet_black.GetWidth(); + const auto bullet_h = bullet_black.GetHeight(); const int yoff_icon = bullet_h < em_h ? (em_h - bullet_h) / 2 : 0; const int yoff_text = bullet_h > em_h ? (bullet_h - em_h) / 2 : 0; const int yinc = item_height(); @@ -1748,10 +1748,10 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) unsigned x = em_w/2 + item.indent * em_w; if (i == item_active || (item_hover >= 0 && i == (size_t)item_hover)) { - dc.DrawBitmap(bullet_blue.bmp(), x, y + yoff_icon, false); + dc.DrawBitmap(bullet_blue.get_bitmap(), x, y + yoff_icon, false); } - else if (i < item_active) { dc.DrawBitmap(bullet_black.bmp(), x, y + yoff_icon, false); } - else if (i > item_active) { dc.DrawBitmap(bullet_white.bmp(), x, y + yoff_icon, false); } + else if (i < item_active) { dc.DrawBitmap(bullet_black.get_bitmap(), x, y + yoff_icon, false); } + else if (i > item_active) { dc.DrawBitmap(bullet_white.get_bitmap(), x, y + yoff_icon, false); } x += + bullet_w + em_w/2; const auto text_size = dc.GetTextExtent(item.label); @@ -1763,9 +1763,9 @@ void ConfigWizardIndex::on_paint(wxPaintEvent & evt) } //draw logo - if (int y = size.y - bg.GetBmpHeight(); y>=0) { - dc.DrawBitmap(bg.bmp(), 0, y, false); - index_width = std::max(index_width, bg.GetBmpWidth() + em_w / 2); + if (int y = size.y - bg.GetHeight(); y>=0) { + dc.DrawBitmap(bg.get_bitmap(), 0, y, false); + index_width = std::max(index_width, bg.GetWidth() + em_w / 2); } if (GetMinSize().x < index_width) { @@ -1797,12 +1797,8 @@ void ConfigWizardIndex::msw_rescale() em_w = size.x; em_h = size.y; - bg.msw_rescale(); - SetMinSize(bg.bmp().GetSize()); + SetMinSize(bg.GetSize()); - bullet_black.msw_rescale(); - bullet_blue.msw_rescale(); - bullet_white.msw_rescale(); Refresh(); } @@ -2780,9 +2776,7 @@ bool ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese page_diams->apply_custom_config(*custom_config); page_temps->apply_custom_config(*custom_config); -#if ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE copy_bed_model_and_texture_if_needed(*custom_config); -#endif // ENABLE_COPY_CUSTOM_BED_MODEL_AND_TEXTURE const std::string profile_name = page_custom->profile_name(); preset_bundle->load_config_from_wizard(profile_name, *custom_config); diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp index 4de8381ffe..aa074f9253 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -519,7 +519,7 @@ private: ssize_t item_hover; size_t last_page; - int item_height() const { return std::max(bullet_black.bmp().GetSize().GetHeight(), em_w) + em_w; } + int item_height() const { return std::max(bullet_black.GetHeight(), em_w) + em_w; } void on_paint(wxPaintEvent &evt); void on_mouse_move(wxMouseEvent &evt); diff --git a/src/slic3r/GUI/CoordAxes.cpp b/src/slic3r/GUI/CoordAxes.cpp index edd1d4f03f..1ac234d5b6 100644 --- a/src/slic3r/GUI/CoordAxes.cpp +++ b/src/slic3r/GUI/CoordAxes.cpp @@ -3,10 +3,10 @@ #include "CoordAxes.hpp" #include "GUI_App.hpp" #include "3DScene.hpp" -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "Plater.hpp" #include "Camera.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include @@ -20,19 +20,20 @@ const float CoordAxes::DefaultStemLength = 25.0f; const float CoordAxes::DefaultTipRadius = 2.5f * CoordAxes::DefaultStemRadius; const float CoordAxes::DefaultTipLength = 5.0f; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void CoordAxes::render(const Transform3d& trafo, float emission_factor) #else void CoordAxes::render(float emission_factor) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL auto render_axis = [this](GLShaderProgram& shader, const Transform3d& transform) { const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d matrix = camera.get_view_matrix() * transform; + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d matrix = view_matrix * transform; shader.set_uniform("view_model_matrix", matrix); shader.set_uniform("projection_matrix", camera.get_projection_matrix()); - shader.set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + shader.set_uniform("view_normal_matrix", (Matrix3d)(view_matrix.matrix().block(0, 0, 3, 3) * transform.matrix().block(0, 0, 3, 3).inverse().transpose())); m_arrow.render(); #else auto render_axis = [this](const Transform3f& transform) { @@ -40,7 +41,7 @@ void CoordAxes::render(float emission_factor) glsafe(::glMultMatrixf(transform.data())); m_arrow.render(); glsafe(::glPopMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; if (!m_arrow.is_initialized()) @@ -60,38 +61,29 @@ void CoordAxes::render(float emission_factor) // x axis #if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::X()); -#else - m_arrow.set_color(-1, ColorRGBA::X()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(*shader, trafo * Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 })); #else + m_arrow.set_color(-1, ColorRGBA::X()); render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0 }).cast()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // y axis #if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::Y()); -#else - m_arrow.set_color(-1, ColorRGBA::Y()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(*shader, trafo * Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 })); #else + m_arrow.set_color(-1, ColorRGBA::Y()); render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0 }).cast()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // z axis #if ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.set_color(ColorRGBA::Z()); -#else - m_arrow.set_color(-1, ColorRGBA::Z()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES render_axis(*shader, trafo * Geometry::assemble_transform(m_origin)); #else + m_arrow.set_color(-1, ColorRGBA::Z()); render_axis(Geometry::assemble_transform(m_origin).cast()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); if (curr_shader != nullptr) diff --git a/src/slic3r/GUI/CoordAxes.hpp b/src/slic3r/GUI/CoordAxes.hpp index 9e49d1391f..d2e830a658 100644 --- a/src/slic3r/GUI/CoordAxes.hpp +++ b/src/slic3r/GUI/CoordAxes.hpp @@ -49,11 +49,11 @@ public: float get_tip_length() const { return m_tip_length; } float get_total_length() const { return m_stem_length + m_tip_length; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render(const Transform3d& trafo, float emission_factor = 0.0f); #else void render(float emission_factor = 0.0f); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL }; } // GUI diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp index dda50ec053..717af39ba8 100644 --- a/src/slic3r/GUI/DoubleSlider.cpp +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -86,24 +86,24 @@ Control::Control( wxWindow *parent, m_bmp_thumb_higher = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "thumb_right") : ScalableBitmap(this, "thumb_up")); m_bmp_thumb_lower = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "thumb_left") : ScalableBitmap(this, "thumb_down")); - m_thumb_size = m_bmp_thumb_lower.GetBmpSize(); + m_thumb_size = m_bmp_thumb_lower.GetSize(); 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_tick_icon_dim = m_bmp_add_tick_on.GetWidth(); 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_lock_icon_dim = m_bmp_one_layer_lock_on.GetWidth(); m_bmp_revert = ScalableBitmap(this, "undo"); - m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); + m_revert_icon_dim = m_bmp_revert.GetWidth(); m_bmp_cog = ScalableBitmap(this, "cog"); - m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); + m_cog_icon_dim = m_bmp_cog.GetWidth(); m_selection = ssUndef; m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume printing"))); @@ -155,26 +155,11 @@ void Control::msw_rescale() { m_font = GUI::wxGetApp().normal_font(); - 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; + m_thumb_size = m_bmp_thumb_lower.GetSize(); + m_tick_icon_dim = m_bmp_add_tick_on.GetWidth(); + m_lock_icon_dim = m_bmp_one_layer_lock_on.GetWidth(); + m_revert_icon_dim = m_bmp_revert.GetWidth(); + m_cog_icon_dim = m_bmp_cog.GetWidth(); SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); @@ -189,22 +174,18 @@ void Control::sys_color_changed() { GUI::wxGetApp().UpdateDarkUI(GetParent()); - 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.GetBmpWidth(); + m_bmp_add_tick_on .sys_color_changed(); + m_bmp_add_tick_off.sys_color_changed(); + m_bmp_del_tick_on .sys_color_changed(); + m_bmp_del_tick_off.sys_color_changed(); - 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.GetBmpWidth(); + m_bmp_one_layer_lock_on .sys_color_changed(); + m_bmp_one_layer_lock_off .sys_color_changed(); + m_bmp_one_layer_unlock_on .sys_color_changed(); + m_bmp_one_layer_unlock_off.sys_color_changed(); - m_bmp_revert.msw_rescale(); - m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); - m_bmp_cog.msw_rescale(); - m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); + m_bmp_revert.sys_color_changed(); + m_bmp_cog .sys_color_changed(); } int Control::GetActiveValue() const @@ -604,9 +585,12 @@ void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_ return; } - wxBitmap* icon = m_focus == fiActionIcon ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); + //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(); + ScalableBitmap* icon = m_focus == fiActionIcon ? &m_bmp_add_tick_off : &m_bmp_add_tick_on; 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(); + icon = m_focus == fiActionIcon ? &m_bmp_del_tick_off : &m_bmp_del_tick_on; 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; @@ -615,10 +599,12 @@ void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_ else is_horizontal() ? y_draw = pt_beg.y - m_tick_icon_dim-2 : x_draw = pt_end.x + 3; - if (m_draw_mode == dmSequentialFffPrint) - dc.DrawBitmap(create_scaled_bitmap("colorchange_add", nullptr, 16, true), x_draw, y_draw); + if (m_draw_mode == dmSequentialFffPrint) { + wxBitmap disabled_add = get_bmp_bundle("colorchange_add")->GetBitmapFor(this).ConvertToDisabled(); + dc.DrawBitmap(disabled_add, x_draw, y_draw); + } else - dc.DrawBitmap(*icon, x_draw, y_draw); + dc.DrawBitmap((*icon).get_bitmap(), 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); @@ -851,7 +837,7 @@ void Control::draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider { wxCoord x_draw = pos.x - int(0.5 * m_thumb_size.x); wxCoord y_draw = pos.y - int(0.5 * m_thumb_size.y); - dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.bmp() : m_bmp_thumb_higher.bmp(), x_draw, y_draw); + dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.get_bitmap() : m_bmp_thumb_higher.get_bitmap(), x_draw, y_draw); // Update thumb rect update_thumb_rect(x_draw, y_draw, selection); @@ -945,12 +931,12 @@ void Control::draw_ticks(wxDC& dc) // Draw icon for "Pause print", "Custom Gcode" or conflict tick if (!icon_name.empty()) { - wxBitmap icon = create_scaled_bitmap(icon_name); + wxBitmapBundle* icon = get_bmp_bundle(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); + dc.DrawBitmap(icon->GetBitmapFor(this), x_draw, y_draw); } } } @@ -1262,9 +1248,12 @@ void Control::draw_one_layer_icon(wxDC& dc) if (m_draw_mode == dmSequentialGCodeView) return; - const wxBitmap& icon = m_is_one_layer ? - m_focus == fiOneLayerIcon ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() : - m_focus == fiOneLayerIcon ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp(); + //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(); + const ScalableBitmap& icon = m_is_one_layer ? + m_focus == fiOneLayerIcon ? m_bmp_one_layer_lock_off : m_bmp_one_layer_lock_on : + m_focus == fiOneLayerIcon ? m_bmp_one_layer_unlock_off : m_bmp_one_layer_unlock_on; int width, height; get_size(&width, &height); @@ -1273,7 +1262,7 @@ void Control::draw_one_layer_icon(wxDC& dc) 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); + dc.DrawBitmap(icon.bmp().GetBitmapFor(this), 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); @@ -1291,7 +1280,7 @@ void Control::draw_revert_icon(wxDC& dc) 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); + dc.DrawBitmap(m_bmp_revert.get_bitmap(), 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); @@ -1315,7 +1304,7 @@ void Control::draw_cog_icon(wxDC& dc) is_horizontal() ? y_draw = height - m_cog_icon_dim - 2 : y_draw = height - 2; } - dc.DrawBitmap(m_bmp_cog.bmp(), x_draw, y_draw); + dc.DrawBitmap(m_bmp_cog.get_bitmap(), 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); @@ -1673,7 +1662,7 @@ void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current 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); + std::vector icons = get_extruder_color_icons(true); wxMenu* change_extruder_menu = new wxMenu(); @@ -1684,7 +1673,7 @@ void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current 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, + [this, i](wxCommandEvent&) { add_code_as_tick(ToolChange, i); }, icons[i-1], menu, [is_active_extruder]() { return !is_active_extruder; }, GUI::wxGetApp().plater()); } @@ -1722,7 +1711,7 @@ void Control::append_add_color_change_menu_item(wxMenu* menu, bool switch_curren 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_menu_bitmap("colorchange_add_m")); + add_color_change_menu_item->SetBitmap(*get_bmp_bundle("colorchange_add_m")); } } diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp index d72e1dd328..0368a2fe28 100644 --- a/src/slic3r/GUI/ExtraRenderers.cpp +++ b/src/slic3r/GUI/ExtraRenderers.cpp @@ -33,6 +33,15 @@ wxIMPLEMENT_DYNAMIC_CLASS(DataViewBitmapText, wxObject) IMPLEMENT_VARIANT_OBJECT(DataViewBitmapText) +static wxSize get_size(const wxBitmap& icon) +{ +#ifdef __WIN32__ + return icon.GetSize(); +#else + return icon.GetScaledSize(); +#endif +} + // --------------------------------------------------------- // BitmapTextRenderer // --------------------------------------------------------- @@ -124,11 +133,7 @@ bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { -#ifdef __APPLE__ - wxSize icon_sz = icon.GetScaledSize(); -#else - wxSize icon_sz = icon.GetSize(); -#endif + wxSize icon_sz = get_size(icon); dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2); xoffset = icon_sz.x + 4; } @@ -264,11 +269,13 @@ bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state) const wxBitmap& icon = m_value.GetBitmap(); if (icon.IsOk()) { - dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2); - xoffset = icon.GetWidth() + 4; + wxSize icon_sz = get_size(icon); + + dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.GetHeight()) / 2); + xoffset = icon_sz.GetWidth() + 4; if (rect.height==0) - rect.height= icon.GetHeight(); + rect.height= icon_sz.GetHeight(); } #ifdef _WIN32 @@ -297,7 +304,7 @@ wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelR if (can_create_editor_ctrl && !can_create_editor_ctrl()) return nullptr; - std::vector icons = get_extruder_color_icons(); + std::vector icons = get_extruder_color_icons(); if (icons.empty()) return nullptr; diff --git a/src/slic3r/GUI/ExtruderSequenceDialog.cpp b/src/slic3r/GUI/ExtruderSequenceDialog.cpp index 42313636ec..e1c6a7ce02 100644 --- a/src/slic3r/GUI/ExtruderSequenceDialog.cpp +++ b/src/slic3r/GUI/ExtruderSequenceDialog.cpp @@ -264,9 +264,6 @@ 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); diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index 8c5bfffc65..1a4eb5cc87 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -777,7 +777,7 @@ void SpinCtrl::BUILD() { break; } - const int min_val = m_opt.min == INT_MIN + const int min_val = m_opt.min == -FLT_MAX #ifdef __WXOSX__ // We will forcibly set the input value for SpinControl, since the value // inserted from the keyboard is not updated under OSX. @@ -786,8 +786,8 @@ void SpinCtrl::BUILD() { // less then min_val. || m_opt.min > 0 #endif - ? 0 : m_opt.min; - const int max_val = m_opt.max < 2147483647 ? m_opt.max : 2147483647; + ? (int)0 : (int)m_opt.min; + const int max_val = m_opt.max < FLT_MAX ? (int)m_opt.max : INT_MAX; auto temp = new wxSpinCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, wxTE_PROCESS_ENTER | wxSP_ARROW_KEYS @@ -848,7 +848,7 @@ void SpinCtrl::BUILD() { if (!parsed || value < INT_MIN || value > INT_MAX) tmp_value = UNDEF_VALUE; else { - tmp_value = std::min(std::max((int)value, m_opt.min), m_opt.max); + tmp_value = std::min(std::max((int)value, temp->GetMin()), temp->GetMax()); #ifdef __WXOSX__ // Forcibly set the input value for SpinControl, since the value // inserted from the keyboard or clipboard is not updated under OSX @@ -1616,8 +1616,8 @@ void SliderCtrl::BUILD() auto temp = new wxBoxSizer(wxHORIZONTAL); auto def_val = m_opt.get_default_value()->value; - auto min = m_opt.min == INT_MIN ? 0 : m_opt.min; - auto max = m_opt.max == INT_MAX ? 100 : m_opt.max; + auto min = m_opt.min == -FLT_MAX ? 0 : (int)m_opt.min; + auto max = m_opt.max == FLT_MAX ? 100 : INT_MAX; m_slider = new wxSlider(m_parent, wxID_ANY, def_val * m_scale, min * m_scale, max * m_scale, diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index 97db4ea7f0..60a06427d7 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -106,14 +106,14 @@ public: bool set_undo_to_sys_tooltip(const wxString* tip) { return m_undo_ui.set_undo_to_sys_tooltip(tip); } // ui items used for revert line value - bool has_undo_ui() const { return m_undo_ui.undo_bitmap != nullptr; } - const wxBitmap& undo_bitmap() const { return m_undo_ui.undo_bitmap->bmp(); } - const wxString* undo_tooltip() const { return m_undo_ui.undo_tooltip; } - const wxBitmap& undo_to_sys_bitmap() const { return m_undo_ui.undo_to_sys_bitmap->bmp(); } - const wxString* undo_to_sys_tooltip() const { return m_undo_ui.undo_to_sys_tooltip; } - const wxColour* label_color() const { return m_undo_ui.label_color; } - const bool blink() const { return m_undo_ui.blink; } - bool* get_blink_ptr() { return &m_undo_ui.blink; } + bool has_undo_ui() const { return m_undo_ui.undo_bitmap != nullptr; } + const wxBitmapBundle& undo_bitmap() const { return m_undo_ui.undo_bitmap->bmp(); } + const wxString* undo_tooltip() const { return m_undo_ui.undo_tooltip; } + const wxBitmapBundle& undo_to_sys_bitmap() const { return m_undo_ui.undo_to_sys_bitmap->bmp(); } + const wxString* undo_to_sys_tooltip() const { return m_undo_ui.undo_to_sys_tooltip; } + const wxColour* label_color() const { return m_undo_ui.label_color; } + const bool blink() const { return m_undo_ui.blink; } + bool* get_blink_ptr() { return &m_undo_ui.blink; } }; diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 1e28d12871..d1f380fb7a 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -51,7 +51,7 @@ static EMoveType buffer_type(unsigned char id) { // Equivalent to conversion to string with sprintf(buf, "%.2g", value) and conversion back to float, but faster. static float round_to_bin(const float value) { -// assert(value > 0); +// assert(value >= 0); constexpr float const scale [5] = { 100.f, 1000.f, 10000.f, 100000.f, 1000000.f }; constexpr float const invscale [5] = { 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f }; constexpr float const threshold[5] = { 0.095f, 0.0095f, 0.00095f, 0.000095f, 0.0000095f }; @@ -59,7 +59,12 @@ static float round_to_bin(const float value) int i = 0; // While the scaling factor is not yet large enough to get two integer digits after scaling and rounding: for (; value < threshold[i] && i < 4; ++ i) ; - return std::round(value * scale[i]) * invscale[i]; + // At least on MSVC std::round() calls a complex function, which is pretty expensive. + // our fast_round_up is much cheaper and it could be inlined. +// return std::round(value * scale[i]) * invscale[i]; + double a = value * scale[i]; + assert(std::abs(a) < double(std::numeric_limits::max())); + return fast_round_up(a) * invscale[i]; } void GCodeViewer::VBuffer::reset() @@ -69,6 +74,14 @@ void GCodeViewer::VBuffer::reset() glsafe(::glDeleteBuffers(static_cast(vbos.size()), static_cast(vbos.data()))); vbos.clear(); } + +#if ENABLE_GL_CORE_PROFILE + if (!vaos.empty()) { + glsafe(::glDeleteVertexArrays(static_cast(vaos.size()), static_cast(vaos.data()))); + vaos.clear(); + } +#endif // ENABLE_GL_CORE_PROFILE + sizes.clear(); count = 0; } @@ -176,7 +189,6 @@ void GCodeViewer::TBuffer::add_path(const GCodeProcessorResult::MoveVertex& move move.volumetric_rate(), move.extruder_id, move.cp_color_id, { { endpoint, endpoint } } }); } -#if ENABLE_SHOW_TOOLPATHS_COG void GCodeViewer::COG::render() { if (!m_visible) @@ -192,16 +204,18 @@ void GCodeViewer::COG::render() glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d matrix = camera.get_view_matrix() * Geometry::assemble_transform(cog()); + Transform3d model_matrix = Geometry::assemble_transform(cog()); if (m_fixed_size) { - const double inv_zoom = wxGetApp().plater()->get_camera().get_inv_zoom(); - matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), inv_zoom * Vec3d::Ones()); + const double inv_zoom = camera.get_inv_zoom(); + model_matrix = model_matrix * Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), inv_zoom * Vec3d::Ones()); } - shader->set_uniform("view_model_matrix", matrix); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); m_model.render(); #else glsafe(::glPushMatrix()); @@ -213,7 +227,7 @@ void GCodeViewer::COG::render() } m_model.render(); glsafe(::glPopMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); @@ -246,7 +260,6 @@ void GCodeViewer::COG::render() //imgui.end(); //ImGui::PopStyleVar(); } -#endif // ENABLE_SHOW_TOOLPATHS_COG #if ENABLE_PREVIEW_LAYER_TIME float GCodeViewer::Extrusions::Range::step_size(EType type) const @@ -302,6 +315,9 @@ void GCodeViewer::SequentialRangeCap::reset() { buffer = nullptr; ibo = 0; +#if ENABLE_GL_CORE_PROFILE + vao = 0; +#endif // ENABLE_GL_CORE_PROFILE vbo = 0; color = { 0.0f, 0.0f, 0.0f, 1.0f }; } @@ -336,22 +352,24 @@ void GCodeViewer::SequentialView::Marker::render() shader->start_using(); shader->set_uniform("emission_factor", 0.0f); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d matrix = camera.get_view_matrix() * m_world_transform.cast(); - shader->set_uniform("view_model_matrix", matrix); + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d model_matrix = m_world_transform.cast(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixf(m_world_transform.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_model.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); @@ -722,13 +740,17 @@ void GCodeViewer::init() } case EMoveType::Travel: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL buffer.vertices.format = VBuffer::EFormat::Position; +#if ENABLE_GL_CORE_PROFILE + buffer.shader = OpenGLManager::get_gl_info().is_core_profile() ? "dashed_thick_lines" : "flat"; +#else buffer.shader = "flat"; +#endif // ENABLE_GL_CORE_PROFILE #else buffer.vertices.format = VBuffer::EFormat::PositionNormal3; buffer.shader = "toolpaths_lines"; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL break; } } @@ -739,11 +761,6 @@ void GCodeViewer::init() // 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; } @@ -1084,9 +1101,7 @@ unsigned int GCodeViewer::get_options_visibility_flags() const 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)); -#if ENABLE_SHOW_TOOLPATHS_COG flags = set_flag(flags, static_cast(Preview::OptionType::CenterOfGravity), m_cog.is_visible()); -#endif // ENABLE_SHOW_TOOLPATHS_COG 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()); #if !ENABLE_PREVIEW_LAYOUT @@ -1110,9 +1125,7 @@ void GCodeViewer::set_options_visibility_from_flags(unsigned int flags) 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))); -#if ENABLE_SHOW_TOOLPATHS_COG m_cog.set_visible(is_flag_set(static_cast(Preview::OptionType::CenterOfGravity))); -#endif // ENABLE_SHOW_TOOLPATHS_COG 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))); #if !ENABLE_PREVIEW_LAYOUT @@ -1206,9 +1219,16 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const // get vertices/normals data from vertex buffers on gpu for (size_t i = 0; i < t_buffer.vertices.vbos.size(); ++i) { const size_t floats_count = t_buffer.vertices.sizes[i] / sizeof(float); - VertexBuffer vertices(floats_count); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, t_buffer.vertices.vbos[i])); +#if ENABLE_OPENGL_ES + const VertexBuffer vertices = *static_cast(::glMapBufferRange(GL_ARRAY_BUFFER, 0, + static_cast(t_buffer.vertices.sizes[i]), GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ARRAY_BUFFER)); +#else + VertexBuffer vertices(floats_count); glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, static_cast(t_buffer.vertices.sizes[i]), static_cast(vertices.data()))); +#endif // ENABLE_OPENGL_ES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); const size_t vertices_count = floats_count / floats_per_vertex; for (size_t j = 0; j < vertices_count; ++j) { @@ -1256,9 +1276,17 @@ void GCodeViewer::export_toolpaths_to_obj(const char* filename) const // get indices data from index buffer on gpu glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.ibo)); for (size_t j = 0; j < render_path.sizes.size(); ++j) { +#if ENABLE_OPENGL_ES + const IndexBuffer indices = *static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(render_path.offsets[j]), static_cast(render_path.sizes[j] * sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else IndexBuffer indices(render_path.sizes[j]); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(render_path.offsets[j]), static_cast(render_path.sizes[j] * sizeof(IBufferType)), static_cast(indices.data()))); +#endif // ENABLE_OPENGL_ES const size_t triangles_count = render_path.sizes[j] / 3; for (size_t k = 0; k < triangles_count; ++k) { @@ -1302,14 +1330,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) // format data into the buffers to be rendered as lines auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { -#if !ENABLE_GL_SHADERS_ATTRIBUTES - // x component of the normal to the current segment (the normal is parallel to the XY plane) - const Vec3f dir = (curr.position - prev.position).normalized(); - Vec3f normal(dir.y(), -dir.x(), 0.0); - normal.normalize(); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL auto add_vertex = [&vertices](const GCodeProcessorResult::MoveVertex& vertex) { // add position vertices.push_back(vertex.position.x()); @@ -1317,6 +1338,11 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) vertices.push_back(vertex.position.z()); }; #else + // x component of the normal to the current segment (the normal is parallel to the XY plane) + const Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f normal(dir.y(), -dir.x(), 0.0); + normal.normalize(); + auto add_vertex = [&vertices, &normal](const GCodeProcessorResult::MoveVertex& vertex) { // add position vertices.push_back(vertex.position.x()); @@ -1327,7 +1353,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) vertices.push_back(normal.y()); vertices.push_back(normal.z()); }; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // add previous vertex add_vertex(prev); @@ -1702,9 +1728,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) if (wxGetApp().is_editor()) m_contained_in_bed = wxGetApp().plater()->build_volume().all_paths_inside(gcode_result, m_paths_bounding_box); -#if ENABLE_SHOW_TOOLPATHS_COG m_cog.reset(); -#endif // ENABLE_SHOW_TOOLPATHS_COG m_sequential_view.gcode_ids.clear(); for (size_t i = 0; i < gcode_result.moves.size(); ++i) { @@ -1740,7 +1764,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) const GCodeProcessorResult::MoveVertex& prev = gcode_result.moves[i - 1]; -#if ENABLE_SHOW_TOOLPATHS_COG if (curr.type == EMoveType::Extrude && curr.extrusion_role != erSkirt && curr.extrusion_role != erSupportMaterial && @@ -1752,7 +1775,6 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) const Vec3d prev_pos = prev.position.cast(); m_cog.add_segment(curr_pos, prev_pos, curr.mm3_per_mm * (curr_pos - prev_pos).norm()); } -#endif // ENABLE_SHOW_TOOLPATHS_COG // update progress dialog ++progress_count; @@ -2046,13 +2068,27 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) ++m_statistics.vbuffers_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS - GLuint id = 0; - glsafe(::glGenBuffers(1, &id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, id)); +#if ENABLE_GL_CORE_PROFILE + GLuint vao_id = 0; + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &vao_id)); + glsafe(::glBindVertexArray(vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + + GLuint vbo_id = 0; + glsafe(::glGenBuffers(1, &vbo_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, vbo_id)); glsafe(::glBufferData(GL_ARRAY_BUFFER, size_bytes, v_buffer.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - t_buffer.vertices.vbos.push_back(static_cast(id)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glBindVertexArray(0)); + t_buffer.vertices.vaos.push_back(static_cast(vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + t_buffer.vertices.vbos.push_back(static_cast(vbo_id)); t_buffer.vertices.sizes.push_back(size_bytes); } } @@ -2080,9 +2116,16 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) using CurrVertexBuffer = std::pair; std::vector curr_vertex_buffers(m_buffers.size(), { 0, 0 }); +#if ENABLE_GL_CORE_PROFILE + // variable used to keep track of the vertex buffers ids + using VIndexList = std::vector; + std::vector vao_indices(m_buffers.size()); + std::vector vbo_indices(m_buffers.size()); +#else // variable used to keep track of the vertex buffers ids using VboIndexList = std::vector; std::vector vbo_indices(m_buffers.size()); +#endif // ENABLE_GL_CORE_PROFILE size_t seams_count = 0; @@ -2114,13 +2157,26 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) TBuffer& t_buffer = m_buffers[id]; MultiIndexBuffer& i_multibuffer = indices[id]; CurrVertexBuffer& curr_vertex_buffer = curr_vertex_buffers[id]; +#if ENABLE_GL_CORE_PROFILE + VIndexList& vao_index_list = vao_indices[id]; + VIndexList& vbo_index_list = vbo_indices[id]; +#else VboIndexList& vbo_index_list = vbo_indices[id]; +#endif // ENABLE_GL_CORE_PROFILE // ensure there is at least one index buffer if (i_multibuffer.empty()) { i_multibuffer.push_back(IndexBuffer()); +#if ENABLE_GL_CORE_PROFILE + if (!t_buffer.vertices.vaos.empty() && OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + vao_index_list.push_back(t_buffer.vertices.vaos[curr_vertex_buffer.first]); + if (!t_buffer.vertices.vbos.empty()) vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); +#else + if (!t_buffer.vertices.vbos.empty()) + vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); +#endif // ENABLE_GL_CORE_PROFILE } // if adding the indices for the current segment exceeds the threshold size of the current index buffer @@ -2128,6 +2184,10 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) size_t indiced_size_to_add = (t_buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) ? t_buffer.model.data.indices_size_bytes() : t_buffer.max_indices_per_segment_size_bytes(); if (i_multibuffer.back().size() * sizeof(IBufferType) >= IBUFFER_THRESHOLD_BYTES - indiced_size_to_add) { i_multibuffer.push_back(IndexBuffer()); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + vao_index_list.push_back(t_buffer.vertices.vaos[curr_vertex_buffer.first]); +#endif // ENABLE_GL_CORE_PROFILE vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { Path& last_path = t_buffer.paths.back(); @@ -2143,6 +2203,10 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) ++curr_vertex_buffer.first; curr_vertex_buffer.second = 0; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + vao_index_list.push_back(t_buffer.vertices.vaos[curr_vertex_buffer.first]); +#endif // ENABLE_GL_CORE_PROFILE vbo_index_list.push_back(t_buffer.vertices.vbos[curr_vertex_buffer.first]); if (t_buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::BatchedModel) { @@ -2200,6 +2264,10 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) t_buffer.indices.push_back(IBuffer()); IBuffer& ibuf = t_buffer.indices.back(); ibuf.count = size_elements; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + ibuf.vao = vao_indices[i][t_buffer.indices.size() - 1]; +#endif // ENABLE_GL_CORE_PROFILE ibuf.vbo = vbo_indices[i][t_buffer.indices.size() - 1]; #if ENABLE_GCODE_VIEWER_STATISTICS @@ -2264,7 +2332,7 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) if (move.type == EMoveType::Extrude) { #if ENABLE_PROCESS_G2_G3_LINES - if (move.extrusion_role != erNone && !move.internal_only) { + if (!move.internal_only) { #endif // ENABLE_PROCESS_G2_G3_LINES // layers zs const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); @@ -2630,14 +2698,30 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool // gets the vertex index from the index buffer on gpu const IBuffer& i_buffer = buffer.indices[sub_path.first.b_id]; - IBufferType index = 0; glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); +#if ENABLE_OPENGL_ES + IBufferType index = *static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else + IBufferType index = 0; glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast(offset * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&index))); +#endif // ENABLE_OPENGL_ES glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); // gets the position from the vertices buffer on gpu glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); +#if ENABLE_OPENGL_ES + sequential_view->current_position = *static_cast(::glMapBufferRange(GL_ARRAY_BUFFER, + static_cast(index * buffer.vertices.vertex_size_bytes()), + static_cast(buffer.vertices.position_size_bytes()), GL_MAP_READ_BIT)); + glcheck(); + glsafe(::glUnmapBuffer(GL_ARRAY_BUFFER)); +#else glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(sequential_view->current_position.data()))); +#endif // ENABLE_OPENGL_ES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); sequential_view->current_offset = Vec3f::Zero(); @@ -2829,6 +2913,10 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool SequentialRangeCap& cap = (*sequential_range_caps)[0]; const IBuffer& i_buffer = buffer.indices[ibuffer_id]; cap.buffer = &buffer; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + cap.vao = i_buffer.vao; +#endif // ENABLE_GL_CORE_PROFILE cap.vbo = i_buffer.vbo; // calculate offset into the index buffer @@ -2841,10 +2929,22 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool // extract indices from index buffer std::array indices{ 0, 0, 0, 0, 0, 0 }; glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); +#if ENABLE_OPENGL_ES + IBufferType* index_ptr = static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(offset * sizeof(IBufferType)), static_cast(14 * sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + indices[0] = *(index_ptr + 0); + indices[1] = *(index_ptr + 7); + indices[2] = *(index_ptr + 1); + indices[4] = *(index_ptr + 13); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 0) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 7) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 1) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 13) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[4]))); +#endif // ENABLE_OPENGL_ES glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); indices[3] = indices[0]; indices[5] = indices[1]; @@ -2874,6 +2974,10 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool SequentialRangeCap& cap = (*sequential_range_caps)[1]; const IBuffer& i_buffer = buffer.indices[ibuffer_id]; cap.buffer = &buffer; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + cap.vao = i_buffer.vao; +#endif // ENABLE_GL_CORE_PROFILE cap.vbo = i_buffer.vbo; // calculate offset into the index buffer @@ -2886,10 +2990,22 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool // extract indices from index buffer std::array indices{ 0, 0, 0, 0, 0, 0 }; glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); +#if ENABLE_OPENGL_ES + IBufferType* index_ptr = static_cast(::glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, + static_cast(offset * sizeof(IBufferType)), static_cast(17 * sizeof(IBufferType)), + GL_MAP_READ_BIT)); + glcheck(); + indices[0] = *(index_ptr + 2); + indices[1] = *(index_ptr + 4); + indices[2] = *(index_ptr + 10); + indices[5] = *(index_ptr + 16); + glsafe(::glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER)); +#else glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 2) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[0]))); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 4) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[1]))); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 10) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[2]))); glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast((offset + 16) * sizeof(IBufferType)), static_cast(sizeof(IBufferType)), static_cast(&indices[5]))); +#endif // ENABLE_OPENGL_ES glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); indices[3] = indices[0]; indices[4] = indices[2]; @@ -2938,17 +3054,19 @@ void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool void GCodeViewer::render_toolpaths() { -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL const std::array light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); +#if !ENABLE_GL_CORE_PROFILE const double zoom = camera.get_zoom(); +#endif // !ENABLE_GL_CORE_PROFILE -#if !ENABLE_GL_SHADERS_ATTRIBUTES - auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { +#if !ENABLE_LEGACY_OPENGL_REMOVAL + auto shader_init_as_lines = [light_intensity](GLShaderProgram &shader) { shader.set_uniform("light_intensity", light_intensity); }; -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL auto render_as_lines = [ #if ENABLE_GCODE_VIEWER_STATISTICS this @@ -2960,7 +3078,22 @@ void GCodeViewer::render_toolpaths() assert(! path.sizes.empty()); assert(! path.offsets.empty()); shader.set_uniform(uniform_color, path.color); +#if ENABLE_GL_CORE_PROFILE + const Camera& camera = wxGetApp().plater()->get_camera(); + const std::array& viewport = camera.get_viewport(); + const float zoom = float(camera.get_zoom()); + shader.set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader.set_uniform("width", (zoom < 5.0f) ? 0.5f : (0.5f + 5.0f * (zoom - 5.0f) / (100.0f - 5.0f))); + shader.set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + +#if ENABLE_OPENGL_ES + for (size_t i = 0; i < path.sizes.size(); ++i) { + glsafe(::glDrawElements(GL_LINES, (GLsizei)path.sizes[i], GL_UNSIGNED_SHORT, (const void*)path.offsets[i])); + } +#else glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#endif // ENABLE_OPENGL_ES #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_lines_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -2978,7 +3111,13 @@ void GCodeViewer::render_toolpaths() assert(! path.sizes.empty()); assert(! path.offsets.empty()); shader.set_uniform(uniform_color, path.color); +#if ENABLE_OPENGL_ES + for (size_t i = 0; i < path.sizes.size(); ++i) { + glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)path.sizes[i], GL_UNSIGNED_SHORT, (const void*)path.offsets[i])); + } +#else glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_SHORT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size())); +#endif // ENABLE_OPENGL_ES #if ENABLE_GCODE_VIEWER_STATISTICS ++m_statistics.gl_multi_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS @@ -3013,7 +3152,7 @@ void GCodeViewer::render_toolpaths() } }; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_GCODE_VIEWER_STATISTICS auto render_as_batched_model = [this](TBuffer& buffer, GLShaderProgram& shader, int position_id, int normal_id) { #else @@ -3025,7 +3164,7 @@ void GCodeViewer::render_toolpaths() #else auto render_as_batched_model = [](TBuffer& buffer, GLShaderProgram& shader) { #endif // ENABLE_GCODE_VIEWER_STATISTICS -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL struct Range { @@ -3039,8 +3178,12 @@ void GCodeViewer::render_toolpaths() for (size_t j = 0; j < buffer.indices.size(); ++j) { const IBuffer& i_buffer = buffer.indices[j]; buffer_range.last = buffer_range.first + i_buffer.count / indices_per_instance; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(i_buffer.vao)); +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableVertexAttribArray(position_id)); @@ -3048,10 +3191,10 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableVertexAttribArray(normal_id)); @@ -3059,7 +3202,7 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); @@ -3083,7 +3226,7 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (normal_id != -1) glsafe(::glDisableVertexAttribArray(normal_id)); if (position_id != -1) @@ -3093,8 +3236,12 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE buffer_range.first = buffer_range.last; } @@ -3118,12 +3265,11 @@ void GCodeViewer::render_toolpaths() shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d& view_matrix = camera.get_view_matrix(); - shader->set_uniform("view_model_matrix", view_matrix); +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::InstancedModel) { shader->set_uniform("emission_factor", 0.25f); @@ -3132,23 +3278,23 @@ void GCodeViewer::render_toolpaths() } else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::BatchedModel) { shader->set_uniform("emission_factor", 0.25f); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const int position_id = shader->get_attrib_location("v_position"); const int normal_id = shader->get_attrib_location("v_normal"); render_as_batched_model(buffer, *shader, position_id, normal_id); #else render_as_batched_model(buffer, *shader); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->set_uniform("emission_factor", 0.0f); } else { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const int position_id = shader->get_attrib_location("v_position"); const int normal_id = shader->get_attrib_location("v_normal"); #else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line) shader_init_as_lines(*shader); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const int uniform_color = shader->get_uniform_location("uniform_color"); auto it_path = buffer.render_paths.begin(); @@ -3160,8 +3306,12 @@ void GCodeViewer::render_toolpaths() // Not found. This shall not happen. continue; +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(i_buffer.vao)); +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, i_buffer.vbo)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, buffer.vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableVertexAttribArray(position_id)); @@ -3169,10 +3319,10 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const bool has_normals = buffer.vertices.normal_size_floats() > 0; if (has_normals) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, buffer.vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableVertexAttribArray(normal_id)); @@ -3180,7 +3330,7 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, i_buffer.ibo)); @@ -3189,7 +3339,12 @@ void GCodeViewer::render_toolpaths() switch (buffer.render_primitive_type) { case TBuffer::ERenderPrimitiveType::Line: { +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) + glsafe(::glLineWidth(static_cast(line_width(camera.get_zoom())))); +#else glsafe(::glLineWidth(static_cast(line_width(zoom)))); +#endif // ENABLE_GL_CORE_PROFILE render_as_lines(it_path, buffer.render_paths.end(), *shader, uniform_color); break; } @@ -3202,7 +3357,7 @@ void GCodeViewer::render_toolpaths() glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (normal_id != -1) glsafe(::glDisableVertexAttribArray(normal_id)); if (position_id != -1) @@ -3212,8 +3367,12 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE } } @@ -3233,18 +3392,21 @@ void GCodeViewer::render_toolpaths() shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d& view_matrix = camera.get_view_matrix(); - shader->set_uniform("view_model_matrix", view_matrix); +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); const int position_id = shader->get_attrib_location("v_position"); const int normal_id = shader->get_attrib_location("v_normal"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(cap.vao)); +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, cap.vbo)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, buffer->vertices.position_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); glsafe(::glEnableVertexAttribArray(position_id)); @@ -3252,10 +3414,10 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glVertexPointer(buffer->vertices.position_size_floats(), GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.position_offset_bytes())); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const bool has_normals = buffer->vertices.normal_size_floats() > 0; if (has_normals) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, buffer->vertices.normal_size_floats(), GL_FLOAT, GL_FALSE, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); glsafe(::glEnableVertexAttribArray(normal_id)); @@ -3263,7 +3425,7 @@ void GCodeViewer::render_toolpaths() #else glsafe(::glNormalPointer(GL_FLOAT, buffer->vertices.vertex_size_bytes(), (const void*)buffer->vertices.normal_offset_bytes())); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } shader->set_uniform("uniform_color", cap.color); @@ -3276,7 +3438,7 @@ void GCodeViewer::render_toolpaths() ++m_statistics.gl_triangles_calls_count; #endif // ENABLE_GCODE_VIEWER_STATISTICS -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (normal_id != -1) glsafe(::glDisableVertexAttribArray(normal_id)); if (position_id != -1) @@ -3286,9 +3448,13 @@ void GCodeViewer::render_toolpaths() glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE shader->stop_using(); }; @@ -3321,12 +3487,12 @@ void GCodeViewer::render_shells() // glsafe(::glDepthMask(GL_FALSE)); shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, camera.get_view_matrix(), camera.get_projection_matrix()); #else m_shells.volumes.render(GLVolumeCollection::ERenderType::Transparent, true, wxGetApp().plater()->get_camera().get_view_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); // glsafe(::glDepthMask(GL_TRUE)); @@ -4453,7 +4619,6 @@ void GCodeViewer::render_legend(float& legend_height) #endif // ENABLE_LEGEND_TOOLBAR_ICONS }); ImGui::SameLine(); -#if ENABLE_SHOW_TOOLPATHS_COG #if ENABLE_LEGEND_TOOLBAR_ICONS toggle_button(Preview::OptionType::CenterOfGravity, _u8L("Center of gravity"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { image_icon(window, pos, size, ImGui::LegendCOG); @@ -4481,7 +4646,6 @@ void GCodeViewer::render_legend(float& legend_height) }); #endif // ENABLE_LEGEND_TOOLBAR_ICONS ImGui::SameLine(); -#endif // ENABLE_SHOW_TOOLPATHS_COG if (!wxGetApp().is_gcode_viewer()) { #if ENABLE_LEGEND_TOOLBAR_ICONS toggle_button(Preview::OptionType::Shells, _u8L("Shells"), [image_icon](ImGuiWindow& window, const ImVec2& pos, float size) { @@ -4670,4 +4834,3 @@ ColorRGBA GCodeViewer::option_color(EMoveType move_type) const } // namespace GUI } // namespace Slic3r - diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp index 51adcab5a4..81cc6e39a8 100644 --- a/src/slic3r/GUI/GCodeViewer.hpp +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -62,6 +62,10 @@ class GCodeViewer }; EFormat format{ EFormat::Position }; +#if ENABLE_GL_CORE_PROFILE + // vaos id + std::vector vaos; +#endif // ENABLE_GL_CORE_PROFILE // vbos id std::vector vbos; // sizes of the buffers, in bytes, used in export to obj @@ -162,6 +166,10 @@ class GCodeViewer // ibo buffer containing indices data (for lines/triangles) used to render a specific toolpath type struct IBuffer { +#if ENABLE_GL_CORE_PROFILE + // id of the associated vertex array buffer + unsigned int vao{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE // id of the associated vertex buffer unsigned int vbo{ 0 }; // ibo id @@ -379,7 +387,6 @@ class GCodeViewer bool visible{ false }; }; -#if ENABLE_SHOW_TOOLPATHS_COG // helper to render center of gravity class COG { @@ -423,7 +430,6 @@ class GCodeViewer #endif // ENABLE_LEGACY_OPENGL_REMOVAL } }; -#endif // ENABLE_SHOW_TOOLPATHS_COG // helper to render extrusion paths struct Extrusions @@ -558,8 +564,11 @@ class GCodeViewer struct SequentialRangeCap { TBuffer* buffer{ nullptr }; - unsigned int ibo{ 0 }; +#if ENABLE_GL_CORE_PROFILE + unsigned int vao{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE unsigned int vbo{ 0 }; + unsigned int ibo{ 0 }; ColorRGBA color; ~SequentialRangeCap(); @@ -780,9 +789,7 @@ private: Extrusions m_extrusions; SequentialView m_sequential_view; Shells m_shells; -#if ENABLE_SHOW_TOOLPATHS_COG COG m_cog; -#endif // ENABLE_SHOW_TOOLPATHS_COG EViewType m_view_type{ EViewType::FeatureType }; bool m_legend_enabled{ true }; #if ENABLE_PREVIEW_LAYOUT @@ -798,7 +805,6 @@ private: #if ENABLE_GCODE_VIEWER_STATISTICS Statistics m_statistics; #endif // ENABLE_GCODE_VIEWER_STATISTICS - std::array m_detected_point_sizes = { 0.0f, 0.0f }; GCodeProcessorResult::SettingsIds m_settings_ids; std::array m_sequential_range_caps; #if ENABLE_PREVIEW_LAYER_TIME @@ -832,9 +838,7 @@ public: void reset(); void render(); -#if ENABLE_SHOW_TOOLPATHS_COG void render_cog() { m_cog.render(); } -#endif // ENABLE_SHOW_TOOLPATHS_COG bool has_data() const { return !m_roles.empty(); } bool can_export_toolpaths() const; @@ -906,4 +910,3 @@ private: } // namespace Slic3r #endif // slic3r_GCodeViewer_hpp_ - diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 492469c2b0..ea89139599 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -124,8 +124,10 @@ void GLCanvas3D::LayersEditing::init() { 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)); - glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)); + if (!OpenGLManager::get_gl_info().is_core_profile() || !OpenGLManager::get_gl_info().is_mesa()) { + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + } glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1)); @@ -264,21 +266,14 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) GLCanvas3D::LayersEditing::s_overlay_window_width = ImGui::GetWindowSize().x /*+ (float)m_layers_texture.width/4*/; imgui.end(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL render_active_object_annotations(canvas); render_profile(canvas); #else const Rect& bar_rect = get_bar_rect_viewport(canvas); -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_profile.dirty = m_profile.old_bar_rect != bar_rect; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL render_active_object_annotations(canvas, bar_rect); render_profile(bar_rect); -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_profile.old_bar_rect = bar_rect; - m_profile.dirty = false; #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#endif // ENABLE_GL_SHADERS_ATTRIBUTES } float GLCanvas3D::LayersEditing::get_cursor_z_relative(const GLCanvas3D& canvas) @@ -312,7 +307,7 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) return { w - thickness_bar_width(canvas), 0.0f, w, h }; } -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) { const Size& cnv_size = canvas.get_canvas_size(); @@ -321,7 +316,7 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); return { (half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom }; } -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL bool GLCanvas3D::LayersEditing::is_initialized() const { @@ -354,21 +349,20 @@ std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) con return ret; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas) -#else -void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES { -#if ENABLE_GL_SHADERS_ATTRIBUTES const Size cnv_size = canvas.get_canvas_size(); - const float cnv_width = (float)cnv_size.get_width(); + const float cnv_width = (float)cnv_size.get_width(); const float cnv_height = (float)cnv_size.get_height(); if (cnv_width == 0.0f || cnv_height == 0.0f) return; const float cnv_inv_width = 1.0f / cnv_width; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#else +void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) +{ +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); if (shader == nullptr) return; @@ -380,46 +374,35 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 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); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); - shader->set_uniform("normal_matrix", (Matrix3d)Eigen::Matrix3d::Identity()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + shader->set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1)); glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id)); // Render the color bar #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_profile.background.is_initialized() || m_profile.old_canvas_width != cnv_width) { m_profile.old_canvas_width = cnv_width; -#else - if (!m_profile.background.is_initialized() || m_profile.dirty) { -#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_profile.background.reset(); GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P2T2 }; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3T2 }; init_data.reserve_vertices(4); init_data.reserve_indices(6); // vertices -#if ENABLE_GL_SHADERS_ATTRIBUTES const float l = 1.0f - 2.0f * THICKNESS_BAR_WIDTH * cnv_inv_width; const float r = 1.0f; const float t = 1.0f; const float b = -1.0f; -#else - const float l = bar_rect.get_left(); - const float r = bar_rect.get_right(); - const float t = bar_rect.get_top(); - const float b = bar_rect.get_bottom(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - init_data.add_vertex(Vec2f(l, b), Vec2f(0.0f, 0.0f)); - init_data.add_vertex(Vec2f(r, b), Vec2f(1.0f, 0.0f)); - init_data.add_vertex(Vec2f(r, t), Vec2f(1.0f, 1.0f)); - init_data.add_vertex(Vec2f(l, t), Vec2f(0.0f, 1.0f)); + init_data.add_vertex(Vec3f(l, b, 0.0f), Vec3f::UnitZ(), Vec2f(0.0f, 0.0f)); + init_data.add_vertex(Vec3f(r, b, 0.0f), Vec3f::UnitZ(), Vec2f(1.0f, 0.0f)); + init_data.add_vertex(Vec3f(r, t, 0.0f), Vec3f::UnitZ(), Vec2f(1.0f, 1.0f)); + init_data.add_vertex(Vec3f(l, t, 0.0f), Vec3f::UnitZ(), Vec2f(0.0f, 1.0f)); // indices init_data.add_triangle(0, 1, 2); @@ -449,18 +432,18 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3 shader->stop_using(); } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLCanvas3D::LayersEditing::render_profile(const GLCanvas3D& canvas) #else void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { //FIXME show some kind of legend. if (!m_slicing_parameters) return; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Size cnv_size = canvas.get_canvas_size(); const float cnv_width = (float)cnv_size.get_width(); const float cnv_height = (float)cnv_size.get_height(); @@ -477,15 +460,11 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) // Make the vertical bar a bit wider so the layer height curve does not touch the edge of the bar region. const float scale_x = bar_rect.get_width() / float(1.12 * m_slicing_parameters->max_layer_height); const float scale_y = bar_rect.get_height() / m_object_max_z; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_LEGACY_OPENGL_REMOVAL // Baseline -#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_profile.baseline.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile) { -#else - if (!m_profile.baseline.is_initialized() || m_profile.dirty) { -#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_profile.baseline.reset(); GLModel::Geometry init_data; @@ -495,15 +474,9 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) init_data.reserve_indices(2); // vertices -#if ENABLE_GL_SHADERS_ATTRIBUTES const float axis_x = 2.0f * ((cnv_width - THICKNESS_BAR_WIDTH + float(m_slicing_parameters->layer_height) * scale_x) * cnv_inv_width - 0.5f); init_data.add_vertex(Vec2f(axis_x, -1.0f)); init_data.add_vertex(Vec2f(axis_x, 1.0f)); -#else - const float x = bar_rect.get_left() + float(m_slicing_parameters->layer_height) * scale_x; - init_data.add_vertex(Vec2f(x, bar_rect.get_bottom())); - init_data.add_vertex(Vec2f(x, bar_rect.get_top())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES // indices init_data.add_line(0, 1); @@ -511,11 +484,7 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) m_profile.baseline.init_from(std::move(init_data)); } -#if ENABLE_GL_SHADERS_ATTRIBUTES if (!m_profile.profile.is_initialized() || m_profile.old_layer_height_profile != m_layer_height_profile) { -#else - if (!m_profile.profile.is_initialized() || m_profile.dirty || m_profile.old_layer_height_profile != m_layer_height_profile) { -#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_profile.old_layer_height_profile = m_layer_height_profile; m_profile.profile.reset(); @@ -527,26 +496,29 @@ void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) // vertices + indices for (unsigned int i = 0; i < (unsigned int)m_layer_height_profile.size(); i += 2) { -#if ENABLE_GL_SHADERS_ATTRIBUTES init_data.add_vertex(Vec2f(2.0f * ((cnv_width - THICKNESS_BAR_WIDTH + float(m_layer_height_profile[i + 1]) * scale_x) * cnv_inv_width - 0.5f), - 2.0f * (float(m_layer_height_profile[i]) * scale_y * cnv_inv_height - 0.5))); -#else - init_data.add_vertex(Vec2f(bar_rect.get_left() + float(m_layer_height_profile[i + 1]) * scale_x, - bar_rect.get_bottom() + float(m_layer_height_profile[i]) * scale_y)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + 2.0f * (float(m_layer_height_profile[i]) * scale_y * cnv_inv_height - 0.5))); init_data.add_index(i / 2); } m_profile.profile.init_from(std::move(init_data)); } +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = wxGetApp().plater()->get_camera().get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE m_profile.baseline.render(); m_profile.profile.render(); shader->stop_using(); @@ -594,10 +566,10 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G 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)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Initialize the layer height texture mapping. const GLsizei w = (GLsizei)m_layers_texture.width; @@ -617,16 +589,18 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G shader->set_uniform("volume_world_matrix", glvolume->world_matrix()); shader->set_uniform("object_max_z", 0.0f); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d view_model_matrix = camera.get_view_matrix() * glvolume->world_matrix(); - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d model_matrix = glvolume->world_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glvolume->render(); } // Revert back to the previous shader. - glBindTexture(GL_TEXTURE_2D, 0); + glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); } void GLCanvas3D::LayersEditing::adjust_layer_height_profile() @@ -1066,11 +1040,11 @@ void GLCanvas3D::SequentialPrintClearance::render() shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_DEPTH_TEST)); glsafe(::glDisable(GL_CULL_FACE)); @@ -1204,9 +1178,6 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D &bed) , m_tab_down(false) , m_cursor_type(Standard) , m_reload_delayed(false) -#if ENABLE_RENDER_PICKING_PASS - , m_show_picking_texture(false) -#endif // ENABLE_RENDER_PICKING_PASS , m_render_sla_auxiliaries(true) , m_labels(*this) , m_slope(m_volumes) @@ -1244,7 +1215,11 @@ bool GLCanvas3D::init() return false; glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f)); +#if ENABLE_OPENGL_ES + glsafe(::glClearDepthf(1.0f)); +#else glsafe(::glClearDepth(1.0f)); +#endif // ENABLE_OPENGL_ES glsafe(::glDepthFunc(GL_LESS)); @@ -1658,7 +1633,12 @@ void GLCanvas3D::render() // 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(); +#if ENABLE_RAYCAST_PICKING + camera.set_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height())); + camera.apply_viewport(); +#else camera.apply_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height())); +#endif // ENABLE_RAYCAST_PICKING if (camera.requires_zoom_to_bed) { zoom_to_bed(); @@ -1681,22 +1661,22 @@ void GLCanvas3D::render() wxGetApp().imgui()->new_frame(); if (m_picking_enabled) { -#if ENABLE_NEW_RECTANGLE_SELECTION if (m_rectangle_selection.is_dragging() && !m_rectangle_selection.is_empty()) -#else - if (m_rectangle_selection.is_dragging()) -#endif // ENABLE_NEW_RECTANGLE_SELECTION // picking pass using rectangle selection _rectangular_selection_picking_pass(); else if (!m_volumes.empty()) // regular picking pass _picking_pass(); +#if ENABLE_RAYCAST_PICKING_DEBUG + else { + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + imgui.text("Picking disabled"); + imgui.end(); + } +#endif // ENABLE_RAYCAST_PICKING_DEBUG } -#if ENABLE_RENDER_PICKING_PASS - if (!m_picking_enabled || !m_show_picking_texture) { -#endif // ENABLE_RENDER_PICKING_PASS - const bool is_looking_downward = camera.is_looking_downward(); // draw scene @@ -1709,21 +1689,19 @@ void GLCanvas3D::render() _render_sla_slices(); _render_selection(); if (is_looking_downward) -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), false, true); #else _render_bed(false, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL _render_objects(GLVolumeCollection::ERenderType::Transparent); _render_sequential_clearance(); #if ENABLE_RENDER_SELECTION_CENTER _render_selection_center(); #endif // ENABLE_RENDER_SELECTION_CENTER -#if ENABLE_SHOW_TOOLPATHS_COG if (!m_main_toolbar.is_enabled()) _render_gcode_cog(); -#endif // ENABLE_SHOW_TOOLPATHS_COG // we need to set the mouse's scene position here because the depth buffer // could be invalidated by the following gizmo render methods @@ -1736,14 +1714,16 @@ void GLCanvas3D::render() _render_selection_sidebar_hints(); _render_current_gizmo(); if (!is_looking_downward) -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL _render_bed(camera.get_view_matrix(), camera.get_projection_matrix(), true, true); #else _render_bed(true, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_RENDER_PICKING_PASS - } -#endif // ENABLE_RENDER_PICKING_PASS +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_RAYCAST_PICKING_DEBUG + if (m_picking_enabled && !m_mouse.dragging && !m_gizmos.is_dragging() && !m_rectangle_selection.is_dragging()) + m_scene_raycaster.render_hit(camera); +#endif // ENABLE_RAYCAST_PICKING_DEBUG #if ENABLE_SHOW_CAMERA_TARGET _render_camera_target(); @@ -1849,6 +1829,9 @@ void GLCanvas3D::select_all() void GLCanvas3D::deselect_all() { + if (m_selection.is_empty()) + return; + m_selection.remove_all(); wxGetApp().obj_manipul()->set_dirty(); m_gizmos.reset_all_states(); @@ -2097,6 +2080,9 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re if (volume->is_wipe_tower) { // There is only one wipe tower. assert(volume_idx_wipe_tower_old == -1); +#if ENABLE_OPENGL_ES + m_wipe_tower_mesh.clear(); +#endif // ENABLE_OPENGL_ES volume_idx_wipe_tower_old = (int)volume_id; } if (!m_reload_delayed) { @@ -2247,6 +2233,9 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re #else #if ENABLE_LEGACY_OPENGL_REMOVAL volume.model.init_from(mesh); +#if ENABLE_RAYCAST_PICKING + volume.mesh_raycaster = std::make_unique(std::make_shared(mesh)); +#endif // ENABLE_RAYCAST_PICKING #else volume.indexed_vertex_array.load_mesh(mesh); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -2262,7 +2251,13 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re #endif // ENABLE_LEGACY_OPENGL_REMOVAL #else #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + const TriangleMesh& new_mesh = m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh(); + volume.model.init_from(new_mesh); + volume.mesh_raycaster = std::make_unique(std::make_shared(new_mesh)); +#else volume.model.init_from(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh()); +#endif // ENABLE_RAYCAST_PICKING #else volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -2336,13 +2331,25 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL +#if ENABLE_OPENGL_ES + int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( + x, y, w, depth, (float)height, a, !print->is_step_done(psWipeTower), + brim_width, &m_wipe_tower_mesh); +#else int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( x, y, w, depth, (float)height, a, !print->is_step_done(psWipeTower), brim_width); +#endif // ENABLE_OPENGL_ES +#else +#if ENABLE_OPENGL_ES + int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( + 1000, x, y, w, depth, (float)height, a, !print->is_step_done(psWipeTower), + brim_width, &m_wipe_tower_mesh); #else int volume_idx_wipe_tower_new = m_volumes.load_wipe_tower_preview( 1000, x, y, w, depth, (float)height, a, !print->is_step_done(psWipeTower), brim_width); +#endif // ENABLE_OPENGL_ES #endif // ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL #else #if ENABLE_WIPETOWER_OBJECTID_1000_REMOVAL @@ -2410,6 +2417,23 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re manip->set_dirty(); } +#if ENABLE_RAYCAST_PICKING + // refresh volume raycasters for picking + m_scene_raycaster.remove_raycasters(SceneRaycaster::EType::Volume); + for (size_t i = 0; i < m_volumes.volumes.size(); ++i) { + assert(m_volumes.volumes[i]->mesh_raycaster != nullptr); + add_raycaster_for_picking(SceneRaycaster::EType::Volume, i, *m_volumes.volumes[i]->mesh_raycaster, m_volumes.volumes[i]->world_matrix()); + } + + // refresh gizmo elements raycasters for picking + GLGizmoBase* curr_gizmo = m_gizmos.get_current(); + if (curr_gizmo != nullptr) + curr_gizmo->unregister_raycasters_for_picking(); + m_scene_raycaster.remove_raycasters(SceneRaycaster::EType::Gizmo); + if (curr_gizmo != nullptr && !m_selection.is_empty()) + curr_gizmo->register_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + // and force this canvas to be redrawn. m_dirty = true; } @@ -2782,14 +2806,6 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) } case 'O': case 'o': { _update_camera_zoom(-1.0); break; } -#if ENABLE_RENDER_PICKING_PASS - case 'T': - case 't': { - m_show_picking_texture = !m_show_picking_texture; - m_dirty = true; - break; - } -#endif // ENABLE_RENDER_PICKING_PASS case 'Z': case 'z': { if (!m_selection.is_empty()) @@ -2962,14 +2978,9 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) _update_selection_from_hover(); m_rectangle_selection.stop_dragging(); m_mouse.ignore_left_up = true; -#if !ENABLE_NEW_RECTANGLE_SELECTION - m_dirty = true; -#endif // !ENABLE_NEW_RECTANGLE_SELECTION } m_shift_kar_filter.reset_count(); -#if ENABLE_NEW_RECTANGLE_SELECTION m_dirty = true; -#endif // ENABLE_NEW_RECTANGLE_SELECTION // set_cursor(Standard); } else if (keyCode == WXK_ALT) { @@ -2983,7 +2994,11 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) { #if ENABLE_NEW_CAMERA_MOVEMENTS +#if ENABLE_RAYCAST_PICKING + if (m_mouse.dragging && !m_moving) { +#else if (m_mouse.dragging) { +#endif // ENABLE_RAYCAST_PICKING // if the user releases CTRL while rotating the 3D scene // prevent from moving the selected volume m_mouse.drag.move_volume_idx = -1; @@ -3027,12 +3042,10 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) m_mouse.ignore_left_up = false; // set_cursor(Cross); } -#if ENABLE_NEW_RECTANGLE_SELECTION if (m_shift_kar_filter.is_first()) m_dirty = true; m_shift_kar_filter.increase_count(); -#endif // ENABLE_NEW_RECTANGLE_SELECTION } else if (keyCode == WXK_ALT) { if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { @@ -3298,9 +3311,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) mouse_up_cleanup(); m_mouse.set_start_position_3D_as_invalid(); -#if ENABLE_OBJECT_MANIPULATOR_FOCUS - handle_sidebar_focus_event("", false); -#endif // ENABLE_OBJECT_MANIPULATOR_FOCUS return; } @@ -3308,9 +3318,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) mouse_up_cleanup(); m_mouse.set_start_position_3D_as_invalid(); -#if ENABLE_OBJECT_MANIPULATOR_FOCUS - handle_sidebar_focus_event("", false); -#endif // ENABLE_OBJECT_MANIPULATOR_FOCUS return; } @@ -3318,9 +3325,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) mouse_up_cleanup(); m_mouse.set_start_position_3D_as_invalid(); -#if ENABLE_OBJECT_MANIPULATOR_FOCUS - handle_sidebar_focus_event("", false); -#endif // ENABLE_OBJECT_MANIPULATOR_FOCUS return; } @@ -3328,9 +3332,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) mouse_up_cleanup(); m_mouse.set_start_position_3D_as_invalid(); -#if ENABLE_OBJECT_MANIPULATOR_FOCUS - handle_sidebar_focus_event("", false); -#endif // ENABLE_OBJECT_MANIPULATOR_FOCUS return; } @@ -3375,9 +3376,6 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } -#if ENABLE_OBJECT_MANIPULATOR_FOCUS - handle_sidebar_focus_event("", false); -#endif // ENABLE_OBJECT_MANIPULATOR_FOCUS return; } @@ -3392,39 +3390,27 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_mouse.set_move_start_threshold_position_2D_as_invalid(); } -#if ENABLE_OBJECT_MANIPULATOR_FOCUS - if (evt.ButtonDown()) { - std::string curr_sidebar_field = m_sidebar_field; - handle_sidebar_focus_event("", false); - if (boost::algorithm::istarts_with(curr_sidebar_field, "layer")) - // restore visibility of layers hints after left clicking on the 3D scene - m_sidebar_field = curr_sidebar_field; - if (wxWindow::FindFocus() != m_canvas) - // Grab keyboard focus on any mouse click event. - m_canvas->SetFocus(); - } -#else if (evt.ButtonDown() && wxWindow::FindFocus() != m_canvas) // Grab keyboard focus on any mouse click event. m_canvas->SetFocus(); -#endif // ENABLE_OBJECT_MANIPULATOR_FOCUS if (evt.Entering()) { //#if defined(__WXMSW__) || defined(__linux__) // // On Windows and Linux needs focus in order to catch key events -#if !ENABLE_OBJECT_MANIPULATOR_FOCUS - // Set focus in order to remove it from sidebar fields -#endif // !ENABLE_OBJECT_MANIPULATOR_FOCUS + // Set focus in order to remove it from object list if (m_canvas != nullptr) { -#if !ENABLE_OBJECT_MANIPULATOR_FOCUS - // Only set focus, if the top level window of this canvas is active. + // Only set focus, if the top level window of this canvas is active + // and ObjectList has a focus auto p = dynamic_cast(evt.GetEventObject()); while (p->GetParent()) p = p->GetParent(); - auto *top_level_wnd = dynamic_cast(p); - if (top_level_wnd && top_level_wnd->IsActive()) +#ifdef __WIN32__ + wxWindow* const obj_list = wxGetApp().obj_list()->GetMainWindow(); +#else + wxWindow* const obj_list = wxGetApp().obj_list(); +#endif + if (obj_list == p->FindFocus()) m_canvas->SetFocus(); -#endif // !ENABLE_OBJECT_MANIPULATOR_FOCUS 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 @@ -3458,19 +3444,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_layers_editing.state = LayersEditing::Editing; _perform_layer_editing_action(&evt); } -#if !ENABLE_NEW_RECTANGLE_SELECTION - 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_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation) { - m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); - m_dirty = true; - } - } -#endif // !ENABLE_NEW_RECTANGLE_SELECTION else { -#if ENABLE_NEW_RECTANGLE_SELECTION const bool rectangle_selection_dragging = m_rectangle_selection.is_dragging(); if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) { if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports && @@ -3481,39 +3455,23 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) m_dirty = true; } } -#endif // ENABLE_NEW_RECTANGLE_SELECTION // Select volume in this 3D canvas. // 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 ENABLE_NEW_RECTANGLE_SELECTION if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled()) && !rectangle_selection_dragging) { -#else - if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) { -#endif // ENABLE_NEW_RECTANGLE_SELECTION 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); -#if ENABLE_NEW_RECTANGLE_SELECTION bool shift_down = evt.ShiftDown(); -#else - bool ctrl_down = evt.CmdDown(); -#endif // ENABLE_NEW_RECTANGLE_SELECTION Selection::IndicesList curr_idxs = m_selection.get_volume_idxs(); -#if ENABLE_NEW_RECTANGLE_SELECTION if (already_selected && shift_down) m_selection.remove(volume_idx); else { m_selection.add(volume_idx, !shift_down, true); -#else - if (already_selected && ctrl_down) - m_selection.remove(volume_idx); - else { - m_selection.add(volume_idx, !ctrl_down, true); -#endif // ENABLE_NEW_RECTANGLE_SELECTION m_mouse.drag.move_requires_threshold = !already_selected; if (already_selected) m_mouse.set_move_start_threshold_position_2D_as_invalid(); @@ -3535,11 +3493,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } -#if ENABLE_NEW_RECTANGLE_SELECTION if (!m_hover_volume_idxs.empty() && !m_rectangle_selection.is_dragging()) { -#else - if (!m_hover_volume_idxs.empty()) { -#endif // ENABLE_NEW_RECTANGLE_SELECTION 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. const int volume_idx = get_first_hover_volume_idx(); @@ -3555,7 +3509,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #endif // ENABLE_NEW_CAMERA_MOVEMENTS m_mouse.drag.start_position_3D = m_mouse.scene_position; m_sequential_print_clearance_first_displacement = true; +#if !ENABLE_RAYCAST_PICKING m_moving = true; +#endif // !ENABLE_RAYCAST_PICKING } } } @@ -3567,7 +3523,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #else else if (evt.Dragging() && evt.LeftIsDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) { #endif // ENABLE_NEW_CAMERA_MOVEMENTS - if (!m_mouse.drag.move_requires_threshold) { + 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 @@ -3603,6 +3559,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } #if ENABLE_WORLD_COORDINATE +#if ENABLE_RAYCAST_PICKING + m_moving = true; +#endif // ENABLE_RAYCAST_PICKING TransformationType trafo_type; trafo_type.set_relative(); m_selection.translate(cur_pos - m_mouse.drag.start_position_3D, trafo_type); @@ -3616,13 +3575,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) { -#if ENABLE_NEW_RECTANGLE_SELECTION // keeps the mouse position updated while dragging the selection rectangle m_mouse.position = pos.cast(); m_rectangle_selection.dragging(m_mouse.position); -#else - m_rectangle_selection.dragging(pos.cast()); -#endif // ENABLE_NEW_RECTANGLE_SELECTION m_dirty = true; } else if (evt.Dragging()) { @@ -3638,29 +3593,35 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) #if ENABLE_NEW_CAMERA_MOVEMENTS else if (evt.LeftIsDown()) { // if dragging over blank area with left button, rotate - if ((any_gizmo_active || evt.CmdDown() || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { +#if ENABLE_RAYCAST_PICKING + if (!m_moving) { +#endif // ENABLE_RAYCAST_PICKING + if ((any_gizmo_active || evt.CmdDown() || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { #else // if dragging over blank area with left button, rotate else if (evt.LeftIsDown()) { if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) { #endif // ENABLE_NEW_CAMERA_MOVEMENTS - const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.0) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.0); - 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.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(), current_printer_technology() != ptSLA); - } + const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.0) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.0); + 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.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(), current_printer_technology() != ptSLA); + } - m_dirty = true; + m_dirty = true; + } + m_mouse.drag.start_position_3D = Vec3d((double)pos.x(), (double)pos.y(), 0.0); +#if ENABLE_RAYCAST_PICKING } - m_mouse.drag.start_position_3D = Vec3d((double)pos.x(), (double)pos.y(), 0.0); +#endif // ENABLE_RAYCAST_PICKING } else if (evt.MiddleIsDown() || evt.RightIsDown()) { // If dragging over blank area with right/middle button, pan. @@ -3685,6 +3646,10 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) } } else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) { +#if ENABLE_RAYCAST_PICKING + m_mouse.position = pos.cast(); +#endif // ENABLE_RAYCAST_PICKING + if (m_layers_editing.state != LayersEditing::Unknown) { m_layers_editing.state = LayersEditing::Unknown; _stop_timer(); @@ -3709,7 +3674,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) deselect_all(); } else if (evt.RightUp()) { +#if !ENABLE_RAYCAST_PICKING m_mouse.position = pos.cast(); +#endif // !ENABLE_RAYCAST_PICKING // 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(); @@ -3922,12 +3889,13 @@ void GLCanvas3D::do_rotate(const std::string& snapshot_type) for (int i = 0; i < static_cast(m_model->objects.size()); ++i) { const ModelObject* obj = m_model->objects[i]; for (int j = 0; j < static_cast(obj->instances.size()); ++j) { - if (snapshot_type.empty() && m_selection.get_object_idx() == i) { + if (snapshot_type == L("Gizmo-Place on Face") && m_selection.get_object_idx() == i) { // This means we are flattening this object. In that case pretend // that it is not sinking (even if it is), so it is placed on bed // later on (whatever is sinking will be left sinking). min_zs[{ i, j }] = SINKING_Z_THRESHOLD; - } else + } + else min_zs[{ i, j }] = obj->instance_bounding_box(j).min.z(); } @@ -4445,12 +4413,12 @@ bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) ImGuiWrapper* imgui = wxGetApp().imgui(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL imgui->set_next_window_pos(pos_x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); #else 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); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL std::string title = is_undo ? L("Undo History") : L("Redo History"); imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); @@ -4489,12 +4457,12 @@ bool GLCanvas3D::_render_search_list(float pos_x) bool action_taken = false; ImGuiWrapper* imgui = wxGetApp().imgui(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); #else 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); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL std::string title = L("Search"); imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); @@ -4547,13 +4515,13 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) { ImGuiWrapper *imgui = wxGetApp().imgui(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL imgui->set_next_window_pos(pos_x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); #else auto canvas_w = float(get_canvas_size().get_width()); const float x = pos_x * float(wxGetApp().plater()->get_camera().get_zoom()) + 0.5f * canvas_w; imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL imgui->begin(_L("Arrange options"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); @@ -4674,15 +4642,19 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const Camera camera; camera.set_type(camera_type); camera.set_scene_box(scene_bounding_box()); +#if ENABLE_RAYCAST_PICKING + camera.set_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); + camera.apply_viewport(); +#else camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); +#endif // ENABLE_RAYCAST_PICKING camera.zoom_to_box(volumes_box); -#if !ENABLE_LEGACY_OPENGL_REMOVAL - camera.apply_view_matrix(); -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Transform3d& view_matrix = camera.get_view_matrix(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#else + camera.apply_view_matrix(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL double near_z = -1.0; double far_z = -1.0; @@ -4691,11 +4663,11 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const // extends the near and far z of the frustrum to avoid the bed being clipped // box in eye space -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(view_matrix); #else const BoundingBoxf3 t_bed_box = m_bed.extended_bounding_box().transformed(camera.get_view_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL near_z = -t_bed_box.max.z(); far_z = -t_bed_box.min.z(); } @@ -4715,9 +4687,9 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const shader->start_using(); shader->set_uniform("emission_factor", 0.0f); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Transform3d& projection_matrix = camera.get_projection_matrix(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (GLVolume* vol : visible_volumes) { #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -4728,12 +4700,13 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const // the volume may have been deactivated by an active gizmo const bool is_active = vol->is_active; vol->is_active = true; -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d matrix = view_matrix * vol->world_matrix(); - shader->set_uniform("view_model_matrix", matrix); +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d model_matrix = vol->world_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); shader->set_uniform("projection_matrix", projection_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL vol->render(); vol->is_active = is_active; } @@ -4743,11 +4716,11 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, const glsafe(::glDisable(GL_DEPTH_TEST)); if (thumbnail_params.show_bed) -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL _render_bed(view_matrix, projection_matrix, !camera.is_looking_downward(), false); #else _render_bed(!camera.is_looking_downward(), false); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // restore background color if (thumbnail_params.transparent_background) @@ -4976,7 +4949,11 @@ 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 +#if ENABLE_RAYCAST_PICKING + wxGetApp().plater()->get_camera().apply_viewport(); +#else wxGetApp().plater()->get_camera().apply_viewport(0, 0, cnv_size.get_width(), cnv_size.get_height()); +#endif // ENABLE_RAYCAST_PICKING } bool GLCanvas3D::_init_toolbars() @@ -5014,7 +4991,7 @@ bool GLCanvas3D::_init_main_toolbar() return true; } // init arrow -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_main_toolbar.init_arrow("toolbar_arrow_2.svg")) #else BackgroundTexture::Metadata arrow_data; @@ -5024,15 +5001,15 @@ bool GLCanvas3D::_init_main_toolbar() arrow_data.right = 0; arrow_data.bottom = 0; if (!m_main_toolbar.init_arrow(arrow_data)) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL BOOST_LOG_TRIVIAL(error) << "Main toolbar failed to load arrow texture."; // m_gizmos is created at constructor, thus we can init arrow here. -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_gizmos.init_arrow("toolbar_arrow_2.svg")) #else if (!m_gizmos.init_arrow(arrow_data)) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL BOOST_LOG_TRIVIAL(error) << "Gizmos manager failed to load arrow texture."; // m_main_toolbar.set_layout_type(GLToolbar::Layout::Vertical); @@ -5237,7 +5214,7 @@ bool GLCanvas3D::_init_undoredo_toolbar() } // init arrow -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (!m_undoredo_toolbar.init_arrow("toolbar_arrow_2.svg")) #else BackgroundTexture::Metadata arrow_data; @@ -5247,7 +5224,7 @@ bool GLCanvas3D::_init_undoredo_toolbar() arrow_data.right = 0; arrow_data.bottom = 0; if (!m_undoredo_toolbar.init_arrow(arrow_data)) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL BOOST_LOG_TRIVIAL(error) << "Undo/Redo toolbar failed to load arrow texture."; // m_undoredo_toolbar.set_layout_type(GLToolbar::Layout::Vertical); @@ -5404,9 +5381,10 @@ BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_be static const double max_scale_factor = 2.0; const Vec3d bb_size = bb.size(); const Vec3d bed_bb_size = m_bed.build_volume().bounding_volume().size(); - if (bb_size.x() > max_scale_factor * bed_bb_size.x() || - bb_size.y() > max_scale_factor * bed_bb_size.y() || - bb_size.z() > max_scale_factor * bed_bb_size.z()) { + + if ((bed_bb_size.x() > 0.0 && bb_size.x() > max_scale_factor * bed_bb_size.x()) || + (bed_bb_size.y() > 0.0 && bb_size.y() > max_scale_factor * bed_bb_size.y()) || + (bed_bb_size.z() > 0.0 && bb_size.z() > max_scale_factor * bed_bb_size.z())) { const Vec3d bed_bb_center = bed_bb.center(); const Vec3d extend_by = max_scale_factor * bed_bb_size; bb = BoundingBoxf3(bed_bb_center - extend_by, bed_bb_center + extend_by); @@ -5440,6 +5418,118 @@ void GLCanvas3D::_refresh_if_shown_on_screen() } } +#if ENABLE_RAYCAST_PICKING +void GLCanvas3D::_picking_pass() +{ + if (!m_picking_enabled || m_mouse.dragging || m_mouse.position == Vec2d(DBL_MAX, DBL_MAX) || m_gizmos.is_dragging()) { +#if ENABLE_RAYCAST_PICKING_DEBUG + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + imgui.text("Picking disabled"); + imgui.end(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG + return; + } + + m_hover_volume_idxs.clear(); + + const ClippingPlane clipping_plane = m_gizmos.get_clipping_plane().inverted_normal(); + const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(m_mouse.position, wxGetApp().plater()->get_camera(), &clipping_plane); + if (hit.is_valid()) { + switch (hit.type) + { + case SceneRaycaster::EType::Volume: + { + if (0 <= hit.raycaster_id && hit.raycaster_id < (int)m_volumes.volumes.size()) { + const GLVolume* volume = m_volumes.volumes[hit.raycaster_id]; + if (volume->is_active && !volume->disabled && (volume->composite_id.volume_id >= 0 || m_render_sla_auxiliaries)) { + // 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(hit.raycaster_id); + m_gizmos.set_hover_id(-1); + } + } + } + else + assert(false); + + break; + } + case SceneRaycaster::EType::Gizmo: + { + const Size& cnv_size = get_canvas_size(); + bool inside = 0 <= m_mouse.position.x() && m_mouse.position.x() < cnv_size.get_width() && + 0 <= m_mouse.position.y() && m_mouse.position.y() < cnv_size.get_height(); + m_gizmos.set_hover_id(inside ? hit.raycaster_id : -1); + break; + } + case SceneRaycaster::EType::Bed: + { + m_gizmos.set_hover_id(-1); + break; + } + default: + { + assert(false); + break; + } + } + } + else + m_gizmos.set_hover_id(-1); + + _update_volumes_hover_state(); + +#if ENABLE_RAYCAST_PICKING_DEBUG + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.begin(std::string("Hit result"), ImGuiWindowFlags_AlwaysAutoResize); + std::string object_type = "None"; + switch (hit.type) + { + case SceneRaycaster::EType::Bed: { object_type = "Bed"; break; } + case SceneRaycaster::EType::Gizmo: { object_type = "Gizmo element"; break; } + case SceneRaycaster::EType::Volume: + { + if (m_volumes.volumes[hit.raycaster_id]->is_wipe_tower) + object_type = "Volume (Wipe tower)"; + else if (m_volumes.volumes[hit.raycaster_id]->volume_idx() == -int(slaposPad)) + object_type = "Volume (SLA pad)"; + else if (m_volumes.volumes[hit.raycaster_id]->volume_idx() == -int(slaposSupportTree)) + object_type = "Volume (SLA supports)"; + else if (m_volumes.volumes[hit.raycaster_id]->is_modifier) + object_type = "Volume (Modifier)"; + else + object_type = "Volume (Part)"; + break; + } + default: { break; } + } + char buf[1024]; + if (hit.type != SceneRaycaster::EType::None) { + sprintf(buf, "Object ID: %d", hit.raycaster_id); + imgui.text(std::string(buf)); + sprintf(buf, "Type: %s", object_type.c_str()); + imgui.text(std::string(buf)); + sprintf(buf, "Position: %.3f, %.3f, %.3f", hit.position.x(), hit.position.y(), hit.position.z()); + imgui.text(std::string(buf)); + sprintf(buf, "Normal: %.3f, %.3f, %.3f", hit.normal.x(), hit.normal.y(), hit.normal.z()); + imgui.text(std::string(buf)); + } + else + imgui.text("NO HIT"); + + ImGui::Separator(); + imgui.text("Registered for picking:"); + sprintf(buf, "Beds: %d", (int)m_scene_raycaster.beds_count()); + imgui.text(std::string(buf)); + sprintf(buf, "Volumes: %d", (int)m_scene_raycaster.volumes_count()); + imgui.text(std::string(buf)); + sprintf(buf, "Gizmo elements: %d", (int)m_scene_raycaster.gizmos_count()); + imgui.text(std::string(buf)); + imgui.end(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG +} +#else void GLCanvas3D::_picking_pass() { if (m_picking_enabled && !m_mouse.dragging && m_mouse.position != Vec2d(DBL_MAX, DBL_MAX) && !m_gizmos.is_dragging()) { @@ -5458,25 +5548,25 @@ void GLCanvas3D::_picking_pass() glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL 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().data()); ::glEnable(GL_CLIP_PLANE0); } -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL _render_volumes_for_picking(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL if (m_camera_clipping_plane.is_active()) ::glDisable(GL_CLIP_PLANE0); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); _render_bed_for_picking(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward()); #else _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_gizmos.render_current_gizmo_for_picking_pass(); @@ -5514,6 +5604,7 @@ void GLCanvas3D::_picking_pass() _update_volumes_hover_state(); } } +#endif // ENABLE_RAYCAST_PICKING void GLCanvas3D::_rectangular_selection_picking_pass() { @@ -5522,6 +5613,62 @@ void GLCanvas3D::_rectangular_selection_picking_pass() std::set idxs; if (m_picking_enabled) { +#if ENABLE_RAYCAST_PICKING + const size_t width = std::max(m_rectangle_selection.get_width(), 1); + const size_t height = std::max(m_rectangle_selection.get_height(), 1); + + const OpenGLManager::EFramebufferType framebuffers_type = OpenGLManager::get_framebuffers_type(); + bool use_framebuffer = framebuffers_type != OpenGLManager::EFramebufferType::Unknown; + + GLuint render_fbo = 0; + GLuint render_tex = 0; + GLuint render_depth = 0; + if (use_framebuffer) { + // setup a framebuffer which covers only the selection rectangle + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + glsafe(::glGenFramebuffers(1, &render_fbo)); + glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, render_fbo)); + } + else { + glsafe(::glGenFramebuffersEXT(1, &render_fbo)); + glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, render_fbo)); + } + glsafe(::glGenTextures(1, &render_tex)); + glsafe(::glBindTexture(GL_TEXTURE_2D, render_tex)); + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, render_tex, 0)); + glsafe(::glGenRenderbuffers(1, &render_depth)); + glsafe(::glBindRenderbuffer(GL_RENDERBUFFER, render_depth)); +#if ENABLE_OPENGL_ES + glsafe(::glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height)); +#else + glsafe(::glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height)); +#endif // ENABLE_OPENGL_ES + glsafe(::glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, render_depth)); + } + else { + glsafe(::glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, render_tex, 0)); + glsafe(::glGenRenderbuffersEXT(1, &render_depth)); + glsafe(::glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, render_depth)); + glsafe(::glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height)); + glsafe(::glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, render_depth)); + } + const GLenum drawBufs[] = { GL_COLOR_ATTACHMENT0 }; + glsafe(::glDrawBuffers(1, drawBufs)); + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + if (::glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + use_framebuffer = false; + } + else { + if (::glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT) + use_framebuffer = false; + } + } +#endif // ENABLE_RAYCAST_PICKING + if (m_multisample_allowed) // This flag is often ignored by NVIDIA drivers if rendering into a screen buffer. glsafe(::glDisable(GL_MULTISAMPLE)); @@ -5531,17 +5678,62 @@ void GLCanvas3D::_rectangular_selection_picking_pass() glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); +#if ENABLE_RAYCAST_PICKING + const Camera& main_camera = wxGetApp().plater()->get_camera(); + Camera framebuffer_camera; + const Camera* camera = &main_camera; + if (use_framebuffer) { + // setup a camera which covers only the selection rectangle + const std::array& viewport = camera->get_viewport(); + const double near_left = camera->get_near_left(); + const double near_bottom = camera->get_near_bottom(); + const double near_width = camera->get_near_width(); + const double near_height = camera->get_near_height(); + + const double ratio_x = near_width / double(viewport[2]); + const double ratio_y = near_height / double(viewport[3]); + + const double rect_near_left = near_left + double(m_rectangle_selection.get_left()) * ratio_x; + const double rect_near_bottom = near_bottom + (double(viewport[3]) - double(m_rectangle_selection.get_bottom())) * ratio_y; + double rect_near_right = near_left + double(m_rectangle_selection.get_right()) * ratio_x; + double rect_near_top = near_bottom + (double(viewport[3]) - double(m_rectangle_selection.get_top())) * ratio_y; + + if (rect_near_left == rect_near_right) + rect_near_right = rect_near_left + ratio_x; + if (rect_near_bottom == rect_near_top) + rect_near_top = rect_near_bottom + ratio_y; + + framebuffer_camera.look_at(camera->get_position(), camera->get_target(), camera->get_dir_up()); + framebuffer_camera.apply_projection(rect_near_left, rect_near_right, rect_near_bottom, rect_near_top, camera->get_near_z(), camera->get_far_z()); + framebuffer_camera.set_viewport(0, 0, width, height); + framebuffer_camera.apply_viewport(); + camera = &framebuffer_camera; + } + + _render_volumes_for_picking(*camera); +#else _render_volumes_for_picking(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_RAYCAST_PICKING +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + _render_bed_for_picking(camera->get_view_matrix(), camera->get_projection_matrix(), !camera->is_looking_downward()); +#else const Camera& camera = wxGetApp().plater()->get_camera(); _render_bed_for_picking(camera.get_view_matrix(), camera.get_projection_matrix(), !camera.is_looking_downward()); +#endif // ENABLE_RAYCAST_PICKING #else _render_bed_for_picking(!wxGetApp().plater()->get_camera().is_looking_downward()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (m_multisample_allowed) glsafe(::glEnable(GL_MULTISAMPLE)); +#if ENABLE_RAYCAST_PICKING + const size_t px_count = width * height; + + const size_t left = use_framebuffer ? 0 : (size_t)m_rectangle_selection.get_left(); + const size_t top = use_framebuffer ? 0 : (size_t)get_canvas_size().get_height() - (size_t)m_rectangle_selection.get_top(); +#else int width = std::max((int)m_rectangle_selection.get_width(), 1); int height = std::max((int)m_rectangle_selection.get_height(), 1); int px_count = width * height; @@ -5549,6 +5741,7 @@ void GLCanvas3D::_rectangular_selection_picking_pass() int left = (int)m_rectangle_selection.get_left(); int top = get_canvas_size().get_height() - (int)m_rectangle_selection.get_top(); if (left >= 0 && top >= 0) { +#endif // ENABLE_RAYCAST_PICKING #define USE_PARALLEL 1 #if USE_PARALLEL struct Pixel @@ -5590,7 +5783,30 @@ void GLCanvas3D::_rectangular_selection_picking_pass() idxs.insert(volume_id); } #endif // USE_PARALLEL +#if ENABLE_RAYCAST_PICKING + if (camera != &main_camera) + main_camera.apply_viewport(); + + if (framebuffers_type == OpenGLManager::EFramebufferType::Arb) { + glsafe(::glBindFramebuffer(GL_FRAMEBUFFER, 0)); + if (render_depth != 0) + glsafe(::glDeleteRenderbuffers(1, &render_depth)); + if (render_fbo != 0) + glsafe(::glDeleteFramebuffers(1, &render_fbo)); + } + else if (framebuffers_type == OpenGLManager::EFramebufferType::Ext) { + glsafe(::glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); + if (render_depth != 0) + glsafe(::glDeleteRenderbuffersEXT(1, &render_depth)); + if (render_fbo != 0) + glsafe(::glDeleteFramebuffersEXT(1, &render_fbo)); + } + + if (render_tex != 0) + glsafe(::glDeleteTextures(1, &render_tex)); +#else } +#endif // ENABLE_RAYCAST_PICKING } m_hover_volume_idxs.assign(idxs.begin(), idxs.end()); @@ -5610,13 +5826,13 @@ void GLCanvas3D::_render_background() use_error_color &= m_gcode_viewer.has_data() && !m_gcode_viewer.is_contained_in_bed(); } -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL // Draws a bottom to top gradient over the complete screen. glsafe(::glDisable(GL_DEPTH_TEST)); @@ -5667,18 +5883,18 @@ void GLCanvas3D::_render_background() glsafe(::glEnable(GL_DEPTH_TEST)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLCanvas3D::_render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes) #else void GLCanvas3D::_render_bed(bool bottom, bool show_axes) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { float scale_factor = 1.0; #if ENABLE_RETINA_GL @@ -5692,29 +5908,29 @@ void GLCanvas3D::_render_bed(bool bottom, bool show_axes) && m_gizmos.get_current_type() != GLGizmosManager::Seam && m_gizmos.get_current_type() != GLGizmosManager::MmuSegmentation); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL m_bed.render(*this, view_matrix, projection_matrix, bottom, scale_factor, show_axes, show_texture); #else m_bed.render(*this, bottom, scale_factor, show_axes, show_texture); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLCanvas3D::_render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom) #else void GLCanvas3D::_render_bed_for_picking(bool bottom) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { float scale_factor = 1.0; #if ENABLE_RETINA_GL scale_factor = m_retina_helper->get_scale_factor(); #endif // ENABLE_RETINA_GL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL m_bed.render_for_picking(*this, view_matrix, projection_matrix, bottom, scale_factor); #else m_bed.render_for_picking(*this, bottom, scale_factor); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) @@ -5767,9 +5983,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) m_volumes.set_clipping_plane(m_camera_clipping_plane.get_data()); m_volumes.set_show_sinking_contours(! m_gizmos.is_hiding_instances()); -#if ENABLE_SHOW_NON_MANIFOLD_EDGES m_volumes.set_show_non_manifold_edges(!m_gizmos.is_hiding_instances() && m_gizmos.get_current_type() != GLGizmosManager::Simplify); -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES GLShaderProgram* shader = wxGetApp().get_shader("gouraud"); if (shader != nullptr) { @@ -5782,7 +5996,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) { 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; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix(), [object_id](const GLVolume& volume) { // Which volume to paint without the layer height profile shader? @@ -5793,13 +6007,13 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) // Which volume to paint without the layer height profile shader? return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id); }); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Let LayersEditing handle rendering of the active object using the layer height profile shader. m_layers_editing.render_volumes(*this, m_volumes); } else { // do not cull backfaces to show broken geometry, if any -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); m_volumes.render(type, m_picking_enabled, camera.get_view_matrix(), camera.get_projection_matrix(), [this](const GLVolume& volume) { return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0); @@ -5808,7 +6022,7 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) m_volumes.render(type, 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); }); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } // In case a painting gizmo is open, it should render the painted triangles @@ -5827,12 +6041,12 @@ void GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) } case GLVolumeCollection::ERenderType::Transparent: { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); m_volumes.render(type, false, camera.get_view_matrix(), camera.get_projection_matrix()); #else m_volumes.render(type, false, wxGetApp().plater()->get_camera().get_view_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL break; } } @@ -5847,12 +6061,10 @@ void GLCanvas3D::_render_gcode() m_gcode_viewer.render(); } -#if ENABLE_SHOW_TOOLPATHS_COG void GLCanvas3D::_render_gcode_cog() { m_gcode_viewer.render_cog(); } -#endif // ENABLE_SHOW_TOOLPATHS_COG void GLCanvas3D::_render_selection() { @@ -5921,7 +6133,11 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale() 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); + // the std::max() is there because on some Linux dialects/virtual machines this code is called when the canvas has not been properly initialized yet, + // leading to negative values for the scale. + // See: https://github.com/prusa3d/PrusaSlicer/issues/8563 + // https://github.com/supermerill/SuperSlicer/issues/854 + float new_h_scale = std::max((cnv_size.get_width() - noitems_width), 1.0f) / (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 @@ -5940,7 +6156,7 @@ void GLCanvas3D::_check_and_update_toolbar_icon_scale() void GLCanvas3D::_render_overlays() { glsafe(::glDisable(GL_DEPTH_TEST)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); // ensure that the textures are renderered inside the frustrum @@ -5949,7 +6165,7 @@ void GLCanvas3D::_render_overlays() // 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)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL _check_and_update_toolbar_icon_scale(); @@ -5988,19 +6204,19 @@ void GLCanvas3D::_render_overlays() } m_labels.render(sorted_instances); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } +#if ENABLE_RAYCAST_PICKING +void GLCanvas3D::_render_volumes_for_picking(const Camera& camera) const +#else void GLCanvas3D::_render_volumes_for_picking() const +#endif // ENABLE_RAYCAST_PICKING { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES GLShaderProgram* shader = wxGetApp().get_shader("flat_clip"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("flat"); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (shader == nullptr) return; #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -6008,12 +6224,16 @@ void GLCanvas3D::_render_volumes_for_picking() const // do not cull backfaces to show broken geometry, if any glsafe(::glDisable(GL_CULL_FACE)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + const Transform3d& view_matrix = camera.get_view_matrix(); +#else const Transform3d& view_matrix = wxGetApp().plater()->get_camera().get_view_matrix(); +#endif // ENABLE_RAYCAST_PICKING for (size_t type = 0; type < 2; ++ type) { GLVolumeWithIdAndZList to_render = volumes_to_render(m_volumes.volumes, (type == 0) ? GLVolumeCollection::ERenderType::Opaque : GLVolumeCollection::ERenderType::Transparent, view_matrix); for (const GLVolumeWithIdAndZ& volume : to_render) @@ -6025,17 +6245,19 @@ void GLCanvas3D::_render_volumes_for_picking() const #if ENABLE_LEGACY_OPENGL_REMOVAL volume.first->model.set_color(picking_decode(id)); shader->start_using(); +#if ENABLE_RAYCAST_PICKING + shader->set_uniform("view_model_matrix", view_matrix * volume.first->world_matrix()); #else - glsafe(::glColor4fv(picking_decode(id).data())); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix() * volume.first->world_matrix()); +#endif // ENABLE_RAYCAST_PICKING shader->set_uniform("projection_matrix", camera.get_projection_matrix()); shader->set_uniform("volume_world_matrix", volume.first->world_matrix()); shader->set_uniform("z_range", m_volumes.get_z_range()); shader->set_uniform("clipping_plane", m_volumes.get_clipping_plane()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#else + glsafe(::glColor4fv(picking_decode(id).data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL volume.first->render(); #if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); @@ -6043,10 +6265,10 @@ void GLCanvas3D::_render_volumes_for_picking() const } } -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_CULL_FACE)); } @@ -6081,20 +6303,20 @@ void GLCanvas3D::_render_main_toolbar() return; const Size cnv_size = get_canvas_size(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const float top = 0.5f * (float)cnv_size.get_height(); #else const float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); #else const float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_main_toolbar.set_position(top, left); m_main_toolbar.render(*this); @@ -6108,20 +6330,20 @@ void GLCanvas3D::_render_undoredo_toolbar() return; const Size cnv_size = get_canvas_size(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const float top = 0.5f * (float)cnv_size.get_height(); #else float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar(); const float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const float left = m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width); #else const float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_undoredo_toolbar.set_position(top, left); m_undoredo_toolbar.render(*this); @@ -6135,7 +6357,7 @@ void GLCanvas3D::_render_collapse_toolbar() const const Size cnv_size = get_canvas_size(); const float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const float top = 0.5f * (float)cnv_size.get_height(); const float left = 0.5f * (float)cnv_size.get_width() - collapse_toolbar.get_width() - band; #else @@ -6143,7 +6365,7 @@ void GLCanvas3D::_render_collapse_toolbar() const const float top = 0.5f * (float)cnv_size.get_height() * inv_zoom; const float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band) * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL collapse_toolbar.set_position(top, left); collapse_toolbar.render(*this); @@ -6167,17 +6389,17 @@ void GLCanvas3D::_render_view_toolbar() const #endif // ENABLE_RETINA_GL const Size cnv_size = get_canvas_size(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL // places the toolbar on the bottom-left corner of the 3d scene - float top = -0.5f * (float)cnv_size.get_height() + view_toolbar.get_height(); - float left = -0.5f * (float)cnv_size.get_width(); + const float top = -0.5f * (float)cnv_size.get_height() + view_toolbar.get_height(); + const float left = -0.5f * (float)cnv_size.get_width(); #else 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() + view_toolbar.get_height()) * inv_zoom; float left = -0.5f * (float)cnv_size.get_width() * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL view_toolbar.set_position(top, left); view_toolbar.render(*this); } @@ -6188,7 +6410,10 @@ void GLCanvas3D::_render_camera_target() static const float half_length = 5.0f; glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glLineWidth(2.0f)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(2.0f)); #if ENABLE_LEGACY_OPENGL_REMOVAL const Vec3f& target = wxGetApp().plater()->get_camera().get_target().cast(); @@ -6225,14 +6450,24 @@ void GLCanvas3D::_render_camera_target() } } +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix() * Geometry::assemble_transform(m_camera_target.target)); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.5f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (int i = 0; i < 3; ++i) { m_camera_target.axis[i].render(); } @@ -6411,32 +6646,19 @@ void GLCanvas3D::_render_sla_slices() shader->start_using(); for (const SLAPrintObject::Instance& inst : obj->instances()) { -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(Vec3d(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0), inst.rotation * Vec3d::UnitZ(), Vec3d::Ones(), - obj->is_left_handed() ? Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); + obj->is_left_handed() ? /* The polygons are mirrored by X */ Vec3d(-1.0f, 1.0f, 1.0f) : Vec3d::Ones()); shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslated(unscale(inst.shift.x()), unscale(inst.shift.y()), 0.0)); - glsafe(::glRotatef(Geometry::rad2deg(inst.rotation), 0.0f, 0.0f, 1.0f)); - if (obj->is_left_handed()) - // The polygons are mirrored by X. - glsafe(::glScalef(-1.0f, 1.0f, 1.0f)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES bottom_obj_triangles.render(); top_obj_triangles.render(); bottom_sup_triangles.render(); top_sup_triangles.render(); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES } shader->stop_using(); @@ -6501,10 +6723,6 @@ void GLCanvas3D::_update_volumes_hover_state() return; } -#if !ENABLE_NEW_RECTANGLE_SELECTION - bool selection_modifiers_only = m_selection.is_empty() || m_selection.is_any_modifier(); -#endif // !ENABLE_NEW_RECTANGLE_SELECTION - bool hover_modifiers_only = true; for (int i : m_hover_volume_idxs) { if (!m_volumes.volumes[i]->is_modifier) { @@ -6532,14 +6750,8 @@ void GLCanvas3D::_update_volumes_hover_state() if (volume.hover != GLVolume::HS_None) continue; -#if ENABLE_NEW_RECTANGLE_SELECTION bool deselect = volume.selected && ((shift_pressed && m_rectangle_selection.is_empty()) || (alt_pressed && !m_rectangle_selection.is_empty())); bool select = !volume.selected && (m_rectangle_selection.is_empty() || (shift_pressed && !m_rectangle_selection.is_empty())); -#else - bool deselect = volume.selected && ((ctrl_pressed && !shift_pressed) || alt_pressed); - // (volume->is_modifier && !selection_modifiers_only && !is_ctrl_pressed) -> allows hovering on selected modifiers belonging to selection of type Instance - bool select = (!volume.selected || (volume.is_modifier && !selection_modifiers_only && !ctrl_pressed)) && !alt_pressed; -#endif // ENABLE_NEW_RECTANGLE_SELECTION if (select || deselect) { bool as_volume = @@ -6594,6 +6806,19 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) if (m_canvas == nullptr) return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX); +#if ENABLE_RAYCAST_PICKING + if (z == nullptr) { + const SceneRaycaster::HitResult hit = m_scene_raycaster.hit(mouse_pos.cast(), wxGetApp().plater()->get_camera(), nullptr); + return hit.is_valid() ? hit.position.cast() : _mouse_to_bed_3d(mouse_pos); + } + else { + const Camera& camera = wxGetApp().plater()->get_camera(); + const Vec4i viewport(camera.get_viewport().data()); + Vec3d out; + igl::unproject(Vec3d(mouse_pos.x(), viewport[3] - mouse_pos.y(), *z), camera.get_view_matrix().matrix(), camera.get_projection_matrix().matrix(), viewport, out); + return out; + } +#else const Camera& camera = wxGetApp().plater()->get_camera(); const Matrix4d modelview = camera.get_view_matrix().matrix(); const Matrix4d projection = camera.get_projection_matrix().matrix(); @@ -6609,6 +6834,7 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z) Vec3d out; igl::unproject(Vec3d(mouse_pos.x(), y, mouse_z), modelview, projection, viewport, out); return out; +#endif // ENABLE_RAYCAST_PICKING } Vec3d GLCanvas3D::_mouse_to_bed_3d(const Point& mouse_pos) @@ -6890,6 +7116,11 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c return volume; }; const size_t volumes_cnt_initial = m_volumes.volumes.size(); + // Limit the number of threads as the code below does not scale well due to memory pressure. + // (most of the time is spent in malloc / free / memmove) + // Not using all the threads leaves some of the threads to G-code generator. + tbb::task_arena limited_arena(std::min(tbb::this_task_arena::max_concurrency(), 4)); + limited_arena.execute([&ctxt, grain_size, &new_volume, is_selected_separate_extruder, this]{ tbb::parallel_for( tbb::blocked_range(0, ctxt.layers.size(), grain_size), [&ctxt, &new_volume, is_selected_separate_extruder, this](const tbb::blocked_range& range) { @@ -7064,6 +7295,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c vol->indexed_vertex_array.shrink_to_fit(); #endif // ENABLE_LEGACY_OPENGL_REMOVAL }); + }); // task arena BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - finalizing results" << m_volumes.log_memory_info() << log_memory_info(); // Remove empty volumes from the newly added volumes. @@ -7474,42 +7706,38 @@ void GLCanvas3D::_update_selection_from_hover() } } -#if ENABLE_NEW_RECTANGLE_SELECTION if (!m_rectangle_selection.is_empty()) { -#endif // ENABLE_NEW_RECTANGLE_SELECTION - if (state == GLSelectionRectangle::EState::Select) { - bool contains_all = true; - for (int i : m_hover_volume_idxs) { - if (!m_selection.contains_volume((unsigned int)i)) { - contains_all = false; - break; + if (state == GLSelectionRectangle::EState::Select) { + bool contains_all = true; + for (int i : m_hover_volume_idxs) { + if (!m_selection.contains_volume((unsigned int)i)) { + contains_all = false; + break; + } + } + + // the selection is going to be modified (Add) + if (!contains_all) { + wxGetApp().plater()->take_snapshot(_L("Selection-Add from rectangle"), UndoRedo::SnapshotType::Selection); + selection_changed = true; } } + else { + bool contains_any = false; + for (int i : m_hover_volume_idxs) { + if (m_selection.contains_volume((unsigned int)i)) { + contains_any = true; + break; + } + } - // the selection is going to be modified (Add) - if (!contains_all) { - wxGetApp().plater()->take_snapshot(_L("Selection-Add from rectangle"), UndoRedo::SnapshotType::Selection); - selection_changed = true; - } - } - else { - bool contains_any = false; - for (int i : m_hover_volume_idxs) { - if (m_selection.contains_volume((unsigned int)i)) { - contains_any = true; - break; + // the selection is going to be modified (Remove) + if (contains_any) { + wxGetApp().plater()->take_snapshot(_L("Selection-Remove from rectangle"), UndoRedo::SnapshotType::Selection); + selection_changed = true; } } - - // the selection is going to be modified (Remove) - if (contains_any) { - wxGetApp().plater()->take_snapshot(_L("Selection-Remove from rectangle"), UndoRedo::SnapshotType::Selection); - selection_changed = true; - } } -#if ENABLE_NEW_RECTANGLE_SELECTION - } -#endif // ENABLE_NEW_RECTANGLE_SELECTION if (!selection_changed) return; diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index f1a9bb5287..bf649aeb90 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -16,6 +16,9 @@ #include "libslic3r/GCode/GCodeProcessor.hpp" #include "GCodeViewer.hpp" #include "Camera.hpp" +#if ENABLE_RAYCAST_PICKING +#include "SceneRaycaster.hpp" +#endif // ENABLE_RAYCAST_PICKING #include "libslic3r/Slicing.hpp" @@ -257,15 +260,8 @@ class GLCanvas3D GLModel baseline; GLModel profile; GLModel background; -#if ENABLE_GL_SHADERS_ATTRIBUTES float old_canvas_width{ 0.0f }; -#else - Rect old_bar_rect; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES std::vector old_layer_height_profile; -#if !ENABLE_GL_SHADERS_ATTRIBUTES - bool dirty{ false }; -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES }; Profile m_profile; #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -295,9 +291,9 @@ class GLCanvas3D static float get_cursor_z_relative(const GLCanvas3D& canvas); static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y); static Rect get_bar_rect_screen(const GLCanvas3D& canvas); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL static Rect get_bar_rect_viewport(const GLCanvas3D& canvas); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL static float get_overlay_window_width() { return LayersEditing::s_overlay_window_width; } float object_max_z() const { return m_object_max_z; } @@ -307,13 +303,13 @@ class GLCanvas3D private: bool is_initialized() const; void generate_layer_height_texture(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_active_object_annotations(const GLCanvas3D& canvas); void render_profile(const GLCanvas3D& canvas); #else void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect); void render_profile(const Rect& bar_rect); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void update_slicing_parameters(); static float thickness_bar_width(const GLCanvas3D &canvas); @@ -496,6 +492,9 @@ public: private: wxGLCanvas* m_canvas; wxGLContext* m_context; +#if ENABLE_RAYCAST_PICKING + SceneRaycaster m_scene_raycaster; +#endif // ENABLE_RAYCAST_PICKING Bed3D &m_bed; #if ENABLE_RETINA_GL std::unique_ptr m_retina_helper; @@ -518,6 +517,9 @@ private: bool m_event_handlers_bound{ false }; GLVolumeCollection m_volumes; +#if ENABLE_OPENGL_ES + TriangleMesh m_wipe_tower_mesh; +#endif // ENABLE_OPENGL_ES GCodeViewer m_gcode_viewer; RenderTimer m_render_timer; @@ -676,6 +678,27 @@ public: bool init(); void post_event(wxEvent &&event); +#if ENABLE_RAYCAST_PICKING + std::shared_ptr add_raycaster_for_picking(SceneRaycaster::EType type, int id, const MeshRaycaster& raycaster, + const Transform3d& trafo, bool use_back_faces = false) { + return m_scene_raycaster.add_raycaster(type, id, raycaster, trafo, use_back_faces); + } + void remove_raycasters_for_picking(SceneRaycaster::EType type, int id) { + m_scene_raycaster.remove_raycasters(type, id); + } + void remove_raycasters_for_picking(SceneRaycaster::EType type) { + m_scene_raycaster.remove_raycasters(type); + } + + std::vector>* get_raycasters_for_picking(SceneRaycaster::EType type) { + return m_scene_raycaster.get_raycasters(type); + } + + void set_raycaster_gizmos_on_top(bool value) { + m_scene_raycaster.set_gizmos_on_top(value); + } +#endif // ENABLE_RAYCAST_PICKING + void set_as_dirty(); void requires_check_outside_state() { m_requires_check_outside_state = true; } @@ -983,18 +1006,16 @@ private: void _picking_pass(); void _rectangular_selection_picking_pass(); void _render_background(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void _render_bed(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom, bool show_axes); void _render_bed_for_picking(const Transform3d& view_matrix, const Transform3d& projection_matrix, bool bottom); #else void _render_bed(bool bottom, bool show_axes); void _render_bed_for_picking(bool bottom); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void _render_objects(GLVolumeCollection::ERenderType type); void _render_gcode(); -#if ENABLE_SHOW_TOOLPATHS_COG void _render_gcode_cog(); -#endif // ENABLE_SHOW_TOOLPATHS_COG void _render_selection(); void _render_sequential_clearance(); #if ENABLE_RENDER_SELECTION_CENTER @@ -1002,7 +1023,11 @@ private: #endif // ENABLE_RENDER_SELECTION_CENTER void _check_and_update_toolbar_icon_scale(); void _render_overlays(); +#if ENABLE_RAYCAST_PICKING + void _render_volumes_for_picking(const Camera& camera) const; +#else void _render_volumes_for_picking() const; +#endif // ENABLE_RAYCAST_PICKING void _render_current_gizmo() const; void _render_gizmos_overlay(); void _render_main_toolbar(); diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp index e6bdae4153..2d6a66d43c 100644 --- a/src/slic3r/GUI/GLModel.cpp +++ b/src/slic3r/GUI/GLModel.cpp @@ -94,22 +94,46 @@ void GLModel::Geometry::add_vertex(const Vec3f& position) void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec2f& tex_coord) { assert(format.vertex_layout == EVertexLayout::P3T2); - vertices.emplace_back(position.x()); - vertices.emplace_back(position.y()); - vertices.emplace_back(position.z()); - vertices.emplace_back(tex_coord.x()); - vertices.emplace_back(tex_coord.y()); + vertices.insert(vertices.end(), position.data(), position.data() + 3); + vertices.insert(vertices.end(), tex_coord.data(), tex_coord.data() + 2); } -void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec3f& normal) +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec3f& normal, const Vec2f& tex_coord) { - assert(format.vertex_layout == EVertexLayout::P3N3); + assert(format.vertex_layout == EVertexLayout::P3N3T2); vertices.emplace_back(position.x()); vertices.emplace_back(position.y()); vertices.emplace_back(position.z()); vertices.emplace_back(normal.x()); vertices.emplace_back(normal.y()); vertices.emplace_back(normal.z()); + vertices.emplace_back(tex_coord.x()); + vertices.emplace_back(tex_coord.y()); +} + +#if ENABLE_OPENGL_ES +void GLModel::Geometry::add_vertex(const Vec3f& position, const Vec3f& normal, const Vec3f& extra) +{ + assert(format.vertex_layout == EVertexLayout::P3N3E3); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(normal.x()); + vertices.emplace_back(normal.y()); + vertices.emplace_back(normal.z()); + vertices.emplace_back(extra.x()); + vertices.emplace_back(extra.y()); + vertices.emplace_back(extra.z()); +} +#endif // ENABLE_OPENGL_ES + +void GLModel::Geometry::add_vertex(const Vec4f& position) +{ + assert(format.vertex_layout == EVertexLayout::P4); + vertices.emplace_back(position.x()); + vertices.emplace_back(position.y()); + vertices.emplace_back(position.z()); + vertices.emplace_back(position.w()); } void GLModel::Geometry::add_index(unsigned int id) @@ -123,13 +147,6 @@ void GLModel::Geometry::add_line(unsigned int id1, unsigned int id2) indices.emplace_back(id2); } -void GLModel::Geometry::add_triangle(unsigned int id1, unsigned int id2, unsigned int id3) -{ - indices.emplace_back(id1); - indices.emplace_back(id2); - indices.emplace_back(id3); -} - Vec2f GLModel::Geometry::extract_position_2(size_t id) const { const size_t p_stride = position_stride_floats(format); @@ -244,12 +261,17 @@ size_t GLModel::Geometry::vertex_stride_floats(const Format& format) { switch (format.vertex_layout) { - case EVertexLayout::P2: { return 2; } - case EVertexLayout::P2T2: { return 4; } - case EVertexLayout::P3: { return 3; } - case EVertexLayout::P3T2: { return 5; } - case EVertexLayout::P3N3: { return 6; } - default: { assert(false); return 0; } + case EVertexLayout::P2: { return 2; } + case EVertexLayout::P2T2: { return 4; } + case EVertexLayout::P3: { return 3; } + case EVertexLayout::P3T2: { return 5; } + case EVertexLayout::P3N3: { return 6; } + case EVertexLayout::P3N3T2: { return 8; } +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: { return 9; } +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 4; } + default: { assert(false); return 0; } }; } @@ -258,11 +280,18 @@ size_t GLModel::Geometry::position_stride_floats(const Format& format) switch (format.vertex_layout) { case EVertexLayout::P2: - case EVertexLayout::P2T2: { return 2; } + case EVertexLayout::P2T2: { return 2; } case EVertexLayout::P3: case EVertexLayout::P3T2: - case EVertexLayout::P3N3: { return 3; } - default: { assert(false); return 0; } + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 4; } + default: { assert(false); return 0; } }; } @@ -274,7 +303,12 @@ size_t GLModel::Geometry::position_offset_floats(const Format& format) case EVertexLayout::P2T2: case EVertexLayout::P3: case EVertexLayout::P3T2: - case EVertexLayout::P3N3: { return 0; } + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return 0; } default: { assert(false); return 0; } }; } @@ -283,8 +317,14 @@ size_t GLModel::Geometry::normal_stride_floats(const Format& format) { switch (format.vertex_layout) { - case EVertexLayout::P3N3: { return 3; } - default: { assert(false); return 0; } + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return 0; } }; } @@ -292,8 +332,14 @@ size_t GLModel::Geometry::normal_offset_floats(const Format& format) { switch (format.vertex_layout) { - case EVertexLayout::P3N3: { return 3; } - default: { assert(false); return 0; } + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return 3; } +#else + case EVertexLayout::P3N3T2: { return 3; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return 0; } }; } @@ -302,8 +348,9 @@ size_t GLModel::Geometry::tex_coord_stride_floats(const Format& format) switch (format.vertex_layout) { case EVertexLayout::P2T2: - case EVertexLayout::P3T2: { return 2; } - default: { assert(false); return 0; } + case EVertexLayout::P3T2: + case EVertexLayout::P3N3T2: { return 2; } + default: { assert(false); return 0; } }; } @@ -311,12 +358,33 @@ size_t GLModel::Geometry::tex_coord_offset_floats(const Format& format) { switch (format.vertex_layout) { - case EVertexLayout::P2T2: { return 2; } - case EVertexLayout::P3T2: { return 3; } - default: { assert(false); return 0; } + case EVertexLayout::P2T2: { return 2; } + case EVertexLayout::P3T2: { return 3; } + case EVertexLayout::P3N3T2: { return 6; } + default: { assert(false); return 0; } }; } +#if ENABLE_OPENGL_ES +size_t GLModel::Geometry::extra_stride_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return 3; } + default: { assert(false); return 0; } + }; +} + +size_t GLModel::Geometry::extra_offset_floats(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return 6; } + default: { assert(false); return 0; } + }; +} +#endif // ENABLE_OPENGL_ES + size_t GLModel::Geometry::index_stride_bytes(const Geometry& data) { switch (data.index_type) @@ -336,7 +404,12 @@ bool GLModel::Geometry::has_position(const Format& format) case EVertexLayout::P2T2: case EVertexLayout::P3: case EVertexLayout::P3T2: - case EVertexLayout::P3N3: { return true; } + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return true; } default: { assert(false); return false; } }; } @@ -348,9 +421,16 @@ bool GLModel::Geometry::has_normal(const Format& format) case EVertexLayout::P2: case EVertexLayout::P2T2: case EVertexLayout::P3: - case EVertexLayout::P3T2: { return false; } - case EVertexLayout::P3N3: { return true; } - default: { assert(false); return false; } + case EVertexLayout::P3T2: + case EVertexLayout::P4: { return false; } + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3T2: + case EVertexLayout::P3N3E3: { return true; } +#else + case EVertexLayout::P3N3T2: { return true; } +#endif // ENABLE_OPENGL_ES + default: { assert(false); return false; } }; } @@ -359,13 +439,36 @@ bool GLModel::Geometry::has_tex_coord(const Format& format) switch (format.vertex_layout) { case EVertexLayout::P2T2: - case EVertexLayout::P3T2: { return true; } + case EVertexLayout::P3T2: + case EVertexLayout::P3N3T2: { return true; } case EVertexLayout::P2: case EVertexLayout::P3: - case EVertexLayout::P3N3: { return false; } - default: { assert(false); return false; } + case EVertexLayout::P3N3: +#if ENABLE_OPENGL_ES + case EVertexLayout::P3N3E3: +#endif // ENABLE_OPENGL_ES + case EVertexLayout::P4: { return false; } + default: { assert(false); return false; } }; } + +#if ENABLE_OPENGL_ES +bool GLModel::Geometry::has_extra(const Format& format) +{ + switch (format.vertex_layout) + { + case EVertexLayout::P3N3E3: { return true; } + case EVertexLayout::P2: + case EVertexLayout::P2T2: + case EVertexLayout::P3: + case EVertexLayout::P3T2: + case EVertexLayout::P3N3: + case EVertexLayout::P3N3T2: + case EVertexLayout::P4: { return false; } + default: { assert(false); return false; } + }; +} +#endif // ENABLE_OPENGL_ES #else size_t GLModel::Geometry::vertices_count() const { @@ -480,7 +583,7 @@ void GLModel::init_from(const TriangleMesh& mesh, bool smooth_normals) const indexed_triangle_set& its = mesh.its; Geometry& data = m_render_data.geometry; - data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3, GLModel::Geometry::index_type(3 * its.indices.size()) }; + data.format = { Geometry::EPrimitiveType::Triangles, Geometry::EVertexLayout::P3N3 }; data.reserve_vertices(3 * its.indices.size()); data.reserve_indices(3 * its.indices.size()); @@ -492,10 +595,7 @@ void GLModel::init_from(const TriangleMesh& mesh, bool smooth_normals) // indices for (size_t i = 0; i < its.indices.size(); ++i) { const stl_triangle_vertex_indices& idx = its.indices[i]; - if (data.format.index_type == GLModel::Geometry::EIndexType::USHORT) - data.add_ushort_triangle((unsigned short)idx(0), (unsigned short)idx(1), (unsigned short)idx(2)); - else - data.add_uint_triangle((unsigned int)idx(0), (unsigned int)idx(1), (unsigned int)idx(2)); + data.add_triangle((unsigned int)idx(0), (unsigned int)idx(1), (unsigned int)idx(2)); } // update bounding box @@ -723,6 +823,12 @@ void GLModel::reset() s_statistics.gpu_memory.vertices.current -= vertices_size_bytes(); #endif // ENABLE_GLMODEL_STATISTICS } +#if ENABLE_GL_CORE_PROFILE + if (m_render_data.vao_id > 0) { + glsafe(::glDeleteVertexArrays(1, &m_render_data.vao_id)); + m_render_data.vao_id = 0; + } +#endif // ENABLE_GL_CORE_PROFILE m_render_data.vertices_count = 0; m_render_data.indices_count = 0; @@ -846,75 +952,82 @@ void GLModel::render(const std::pair& range) const bool position = Geometry::has_position(data.format); const bool normal = Geometry::has_normal(data.format); const bool tex_coord = Geometry::has_tex_coord(data.format); +#if ENABLE_OPENGL_ES + const bool extra = Geometry::has_extra(data.format); +#endif // ENABLE_OPENGL_ES +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(m_render_data.vao_id)); + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); -#if ENABLE_GL_SHADERS_ATTRIBUTES - int position_id = -1; - int normal_id = -1; + int position_id = -1; + int normal_id = -1; int tex_coord_id = -1; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_OPENGL_ES + int extra_id = -1; +#endif // ENABLE_OPENGL_ES if (position) { -#if ENABLE_GL_SHADERS_ATTRIBUTES position_id = shader->get_attrib_location("v_position"); if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, Geometry::position_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(position_id)); } -#else - glsafe(::glVertexPointer(Geometry::position_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::position_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES } if (normal) { -#if ENABLE_GL_SHADERS_ATTRIBUTES normal_id = shader->get_attrib_location("v_normal"); if (normal_id != -1) { glsafe(::glVertexAttribPointer(normal_id, Geometry::normal_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(normal_id)); } -#else - glsafe(::glNormalPointer(GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::normal_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES } if (tex_coord) { -#if ENABLE_GL_SHADERS_ATTRIBUTES tex_coord_id = shader->get_attrib_location("v_tex_coord"); if (tex_coord_id != -1) { glsafe(::glVertexAttribPointer(tex_coord_id, Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); glsafe(::glEnableVertexAttribArray(tex_coord_id)); } -#else - glsafe(::glTexCoordPointer(Geometry::tex_coord_stride_floats(data.format), GL_FLOAT, vertex_stride_bytes, (const void*)Geometry::tex_coord_offset_bytes(data.format))); - glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES } +#if ENABLE_OPENGL_ES + if (extra) { + extra_id = shader->get_attrib_location("v_extra"); + if (extra_id != -1) { + glsafe(::glVertexAttribPointer(extra_id, Geometry::extra_stride_floats(data.format), GL_FLOAT, GL_FALSE, vertex_stride_bytes, (const void*)Geometry::extra_offset_bytes(data.format))); + glsafe(::glEnableVertexAttribArray(extra_id)); + } + } +#endif // ENABLE_OPENGL_ES shader->set_uniform("uniform_color", data.color); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); glsafe(::glDrawElements(mode, range.second - range.first, index_type, (const void*)(range.first * Geometry::index_stride_bytes(data)))); +#if !ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#endif // !ENABLE_GL_CORE_PROFILE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_OPENGL_ES + if (extra_id != -1) + glsafe(::glDisableVertexAttribArray(extra_id)); +#endif // ENABLE_OPENGL_ES if (tex_coord_id != -1) glsafe(::glDisableVertexAttribArray(tex_coord_id)); if (normal_id != -1) glsafe(::glDisableVertexAttribArray(normal_id)); if (position_id != -1) glsafe(::glDisableVertexAttribArray(position_id)); -#else - if (tex_coord) - glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); - if (normal) - glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); - if (position) - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE #if ENABLE_GLMODEL_STATISTICS ++s_statistics.render_calls; @@ -966,6 +1079,11 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance assert(offset_id != -1 && scales_id != -1); #endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(m_render_data.vao_id)); +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, instances_vbo)); #if ENABLE_LEGACY_OPENGL_REMOVAL const size_t instance_stride = 5 * sizeof(float); @@ -999,6 +1117,9 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance const bool position = Geometry::has_position(data.format); const bool normal = Geometry::has_normal(data.format); +#if ENABLE_GL_CORE_PROFILE + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); if (position) { @@ -1013,9 +1134,13 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance shader->set_uniform("uniform_color", data.color); +#if !ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); +#endif // !ENABLE_GL_CORE_PROFILE glsafe(::glDrawElementsInstanced(mode, indices_count(), index_type, (const void*)0, instances_count)); +#if !ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); +#endif // !ENABLE_GL_CORE_PROFILE if (normal) glsafe(::glDisableVertexAttribArray(normal_id)); @@ -1071,6 +1196,10 @@ void GLModel::render_instanced(unsigned int instances_vbo, unsigned int instance #endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE #if ENABLE_GLMODEL_STATISTICS ++s_statistics.render_instanced_calls; @@ -1091,6 +1220,13 @@ bool GLModel::send_to_gpu() return false; } +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &m_render_data.vao_id)); + glsafe(::glBindVertexArray(m_render_data.vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + // vertices glsafe(::glGenBuffers(1, &m_render_data.vbo_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_render_data.vbo_id)); @@ -1104,9 +1240,9 @@ bool GLModel::send_to_gpu() data.vertices = std::vector(); // indices + const size_t indices_count = data.indices.size(); glsafe(::glGenBuffers(1, &m_render_data.ibo_id)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_render_data.ibo_id)); - const size_t indices_count = data.indices.size(); if (m_render_data.vertices_count <= 256) { // convert indices to unsigned char to save gpu memory std::vector reduced_indices(indices_count); @@ -1115,7 +1251,6 @@ bool GLModel::send_to_gpu() } data.index_type = Geometry::EIndexType::UBYTE; glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned char), reduced_indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } else if (m_render_data.vertices_count <= 65536) { // convert indices to unsigned short to save gpu memory @@ -1125,13 +1260,17 @@ bool GLModel::send_to_gpu() } data.index_type = Geometry::EIndexType::USHORT; glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices_count * sizeof(unsigned short), reduced_indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } else { data.index_type = Geometry::EIndexType::UINT; glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.indices_size_bytes(), data.indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } + +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + m_render_data.indices_count = indices_count; #if ENABLE_GLMODEL_STATISTICS s_statistics.gpu_memory.indices.current += data.indices_size_bytes(); @@ -1139,6 +1278,11 @@ bool GLModel::send_to_gpu() #endif // ENABLE_GLMODEL_STATISTICS data.indices = std::vector(); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE + return true; } @@ -1378,61 +1522,61 @@ GLModel::Geometry stilized_arrow(unsigned int resolution, float tip_radius, floa } #else append_vertex(entity, { 0.0f, 0.0f, total_height }, Vec3f::UnitZ()); - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { append_vertex(entity, { 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) { + for (unsigned int i = 0; i < resolution; ++i) { const int v3 = (i < resolution - 1) ? i + 2 : 1; append_indices(entity, 0, i + 1, v3); } // tip cap outer perimeter vertices - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { append_vertex(entity, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); } // tip cap inner perimeter vertices - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, -Vec3f::UnitZ()); } // tip cap triangles - for (int i = 0; i < resolution; ++i) { - const int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; - const int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1; + const unsigned int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1; append_indices(entity, i + resolution + 1, v3, v2); append_indices(entity, i + resolution + 1, i + 2 * resolution + 1, v3); } // stem bottom vertices - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { append_vertex(entity, { 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) { + for (unsigned int i = 0; i < resolution; ++i) { append_vertex(entity, { 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) { - const int v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; - const int v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; + for (unsigned int i = 0; i < resolution; ++i) { + const int unsigned v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1; + const int unsigned v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1; append_indices(entity, i + 3 * resolution + 1, v3, v2); append_indices(entity, i + 3 * resolution + 1, i + 4 * resolution + 1, v3); } // stem cap vertices append_vertex(entity, Vec3f::Zero(), -Vec3f::UnitZ()); - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { append_vertex(entity, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, -Vec3f::UnitZ()); } // stem cap triangles - for (int i = 0; i < resolution; ++i) { - const int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2; append_indices(entity, 5 * resolution + 1, v3, i + 5 * resolution + 2); } @@ -1680,57 +1824,57 @@ GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float ti // stem // top face vertices - for (int i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = static_cast(i) * step_angle; append_vertex(entity, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); } - for (int i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = static_cast(i) * step_angle; append_vertex(entity, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ()); } // top face triangles - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { append_indices(entity, 26 + i, 27 + i, 27 + resolution + i); append_indices(entity, 27 + i, 28 + resolution + i, 27 + resolution + i); } // bottom face vertices - for (int i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = static_cast(i) * step_angle; append_vertex(entity, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); } - for (int i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = static_cast(i) * step_angle; append_vertex(entity, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ()); } // bottom face triangles - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { append_indices(entity, 28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i); append_indices(entity, 29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i); } // side faces vertices and triangles - for (int i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = static_cast(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); append_vertex(entity, { inner_radius * s, inner_radius * c, -half_thickness }, { -s, -c, 0.0f }); } - for (int i = 0; i <= resolution; ++i) { + for (unsigned int i = 0; i <= resolution; ++i) { const float angle = static_cast(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); append_vertex(entity, { 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) { - const int ii = first_id + i; + unsigned int first_id = 26 + 4 * (resolution + 1); + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; append_indices(entity, ii, ii + 1, ii + resolution + 2); append_indices(entity, ii, ii + resolution + 2, ii + resolution + 1); } @@ -1744,14 +1888,14 @@ GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float ti append_indices(entity, first_id, first_id + 1, first_id + 3); append_indices(entity, first_id, first_id + 3, first_id + 2); - for (int i = resolution; i >= 0; --i) { + for (int i = int(resolution); i >= 0; --i) { const float angle = static_cast(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); append_vertex(entity, { outer_radius * s, outer_radius * c, -half_thickness }, { s, c, 0.0f }); } - for (int i = resolution; i >= 0; --i) { + for (int i = int(resolution); i >= 0; --i) { const float angle = static_cast(i) * step_angle; const float c = ::cos(angle); const float s = ::sin(angle); @@ -1759,8 +1903,8 @@ GLModel::Geometry circular_arrow(unsigned int resolution, float radius, float ti } first_id = 30 + 6 * (resolution + 1); - for (int i = 0; i < resolution; ++i) { - const int ii = first_id + i; + for (unsigned int i = 0; i < resolution; ++i) { + const unsigned int ii = first_id + i; append_indices(entity, ii, ii + 1, ii + resolution + 2); append_indices(entity, ii, ii + resolution + 2, ii + resolution + 1); } @@ -2007,8 +2151,8 @@ GLModel::Geometry diamond(unsigned int resolution) data.add_triangle(resolution - 1, resolution + 1, 0); #else // positions - for (int i = 0; i < resolution; ++i) { - float ii = float(i) * step; + for (unsigned int i = 0; i < resolution; ++i) { + const float ii = float(i) * step; entity.positions.emplace_back(0.5f * ::cos(ii), 0.5f * ::sin(ii), 0.0f); } entity.positions.emplace_back(0.0f, 0.0f, 0.5f); @@ -2021,7 +2165,7 @@ GLModel::Geometry diamond(unsigned int resolution) // triangles // top - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { entity.indices.push_back(i + 0); entity.indices.push_back(i + 1); entity.indices.push_back(resolution); @@ -2031,7 +2175,7 @@ GLModel::Geometry diamond(unsigned int resolution) entity.indices.push_back(resolution); // bottom - for (int i = 0; i < resolution; ++i) { + for (unsigned int i = 0; i < resolution; ++i) { entity.indices.push_back(i + 0); entity.indices.push_back(resolution + 1); entity.indices.push_back(i + 1); @@ -2047,7 +2191,6 @@ GLModel::Geometry diamond(unsigned int resolution) } #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_SHOW_TOOLPATHS_COG GLModel::Geometry smooth_sphere(unsigned int resolution, float radius) { resolution = std::max(4, resolution); @@ -2110,7 +2253,6 @@ GLModel::Geometry smooth_sphere(unsigned int resolution, float radius) return data; } -#endif // ENABLE_SHOW_TOOLPATHS_COG #endif // ENABLE_LEGACY_OPENGL_REMOVAL } // namespace GUI diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp index 3176780bfa..c2845c8850 100644 --- a/src/slic3r/GUI/GLModel.hpp +++ b/src/slic3r/GUI/GLModel.hpp @@ -4,6 +4,7 @@ #include "libslic3r/Point.hpp" #include "libslic3r/BoundingBox.hpp" #include "libslic3r/Color.hpp" +#include "libslic3r/Utils.hpp" #include #include @@ -58,11 +59,16 @@ namespace GUI { enum class EVertexLayout : unsigned char { - P2, // position 2 floats - P2T2, // position 2 floats + texture coords 2 floats - P3, // position 3 floats - P3T2, // position 3 floats + texture coords 2 floats - P3N3, // position 3 floats + normal 3 floats + P2, // position 2 floats + P2T2, // position 2 floats + texture coords 2 floats + P3, // position 3 floats + P3T2, // position 3 floats + texture coords 2 floats + P3N3, // position 3 floats + normal 3 floats + P3N3T2, // position 3 floats + normal 3 floats + texture coords 2 floats +#if ENABLE_OPENGL_ES + P3N3E3, // position 3 floats + normal 3 floats + extra 3 floats +#endif // ENABLE_OPENGL_ES + P4, // position 4 floats }; enum class EIndexType : unsigned char @@ -85,13 +91,24 @@ namespace GUI { ColorRGBA color{ ColorRGBA::BLACK() }; void reserve_vertices(size_t vertices_count) { vertices.reserve(vertices_count * vertex_stride_floats(format)); } + void reserve_more_vertices(size_t vertices_count) { vertices.reserve(next_highest_power_of_2(vertices.size() + vertices_count * vertex_stride_floats(format))); } void reserve_indices(size_t indices_count) { indices.reserve(indices_count); } + void reserve_more_indices(size_t indices_count) { indices.reserve(next_highest_power_of_2(indices.size() + indices_count)); } - void add_vertex(const Vec2f& position); // EVertexLayout::P2 - void add_vertex(const Vec2f& position, const Vec2f& tex_coord); // EVertexLayout::P2T2 - void add_vertex(const Vec3f& position); // EVertexLayout::P3 - void add_vertex(const Vec3f& position, const Vec2f& tex_coord); // EVertexLayout::P3T2 - void add_vertex(const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3 + void add_vertex(const Vec2f& position); // EVertexLayout::P2 + void add_vertex(const Vec2f& position, const Vec2f& tex_coord); // EVertexLayout::P2T2 + void add_vertex(const Vec3f& position); // EVertexLayout::P3 + void add_vertex(const Vec3f& position, const Vec2f& tex_coord); // EVertexLayout::P3T2 + void add_vertex(const Vec3f& position, const Vec3f& normal) { // EVertexLayout::P3N3 + assert(format.vertex_layout == EVertexLayout::P3N3); + vertices.insert(vertices.end(), position.data(), position.data() + 3); + vertices.insert(vertices.end(), normal.data(), normal.data() + 3); + } + void add_vertex(const Vec3f& position, const Vec3f& normal, const Vec2f& tex_coord); // EVertexLayout::P3N3T2 +#if ENABLE_OPENGL_ES + void add_vertex(const Vec3f& position, const Vec3f& normal, const Vec3f& extra); // EVertexLayout::P3N3E3 +#endif // ENABLE_OPENGL_ES + void add_vertex(const Vec4f& position); // EVertexLayout::P4 void set_vertex(size_t id, const Vec3f& position, const Vec3f& normal); // EVertexLayout::P3N3 @@ -99,7 +116,11 @@ namespace GUI { void add_index(unsigned int id); void add_line(unsigned int id1, unsigned int id2); - void add_triangle(unsigned int id1, unsigned int id2, unsigned int id3); + void add_triangle(unsigned int id1, unsigned int id2, unsigned int id3){ + indices.emplace_back(id1); + indices.emplace_back(id2); + indices.emplace_back(id3); + } Vec2f extract_position_2(size_t id) const; Vec3f extract_position_3(size_t id) const; @@ -137,11 +158,21 @@ namespace GUI { static size_t tex_coord_offset_floats(const Format& format); static size_t tex_coord_offset_bytes(const Format& format) { return tex_coord_offset_floats(format) * sizeof(float); } +#if ENABLE_OPENGL_ES + static size_t extra_stride_floats(const Format& format); + static size_t extra_stride_bytes(const Format& format) { return extra_stride_floats(format) * sizeof(float); } + static size_t extra_offset_floats(const Format& format); + static size_t extra_offset_bytes(const Format& format) { return extra_offset_floats(format) * sizeof(float); } +#endif // ENABLE_OPENGL_ES + static size_t index_stride_bytes(const Geometry& data); static bool has_position(const Format& format); static bool has_normal(const Format& format); static bool has_tex_coord(const Format& format); +#if ENABLE_OPENGL_ES + static bool has_extra(const Format& format); +#endif // ENABLE_OPENGL_ES #else struct Entity { @@ -167,6 +198,9 @@ namespace GUI { struct RenderData { Geometry geometry; +#if ENABLE_GL_CORE_PROFILE + unsigned int vao_id{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE unsigned int vbo_id{ 0 }; unsigned int ibo_id{ 0 }; size_t vertices_count{ 0 }; @@ -340,11 +374,9 @@ namespace GUI { GLModel::Geometry diamond(unsigned int resolution); #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_SHOW_TOOLPATHS_COG // create a sphere with the given resolution and smooth normals // the origin of the sphere is in its center GLModel::Geometry smooth_sphere(unsigned int resolution, float radius); -#endif // ENABLE_SHOW_TOOLPATHS_COG #endif // ENABLE_LEGACY_OPENGL_REMOVAL } // namespace GUI diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp index 78a7031293..b07cbd6dd3 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.cpp +++ b/src/slic3r/GUI/GLSelectionRectangle.cpp @@ -30,17 +30,23 @@ namespace GUI { m_end_corner = mouse_position; } +#if ENABLE_RAYCAST_PICKING + std::vector GLSelectionRectangle::contains(const std::vector& points) const +#else std::vector GLSelectionRectangle::stop_dragging(const GLCanvas3D& canvas, const std::vector& points) +#endif // ENABLE_RAYCAST_PICKING { std::vector out; +#if !ENABLE_RAYCAST_PICKING if (!is_dragging()) return out; m_state = EState::Off; +#endif // !ENABLE_RAYCAST_PICKING // 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()) }); + const 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. const Camera &camera = wxGetApp().plater()->get_camera(); @@ -65,7 +71,7 @@ namespace GUI { return; const Size cnv_size = canvas.get_canvas_size(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const float cnv_width = (float)cnv_size.get_width(); const float cnv_height = (float)cnv_size.get_height(); if (cnv_width == 0.0f || cnv_height == 0.0f) @@ -93,9 +99,13 @@ namespace GUI { const float top = (float)std::max(start.y(), end.y()) * inv_zoom; const float right = (float)std::max(start.x(), end.x()) * inv_zoom; const float bottom = (float)std::min(start.y(), end.y()) * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL - glsafe(::glLineWidth(1.5f)); +#if ENABLE_GL_CORE_PROFILE + const bool core_profile = OpenGLManager::get_gl_info().is_core_profile(); + if (!core_profile) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.5f)); #if !ENABLE_LEGACY_OPENGL_REMOVAL float color[3]; color[0] = (m_state == EState::Select) ? 0.3f : 1.0f; @@ -106,7 +116,7 @@ namespace GUI { glsafe(::glDisable(GL_DEPTH_TEST)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); // ensure that the rectangle is renderered inside the frustrum @@ -114,14 +124,28 @@ namespace GUI { // ensure that the overlay fits the frustrum near z plane const double gui_scale = camera.get_gui_scale(); glsafe(::glScaled(gui_scale, gui_scale, 1.0)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +#if !ENABLE_OPENGL_ES +#if ENABLE_GL_CORE_PROFILE + if (!core_profile) { +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glPushAttrib(GL_ENABLE_BIT)); glsafe(::glLineStipple(4, 0xAAAA)); glsafe(::glEnable(GL_LINE_STIPPLE)); +#if ENABLE_GL_CORE_PROFILE + } +#endif // ENABLE_GL_CORE_PROFILE +#endif // !ENABLE_OPENGL_ES #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_OPENGL_ES + GLShaderProgram* shader = wxGetApp().get_shader("dashed_lines"); +#elif ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = core_profile ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_OPENGL_ES if (shader != nullptr) { shader->start_using(); @@ -131,11 +155,44 @@ namespace GUI { m_rectangle.reset(); GLModel::Geometry init_data; +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P4 }; + init_data.reserve_vertices(8); + init_data.reserve_indices(8); +#else init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2 }; init_data.reserve_vertices(4); init_data.reserve_indices(4); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES // vertices +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const float width = right - left; + const float height = top - bottom; + float perimeter = 0.0f; + + init_data.add_vertex(Vec4f(left, bottom, 0.0f, perimeter)); + perimeter += width; + init_data.add_vertex(Vec4f(right, bottom, 0.0f, perimeter)); + + init_data.add_vertex(Vec4f(right, bottom, 0.0f, perimeter)); + perimeter += height; + init_data.add_vertex(Vec4f(right, top, 0.0f, perimeter)); + + init_data.add_vertex(Vec4f(right, top, 0.0f, perimeter)); + perimeter += width; + init_data.add_vertex(Vec4f(left, top, 0.0f, perimeter)); + + init_data.add_vertex(Vec4f(left, top, 0.0f, perimeter)); + perimeter += height; + init_data.add_vertex(Vec4f(left, bottom, 0.0f, perimeter)); + + // indices + init_data.add_line(0, 1); + init_data.add_line(2, 3); + init_data.add_line(4, 5); + init_data.add_line(6, 7); +#else init_data.add_vertex(Vec2f(left, bottom)); init_data.add_vertex(Vec2f(right, bottom)); init_data.add_vertex(Vec2f(right, top)); @@ -146,14 +203,25 @@ namespace GUI { init_data.add_index(1); init_data.add_index(2); init_data.add_index(3); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES m_rectangle.init_from(std::move(init_data)); } -#if ENABLE_GL_SHADERS_ATTRIBUTES shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_OPENGL_ES + shader->set_uniform("dash_size", 0.01f); + shader->set_uniform("gap_size", 0.0075f); +#elif ENABLE_GL_CORE_PROFILE + if (core_profile) { + const std::array& viewport = wxGetApp().plater()->get_camera().get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("dash_size", 0.01f); + shader->set_uniform("gap_size", 0.0075f); + } +#endif // ENABLE_OPENGL_ES m_rectangle.set_color(ColorRGBA((m_state == EState::Select) ? 0.3f : 1.0f, (m_state == EState::Select) ? 1.0f : 0.3f, 0.3f, 1.0f)); m_rectangle.render(); @@ -168,11 +236,16 @@ namespace GUI { glsafe(::glEnd()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if !ENABLE_OPENGL_ES +#if ENABLE_GL_CORE_PROFILE + if (!core_profile) +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glPopAttrib()); +#endif // !ENABLE_OPENGL_ES -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } } // namespace GUI diff --git a/src/slic3r/GUI/GLSelectionRectangle.hpp b/src/slic3r/GUI/GLSelectionRectangle.hpp index 49b3447ba9..16eab222ae 100644 --- a/src/slic3r/GUI/GLSelectionRectangle.hpp +++ b/src/slic3r/GUI/GLSelectionRectangle.hpp @@ -26,9 +26,15 @@ public: // To be called on mouse move. void dragging(const Vec2d& mouse_position); +#if ENABLE_RAYCAST_PICKING + // Given a vector of points in world coordinates, the function returns indices of those + // that are in the rectangle. + std::vector contains(const std::vector& points) const; +#else // Given a vector of points in world coordinates, the function returns indices of those // that are in the rectangle. It then disables the rectangle. std::vector stop_dragging(const GLCanvas3D& canvas, const std::vector& points); +#endif // ENABLE_RAYCAST_PICKING // Disables the rectangle. void stop_dragging(); @@ -36,9 +42,7 @@ public: void render(const GLCanvas3D& canvas); bool is_dragging() const { return m_state != EState::Off; } -#if ENABLE_NEW_RECTANGLE_SELECTION bool is_empty() const { return m_state == EState::Off || m_start_corner.isApprox(m_end_corner); } -#endif // ENABLE_NEW_RECTANGLE_SELECTION EState get_state() const { return m_state; } diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 9e3001d778..5146f03fc6 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -301,14 +301,11 @@ void GLShaderProgram::set_uniform(int id, const Matrix3f& value) const glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast(value.data()))); } -#if ENABLE_GL_SHADERS_ATTRIBUTES void GLShaderProgram::set_uniform(int id, const Matrix3d& value) const { set_uniform(id, (Matrix3f)value.cast()); } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GL_IMGUI_SHADERS void GLShaderProgram::set_uniform(int id, const Matrix4f& value) const { if (id >= 0) @@ -319,7 +316,17 @@ void GLShaderProgram::set_uniform(int id, const Matrix4d& value) const { set_uniform(id, (Matrix4f)value.cast()); } -#endif // ENABLE_GL_IMGUI_SHADERS + +void GLShaderProgram::set_uniform(int id, const Vec2f& value) const +{ + if (id >= 0) + glsafe(::glUniform2fv(id, 1, static_cast(value.data()))); +} + +void GLShaderProgram::set_uniform(int id, const Vec2d& value) const +{ + set_uniform(id, static_cast(value.cast())); +} void GLShaderProgram::set_uniform(int id, const Vec3f& value) const { diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp index 72edb8b66d..935daaaeaa 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -62,13 +62,11 @@ public: void set_uniform(const char* name, const Transform3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Transform3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Matrix3f& value) const { set_uniform(get_uniform_location(name), value); } -#if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(const char* name, const Matrix3d& value) const { set_uniform(get_uniform_location(name), value); } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GL_IMGUI_SHADERS void set_uniform(const char* name, const Matrix4f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Matrix4d& value) const { set_uniform(get_uniform_location(name), value); } -#endif // ENABLE_GL_IMGUI_SHADERS + void set_uniform(const char* name, const Vec2f& value) const { set_uniform(get_uniform_location(name), value); } + void set_uniform(const char* name, const Vec2d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Vec3f& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const Vec3d& value) const { set_uniform(get_uniform_location(name), value); } void set_uniform(const char* name, const ColorRGB& value) const { set_uniform(get_uniform_location(name), value); } @@ -89,13 +87,11 @@ public: void set_uniform(int id, const Transform3f& value) const; void set_uniform(int id, const Transform3d& value) const; void set_uniform(int id, const Matrix3f& value) const; -#if ENABLE_GL_SHADERS_ATTRIBUTES void set_uniform(int id, const Matrix3d& value) const; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GL_IMGUI_SHADERS void set_uniform(int id, const Matrix4f& value) const; void set_uniform(int id, const Matrix4d& value) const; -#endif // ENABLE_GL_IMGUI_SHADERS + void set_uniform(int id, const Vec2f& value) const; + void set_uniform(int id, const Vec2d& value) const; void set_uniform(int id, const Vec3f& value) const; void set_uniform(int id, const Vec3d& value) const; void set_uniform(int id, const ColorRGB& value) const; diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp index 9edd39d7f4..f0b91faf32 100644 --- a/src/slic3r/GUI/GLShadersManager.cpp +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -3,6 +3,9 @@ #include "GLShadersManager.hpp" #include "3DScene.hpp" #include "GUI_App.hpp" +#if ENABLE_GL_CORE_PROFILE +#include "OpenGLManager.hpp" +#endif // ENABLE_GL_CORE_PROFILE #include #include @@ -34,8 +37,13 @@ std::pair GLShadersManager::init() bool valid = true; #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_OPENGL_ES + const std::string prefix = "ES/"; + // used to render wireframed triangles + valid &= append_shader("wireframe", { prefix + "wireframe.vs", prefix + "wireframe.fs" }); +#else const std::string prefix = GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 1) ? "140/" : "110/"; +#endif // ENABLE_OPENGL_ES // imgui shader valid &= append_shader("imgui", { prefix + "imgui.vs", prefix + "imgui.fs" }); // basic shader, used to render all what was previously rendered using the immediate mode @@ -46,24 +54,22 @@ std::pair GLShadersManager::init() valid &= append_shader("flat_texture", { prefix + "flat_texture.vs", prefix + "flat_texture.fs" }); // used to render 3D scene background valid &= append_shader("background", { prefix + "background.vs", prefix + "background.fs" }); -#else - // basic shader, used to render all what was previously rendered using the immediate mode - valid &= append_shader("flat", { "flat.vs", "flat.fs" }); - // basic shader for textures, used to render textures - valid &= append_shader("flat_texture", { "flat_texture.vs", "flat_texture.fs" }); - // used to render 3D scene background - valid &= append_shader("background", { "background.vs", "background.fs" }); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_OPENGL_ES + // used to render dashed lines + valid &= append_shader("dashed_lines", { prefix + "dashed_lines.vs", prefix + "dashed_lines.fs" }); +#elif ENABLE_GL_CORE_PROFILE + if (GUI::OpenGLManager::get_gl_info().is_core_profile()) + // used to render thick and/or dashed lines + valid &= append_shader("dashed_thick_lines", { prefix + "dashed_thick_lines.vs", prefix + "dashed_thick_lines.fs", prefix + "dashed_thick_lines.gs" }); +#endif // ENABLE_OPENGL_ES #endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_SHOW_TOOLPATHS_COG // used to render toolpaths center of gravity -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL valid &= append_shader("toolpaths_cog", { prefix + "toolpaths_cog.vs", prefix + "toolpaths_cog.fs" }); #else valid &= append_shader("toolpaths_cog", { "toolpaths_cog.vs", "toolpaths_cog.fs" }); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#endif // ENABLE_SHOW_TOOLPATHS_COG -#if ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_LEGACY_OPENGL_REMOVAL // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells, options in gcode preview valid &= append_shader("gouraud_light", { prefix + "gouraud_light.vs", prefix + "gouraud_light.fs" }); // used to render printbed @@ -73,16 +79,16 @@ std::pair GLShadersManager::init() valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" }); // used to render printbed valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" }); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // used to render options in gcode preview if (GUI::wxGetApp().is_gl_version_greater_or_equal_to(3, 3)) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL valid &= append_shader("gouraud_light_instanced", { prefix + "gouraud_light_instanced.vs", prefix + "gouraud_light_instanced.fs" }); #else valid &= append_shader("gouraud_light_instanced", { "gouraud_light_instanced.vs", "gouraud_light_instanced.fs" }); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL // used to render objects in 3d editor valid &= append_shader("gouraud", { prefix + "gouraud.vs", prefix + "gouraud.fs" } #else @@ -90,12 +96,12 @@ std::pair GLShadersManager::init() 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" } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_ENVIRONMENT_MAP , { "ENABLE_ENVIRONMENT_MAP"sv } #endif // ENABLE_ENVIRONMENT_MAP ); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL // used to render variable layers heights in 3d editor valid &= append_shader("variable_layer_height", { prefix + "variable_layer_height.vs", prefix + "variable_layer_height.fs" }); // used to render highlight contour around selected triangles inside the multi-material gizmo @@ -105,14 +111,14 @@ std::pair GLShadersManager::init() valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" }); // used to render highlight contour around selected triangles inside the multi-material gizmo valid &= append_shader("mm_contour", { "mm_contour.vs", "mm_contour.fs" }); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Used to render painted triangles inside the multi-material gizmo. Triangle normals are computed inside fragment shader. // For Apple's on Arm CPU computed triangle normals inside fragment shader using dFdx and dFdy has the opposite direction. // Because of this, objects had darker colors inside the multi-material gizmo. // Based on https://stackoverflow.com/a/66206648, the similar behavior was also spotted on some other devices with Arm CPU. // Since macOS 12 (Monterey), this issue with the opposite direction on Apple's Arm CPU seems to be fixed, and computed // triangle normals inside fragment shader have the right direction. -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (platform_flavor() == PlatformFlavor::OSXOnArm && wxPlatformInfo::Get().GetOSMajorVersion() < 12) valid &= append_shader("mm_gouraud", { prefix + "mm_gouraud.vs", prefix + "mm_gouraud.fs" }, { "FLIP_TRIANGLE_NORMALS"sv }); else @@ -122,7 +128,7 @@ std::pair GLShadersManager::init() valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}, {"FLIP_TRIANGLE_NORMALS"sv}); else valid &= append_shader("mm_gouraud", {"mm_gouraud.vs", "mm_gouraud.fs"}); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL return { valid, error }; } diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp index 6065f22a56..2374b088be 100644 --- a/src/slic3r/GUI/GLTexture.cpp +++ b/src/slic3r/GUI/GLTexture.cpp @@ -23,8 +23,8 @@ #define STB_DXT_IMPLEMENTATION #include "stb_dxt/stb_dxt.h" -#include "nanosvg/nanosvg.h" -#include "nanosvg/nanosvgrast.h" +#include +#include #include "libslic3r/Utils.hpp" @@ -277,7 +277,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorstart_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->set_uniform("view_model_matrix", Transform3d::Identity()); shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL model.render(); shader->stop_using(); } @@ -380,13 +382,15 @@ void GLTexture::render_sub_texture(unsigned int tex_id, float left, float right, glsafe(::glBindTexture(GL_TEXTURE_2D, 0)); +#if !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES glsafe(::glDisable(GL_TEXTURE_2D)); +#endif // !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES glsafe(::glDisable(GL_BLEND)); } bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECompressionType compression_type, bool apply_anisotropy) { - bool compression_enabled = (compression_type != None) && GLEW_EXT_texture_compression_s3tc; + bool compression_enabled = (compression_type != None) && OpenGLManager::are_compressed_textures_supported(); // Load a PNG with an alpha channel. wxImage image; @@ -535,7 +539,7 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, bool compress, bool apply_anisotropy, unsigned int max_size_px) { - bool compression_enabled = compress && GLEW_EXT_texture_compression_s3tc; + bool compression_enabled = compress && OpenGLManager::are_compressed_textures_supported(); NSVGimage* image = BitmapCache::nsvgParseFromFileWithReplace(filename.c_str(), "px", 96.0f, {}); if (image == nullptr) { @@ -599,7 +603,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo else glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data())); - if (use_mipmaps) { + if (use_mipmaps && OpenGLManager::use_manually_generated_mipmaps()) { // we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards int lod_w = m_width; int lod_h = m_height; @@ -628,8 +632,9 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)); } - } - else { + } else if (use_mipmaps && !OpenGLManager::use_manually_generated_mipmaps()) { + glGenerateMipmap(GL_TEXTURE_2D); + } else { glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0)); } diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 78fbc084ff..9d7f621ba6 100644 --- a/src/slic3r/GUI/GLToolbar.cpp +++ b/src/slic3r/GUI/GLToolbar.cpp @@ -85,11 +85,11 @@ bool GLToolbarItem::update_enabled_state() return ret; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLToolbarItem::render(const GLCanvas3D& parent, 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 #else 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 -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { 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); @@ -118,7 +118,7 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b GLTexture::render_sub_texture(tex_id, left, right, bottom, top, uvs(tex_width, tex_height, icon_size)); if (is_pressed()) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Size cnv_size = parent.get_canvas_size(); const float cnv_w = (float)cnv_size.get_width(); const float cnv_h = (float)cnv_size.get_height(); @@ -136,7 +136,7 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b m_data.left.render_callback(left, right, bottom, top); else if (m_last_action_type == Right && m_data.right.can_render()) m_data.right.render_callback(left, right, bottom, top); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } @@ -202,7 +202,7 @@ bool GLToolbar::init(const BackgroundTexture::Metadata& background_texture) return res; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL bool GLToolbar::init_arrow(const std::string& filename) { if (m_arrow_texture.get_id() != 0) @@ -228,7 +228,7 @@ bool GLToolbar::init_arrow(const BackgroundTexture::Metadata& arrow_texture) return res; } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLToolbar::Layout::EType GLToolbar::get_layout_type() const { @@ -693,7 +693,7 @@ void GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent) } } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent) { const Size cnv_size = parent.get_canvas_size(); @@ -1108,7 +1108,7 @@ void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& } } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL GLToolbarItem* GLToolbar::get_item(const std::string& item_name) { @@ -1135,7 +1135,7 @@ int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) } } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const { const Size cnv_size = parent.get_canvas_size(); @@ -1428,9 +1428,9 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& return -1; } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLToolbar::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const { const unsigned int tex_id = m_background_texture.texture.get_id(); @@ -1584,9 +1584,9 @@ void GLToolbar::render_background(float left, float top, float right, float bott GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighted_item) { // arrow texture not initialized @@ -1721,9 +1721,9 @@ void GLToolbar::render_arrow(const GLCanvas3D& parent, GLToolbarItem* highlighte GLTexture::render_sub_texture(tex_id, internal_left, internal_right, internal_bottom, internal_top, { { internal_left_uv, internal_top_uv }, { internal_right_uv, internal_top_uv }, { internal_right_uv, internal_bottom_uv }, { internal_left_uv, internal_bottom_uv } }); } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLToolbar::render_horizontal(const GLCanvas3D& parent) { const Size cnv_size = parent.get_canvas_size(); @@ -1927,7 +1927,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) } } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL bool GLToolbar::generate_icons_texture() { diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index bd3204d632..1a836164c4 100644 --- a/src/slic3r/GUI/GLToolbar.hpp +++ b/src/slic3r/GUI/GLToolbar.hpp @@ -153,11 +153,11 @@ public: // returns true if the state changes bool update_enabled_state(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render(const GLCanvas3D& parent, 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; #else 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; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL private: void set_visible(bool visible) { m_data.visible = visible; } @@ -251,11 +251,11 @@ private: GLTexture m_icons_texture; bool m_icons_texture_dirty; BackgroundTexture m_background_texture; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL GLTexture m_arrow_texture; #else BackgroundTexture m_arrow_texture; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL Layout m_layout; ItemsList m_items; @@ -282,11 +282,11 @@ public: bool init(const BackgroundTexture::Metadata& background_texture); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL bool init_arrow(const std::string& filename); #else bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL Layout::EType get_layout_type() const; void set_layout_type(Layout::EType type); @@ -357,11 +357,11 @@ private: int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; int contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& parent) const; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; #else void render_background(float left, float top, float right, float bottom, float border) const; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void render_horizontal(const GLCanvas3D& parent); void render_vertical(const GLCanvas3D& parent); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 4dbe0e8a2f..23b13a483e 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -123,15 +123,18 @@ public: { wxASSERT(bitmap.IsOk()); - int init_dpi = get_dpi_for_window(this); +// int init_dpi = get_dpi_for_window(this); this->SetPosition(pos); + // The size of the SplashScreen can be hanged after its moving to another display + // So, update it from a bitmap size + this->SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); this->CenterOnScreen(); - int new_dpi = get_dpi_for_window(this); +// int new_dpi = get_dpi_for_window(this); - m_scale = (float)(new_dpi) / (float)(init_dpi); +// m_scale = (float)(new_dpi) / (float)(init_dpi); m_main_bitmap = bitmap; - scale_bitmap(m_main_bitmap, m_scale); +// scale_bitmap(m_main_bitmap, m_scale); // init constant texts and scale fonts init_constant_text(); @@ -266,12 +269,12 @@ private: version = _L("Version") + " " + std::string(SLIC3R_VERSION); // credits infornation - credits = title + " " + - _L("is based on Slic3r by Alessandro Ranellucci and the RepRap community.") + "\n" + - _L("Developed by Prusa Research.")+ "\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 Leslie Ing"); + credits = title + " " + + _L("is based on Slic3r by Alessandro Ranellucci and the RepRap community.") + "\n" + + _L("Developed by Prusa Research.") + "\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 Leslie Ing"); title_font = version_font = credits_font = init_font; } @@ -331,7 +334,7 @@ private: // See https://github.com/wxWidgets/wxWidgets/blob/master/src/msw/font.cpp // void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew) wxNativeFontInfo nfi= *font.GetNativeFontInfo(); - float pointSizeNew = scale * font.GetPointSize(); + float pointSizeNew = wxDisplay(this).GetScaleFactor() * scale * font.GetPointSize(); nfi.lf.lfHeight = nfi.GetLogFontHeightAtPPI(pointSizeNew, get_dpi_for_window(this)); nfi.pointSize = pointSizeNew; font = wxFont(nfi); @@ -454,14 +457,17 @@ struct FileWildcards { std::vector file_extensions; }; + + static const FileWildcards file_wildcards_by_type[FT_SIZE] = { /* FT_STL */ { "STL files"sv, { ".stl"sv } }, /* FT_OBJ */ { "OBJ files"sv, { ".obj"sv } }, /* FT_OBJECT */ { "Object files"sv, { ".stl"sv, ".obj"sv } }, + /* FT_STEP */ { "STEP files"sv, { ".stp"sv, ".step"sv } }, /* FT_AMF */ { "AMF files"sv, { ".amf"sv, ".zip.amf"sv, ".xml"sv } }, /* FT_3MF */ { "3MF files"sv, { ".3mf"sv } }, /* FT_GCODE */ { "G-code files"sv, { ".gcode"sv, ".gco"sv, ".g"sv, ".ngc"sv } }, - /* FT_MODEL */ { "Known files"sv, { ".stl"sv, ".obj"sv, ".3mf"sv, ".amf"sv, ".zip.amf"sv, ".xml"sv } }, + /* FT_MODEL */ { "Known files"sv, { ".stl"sv, ".obj"sv, ".3mf"sv, ".amf"sv, ".zip.amf"sv, ".xml"sv, ".step"sv, ".stp"sv } }, /* FT_PROJECT */ { "Project files"sv, { ".3mf"sv, ".amf"sv, ".zip.amf"sv } }, /* FT_FONTS */ { "Font files"sv, { ".ttc"sv, ".ttf"sv } }, /* FT_GALLERY */ { "Known files"sv, { ".stl"sv, ".obj"sv } }, @@ -848,7 +854,16 @@ std::string GUI_App::get_gl_info(bool for_github) wxGLContext* GUI_App::init_glcontext(wxGLCanvas& canvas) { +#if ENABLE_GL_CORE_PROFILE +#if ENABLE_OPENGL_DEBUG_OPTION + return m_opengl_mgr.init_glcontext(canvas, init_params != nullptr ? init_params->opengl_version : std::make_pair(0, 0), + init_params != nullptr ? init_params->opengl_debug : false); +#else + return m_opengl_mgr.init_glcontext(canvas, init_params != nullptr ? init_params->opengl_version : std::make_pair(0, 0)); +#endif // ENABLE_OPENGL_DEBUG_OPTION +#else return m_opengl_mgr.init_glcontext(canvas); +#endif // ENABLE_GL_CORE_PROFILE } bool GUI_App::init_opengl() @@ -882,9 +897,10 @@ static boost::optional parse_semver_from_ini(std::string path) 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); SetAppName(SLIC3R_APP_KEY "-alpha"); -// SetAppName(SLIC3R_APP_KEY "-beta"); +// SetAppName(SLIC3R_APP_KEY "-beta"); // SetAppDisplayName(SLIC3R_APP_NAME); @@ -1180,7 +1196,7 @@ bool GUI_App::on_init_inner() } // create splash screen with updated bmp - scrn = new SplashScreen(bmp.IsOk() ? bmp : create_scaled_bitmap("PrusaSlicer", nullptr, 400), + scrn = new SplashScreen(bmp.IsOk() ? bmp : get_bmp_bundle("PrusaSlicer", 400)->GetPreferredBitmapSizeAtScale(1.0), wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 4000, splashscreen_pos); if (!default_splashscreen_pos) @@ -1399,9 +1415,9 @@ bool GUI_App::dark_mode() // proper dark mode was first introduced. return wxPlatformInfo::Get().CheckOSVersion(10, 14) && mac_dark_mode(); #else - return wxGetApp().app_config->get("dark_color_mode") == "1" ? true : check_dark_mode(); - //const unsigned luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - //return luma < 128; + if (wxGetApp().app_config->has("dark_color_mode")) + return wxGetApp().app_config->get("dark_color_mode") == "1"; + return check_dark_mode(); #endif } @@ -1882,7 +1898,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/STEP):"), from_u8(app_config->get_last_dir()), "", file_wildcards(FT_MODEL), wxFD_OPEN | wxFD_MULTIPLE | wxFD_FILE_MUST_EXIST); @@ -1968,7 +1984,7 @@ static const wxLanguageInfo* linux_get_existing_locale_language(const wxLanguage // while maintaining the order of matches, so that the best match ends up at the very end. std::string system_country = "_" + into_u8(system_language->CanonicalName.AfterFirst('_')).substr(0, 2); int cnt = locales.size(); - for (int i=0; iSetLanguage(wxLANGUAGE_DEFAULT); // Let the wxFileTranslationsLoader enumerate all translation dictionaries for PrusaSlicer @@ -2231,7 +2256,7 @@ void GUI_App::update_mode() { sidebar().update_mode(); -#ifdef _MSW_DARK_MODE +#ifdef _WIN32 //_MSW_DARK_MODE if (!wxGetApp().tabs_as_menu()) dynamic_cast(mainframe->m_tabpanel)->UpdateMode(); #endif @@ -2805,6 +2830,11 @@ NotificationManager * GUI_App::notification_manager() return plater_->get_notification_manager(); } +GalleryDialog* GUI_App::gallery_dialog() +{ + return mainframe->gallery_dialog(); +} + // extruders count from selected printer preset int GUI_App::extruders_cnt() const { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index abe62a1ae9..682aa1d001 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -47,6 +47,7 @@ class ObjectLayers; class Plater; class NotificationManager; struct GUI_InitParams; +class GalleryDialog; @@ -55,6 +56,7 @@ enum FileType FT_STL, FT_OBJ, FT_OBJECT, + FT_STEP, FT_AMF, FT_3MF, FT_GCODE, @@ -296,6 +298,7 @@ public: const Plater* plater() const; Model& model(); NotificationManager * notification_manager(); + GalleryDialog * gallery_dialog(); // Parameters extracted from the command line to be passed to GUI after initialization. GUI_InitParams* init_params { nullptr }; diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index 5e984e3f14..ffecf81617 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -143,14 +143,13 @@ std::map SettingsFactory::CATEGORY_ICON = { L("Hollowing") , "hollowing" } }; -wxBitmap SettingsFactory::get_category_bitmap(const std::string& category_name, bool menu_bmp /*= true*/) +wxBitmapBundle* SettingsFactory::get_category_bitmap(const std::string& category_name) { if (CATEGORY_ICON.find(category_name) == CATEGORY_ICON.end()) - return wxNullBitmap; - return menu_bmp ? create_menu_bitmap(CATEGORY_ICON.at(category_name)) : create_scaled_bitmap(CATEGORY_ICON.at(category_name)); + return get_bmp_bundle("empty"); + return get_bmp_bundle(CATEGORY_ICON.at(category_name)); } - //------------------------------------- // MenuFactory //------------------------------------- @@ -166,11 +165,11 @@ const std::vector> MenuFactory::ADD_VOLUME_M }; // Note: id accords to type of the sub-object (adding volume), so sequence of the menu items is important -const std::vector MenuFactory::TEXT_VOLUME_ICONS { -// text_volume bitmap name - {"add_text_part" }, // ~ModelVolumeType::MODEL_PART - {"add_text_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME - {"add_text_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER +const std::vector> MenuFactory::TEXT_VOLUME_ICONS { +// menu_item Name menu_item bitmap name + {L("Add text"), "add_text_part"}, // ~ModelVolumeType::MODEL_PART + {L("Add negative text"), "add_text_negative" }, // ~ModelVolumeType::NEGATIVE_VOLUME + {L("Add text modifier"), "add_text_modifier"}, // ~ModelVolumeType::PARAMETER_MODIFIER }; static Plater* plater() @@ -439,21 +438,21 @@ static void create_freq_settings_popupmenu(wxMenu* menu, const bool is_object_se #endif } -std::vector MenuFactory::get_volume_bitmaps() +std::vector MenuFactory::get_volume_bitmaps() { - std::vector volume_bmps; + std::vector volume_bmps; volume_bmps.reserve(ADD_VOLUME_MENU_ITEMS.size()); for (auto item : ADD_VOLUME_MENU_ITEMS) - volume_bmps.push_back(create_menu_bitmap(item.second)); + volume_bmps.push_back(get_bmp_bundle(item.second)); return volume_bmps; } -std::vector MenuFactory::get_text_volume_bitmaps() +std::vector MenuFactory::get_text_volume_bitmaps() { - std::vector volume_bmps; + std::vector volume_bmps; volume_bmps.reserve(TEXT_VOLUME_ICONS.size()); for (auto item : TEXT_VOLUME_ICONS) - volume_bmps.push_back(create_menu_bitmap(item)); + volume_bmps.push_back(get_bmp_bundle(item.second)); return volume_bmps; } @@ -659,7 +658,7 @@ wxMenuItem* MenuFactory::append_menu_item_settings(wxMenu* menu_) // Add full settings list auto menu_item = new wxMenuItem(menu, wxID_ANY, menu_name); - menu_item->SetBitmap(create_menu_bitmap("cog")); + menu_item->SetBitmap(*get_bmp_bundle("cog")); menu_item->SetSubMenu(create_settings_popupmenu(menu, is_object_settings, item)); return menu->Append(menu_item); @@ -804,7 +803,7 @@ void MenuFactory::append_menu_item_change_extruder(wxMenu* menu) return; } - std::vector icons = get_extruder_color_icons(true); + std::vector icons = get_extruder_color_icons(true); wxMenu* extruder_selection_menu = new wxMenu(); const wxString& name = sels.Count() == 1 ? names[0] : names[1]; @@ -823,7 +822,7 @@ void MenuFactory::append_menu_item_change_extruder(wxMenu* menu) (is_active_extruder ? " (" + _L("active") + ")" : ""); append_menu_item(extruder_selection_menu, wxID_ANY, item_name, "", - [i](wxCommandEvent&) { obj_list()->set_extruder_for_selected_items(i); }, *icons[icon_idx], menu, + [i](wxCommandEvent&) { obj_list()->set_extruder_for_selected_items(i); }, icons[icon_idx], menu, [is_active_extruder]() { return !is_active_extruder; }, m_parent); } @@ -1232,12 +1231,6 @@ void MenuFactory::update_default_menu() create_default_menu(); } -void MenuFactory::msw_rescale() -{ - for (MenuWithSeparators* menu : { &m_object_menu, &m_sla_object_menu, &m_part_menu, &m_default_menu }) - msw_rescale_menu(dynamic_cast(menu)); -} - #ifdef _WIN32 // For this class is used code from stackoverflow: // https://stackoverflow.com/questions/257288/is-it-possible-to-write-a-template-to-check-for-a-functions-existence @@ -1267,7 +1260,7 @@ static void update_menu_item_def_colors(T* item) void MenuFactory::sys_color_changed() { for (MenuWithSeparators* menu : { &m_object_menu, &m_sla_object_menu, &m_part_menu, &m_default_menu }) { - msw_rescale_menu(dynamic_cast(menu));// msw_rescale_menu updates just icons, so use it + sys_color_changed_menu(dynamic_cast(menu));// msw_rescale_menu updates just icons, so use it #ifdef _WIN32 // but under MSW we have to update item's bachground color for (wxMenuItem* item : menu->GetMenuItems()) @@ -1280,14 +1273,17 @@ void MenuFactory::sys_color_changed(wxMenuBar* menubar) { for (size_t id = 0; id < menubar->GetMenuCount(); id++) { wxMenu* menu = menubar->GetMenu(id); - msw_rescale_menu(menu); + sys_color_changed_menu(menu); +#ifndef __linux__ + menu->SetupBitmaps(); #ifdef _WIN32 // but under MSW we have to update item's bachground color for (wxMenuItem* item : menu->GetMenuItems()) update_menu_item_def_colors(item); +#endif #endif } - menubar->Refresh(); +// menubar->Refresh(); } diff --git a/src/slic3r/GUI/GUI_Factories.hpp b/src/slic3r/GUI/GUI_Factories.hpp index 64f92af7f1..0550be20c3 100644 --- a/src/slic3r/GUI/GUI_Factories.hpp +++ b/src/slic3r/GUI/GUI_Factories.hpp @@ -25,7 +25,7 @@ struct SettingsFactory typedef std::map> Bundle; static std::map CATEGORY_ICON; - static wxBitmap get_category_bitmap(const std::string& category_name, bool menu_bmp = true); + static wxBitmapBundle* get_category_bitmap(const std::string& category_name); static Bundle get_bundle(const DynamicPrintConfig* config, bool is_object_settings); static std::vector get_options(bool is_part); }; @@ -34,9 +34,9 @@ class MenuFactory { public: static const std::vector> ADD_VOLUME_MENU_ITEMS; - static const std::vector TEXT_VOLUME_ICONS; - static std::vector get_volume_bitmaps(); - static std::vector get_text_volume_bitmaps(); + static const std::vector> TEXT_VOLUME_ICONS; + static std::vector get_volume_bitmaps(); + static std::vector get_text_volume_bitmaps(); MenuFactory(); ~MenuFactory() = default; @@ -45,7 +45,6 @@ public: void update(); void update_object_menu(); void update_default_menu(); - void msw_rescale(); void sys_color_changed(); static void sys_color_changed(wxMenuBar* menu_bar); diff --git a/src/slic3r/GUI/GUI_Init.cpp b/src/slic3r/GUI/GUI_Init.cpp index 000199f93a..5b5cca7dc4 100644 --- a/src/slic3r/GUI/GUI_Init.cpp +++ b/src/slic3r/GUI/GUI_Init.cpp @@ -1,3 +1,4 @@ +#include "libslic3r/Technologies.hpp" #include "GUI_Init.hpp" #include "libslic3r/AppConfig.hpp" @@ -25,6 +26,12 @@ namespace Slic3r { namespace GUI { +const std::vector OpenGLVersions::core_str = { "3.2", "3.3", "4.0", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6" }; +const std::vector OpenGLVersions::precore_str = { "2.0", "2.1", "3.0", "3.1" }; + +const std::vector> OpenGLVersions::core = { {3,2}, {3,3}, {4,0}, {4,1}, {4,2}, {4,3}, {4,4}, {4,5}, {4,6} }; +const std::vector> OpenGLVersions::precore = { {2,0}, {2,1}, {3,0}, {3,1} }; + int GUI_Run(GUI_InitParams ¶ms) { #if __APPLE__ @@ -52,7 +59,6 @@ int GUI_Run(GUI_InitParams ¶ms) // gui->autosave = m_config.opt_string("autosave"); GUI::GUI_App::SetInstance(gui); gui->init_params = ¶ms; - return wxEntry(params.argc, params.argv); } catch (const Slic3r::Exception &ex) { boost::nowide::cerr << ex.what() << std::endl; diff --git a/src/slic3r/GUI/GUI_Init.hpp b/src/slic3r/GUI/GUI_Init.hpp index 2adf618a47..878edc1d97 100644 --- a/src/slic3r/GUI/GUI_Init.hpp +++ b/src/slic3r/GUI/GUI_Init.hpp @@ -8,6 +8,15 @@ namespace Slic3r { namespace GUI { +struct OpenGLVersions +{ + static const std::vector core_str; + static const std::vector precore_str; + + static const std::vector> core; + static const std::vector> precore; +}; + struct GUI_InitParams { int argc; @@ -21,6 +30,12 @@ struct GUI_InitParams std::vector input_files; bool start_as_gcodeviewer; +#if ENABLE_GL_CORE_PROFILE + std::pair opengl_version; +#if ENABLE_OPENGL_DEBUG_OPTION + bool opengl_debug; +#endif // ENABLE_OPENGL_DEBUG_OPTION +#endif // ENABLE_GL_CORE_PROFILE }; int GUI_Run(GUI_InitParams ¶ms); diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp index 0587f353fc..6f6ec52380 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.cpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp @@ -234,47 +234,47 @@ void ObjectLayers::UpdateAndShow(const bool show) void ObjectLayers::msw_rescale() { - m_bmp_delete.msw_rescale(); - m_bmp_add.msw_rescale(); + //m_bmp_delete.msw_rescale(); + //m_bmp_add.msw_rescale(); - m_grid_sizer->SetHGap(wxGetApp().em_unit()); + //m_grid_sizer->SetHGap(wxGetApp().em_unit()); - // rescale edit-boxes - const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount(); - for (int i = 0; i < cells_cnt; ++i) { - const wxSizerItem* item = m_grid_sizer->GetItem(i); - if (item->IsWindow()) { - LayerRangeEditor* editor = dynamic_cast(item->GetWindow()); - if (editor != nullptr) - editor->msw_rescale(); - } - else if (item->IsSizer()) // case when we have editor with buttons - { - wxSizerItem* e_item = item->GetSizer()->GetItem(size_t(0)); // editor - if (e_item->IsWindow()) { - LayerRangeEditor* editor = dynamic_cast(e_item->GetWindow()); - if (editor != nullptr) - editor->msw_rescale(); - } + //// rescale edit-boxes + //const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount(); + //for (int i = 0; i < cells_cnt; ++i) { + // const wxSizerItem* item = m_grid_sizer->GetItem(i); + // if (item->IsWindow()) { + // LayerRangeEditor* editor = dynamic_cast(item->GetWindow()); + // if (editor != nullptr) + // editor->msw_rescale(); + // } + // else if (item->IsSizer()) // case when we have editor with buttons + // { + // wxSizerItem* e_item = item->GetSizer()->GetItem(size_t(0)); // editor + // if (e_item->IsWindow()) { + // LayerRangeEditor* editor = dynamic_cast(e_item->GetWindow()); + // if (editor != nullptr) + // editor->msw_rescale(); + // } - if (item->GetSizer()->GetItemCount() > 2) // if there are Add/Del buttons - for (size_t btn : {2, 3}) { // del_btn, add_btn - wxSizerItem* b_item = item->GetSizer()->GetItem(btn); - if (b_item->IsWindow()) { - auto button = dynamic_cast(b_item->GetWindow()); - if (button != nullptr) - button->msw_rescale(); - } - } - } - } + // if (item->GetSizer()->GetItemCount() > 2) // if there are Add/Del buttons + // for (size_t btn : {2, 3}) { // del_btn, add_btn + // wxSizerItem* b_item = item->GetSizer()->GetItem(btn); + // if (b_item->IsWindow()) { + // auto button = dynamic_cast(b_item->GetWindow()); + // if (button != nullptr) + // button->msw_rescale(); + // } + // } + // } + //} m_grid_sizer->Layout(); } void ObjectLayers::sys_color_changed() { - m_bmp_delete.msw_rescale(); - m_bmp_add.msw_rescale(); + m_bmp_delete.sys_color_changed(); + m_bmp_add.sys_color_changed(); // rescale edit-boxes const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount(); @@ -286,7 +286,7 @@ void ObjectLayers::sys_color_changed() if (b_item->IsWindow()) { auto button = dynamic_cast(b_item->GetWindow()); if (button != nullptr) - button->msw_rescale(); + button->sys_color_changed(); } } } diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index c7929e9832..a6bd1b3ea9 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -222,6 +222,14 @@ ObjectList::ObjectList(wxWindow* parent) : Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &ObjectList::ItemValueChanged, this); + Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, [this](wxDataViewEvent& event) { + wxDataViewItem item; + wxDataViewColumn* col; + this->HitTest(this->get_mouse_position_in_control(), item, col); + this->EditItem(item, col); + event.StopPropagation(); + }); + Bind(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, [this](wxCommandEvent& e) { last_volume_is_deleted(e.GetInt()); }); Bind(wxEVT_SIZE, ([this](wxSizeEvent &e) { @@ -986,12 +994,11 @@ void ObjectList::extruder_editing() if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) return; - const int column_width = GetColumn(colExtruder)->GetWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) + 5; - - wxPoint pos = this->get_mouse_position_in_control(); - wxSize size = wxSize(column_width, -1); - pos.x = GetColumn(colName)->GetWidth() + GetColumn(colPrint)->GetWidth() + 5; - pos.y -= GetTextExtent("m").y; + wxRect rect = this->GetItemRect(item, GetColumn(colExtruder)); + wxPoint pos = rect.GetPosition(); + pos.y -= 4; + wxSize size = rect.GetSize(); + size.SetWidth(size.GetWidth() + 8); apply_extruder_selector(&m_extruder_editor, this, L("default"), pos, size); @@ -1417,9 +1424,8 @@ void ObjectList::load_subobject(ModelVolumeType type, bool from_galery/* = false wxArrayString input_files; if (from_galery) { - GalleryDialog dlg(this); - if (dlg.ShowModal() != wxID_CLOSE) - dlg.get_input_files(input_files); + if (wxGetApp().gallery_dialog()->show() != wxID_CLOSE) + wxGetApp().gallery_dialog()->get_input_files(input_files); } else wxGetApp().import_model(wxGetApp().tab_panel()->GetPage(0), input_files); @@ -1745,10 +1751,10 @@ void ObjectList::load_shape_object_from_gallery() return;// Add nothing if something is selected on 3DScene wxArrayString input_files; - GalleryDialog gallery_dlg(this); - if (gallery_dlg.ShowModal() == wxID_CLOSE) + GalleryDialog* gallery_dlg = wxGetApp().gallery_dialog(); + if (gallery_dlg->show() == wxID_CLOSE) return; - gallery_dlg.get_input_files(input_files); + gallery_dlg->get_input_files(input_files); if (input_files.IsEmpty()) return; load_shape_object_from_gallery(input_files); @@ -2091,6 +2097,8 @@ void ObjectList::split() Expand(parent); changed_object(obj_idx); + // update printable state for new volumes on canvas3D + wxGetApp().plater()->canvas3D()->update_instance_printable_state_for_object(obj_idx); } void ObjectList::merge(bool to_multipart_object) @@ -2204,8 +2212,12 @@ void ObjectList::merge(bool to_multipart_object) const Vec3d mirror = transformation.get_mirror(); const Vec3d rotation = transformation.get_rotation(); - if (object->id() == (*m_objects)[obj_idxs.front()]->id()) + if (object->id() == (*m_objects)[obj_idxs.front()]->id()) { new_object->add_instance(); + new_object->instances[0]->printable = false; + } + new_object->instances[0]->printable |= object->instances[0]->printable; + const Transform3d& volume_offset_correction = transformation.get_matrix(); // merge volumes @@ -2270,6 +2282,9 @@ void ObjectList::merge(bool to_multipart_object) add_object_to_list(m_objects->size() - 1); select_item(m_objects_model->GetItemById(m_objects->size() - 1)); update_selections_on_canvas(); + + // update printable state for new volumes on canvas3D + wxGetApp().plater()->canvas3D()->update_instance_printable_state_for_object(int(model->objects.size()) - 1); } // merge all parts to the one single object // all part's settings will be lost @@ -2461,6 +2476,21 @@ bool ObjectList::can_merge_to_single_object() const return (*m_objects)[obj_idx]->volumes.size() > 1; } +wxPoint ObjectList::get_mouse_position_in_control() const +{ + wxPoint pt = wxGetMousePosition() - this->GetScreenPosition(); + +#ifdef __APPLE__ + // Workaround for OSX. From wxWidgets 3.1.6 Hittest doesn't respect to the header of wxDataViewCtrl + if (wxDataViewItem top_item = this->GetTopItem(); top_item.IsOk()) { + auto rect = this->GetItemRect(top_item, this->GetColumn(0)); + pt.y -= rect.y; + } +#endif // __APPLE__ + + return pt; +} + // NO_PARAMETERS function call means that changed object index will be determine from Selection() void ObjectList::changed_object(const int obj_idx/* = -1*/) const { @@ -4274,9 +4304,6 @@ void ObjectList::msw_rescale() GetColumn(colExtruder)->SetWidth( 8 * em); GetColumn(colEditing )->SetWidth( 3 * em); - // rescale/update existing items with bitmaps - m_objects_model->Rescale(); - Layout(); } @@ -4284,7 +4311,10 @@ void ObjectList::sys_color_changed() { wxGetApp().UpdateDVCDarkUI(this, true); - msw_rescale(); + // update existing items with bitmaps + m_objects_model->UpdateBitmaps(); + + Layout(); } void ObjectList::ItemValueChanged(wxDataViewEvent &event) diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index a7de863bd1..17b6465445 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -282,7 +282,7 @@ public: bool can_merge_to_multipart_object() const; bool can_merge_to_single_object() const; - wxPoint get_mouse_position_in_control() const { return wxGetMousePosition() - this->GetScreenPosition(); } + wxPoint get_mouse_position_in_control() const; wxBoxSizer* get_sizer() {return m_sizer;} int get_selected_obj_idx() const; ModelConfig& get_item_config(const wxDataViewItem& item) const; diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 24ae01389b..0385fa21ac 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp @@ -126,7 +126,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // Load bitmaps to be used for the mirroring buttons: m_mirror_bitmap_on = ScalableBitmap(parent, "mirroring_on"); m_mirror_bitmap_off = ScalableBitmap(parent, "mirroring_off"); - m_mirror_bitmap_hidden = ScalableBitmap(parent, "mirroring_transparent.png"); + m_mirror_bitmap_hidden = ScalableBitmap(parent, "mirroring_transparent"); const int border = wxOSX ? 0 : 4; const int em = wxGetApp().em_unit(); @@ -257,9 +257,9 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // axis_name->SetForegroundColour(wxColour(axes_color_text[axis_idx])); sizer = new wxBoxSizer(wxHORIZONTAL); - // Under OSX we use font, smaller than default font, so + // Under OSX or Linux with GTK3 we use font, smaller than default font, so // there is a next trick for an equivalent layout of coordinates combobox and axes labels in they own sizers - if (wxOSX) + if (wxOSX || wxGTK3) sizer->SetMinSize(-1, m_word_local_combo->GetBestHeight(-1)); sizer->Add(axis_name, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border); @@ -1009,7 +1009,7 @@ void ObjectManipulation::update_warning_icon_state(const MeshErrorsInfo& warning m_manifold_warning_bmp = ScalableBitmap(m_parent, warning_icon_name); const wxString& tooltip = warning.tooltip; m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); - m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0,0) : m_manifold_warning_bmp.bmp().GetSize()); + m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0,0) : m_manifold_warning_bmp.GetSize()); m_fix_throught_netfab_bitmap->SetToolTip(tooltip); } @@ -1328,6 +1328,15 @@ void ObjectManipulation::set_coordinates_type(ECoordinatesType type) canvas->set_as_dirty(); canvas->request_extra_frame(); } + +ECoordinatesType ObjectManipulation::get_coordinates_type() const +{ + const wxString og_name = get_og()->get_name(); + if (og_name.Contains(_L("Group manipulation"))) + return ECoordinatesType::World; + + return m_coordinates_type; +} #endif // ENABLE_WORLD_COORDINATE void ObjectManipulation::msw_rescale() @@ -1336,25 +1345,10 @@ void ObjectManipulation::msw_rescale() m_item_name->SetMinSize(wxSize(20*em, wxDefaultCoord)); msw_rescale_word_local_combo(m_word_local_combo); m_word_local_combo_sizer->SetMinSize(wxSize(-1, m_word_local_combo->GetBestHeight(-1))); - m_manifold_warning_bmp.msw_rescale(); const wxString& tooltip = m_fix_throught_netfab_bitmap->GetToolTipText(); m_fix_throught_netfab_bitmap->SetBitmap(tooltip.IsEmpty() ? wxNullBitmap : m_manifold_warning_bmp.bmp()); - m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0, 0) : m_manifold_warning_bmp.bmp().GetSize()); - - 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(); -#if ENABLE_WORLD_COORDINATE - m_reset_skew_button->msw_rescale(); -#endif /// ENABLE_WORLD_COORDINATE - 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(); + m_fix_throught_netfab_bitmap->SetMinSize(tooltip.IsEmpty() ? wxSize(0, 0) : m_manifold_warning_bmp.GetSize()); // rescale label-heights // Text trick to grid sizer layout: @@ -1383,20 +1377,16 @@ void ObjectManipulation::sys_color_changed() for (ManipulationEditor* editor : m_editors) editor->sys_color_changed(this); - // 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(); -#if ENABLE_WORLD_COORDINATE - m_reset_skew_button->msw_rescale(); -#endif // ENABLE_WORLD_COORDINATE - m_drop_to_bed_button->msw_rescale(); - m_lock_bnt->msw_rescale(); + m_mirror_bitmap_on.sys_color_changed(); + m_mirror_bitmap_off.sys_color_changed(); + m_mirror_bitmap_hidden.sys_color_changed(); + m_reset_scale_button->sys_color_changed(); + m_reset_rotation_button->sys_color_changed(); + m_drop_to_bed_button->sys_color_changed(); + m_lock_bnt->sys_color_changed(); for (int id = 0; id < 3; ++id) - m_mirror_buttons[id].first->msw_rescale(); + m_mirror_buttons[id].first->sys_color_changed(); } #if ENABLE_WORLD_COORDINATE @@ -1452,12 +1442,7 @@ ManipulationEditor::ManipulationEditor(ObjectManipulation* parent, { parent->set_focused_editor(nullptr); -#if ENABLE_OBJECT_MANIPULATOR_FOCUS - // if the widgets loosing focus is a manipulator field, call kill_focus - if (dynamic_cast(e.GetEventObject()) != nullptr) -#else if (!m_enter_pressed) -#endif // ENABLE_OBJECT_MANIPULATOR_FOCUS kill_focus(parent); e.Skip(); diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index cfa43b43a3..94433b2db2 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -207,7 +207,7 @@ public: bool get_uniform_scaling() const { return m_uniform_scale; } #if ENABLE_WORLD_COORDINATE void set_coordinates_type(ECoordinatesType type); - ECoordinatesType get_coordinates_type() const { return m_coordinates_type; } + ECoordinatesType get_coordinates_type() const; bool is_world_coordinates() const { return m_coordinates_type == ECoordinatesType::World; } bool is_instance_coordinates() const { return m_coordinates_type == ECoordinatesType::Instance; } bool is_local_coordinates() const { return m_coordinates_type == ECoordinatesType::Local; } diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp index 291013fe9d..97eb5f10d9 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.cpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp @@ -99,7 +99,7 @@ bool ObjectSettings::update_settings_list() btn->SetToolTip(_(L("Remove parameter"))); btn->SetBitmapFocus(m_bmp_delete_focus.bmp()); - btn->SetBitmapHover(m_bmp_delete_focus.bmp()); + btn->SetBitmapCurrent(m_bmp_delete_focus.bmp()); btn->Bind(wxEVT_BUTTON, [opt_key, config, this](wxEvent &event) { wxGetApp().plater()->take_snapshot(from_u8((boost::format(_utf8(L("Delete Option %s"))) % opt_key).str())); @@ -133,7 +133,7 @@ bool ObjectSettings::update_settings_list() return; ctrl->SetBitmap_(m_bmp_delete); ctrl->SetBitmapFocus(m_bmp_delete_focus.bmp()); - ctrl->SetBitmapHover(m_bmp_delete_focus.bmp()); + ctrl->SetBitmapCurrent(m_bmp_delete_focus.bmp()); }; const bool is_extruders_cat = cat.first == "Extruders"; @@ -268,15 +268,6 @@ void ObjectSettings::UpdateAndShow(const bool show) OG_Settings::UpdateAndShow(show ? update_settings_list() : false); } -void ObjectSettings::msw_rescale() -{ - m_bmp_delete.msw_rescale(); - m_bmp_delete_focus.msw_rescale(); - - for (auto group : m_og_settings) - group->msw_rescale(); -} - void ObjectSettings::sys_color_changed() { m_og->sys_color_changed(); diff --git a/src/slic3r/GUI/GUI_ObjectSettings.hpp b/src/slic3r/GUI/GUI_ObjectSettings.hpp index e5a6937f11..677c6ab823 100644 --- a/src/slic3r/GUI/GUI_ObjectSettings.hpp +++ b/src/slic3r/GUI/GUI_ObjectSettings.hpp @@ -30,6 +30,7 @@ public: virtual wxSizer* get_sizer(); ConfigOptionsGroup* get_og() { return m_og.get(); } + const ConfigOptionsGroup* get_og() const { return m_og.get(); } wxWindow* parent() const {return m_parent; } }; @@ -56,7 +57,6 @@ public: 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(); void sys_color_changed(); }; diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp index 88bd42a66f..feda14a7f9 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -63,7 +63,7 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Model* model, DynamicPrintConfig 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); // XXX: more config from 3D.pm @@ -706,7 +706,8 @@ void Preview::update_layers_slider(const std::vector& layers_z, bool kee } // Suggest the auto color change, if model looks like sign - if (m_layers_slider->IsNewPrint()) + if (wxGetApp().app_config->get("allow_auto_color_change") == "1" && + m_layers_slider->IsNewPrint()) { const Print& print = wxGetApp().plater()->fff_print(); @@ -1011,8 +1012,10 @@ void Preview::load_print_as_fff(bool keep_z_range) std::vector gcodes = wxGetApp().is_editor() ? wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes : m_canvas->get_custom_gcode_per_print_z(); + const bool contains_color_gcodes = std::any_of(std::begin(gcodes), std::end(gcodes), + [] (auto const& item) { return item.type == CustomGCode::Type::ColorChange; }); #if ENABLE_PREVIEW_LAYOUT - const GCodeViewer::EViewType choice = !gcodes.empty() ? + const GCodeViewer::EViewType choice = contains_color_gcodes ? GCodeViewer::EViewType::ColorPrint : (number_extruders > 1) ? GCodeViewer::EViewType::Tool : GCodeViewer::EViewType::FeatureType; if (choice != gcode_view_type) { @@ -1022,7 +1025,7 @@ void Preview::load_print_as_fff(bool keep_z_range) refresh_print(); } #else - const wxString choice = !gcodes.empty() ? + const wxString choice = contains_color_gcodes ? _L("Color Print") : (number_extruders > 1) ? _L("Tool") : _L("Feature type"); int type = m_choice_view_type->FindString(choice); diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 97f8edde33..1137f11b93 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -126,9 +126,7 @@ public: ColorChanges, PausePrints, CustomGCodes, -#if ENABLE_SHOW_TOOLPATHS_COG CenterOfGravity, -#endif // ENABLE_SHOW_TOOLPATHS_COG Shells, ToolMarker, #if !ENABLE_PREVIEW_LAYOUT diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index 73bfb3becd..d9bffa3f45 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -153,15 +153,6 @@ wxFont get_default_font_for_dpi(const wxWindow *window, int dpi) } bool check_dark_mode() { -#if 0 //#ifdef _WIN32 // #ysDarkMSW - Allow it when we deside to support the sustem colors for application - wxRegKey rk(wxRegKey::HKCU, - "Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"); - if (rk.Exists() && rk.HasValue("AppsUseLightTheme")) { - long value = -1; - rk.QueryValue("AppsUseLightTheme", &value); - return value <= 0; - } -#endif #if wxCHECK_VERSION(3,1,3) return wxSystemSettings::GetAppearance().IsDark(); #else diff --git a/src/slic3r/GUI/GalleryDialog.cpp b/src/slic3r/GUI/GalleryDialog.cpp index 975b807dcb..8265cb75ef 100644 --- a/src/slic3r/GUI/GalleryDialog.cpp +++ b/src/slic3r/GUI/GalleryDialog.cpp @@ -65,7 +65,7 @@ bool GalleryDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& f } -GalleryDialog::GalleryDialog(wxWindow* parent, bool modify_gallery/* = false*/) : +GalleryDialog::GalleryDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _L("Shape Gallery"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { #ifndef _WIN32 @@ -94,12 +94,9 @@ GalleryDialog::GalleryDialog(wxWindow* parent, bool modify_gallery/* = false*/) #endif wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK | wxCLOSE); - wxButton* ok_btn = static_cast(FindWindowById(wxID_OK, this)); - ok_btn->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(!m_selected_items.empty()); }); - if (modify_gallery) { - ok_btn->SetLabel(_L("Add to bed")); - ok_btn->SetToolTip(_L("Add selected shape(s) to the bed")); - } + m_ok_btn = static_cast(FindWindowById(wxID_OK, this)); + m_ok_btn->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(!m_selected_items.empty()); }); + static_cast(FindWindowById(wxID_CLOSE, this))->Bind(wxEVT_BUTTON, [this](wxCommandEvent&){ this->EndModal(wxID_CLOSE); }); this->SetEscapeId(wxID_CLOSE); auto add_btn = [this, buttons]( size_t pos, int& ID, wxString title, wxString tooltip, @@ -140,6 +137,14 @@ GalleryDialog::~GalleryDialog() { } +int GalleryDialog::show(bool show_from_menu) +{ + m_ok_btn->SetLabel( show_from_menu ? _L("Add to bed") : _L("OK")); + m_ok_btn->SetToolTip(show_from_menu ? _L("Add selected shape(s) to the bed") : ""); + + return this->ShowModal(); +} + bool GalleryDialog::can_delete() { if (m_selected_items.empty()) @@ -157,8 +162,9 @@ bool GalleryDialog::can_change_thumbnail() void GalleryDialog::on_dpi_changed(const wxRect& suggested_rect) { - const int& em = em_unit(); + update(); + const int& em = em_unit(); msw_buttons_rescale(this, em, { ID_BTN_ADD_CUSTOM_SHAPE, ID_BTN_DEL_CUSTOM_SHAPE, ID_BTN_REPLACE_CUSTOM_PNG, wxID_OK, wxID_CLOSE }); wxSize size = wxSize(50 * em, 35 * em); @@ -169,13 +175,14 @@ void GalleryDialog::on_dpi_changed(const wxRect& suggested_rect) Refresh(); } -static void add_lock(wxImage& image) +static void add_lock(wxImage& image, wxWindow* parent_win) { - int lock_sz = 22; + wxBitmapBundle* bmp_bndl = get_bmp_bundle("lock", 22); #ifdef __APPLE__ - lock_sz /= mac_max_scaling_factor(); + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetDefaultSize() * mac_max_scaling_factor()); +#else + wxBitmap bmp = bmp_bndl->GetBitmapFor(parent_win); #endif - wxBitmap bmp = create_scaled_bitmap("lock", nullptr, lock_sz); wxImage lock_image = bmp.ConvertToImage(); if (!lock_image.IsOk() || lock_image.GetWidth() == 0 || lock_image.GetHeight() == 0) @@ -213,21 +220,28 @@ static void add_lock(wxImage& image) } } -static void add_default_image(wxImageList* img_list, bool is_system) +static void add_default_image(wxImageList* img_list, bool is_system, wxWindow* parent_win) { - int sz = IMG_PX_CNT; + wxBitmapBundle* bmp_bndl = get_bmp_bundle("cog", IMG_PX_CNT); #ifdef __APPLE__ - sz /= mac_max_scaling_factor(); + wxBitmap bmp = bmp_bndl->GetBitmap(bmp_bndl->GetDefaultSize() * mac_max_scaling_factor()); +#else + wxBitmap bmp = bmp_bndl->GetBitmapFor(parent_win); #endif - wxBitmap bmp = create_scaled_bitmap("cog", nullptr, sz, true); + bmp = bmp.ConvertToDisabled(); if (is_system) { wxImage image = bmp.ConvertToImage(); if (image.IsOk() && image.GetWidth() != 0 && image.GetHeight() != 0) { - add_lock(image); + add_lock(image, parent_win); +#ifdef __APPLE__ + bmp = wxBitmap(std::move(image), -1, mac_max_scaling_factor()); +#else bmp = wxBitmap(std::move(image)); +#endif } } + img_list->Add(bmp); }; @@ -305,7 +319,7 @@ static void generate_thumbnail_from_model(const std::string& filename) fs::path out_path = fs::path(filename); out_path.replace_extension("png"); - image.SaveFile(out_path.string(), wxBITMAP_TYPE_PNG); + image.SaveFile(from_u8(out_path.string()), wxBITMAP_TYPE_PNG); } void GalleryDialog::load_label_icon_list() @@ -344,10 +358,13 @@ void GalleryDialog::load_label_icon_list() // Make an image list containing large icons +#ifdef __APPLE__ + m_image_list = new wxImageList(IMG_PX_CNT, IMG_PX_CNT); + int px_cnt = IMG_PX_CNT * mac_max_scaling_factor(); +#else int px_cnt = (int)(em_unit() * IMG_PX_CNT * 0.1f + 0.5f); m_image_list = new wxImageList(px_cnt, px_cnt); - - std::string ext = ".png"; +#endif for (const auto& item : list_items) { fs::path model_path = fs::path((item.is_system ? m_sys_dir_path : m_cust_dir_path) + item.name); @@ -364,7 +381,7 @@ void GalleryDialog::load_label_icon_list() if (can_generate_thumbnail) generate_thumbnail_from_model(model_name); else { - add_default_image(m_image_list, item.is_system); + add_default_image(m_image_list, item.is_system, this); continue; } } @@ -373,14 +390,18 @@ void GalleryDialog::load_label_icon_list() if (!image.CanRead(from_u8(img_name)) || !image.LoadFile(from_u8(img_name), wxBITMAP_TYPE_PNG) || image.GetWidth() == 0 || image.GetHeight() == 0) { - add_default_image(m_image_list, item.is_system); + add_default_image(m_image_list, item.is_system, this); continue; } image.Rescale(px_cnt, px_cnt, wxIMAGE_QUALITY_BILINEAR); if (item.is_system) - add_lock(image); + add_lock(image, this); +#ifdef __APPLE__ + wxBitmap bmp = wxBitmap(std::move(image), -1, mac_max_scaling_factor()); +#else wxBitmap bmp = wxBitmap(std::move(image)); +#endif m_image_list->Add(bmp); } diff --git a/src/slic3r/GUI/GalleryDialog.hpp b/src/slic3r/GUI/GalleryDialog.hpp index 2aa04ffa2e..7d56d1af1b 100644 --- a/src/slic3r/GUI/GalleryDialog.hpp +++ b/src/slic3r/GUI/GalleryDialog.hpp @@ -20,6 +20,7 @@ class GalleryDialog : public DPIDialog { wxListCtrl* m_list_ctrl { nullptr }; wxImageList* m_image_list { nullptr }; + wxButton* m_ok_btn { nullptr }; struct Item { std::string name; @@ -48,9 +49,10 @@ class GalleryDialog : public DPIDialog void update(); public: - GalleryDialog(wxWindow* parent, bool modify_gallery = false); + GalleryDialog(wxWindow* parent); ~GalleryDialog(); + int show(bool show_from_menu = false); void get_input_files(wxArrayString& input_files); bool load_files(const wxArrayString& input_files); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp index 2903152499..b52099e07d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -1,157 +1,227 @@ -#include "GLGizmoBase.hpp" -#include "slic3r/GUI/GLCanvas3D.hpp" - -#include - -#include "slic3r/GUI/GUI_App.hpp" -#include "slic3r/GUI/GUI_ObjectManipulation.hpp" -#if ENABLE_GL_SHADERS_ATTRIBUTES -#include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - -// TODO: Display tooltips quicker on Linux - -namespace Slic3r { -namespace GUI { - -const float GLGizmoBase::Grabber::SizeFactor = 0.05f; -const float GLGizmoBase::Grabber::MinHalfSize = 1.5f; -const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f; - -#if ENABLE_GIZMO_GRABBER_REFACTOR +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#if ENABLE_LEGACY_OPENGL_REMOVAL +#include "slic3r/GUI/Plater.hpp" +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +// TODO: Display tooltips quicker on Linux + +namespace Slic3r { +namespace GUI { + +const float GLGizmoBase::Grabber::SizeFactor = 0.05f; +const float GLGizmoBase::Grabber::MinHalfSize = 1.5f; +const float GLGizmoBase::Grabber::DraggingScaleFactor = 1.25f; + +#if ENABLE_RAYCAST_PICKING +PickingModel GLGizmoBase::Grabber::s_cube; +PickingModel GLGizmoBase::Grabber::s_cone; +#else GLModel GLGizmoBase::Grabber::s_cube; GLModel GLGizmoBase::Grabber::s_cone; +#endif // ENABLE_RAYCAST_PICKING GLGizmoBase::Grabber::~Grabber() { +#if ENABLE_RAYCAST_PICKING + if (s_cube.model.is_initialized()) + s_cube.model.reset(); + + if (s_cone.model.is_initialized()) + s_cone.model.reset(); +#else if (s_cube.is_initialized()) s_cube.reset(); if (s_cone.is_initialized()) s_cone.reset(); +#endif // ENABLE_RAYCAST_PICKING } -#endif // ENABLE_GIZMO_GRABBER_REFACTOR - -float GLGizmoBase::Grabber::get_half_size(float size) const -{ - return std::max(size * SizeFactor, MinHalfSize); -} - -float GLGizmoBase::Grabber::get_dragging_half_size(float size) const -{ - return get_half_size(size) * DraggingScaleFactor; -} - -void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, bool picking) -{ -#if ENABLE_GL_SHADERS_ATTRIBUTES - GLShaderProgram* shader = wxGetApp().get_current_shader(); - if (shader == nullptr) - return; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - -#if ENABLE_GIZMO_GRABBER_REFACTOR - if (!s_cube.is_initialized()) { + +float GLGizmoBase::Grabber::get_half_size(float size) const +{ + return std::max(size * SizeFactor, MinHalfSize); +} + +float GLGizmoBase::Grabber::get_dragging_half_size(float size) const +{ + return get_half_size(size) * DraggingScaleFactor; +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoBase::Grabber::register_raycasters_for_picking(int id) +{ + picking_id = id; + // registration will happen on next call to render() +} + +void GLGizmoBase::Grabber::unregister_raycasters_for_picking() +{ + wxGetApp().plater()->canvas3D()->remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo, picking_id); + picking_id = -1; + raycasters = { nullptr }; +} +#endif // ENABLE_RAYCAST_PICKING + +#if ENABLE_RAYCAST_PICKING +void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color) #else - if (!m_cube.is_initialized()) { -#endif // ENABLE_GIZMO_GRABBER_REFACTOR - // This cannot be done in constructor, OpenGL is not yet - // initialized at that point (on Linux at least). - indexed_triangle_set its = its_make_cube(1.0, 1.0, 1.0); - its_translate(its, -0.5f * Vec3f::Ones()); +void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, bool picking) +#endif // ENABLE_RAYCAST_PICKING +{ #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GIZMO_GRABBER_REFACTOR + GLShaderProgram* shader = wxGetApp().get_current_shader(); + if (shader == nullptr) + return; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_RAYCAST_PICKING + if (!s_cube.model.is_initialized()) { +#else + if (!s_cube.is_initialized()) { +#endif // ENABLE_RAYCAST_PICKING + // This cannot be done in constructor, OpenGL is not yet + // initialized at that point (on Linux at least). + indexed_triangle_set its = its_make_cube(1.0, 1.0, 1.0); + its_translate(its, -0.5f * Vec3f::Ones()); +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + s_cube.model.init_from(its); + s_cube.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); +#else s_cube.init_from(its); +#endif // ENABLE_RAYCAST_PICKING #else - m_cube.init_from(its); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR -#else -#if ENABLE_GIZMO_GRABBER_REFACTOR s_cube.init_from(its, BoundingBoxf3{ { -0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 } }); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + } + +#if ENABLE_RAYCAST_PICKING + if (!s_cone.model.is_initialized()) { + indexed_triangle_set its = its_make_cone(0.375, 1.5, double(PI) / 18.0); + s_cone.model.init_from(its); + s_cone.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } #else - m_cube.init_from(its, BoundingBoxf3{ { -0.5, -0.5, -0.5 }, { 0.5, 0.5, 0.5 } }); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } - -#if ENABLE_GIZMO_GRABBER_REFACTOR if (!s_cone.is_initialized()) s_cone.init_from(its_make_cone(0.375, 1.5, double(PI) / 18.0)); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR +#endif // ENABLE_RAYCAST_PICKING -#if ENABLE_GIZMO_GRABBER_REFACTOR const float half_size = dragging ? get_dragging_half_size(size) : get_half_size(size); -#else - const float fullsize = 2.0f * (dragging ? get_dragging_half_size(size) : get_half_size(size)); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR - + #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GIZMO_GRABBER_REFACTOR +#if ENABLE_RAYCAST_PICKING + s_cube.model.set_color(render_color); + s_cone.model.set_color(render_color); +#else s_cube.set_color(render_color); s_cone.set_color(render_color); +#endif // ENABLE_RAYCAST_PICKING + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#if ENABLE_RAYCAST_PICKING + const Transform3d& view_matrix = camera.get_view_matrix(); + const Matrix3d view_matrix_no_offset = view_matrix.matrix().block(0, 0, 3, 3); + std::vector elements_matrices(GRABBER_ELEMENTS_MAX_COUNT, Transform3d::Identity()); + elements_matrices[0] = matrix * Geometry::assemble_transform(center, angles, 2.0 * half_size * Vec3d::Ones()); + Transform3d view_model_matrix = view_matrix * elements_matrices[0]; #else - m_cube.set_color(render_color); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d model_matrix = matrix * Geometry::assemble_transform(center, angles, 2.0 * half_size * Vec3d::Ones()); + const Transform3d view_model_matrix = view_matrix * model_matrix; +#endif // ENABLE_RAYCAST_PICKING + + shader->set_uniform("view_model_matrix", view_model_matrix); +#if ENABLE_RAYCAST_PICKING + Matrix3d view_normal_matrix = view_matrix_no_offset * elements_matrices[0].matrix().block(0, 0, 3, 3).inverse().transpose(); +#else + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); +#endif // ENABLE_RAYCAST_PICKING + shader->set_uniform("view_normal_matrix", view_normal_matrix); #else -#if ENABLE_GIZMO_GRABBER_REFACTOR s_cube.set_color(-1, render_color); s_cone.set_color(-1, render_color); -#else - m_cube.set_color(-1, render_color); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); -#if ENABLE_GIZMO_GRABBER_REFACTOR - const Transform3d view_model_matrix = camera.get_view_matrix() * matrix * Geometry::assemble_transform(center, angles, 2.0 * half_size * Vec3d::Ones()); -#else - const Transform3d view_model_matrix = camera.get_view_matrix() * matrix * Geometry::assemble_transform(center, angles, fullsize * Vec3d::Ones()); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR - const Transform3d& projection_matrix = camera.get_projection_matrix(); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", projection_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); - glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); -#if ENABLE_GIZMO_GRABBER_REFACTOR + glsafe(::glPushMatrix()); + glsafe(::glTranslated(center.x(), center.y(), center.z())); + glsafe(::glRotated(Geometry::rad2deg(angles.z()), 0.0, 0.0, 1.0)); + glsafe(::glRotated(Geometry::rad2deg(angles.y()), 0.0, 1.0, 0.0)); + glsafe(::glRotated(Geometry::rad2deg(angles.x()), 1.0, 0.0, 0.0)); glsafe(::glScaled(2.0 * half_size, 2.0 * half_size, 2.0 * half_size)); -#else - glsafe(::glScaled(fullsize, fullsize, fullsize)); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_GIZMO_GRABBER_REFACTOR - s_cube.render(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + s_cube.model.render(); -#if ENABLE_GL_SHADERS_ATTRIBUTES + auto render_extension = [&view_matrix, &view_matrix_no_offset, shader](const Transform3d& matrix) { + const Transform3d view_model_matrix = view_matrix * matrix; + shader->set_uniform("view_model_matrix", view_model_matrix); + const Matrix3d view_normal_matrix = view_matrix_no_offset * matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); + s_cone.model.render(); + }; +#else + s_cube.render(); +#endif // ENABLE_RAYCAST_PICKING + +#if ENABLE_LEGACY_OPENGL_REMOVAL if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosX)) != 0) { +#if ENABLE_RAYCAST_PICKING + elements_matrices[1] = elements_matrices[0] * Geometry::assemble_transform(Vec3d::UnitX(), Vec3d(0.0, 0.5 * double(PI), 0.0)); + render_extension(elements_matrices[1]); +#else shader->set_uniform("view_model_matrix", view_model_matrix * Geometry::assemble_transform(Vec3d::UnitX(), Vec3d(0.0, 0.5 * double(PI), 0.0))); s_cone.render(); +#endif // ENABLE_RAYCAST_PICKING } if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegX)) != 0) { +#if ENABLE_RAYCAST_PICKING + elements_matrices[2] = elements_matrices[0] * Geometry::assemble_transform(-Vec3d::UnitX(), Vec3d(0.0, -0.5 * double(PI), 0.0)); + render_extension(elements_matrices[2]); +#else shader->set_uniform("view_model_matrix", view_model_matrix * Geometry::assemble_transform(-Vec3d::UnitX(), Vec3d(0.0, -0.5 * double(PI), 0.0))); s_cone.render(); +#endif // ENABLE_RAYCAST_PICKING } if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosY)) != 0) { +#if ENABLE_RAYCAST_PICKING + elements_matrices[3] = elements_matrices[0] * Geometry::assemble_transform(Vec3d::UnitY(), Vec3d(-0.5 * double(PI), 0.0, 0.0)); + render_extension(elements_matrices[3]); +#else shader->set_uniform("view_model_matrix", view_model_matrix * Geometry::assemble_transform(Vec3d::UnitY(), Vec3d(-0.5 * double(PI), 0.0, 0.0))); s_cone.render(); +#endif // ENABLE_RAYCAST_PICKING } if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegY)) != 0) { +#if ENABLE_RAYCAST_PICKING + elements_matrices[4] = elements_matrices[0] * Geometry::assemble_transform(-Vec3d::UnitY(), Vec3d(0.5 * double(PI), 0.0, 0.0)); + render_extension(elements_matrices[4]); +#else shader->set_uniform("view_model_matrix", view_model_matrix * Geometry::assemble_transform(-Vec3d::UnitY(), Vec3d(0.5 * double(PI), 0.0, 0.0))); s_cone.render(); +#endif // ENABLE_RAYCAST_PICKING } if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosZ)) != 0) { +#if ENABLE_RAYCAST_PICKING + elements_matrices[5] = elements_matrices[0] * Geometry::assemble_transform(Vec3d::UnitZ()); + render_extension(elements_matrices[5]); +#else shader->set_uniform("view_model_matrix", view_model_matrix * Geometry::assemble_transform(Vec3d::UnitZ())); s_cone.render(); +#endif // ENABLE_RAYCAST_PICKING } if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegZ)) != 0) { +#if ENABLE_RAYCAST_PICKING + elements_matrices[6] = elements_matrices[0] * Geometry::assemble_transform(-Vec3d::UnitZ(), Vec3d(double(PI), 0.0, 0.0)); + render_extension(elements_matrices[6]); +#else shader->set_uniform("view_model_matrix", view_model_matrix * Geometry::assemble_transform(-Vec3d::UnitZ(), Vec3d(double(PI), 0.0, 0.0))); s_cone.render(); +#endif // ENABLE_RAYCAST_PICKING } #else if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosX)) != 0) { @@ -195,239 +265,278 @@ void GLGizmoBase::Grabber::render(float size, const ColorRGBA& render_color, boo s_cone.render(); glsafe(::glPopMatrix()); } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#else - m_cube.render(); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -} - -GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : m_parent(parent) +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_RAYCAST_PICKING + if (raycasters[0] == nullptr) { + GLCanvas3D& canvas = *wxGetApp().plater()->canvas3D(); + raycasters[0] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cube.mesh_raycaster, elements_matrices[0]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosX)) != 0) + raycasters[1] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[1]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegX)) != 0) + raycasters[2] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[2]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosY)) != 0) + raycasters[3] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[3]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegY)) != 0) + raycasters[4] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[4]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::PosZ)) != 0) + raycasters[5] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[5]); + if ((int(extensions) & int(GLGizmoBase::EGrabberExtension::NegZ)) != 0) + raycasters[6] = canvas.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, picking_id, *s_cone.mesh_raycaster, elements_matrices[6]); + } + else { + for (size_t i = 0; i < GRABBER_ELEMENTS_MAX_COUNT; ++i) { + if (raycasters[i] != nullptr) + raycasters[i]->set_transform(elements_matrices[i]); + } + } +#endif // ENABLE_RAYCAST_PICKING +} + +GLGizmoBase::GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : m_parent(parent) , m_group_id(-1) , m_state(Off) , m_shortcut_key(NO_SHORTCUT_KEY_VALUE) - , m_icon_filename(icon_filename) - , m_sprite_id(sprite_id) - , m_hover_id(-1) - , m_dragging(false) - , m_imgui(wxGetApp().imgui()) - , m_first_input_window_render(true) - , m_dirty(false) -{ -} - -void GLGizmoBase::set_hover_id(int id) -{ - // do not change hover id during dragging - assert(!m_dragging); - - // allow empty grabbers when not using grabbers but use hover_id - flatten, rotate - if (!m_grabbers.empty() && id >= (int) m_grabbers.size()) - return; - - m_hover_id = id; - on_set_hover_id(); -} - -bool GLGizmoBase::update_items_state() -{ - bool res = m_dirty; - m_dirty = false; - return res; -} - -ColorRGBA GLGizmoBase::picking_color_component(unsigned int id) const -{ - id = BASE_ID - id; - if (m_group_id > -1) - id -= m_group_id; - - return picking_decode(id); -} - -void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const -{ - render_grabbers((float)((box.size().x() + box.size().y() + box.size().z()) / 3.0)); -} - -void GLGizmoBase::render_grabbers(float size) const -{ - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - for (int i = 0; i < (int)m_grabbers.size(); ++i) { - if (m_grabbers[i].enabled) - m_grabbers[i].render(m_hover_id == i, size); - } - shader->stop_using(); -} - -void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const -{ -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader("flat"); - if (shader != nullptr) { - shader->start_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - const float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); - - for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i) { - if (m_grabbers[i].enabled) { - m_grabbers[i].color = picking_color_component(i); - m_grabbers[i].render_for_picking(mean_size); - } - } -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -} - -// help function to process grabbers -// call start_dragging, stop_dragging, on_dragging -bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { - bool is_dragging_finished = false; - if (mouse_event.Moving()) { - // it should not happen but for sure - assert(!m_dragging); - if (m_dragging) is_dragging_finished = true; - else return false; - } - - if (mouse_event.LeftDown()) { - Selection &selection = m_parent.get_selection(); - if (!selection.is_empty() && m_hover_id != -1 && - (m_grabbers.empty() || m_hover_id < static_cast(m_grabbers.size()))) { - selection.setup_cache(); - - m_dragging = true; - for (auto &grabber : m_grabbers) grabber.dragging = false; - if (!m_grabbers.empty() && m_hover_id < int(m_grabbers.size())) - m_grabbers[m_hover_id].dragging = true; - - on_start_dragging(); - - // Let the plater know that the dragging started - m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED)); - m_parent.set_as_dirty(); - return true; - } - } else if (m_dragging) { - // when mouse cursor leave window than finish actual dragging operation - bool is_leaving = mouse_event.Leaving(); - if (mouse_event.Dragging()) { - Point mouse_coord(mouse_event.GetX(), mouse_event.GetY()); - auto ray = m_parent.mouse_ray(mouse_coord); - UpdateData data(ray, mouse_coord); - - on_dragging(data); - - wxGetApp().obj_manipul()->set_dirty(); - m_parent.set_as_dirty(); - return true; - } - else if (mouse_event.LeftUp() || is_leaving || is_dragging_finished) { + , m_icon_filename(icon_filename) + , m_sprite_id(sprite_id) + , m_imgui(wxGetApp().imgui()) +{ +} + +void GLGizmoBase::set_hover_id(int id) +{ + // do not change hover id during dragging + assert(!m_dragging); + + // allow empty grabbers when not using grabbers but use hover_id - flatten, rotate + if (!m_grabbers.empty() && id >= (int) m_grabbers.size()) + return; + + m_hover_id = id; + on_set_hover_id(); +} + +bool GLGizmoBase::update_items_state() +{ + bool res = m_dirty; + m_dirty = false; + return res; +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoBase::register_grabbers_for_picking() +{ + for (size_t i = 0; i < m_grabbers.size(); ++i) { + m_grabbers[i].register_raycasters_for_picking((m_group_id >= 0) ? m_group_id : i); + } +} + +void GLGizmoBase::unregister_grabbers_for_picking() +{ + for (size_t i = 0; i < m_grabbers.size(); ++i) { + m_grabbers[i].unregister_raycasters_for_picking(); + } +} +#else +ColorRGBA GLGizmoBase::picking_color_component(unsigned int id) const +{ + id = BASE_ID - id; + if (m_group_id > -1) + id -= m_group_id; + + return picking_decode(id); +} +#endif // ENABLE_RAYCAST_PICKING + +void GLGizmoBase::render_grabbers(const BoundingBoxf3& box) const +{ + render_grabbers((float)((box.size().x() + box.size().y() + box.size().z()) / 3.0)); +} + +void GLGizmoBase::render_grabbers(float size) const +{ + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); + if (shader == nullptr) + return; + shader->start_using(); + shader->set_uniform("emission_factor", 0.1f); + for (int i = 0; i < (int)m_grabbers.size(); ++i) { + if (m_grabbers[i].enabled) + m_grabbers[i].render(m_hover_id == i, size); + } + shader->stop_using(); +} + +#if !ENABLE_RAYCAST_PICKING +void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const +{ +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + const float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); + + for (unsigned int i = 0; i < (unsigned int)m_grabbers.size(); ++i) { + if (m_grabbers[i].enabled) { + m_grabbers[i].color = picking_color_component(i); + m_grabbers[i].render_for_picking(mean_size); + } + } +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->stop_using(); + } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} +#endif // !ENABLE_RAYCAST_PICKING + +// help function to process grabbers +// call start_dragging, stop_dragging, on_dragging +bool GLGizmoBase::use_grabbers(const wxMouseEvent &mouse_event) { + bool is_dragging_finished = false; + if (mouse_event.Moving()) { + // it should not happen but for sure + assert(!m_dragging); + if (m_dragging) is_dragging_finished = true; + else return false; + } + + if (mouse_event.LeftDown()) { + Selection &selection = m_parent.get_selection(); + if (!selection.is_empty() && m_hover_id != -1 && + (m_grabbers.empty() || m_hover_id < static_cast(m_grabbers.size()))) { + selection.setup_cache(); + + m_dragging = true; + for (auto &grabber : m_grabbers) grabber.dragging = false; + if (!m_grabbers.empty() && m_hover_id < int(m_grabbers.size())) + m_grabbers[m_hover_id].dragging = true; + + on_start_dragging(); + + // Let the plater know that the dragging started + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_STARTED)); + m_parent.set_as_dirty(); + return true; + } + } else if (m_dragging) { + // when mouse cursor leave window than finish actual dragging operation + bool is_leaving = mouse_event.Leaving(); + if (mouse_event.Dragging()) { + Point mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + auto ray = m_parent.mouse_ray(mouse_coord); + UpdateData data(ray, mouse_coord); + + on_dragging(data); + + wxGetApp().obj_manipul()->set_dirty(); + m_parent.set_as_dirty(); + return true; + } + else if (mouse_event.LeftUp() || is_leaving || is_dragging_finished) { #if ENABLE_WORLD_COORDINATE - do_stop_dragging(is_leaving); -#else - for (auto &grabber : m_grabbers) grabber.dragging = false; - m_dragging = false; - - // NOTE: This should be part of GLCanvas3D - // Reset hover_id when leave window - if (is_leaving) m_parent.mouse_up_cleanup(); - - on_stop_dragging(); - - // There is prediction that after draggign, data are changed - // Data are updated twice also by canvas3D::reload_scene. - // Should be fixed. - m_parent.get_gizmos_manager().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(); + do_stop_dragging(is_leaving); +#else + for (auto &grabber : m_grabbers) grabber.dragging = false; + m_dragging = false; + + // NOTE: This should be part of GLCanvas3D + // Reset hover_id when leave window + if (is_leaving) m_parent.mouse_up_cleanup(); + + on_stop_dragging(); + + // There is prediction that after draggign, data are changed + // Data are updated twice also by canvas3D::reload_scene. + // Should be fixed. + m_parent.get_gizmos_manager().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(); #endif // ENABLE_WORLD_COORDINATE - return true; - } - } - return false; -} - + return true; + } + } + return false; +} + #if ENABLE_WORLD_COORDINATE -void GLGizmoBase::do_stop_dragging(bool perform_mouse_cleanup) -{ - for (auto& grabber : m_grabbers) grabber.dragging = false; - m_dragging = false; - - // NOTE: This should be part of GLCanvas3D - // Reset hover_id when leave window - if (perform_mouse_cleanup) m_parent.mouse_up_cleanup(); - - on_stop_dragging(); - - // There is prediction that after draggign, data are changed - // Data are updated twice also by canvas3D::reload_scene. - // Should be fixed. - m_parent.get_gizmos_manager().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(); -} +void GLGizmoBase::do_stop_dragging(bool perform_mouse_cleanup) +{ + for (auto& grabber : m_grabbers) grabber.dragging = false; + m_dragging = false; + + // NOTE: This should be part of GLCanvas3D + // Reset hover_id when leave window + if (perform_mouse_cleanup) m_parent.mouse_up_cleanup(); + + on_stop_dragging(); + + // There is prediction that after draggign, data are changed + // Data are updated twice also by canvas3D::reload_scene. + // Should be fixed. + m_parent.get_gizmos_manager().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(); +} #endif // ENABLE_WORLD_COORDINATE - -std::string GLGizmoBase::format(float value, unsigned int decimals) const -{ - return Slic3r::string_printf("%.*f", decimals, value); -} - -void GLGizmoBase::set_dirty() { - m_dirty = true; -} - -void GLGizmoBase::render_input_window(float x, float y, float bottom_limit) -{ - on_render_input_window(x, y, bottom_limit); - if (m_first_input_window_render) { + +std::string GLGizmoBase::format(float value, unsigned int decimals) const +{ + return Slic3r::string_printf("%.*f", decimals, value); +} + +void GLGizmoBase::set_dirty() { + m_dirty = true; +} + + + +void GLGizmoBase::render_input_window(float x, float y, float bottom_limit) +{ + on_render_input_window(x, y, bottom_limit); + if (m_first_input_window_render) { // imgui windows that don't have an initial size needs to be processed once to get one // and are not rendered in the first frame // so, we forces to render another frame the first time the imgui window is shown // https://github.com/ocornut/imgui/issues/2949 - m_parent.set_as_dirty(); + m_parent.set_as_dirty(); m_parent.request_extra_frame(); - m_first_input_window_render = false; - } -} - - - -std::string GLGizmoBase::get_name(bool include_shortcut) const -{ + m_first_input_window_render = false; + } +} + + + +std::string GLGizmoBase::get_name(bool include_shortcut) const +{ std::string out = on_get_name(); if (!include_shortcut) return out; - int key = get_shortcut_key(); + int key = get_shortcut_key(); assert(key==NO_SHORTCUT_KEY_VALUE || (key >= WXK_CONTROL_A && key <= WXK_CONTROL_Z)); out += std::string(" [") + char(int('A') + key - int(WXK_CONTROL_A)) + "]"; - return out; -} - - -} // namespace GUI -} // namespace Slic3r + return out; +} + + +} // namespace GUI +} // namespace Slic3r + diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index 68763666a6..5971d1a4cb 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp @@ -6,6 +6,10 @@ #include "slic3r/GUI/I18N.hpp" #include "slic3r/GUI/GLModel.hpp" +#if ENABLE_RAYCAST_PICKING +#include "slic3r/GUI/MeshUtils.hpp" +#include "slic3r/GUI/SceneRaycaster.hpp" +#endif // ENABLE_RAYCAST_PICKING #include @@ -37,8 +41,8 @@ public: // Starting value for ids to avoid clashing with ids used by GLVolumes // (254 is choosen to leave some space for forward compatibility) static const unsigned int BASE_ID = 255 * 255 * 254; + static const unsigned int GRABBER_ELEMENTS_MAX_COUNT = 7; -#if ENABLE_GIZMO_GRABBER_REFACTOR enum class EGrabberExtension { None = 0, @@ -49,7 +53,6 @@ public: PosZ = 1 << 4, NegZ = 1 << 5, }; -#endif // ENABLE_GIZMO_GRABBER_REFACTOR // Represents NO key(button on keyboard) value static const int NO_SHORTCUT_KEY_VALUE = 0; @@ -65,34 +68,49 @@ protected: bool dragging{ false }; Vec3d center{ Vec3d::Zero() }; Vec3d angles{ Vec3d::Zero() }; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL Transform3d matrix{ Transform3d::Identity() }; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL ColorRGBA color{ ColorRGBA::WHITE() }; -#if ENABLE_GIZMO_GRABBER_REFACTOR EGrabberExtension extensions{ EGrabberExtension::None }; -#endif // ENABLE_GIZMO_GRABBER_REFACTOR +#if ENABLE_RAYCAST_PICKING + // the picking id shared by all the elements + int picking_id{ -1 }; + std::array, GRABBER_ELEMENTS_MAX_COUNT> raycasters = { nullptr }; +#endif // ENABLE_RAYCAST_PICKING Grabber() = default; -#if ENABLE_GIZMO_GRABBER_REFACTOR ~Grabber(); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR +#if ENABLE_RAYCAST_PICKING + void render(bool hover, float size) { render(size, hover ? complementary(color) : color); } +#else void render(bool hover, float size) { render(size, hover ? complementary(color) : color, false); } void render_for_picking(float size) { render(size, color, true); } +#endif // ENABLE_RAYCAST_PICKING float get_half_size(float size) const; float get_dragging_half_size(float size) const; - private: - void render(float size, const ColorRGBA& render_color, bool picking); +#if ENABLE_RAYCAST_PICKING + void register_raycasters_for_picking(int id); + void unregister_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING -#if ENABLE_GIZMO_GRABBER_REFACTOR + private: +#if ENABLE_RAYCAST_PICKING + void render(float size, const ColorRGBA& render_color); +#else + void render(float size, const ColorRGBA& render_color, bool picking); +#endif // ENABLE_RAYCAST_PICKING + +#if ENABLE_RAYCAST_PICKING + static PickingModel s_cube; + static PickingModel s_cone; +#else static GLModel s_cube; static GLModel s_cone; -#else - GLModel m_cube; -#endif // ENABLE_GIZMO_GRABBER_REFACTOR +#endif // ENABLE_RAYCAST_PICKING }; public: @@ -115,17 +133,19 @@ public: protected: GLCanvas3D& m_parent; + int m_group_id; // TODO: remove only for rotate EState m_state; int m_shortcut_key; std::string m_icon_filename; unsigned int m_sprite_id; - int m_hover_id; - bool m_dragging; + int m_hover_id{ -1 }; + bool m_dragging{ false }; mutable std::vector m_grabbers; ImGuiWrapper* m_imgui; - bool m_first_input_window_render; - CommonGizmosDataPool* m_c; + bool m_first_input_window_render{ true }; + CommonGizmosDataPool* m_c{ nullptr }; + public: GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, @@ -166,7 +186,9 @@ public: bool update_items_state(); void render() { on_render(); } +#if !ENABLE_RAYCAST_PICKING void render_for_picking() { on_render_for_picking(); } +#endif // !ENABLE_RAYCAST_PICKING void render_input_window(float x, float y, float bottom_limit); /// @@ -187,6 +209,12 @@ public: /// Keep information about mouse click /// Return True when use the information and don't want to propagate it otherwise False. virtual bool on_mouse(const wxMouseEvent &mouse_event) { return false; } + +#if ENABLE_RAYCAST_PICKING + void register_raycasters_for_picking() { register_grabbers_for_picking(); on_register_raycasters_for_picking(); } + void unregister_raycasters_for_picking() { unregister_grabbers_for_picking(); on_unregister_raycasters_for_picking(); } +#endif // ENABLE_RAYCAST_PICKING + protected: virtual bool on_init() = 0; virtual void on_load(cereal::BinaryInputArchive& ar) {} @@ -206,16 +234,27 @@ protected: virtual void on_dragging(const UpdateData& data) {} virtual void on_render() = 0; +#if !ENABLE_RAYCAST_PICKING virtual void on_render_for_picking() = 0; +#endif // !ENABLE_RAYCAST_PICKING virtual void on_render_input_window(float x, float y, float bottom_limit) {} +#if ENABLE_RAYCAST_PICKING + void register_grabbers_for_picking(); + void unregister_grabbers_for_picking(); + virtual void on_register_raycasters_for_picking() {} + virtual void on_unregister_raycasters_for_picking() {} +#else // Returns the picking color for the given id, based on the BASE_ID constant // No check is made for clashing with other picking color (i.e. GLVolumes) ColorRGBA picking_color_component(unsigned int id) const; +#endif // ENABLE_RAYCAST_PICKING void render_grabbers(const BoundingBoxf3& box) const; void render_grabbers(float size) const; +#if !ENABLE_RAYCAST_PICKING void render_grabbers_for_picking(const BoundingBoxf3& box) const; +#endif // !ENABLE_RAYCAST_PICKING std::string format(float value, unsigned int decimals) const; @@ -238,7 +277,7 @@ protected: private: // Flag for dirty visible state of Gizmo // When True then need new rendering - bool m_dirty; + bool m_dirty{ false }; }; } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 2b09c02f1a..8767fecb28 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -1,430 +1,469 @@ -// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. -#include "GLGizmoCut.hpp" -#include "slic3r/GUI/GLCanvas3D.hpp" - -#include - -#include -#include -#include -#include - -#include - -#include "slic3r/GUI/GUI_App.hpp" -#include "slic3r/GUI/Plater.hpp" -#include "slic3r/GUI/GUI_ObjectManipulation.hpp" -#include "libslic3r/AppConfig.hpp" -#include "libslic3r/Model.hpp" -#include "libslic3r/TriangleMeshSlicer.hpp" - -namespace Slic3r { -namespace GUI { - -const double GLGizmoCut::Offset = 10.0; -const double GLGizmoCut::Margin = 20.0; -static const ColorRGBA GRABBER_COLOR = ColorRGBA::ORANGE(); - -GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -{} - -std::string GLGizmoCut::get_tooltip() const -{ - double cut_z = m_cut_z; - if (wxGetApp().app_config->get("use_inches") == "1") - cut_z *= ObjectManipulation::mm_to_in; - - return (m_hover_id == 0 || m_grabbers[0].dragging) ? "Z: " + format(cut_z, 2) : ""; -} - -bool GLGizmoCut::on_mouse(const wxMouseEvent &mouse_event) -{ - return use_grabbers(mouse_event); -} - -bool GLGizmoCut::on_init() -{ - m_grabbers.emplace_back(); - m_shortcut_key = WXK_CONTROL_C; - return true; -} - -std::string GLGizmoCut::on_get_name() const -{ - return _u8L("Cut"); -} - -void GLGizmoCut::on_set_state() -{ - // Reset m_cut_z on gizmo activation - if (m_state == On) - m_cut_z = bounding_box().center().z(); -} - -bool GLGizmoCut::on_is_activable() const -{ - const Selection& selection = m_parent.get_selection(); - return selection.is_single_full_instance() && !selection.is_wipe_tower(); -} - -void GLGizmoCut::on_start_dragging() -{ - if (m_hover_id == -1) - return; - - const BoundingBoxf3 box = bounding_box(); - m_max_z = box.max.z(); - m_start_z = m_cut_z; - m_drag_pos = m_grabbers[m_hover_id].center; - m_drag_center = box.center(); - m_drag_center.z() = m_cut_z; -} - -void GLGizmoCut::on_dragging(const UpdateData &data) -{ - assert(m_hover_id != -1); - set_cut_z(m_start_z + calc_projection(data.mouse_ray)); -} - -void GLGizmoCut::on_render() -{ - const BoundingBoxf3 box = bounding_box(); - Vec3d plane_center = box.center(); - plane_center.z() = m_cut_z; - m_max_z = box.max.z(); - set_cut_z(m_cut_z); - - update_contours(); - - const float min_x = box.min.x() - Margin; - const float max_x = box.max.x() + Margin; - const float min_y = box.min.y() - Margin; - const float max_y = box.max.y() + Margin; - glsafe(::glEnable(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_CULL_FACE)); - glsafe(::glEnable(GL_BLEND)); - glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader("flat"); - if (shader != nullptr) { - shader->start_using(); - const Vec3d diff = plane_center - m_old_center; - // Z changed when move with cut plane - // X and Y changed when move with cutted object - bool is_changed = std::abs(diff.x()) > EPSILON || - std::abs(diff.y()) > EPSILON || - std::abs(diff.z()) > EPSILON; - m_old_center = plane_center; - - if (!m_plane.is_initialized() || is_changed) { - m_plane.reset(); - - GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; - init_data.color = { 0.8f, 0.8f, 0.8f, 0.5f }; - init_data.reserve_vertices(4); - init_data.reserve_indices(6); - - // vertices - init_data.add_vertex(Vec3f(min_x, min_y, plane_center.z())); - init_data.add_vertex(Vec3f(max_x, min_y, plane_center.z())); - init_data.add_vertex(Vec3f(max_x, max_y, plane_center.z())); - init_data.add_vertex(Vec3f(min_x, max_y, plane_center.z())); - - // indices - init_data.add_triangle(0, 1, 2); - init_data.add_triangle(2, 3, 0); - - m_plane.init_from(std::move(init_data)); - } - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - m_plane.render(); -#else - // Draw the cutting plane - ::glBegin(GL_QUADS); - ::glColor4f(0.8f, 0.8f, 0.8f, 0.5f); - ::glVertex3f(min_x, min_y, plane_center.z()); - ::glVertex3f(max_x, min_y, plane_center.z()); - ::glVertex3f(max_x, max_y, plane_center.z()); - ::glVertex3f(min_x, max_y, plane_center.z()); - glsafe(::glEnd()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - glsafe(::glEnable(GL_CULL_FACE)); - glsafe(::glDisable(GL_BLEND)); - - // Draw the grabber and the connecting line - m_grabbers[0].center = plane_center; - m_grabbers[0].center.z() = plane_center.z() + Offset; - - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); - - glsafe(::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f)); -#if ENABLE_LEGACY_OPENGL_REMOVAL - if (!m_grabber_connection.is_initialized() || is_changed) { - m_grabber_connection.reset(); - - GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; - init_data.color = ColorRGBA::YELLOW(); - init_data.reserve_vertices(2); - init_data.reserve_indices(2); - - // vertices - init_data.add_vertex((Vec3f)plane_center.cast()); - init_data.add_vertex((Vec3f)m_grabbers[0].center.cast()); - - // indices - init_data.add_line(0, 1); - - m_grabber_connection.init_from(std::move(init_data)); - } - - m_grabber_connection.render(); - - shader->stop_using(); - } - - shader = wxGetApp().get_shader("gouraud_light"); -#else - glsafe(::glColor3f(1.0, 1.0, 0.0)); - ::glBegin(GL_LINES); - ::glVertex3dv(plane_center.data()); - ::glVertex3dv(m_grabbers[0].center.data()); - glsafe(::glEnd()); - - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - if (shader != nullptr) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - - m_grabbers[0].color = GRABBER_COLOR; - m_grabbers[0].render(m_hover_id == 0, float((box.size().x() + box.size().y() + box.size().z()) / 3.0)); - - shader->stop_using(); - } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader = wxGetApp().get_shader("flat"); - if (shader != nullptr) { - shader->start_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()* Geometry::assemble_transform(m_cut_contours.shift)); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_cut_contours.shift.x(), m_cut_contours.shift.y(), m_cut_contours.shift.z())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glLineWidth(2.0f)); - m_cut_contours.contours.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } - -void GLGizmoCut::on_render_for_picking() -{ - glsafe(::glDisable(GL_DEPTH_TEST)); - render_grabbers_for_picking(m_parent.get_selection().get_bounding_box()); -} - -void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit) -{ - static float last_y = 0.0f; - static float last_h = 0.0f; - - m_imgui->begin(_L("Cut"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - - const bool imperial_units = wxGetApp().app_config->get("use_inches") == "1"; - - // adjust window position to avoid overlap the view toolbar - const 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_imgui->set_requires_extra_frame(); - if (last_h != win_h) - last_h = win_h; - if (last_y != y) - last_y = y; - } - - ImGui::AlignTextToFramePadding(); - m_imgui->text("Z"); - ImGui::SameLine(); - ImGui::PushItemWidth(m_imgui->get_style_scaling() * 150.0f); - - double cut_z = m_cut_z; - if (imperial_units) - cut_z *= ObjectManipulation::mm_to_in; - ImGui::InputDouble("", &cut_z, 0.0f, 0.0f, "%.2f", ImGuiInputTextFlags_CharsDecimal); - - ImGui::SameLine(); - m_imgui->text(imperial_units ? _L("in") : _L("mm")); - - m_cut_z = cut_z * (imperial_units ? ObjectManipulation::in_to_mm : 1.0); - - ImGui::Separator(); - - m_imgui->checkbox(_L("Keep upper part"), m_keep_upper); - m_imgui->checkbox(_L("Keep lower part"), m_keep_lower); - m_imgui->checkbox(_L("Rotate lower part upwards"), m_rotate_lower); - - ImGui::Separator(); - - m_imgui->disabled_begin((!m_keep_upper && !m_keep_lower) || m_cut_z <= 0.0 || m_max_z <= m_cut_z); - const bool cut_clicked = m_imgui->button(_L("Perform cut")); - m_imgui->disabled_end(); - - m_imgui->end(); - - if (cut_clicked && (m_keep_upper || m_keep_lower)) - perform_cut(m_parent.get_selection()); -} - -void GLGizmoCut::set_cut_z(double cut_z) -{ - // Clamp the plane to the object's bounding box - m_cut_z = std::clamp(cut_z, 0.0, m_max_z); -} - -void GLGizmoCut::perform_cut(const Selection& selection) -{ - 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"); - - // m_cut_z is the distance from the bed. Subtract possible SLA elevation. - const GLVolume* first_glvolume = selection.get_first_volume(); - const double object_cut_z = m_cut_z - first_glvolume->get_sla_shift_z(); - - if (0.0 < object_cut_z && object_cut_z < m_max_z) - wxGetApp().plater()->cut(object_idx, instance_idx, object_cut_z, - only_if(m_keep_upper, ModelObjectCutAttribute::KeepUpper) | - only_if(m_keep_lower, ModelObjectCutAttribute::KeepLower) | - only_if(m_rotate_lower, ModelObjectCutAttribute::FlipLower)); - else { - // the object is SLA-elevated and the plane is under it. - } -} - -double GLGizmoCut::calc_projection(const Linef3& mouse_ray) const -{ - double projection = 0.0; - - const Vec3d starting_vec = m_drag_pos - m_drag_center; - const double len_starting_vec = starting_vec.norm(); - if (len_starting_vec != 0.0) { - const Vec3d mouse_dir = mouse_ray.unit_vector(); - // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position - // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form - // in our case plane normal and ray direction are the same (orthogonal view) - // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal - const Vec3d inters = mouse_ray.a + (m_drag_pos - mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; - // vector from the starting position to the found intersection - const Vec3d inters_vec = inters - m_drag_pos; - - // finds projection of the vector along the staring direction - projection = inters_vec.dot(starting_vec.normalized()); - } - return projection; -} - -BoundingBoxf3 GLGizmoCut::bounding_box() const -{ - BoundingBoxf3 ret; - const Selection& selection = m_parent.get_selection(); - const Selection::IndicesList& idxs = selection.get_volume_idxs(); - return selection.get_bounding_box(); - - for (unsigned int i : idxs) { - const GLVolume* volume = selection.get_volume(i); - if (!volume->is_modifier) - ret.merge(volume->transformed_convex_hull_bounding_box()); - } - return ret; -} - -void GLGizmoCut::update_contours() -{ - const Selection& selection = m_parent.get_selection(); - const GLVolume* first_glvolume = selection.get_first_volume(); - const BoundingBoxf3& box = first_glvolume->transformed_convex_hull_bounding_box(); - - const ModelObject* model_object = wxGetApp().model().objects[selection.get_object_idx()]; - const int instance_idx = selection.get_instance_idx(); - std::vector volumes_idxs = std::vector(model_object->volumes.size()); - std::vector volumes_trafos = std::vector(model_object->volumes.size()); - for (size_t i = 0; i < model_object->volumes.size(); ++i) { - volumes_idxs[i] = model_object->volumes[i]->id(); - volumes_trafos[i] = model_object->volumes[i]->get_matrix(); - } - - bool trafos_match = volumes_trafos.size() == m_cut_contours.volumes_trafos.size(); - if (trafos_match) { - for (size_t i = 0; i < model_object->volumes.size(); ++i) { - if (!volumes_trafos[i].isApprox(m_cut_contours.volumes_trafos[i])) { - trafos_match = false; - break; - } - } - } - - if (0.0 < m_cut_z && m_cut_z < m_max_z) { - if (m_cut_contours.cut_z != m_cut_z || m_cut_contours.object_id != model_object->id() || - m_cut_contours.instance_idx != instance_idx || m_cut_contours.volumes_idxs != volumes_idxs || - !trafos_match) { - m_cut_contours.cut_z = m_cut_z; - - if (m_cut_contours.object_id != model_object->id() || m_cut_contours.volumes_idxs != volumes_idxs || !trafos_match) - m_cut_contours.mesh = model_object->raw_mesh(); - - m_cut_contours.position = box.center(); - m_cut_contours.shift = Vec3d::Zero(); - m_cut_contours.object_id = model_object->id(); - m_cut_contours.instance_idx = instance_idx; - m_cut_contours.volumes_idxs = volumes_idxs; - m_cut_contours.volumes_trafos = volumes_trafos; - m_cut_contours.contours.reset(); - - MeshSlicingParams slicing_params; - slicing_params.trafo = first_glvolume->get_instance_transformation().get_matrix(); - slicing_params.trafo.pretranslate(Vec3d(0., 0., first_glvolume->get_sla_shift_z())); - - const Polygons polys = slice_mesh(m_cut_contours.mesh.its, m_cut_z, slicing_params); - if (!polys.empty()) { - m_cut_contours.contours.init_from(polys, static_cast(m_cut_z)); -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_cut_contours.contours.set_color(ColorRGBA::WHITE()); -#else - m_cut_contours.contours.set_color(-1, { 1.0f, 1.0f, 1.0f, 1.0f }); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } - } - else if (box.center() != m_cut_contours.position) { - m_cut_contours.shift = box.center() - m_cut_contours.position; - } - } - else - m_cut_contours.contours.reset(); -} - -} // namespace GUI -} // namespace Slic3r +// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro. +#include "GLGizmoCut.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" + +#include + +#include +#include +#include +#include + +#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/GUI_ObjectManipulation.hpp" +#include "libslic3r/AppConfig.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/TriangleMeshSlicer.hpp" + +namespace Slic3r { +namespace GUI { + +const double GLGizmoCut::Offset = 10.0; +const double GLGizmoCut::Margin = 20.0; +static const ColorRGBA GRABBER_COLOR = ColorRGBA::ORANGE(); + +GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +{} + +std::string GLGizmoCut::get_tooltip() const +{ + double cut_z = m_cut_z; + if (wxGetApp().app_config->get("use_inches") == "1") + cut_z *= ObjectManipulation::mm_to_in; + + return (m_hover_id == 0 || m_grabbers[0].dragging) ? "Z: " + format(cut_z, 2) : ""; +} + +bool GLGizmoCut::on_mouse(const wxMouseEvent &mouse_event) +{ + return use_grabbers(mouse_event); +} + +bool GLGizmoCut::on_init() +{ + m_grabbers.emplace_back(); + m_shortcut_key = WXK_CONTROL_C; + return true; +} + +std::string GLGizmoCut::on_get_name() const +{ + return _u8L("Cut"); +} + +void GLGizmoCut::on_set_state() +{ + // Reset m_cut_z on gizmo activation + if (m_state == On) + m_cut_z = bounding_box().center().z(); +} + +bool GLGizmoCut::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + return selection.is_single_full_instance() && !selection.is_wipe_tower(); +} + +void GLGizmoCut::on_start_dragging() +{ + if (m_hover_id == -1) + return; + + const BoundingBoxf3 box = bounding_box(); + m_max_z = box.max.z(); + m_start_z = m_cut_z; + m_drag_pos = m_grabbers[m_hover_id].center; + m_drag_center = box.center(); + m_drag_center.z() = m_cut_z; +} + +void GLGizmoCut::on_dragging(const UpdateData &data) +{ + assert(m_hover_id != -1); + set_cut_z(m_start_z + calc_projection(data.mouse_ray)); +} + +void GLGizmoCut::on_render() +{ + const BoundingBoxf3 box = bounding_box(); + Vec3d plane_center = box.center(); + plane_center.z() = m_cut_z; + m_max_z = box.max.z(); + set_cut_z(m_cut_z); + + update_contours(); + + const float min_x = box.min.x() - Margin; + const float max_x = box.max.x() + Margin; + const float min_y = box.min.y() - Margin; + const float max_y = box.max.y() + Margin; + glsafe(::glEnable(GL_DEPTH_TEST)); + glsafe(::glDisable(GL_CULL_FACE)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); + +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + const Vec3d diff = plane_center - m_old_center; + // Z changed when move with cut plane + // X and Y changed when move with cutted object + bool is_changed = std::abs(diff.x()) > EPSILON || std::abs(diff.y()) > EPSILON || std::abs(diff.z()) > EPSILON; +#endif // ENABLE_GL_CORE_PROFILE + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); +#if !ENABLE_GL_CORE_PROFILE + const Vec3d diff = plane_center - m_old_center; + // Z changed when move with cut plane + // X and Y changed when move with cutted object + bool is_changed = std::abs(diff.x()) > EPSILON || + std::abs(diff.y()) > EPSILON || + std::abs(diff.z()) > EPSILON; +#endif // !ENABLE_GL_CORE_PROFILE + m_old_center = plane_center; + + if (!m_plane.is_initialized() || is_changed) { + m_plane.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = { 0.8f, 0.8f, 0.8f, 0.5f }; + init_data.reserve_vertices(4); + init_data.reserve_indices(6); + + // vertices + init_data.add_vertex(Vec3f(min_x, min_y, plane_center.z())); + init_data.add_vertex(Vec3f(max_x, min_y, plane_center.z())); + init_data.add_vertex(Vec3f(max_x, max_y, plane_center.z())); + init_data.add_vertex(Vec3f(min_x, max_y, plane_center.z())); + + // indices + init_data.add_triangle(0, 1, 2); + init_data.add_triangle(2, 3, 0); + + m_plane.init_from(std::move(init_data)); + } + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + m_plane.render(); +#else + // Draw the cutting plane + ::glBegin(GL_QUADS); + ::glColor4f(0.8f, 0.8f, 0.8f, 0.5f); + ::glVertex3f(min_x, min_y, plane_center.z()); + ::glVertex3f(max_x, min_y, plane_center.z()); + ::glVertex3f(max_x, max_y, plane_center.z()); + ::glVertex3f(min_x, max_y, plane_center.z()); + glsafe(::glEnd()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_GL_CORE_PROFILE + shader->stop_using(); + } + + shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.5f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + + glsafe(::glEnable(GL_CULL_FACE)); + glsafe(::glDisable(GL_BLEND)); + + // Draw the grabber and the connecting line + m_grabbers[0].center = plane_center; + m_grabbers[0].center.z() = plane_center.z() + Offset; + + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(m_hover_id != -1 ? 2.0f : 1.5f)); +#if ENABLE_LEGACY_OPENGL_REMOVAL + if (!m_grabber_connection.is_initialized() || is_changed) { + m_grabber_connection.reset(); + + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::YELLOW(); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + init_data.add_vertex((Vec3f)plane_center.cast()); + init_data.add_vertex((Vec3f)m_grabbers[0].center.cast()); + + // indices + init_data.add_line(0, 1); + + m_grabber_connection.init_from(std::move(init_data)); + } + + m_grabber_connection.render(); + +#if ENABLE_GL_CORE_PROFILE + shader->set_uniform("view_model_matrix", camera.get_view_matrix()* Geometry::assemble_transform(m_cut_contours.shift)); + m_cut_contours.contours.render(); +#endif // ENABLE_GL_CORE_PROFILE + + shader->stop_using(); + } + + shader = wxGetApp().get_shader("gouraud_light"); +#else + glsafe(::glColor3f(1.0, 1.0, 0.0)); + ::glBegin(GL_LINES); + ::glVertex3dv(plane_center.data()); + ::glVertex3dv(m_grabbers[0].center.data()); + glsafe(::glEnd()); + + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + if (shader != nullptr) { + shader->start_using(); + shader->set_uniform("emission_factor", 0.1f); + + m_grabbers[0].color = GRABBER_COLOR; + m_grabbers[0].render(m_hover_id == 0, float((box.size().x() + box.size().y() + box.size().z()) / 3.0)); + + shader->stop_using(); + } + +#if !ENABLE_GL_CORE_PROFILE +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()* Geometry::assemble_transform(m_cut_contours.shift)); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslated(m_cut_contours.shift.x(), m_cut_contours.shift.y(), m_cut_contours.shift.z())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glLineWidth(2.0f)); + m_cut_contours.contours.render(); +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->stop_using(); + } +#else + glsafe(::glPopMatrix()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#endif // !ENABLE_GL_CORE_PROFILE +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoCut::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); +} + +void GLGizmoCut::on_unregister_raycasters_for_picking() +{ + m_parent.set_raycaster_gizmos_on_top(false); +} +#else +void GLGizmoCut::on_render_for_picking() +{ + glsafe(::glDisable(GL_DEPTH_TEST)); + render_grabbers_for_picking(m_parent.get_selection().get_bounding_box()); +} +#endif // ENABLE_RAYCAST_PICKING + +void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit) +{ + static float last_y = 0.0f; + static float last_h = 0.0f; + + m_imgui->begin(_L("Cut"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + + const bool imperial_units = wxGetApp().app_config->get("use_inches") == "1"; + + // adjust window position to avoid overlap the view toolbar + const 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_imgui->set_requires_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + + ImGui::AlignTextToFramePadding(); + m_imgui->text("Z"); + ImGui::SameLine(); + ImGui::PushItemWidth(m_imgui->get_style_scaling() * 150.0f); + + double cut_z = m_cut_z; + if (imperial_units) + cut_z *= ObjectManipulation::mm_to_in; + ImGui::InputDouble("", &cut_z, 0.0f, 0.0f, "%.2f", ImGuiInputTextFlags_CharsDecimal); + + ImGui::SameLine(); + m_imgui->text(imperial_units ? _L("in") : _L("mm")); + + m_cut_z = cut_z * (imperial_units ? ObjectManipulation::in_to_mm : 1.0); + + ImGui::Separator(); + + m_imgui->checkbox(_L("Keep upper part"), m_keep_upper); + m_imgui->checkbox(_L("Keep lower part"), m_keep_lower); + m_imgui->checkbox(_L("Rotate lower part upwards"), m_rotate_lower); + + ImGui::Separator(); + + m_imgui->disabled_begin((!m_keep_upper && !m_keep_lower) || m_cut_z <= 0.0 || m_max_z <= m_cut_z); + const bool cut_clicked = m_imgui->button(_L("Perform cut")); + m_imgui->disabled_end(); + + m_imgui->end(); + + if (cut_clicked && (m_keep_upper || m_keep_lower)) + perform_cut(m_parent.get_selection()); +} + +void GLGizmoCut::set_cut_z(double cut_z) +{ + // Clamp the plane to the object's bounding box + m_cut_z = std::clamp(cut_z, 0.0, m_max_z); +} + +void GLGizmoCut::perform_cut(const Selection& selection) +{ + 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"); + + // m_cut_z is the distance from the bed. Subtract possible SLA elevation. + const GLVolume* first_glvolume = selection.get_first_volume(); + const double object_cut_z = m_cut_z - first_glvolume->get_sla_shift_z(); + + if (0.0 < object_cut_z && object_cut_z < m_max_z) + wxGetApp().plater()->cut(object_idx, instance_idx, object_cut_z, + only_if(m_keep_upper, ModelObjectCutAttribute::KeepUpper) | + only_if(m_keep_lower, ModelObjectCutAttribute::KeepLower) | + only_if(m_rotate_lower, ModelObjectCutAttribute::FlipLower)); + else { + // the object is SLA-elevated and the plane is under it. + } +} + +double GLGizmoCut::calc_projection(const Linef3& mouse_ray) const +{ + double projection = 0.0; + + const Vec3d starting_vec = m_drag_pos - m_drag_center; + const double len_starting_vec = starting_vec.norm(); + if (len_starting_vec != 0.0) { + const Vec3d mouse_dir = mouse_ray.unit_vector(); + // finds the intersection of the mouse ray with the plane parallel to the camera viewport and passing throught the starting position + // use ray-plane intersection see i.e. https://en.wikipedia.org/wiki/Line%E2%80%93plane_intersection algebric form + // in our case plane normal and ray direction are the same (orthogonal view) + // when moving to perspective camera the negative z unit axis of the camera needs to be transformed in world space and used as plane normal + const Vec3d inters = mouse_ray.a + (m_drag_pos - mouse_ray.a).dot(mouse_dir) / mouse_dir.squaredNorm() * mouse_dir; + // vector from the starting position to the found intersection + const Vec3d inters_vec = inters - m_drag_pos; + + // finds projection of the vector along the staring direction + projection = inters_vec.dot(starting_vec.normalized()); + } + return projection; +} + +BoundingBoxf3 GLGizmoCut::bounding_box() const +{ + BoundingBoxf3 ret; + const Selection& selection = m_parent.get_selection(); + const Selection::IndicesList& idxs = selection.get_volume_idxs(); + return selection.get_bounding_box(); + + for (unsigned int i : idxs) { + const GLVolume* volume = selection.get_volume(i); + if (!volume->is_modifier) + ret.merge(volume->transformed_convex_hull_bounding_box()); + } + return ret; +} + +void GLGizmoCut::update_contours() +{ + const Selection& selection = m_parent.get_selection(); + const GLVolume* first_glvolume = selection.get_first_volume(); + const BoundingBoxf3& box = first_glvolume->transformed_convex_hull_bounding_box(); + + const ModelObject* model_object = wxGetApp().model().objects[selection.get_object_idx()]; + const int instance_idx = selection.get_instance_idx(); + std::vector volumes_idxs = std::vector(model_object->volumes.size()); + std::vector volumes_trafos = std::vector(model_object->volumes.size()); + for (size_t i = 0; i < model_object->volumes.size(); ++i) { + volumes_idxs[i] = model_object->volumes[i]->id(); + volumes_trafos[i] = model_object->volumes[i]->get_matrix(); + } + + bool trafos_match = std::equal(volumes_trafos.begin(), volumes_trafos.end(), + m_cut_contours.volumes_trafos.begin(), m_cut_contours.volumes_trafos.end(), + [](const Transform3d& a, const Transform3d& b) { return a.isApprox(b); }); + + if (0.0 < m_cut_z && m_cut_z < m_max_z) { + if (m_cut_contours.cut_z != m_cut_z || m_cut_contours.object_id != model_object->id() || + m_cut_contours.instance_idx != instance_idx || m_cut_contours.volumes_idxs != volumes_idxs || + !trafos_match) { + m_cut_contours.cut_z = m_cut_z; + + if (m_cut_contours.object_id != model_object->id() || m_cut_contours.volumes_idxs != volumes_idxs || !trafos_match) + m_cut_contours.mesh = model_object->raw_mesh(); + + m_cut_contours.position = box.center(); + m_cut_contours.shift = Vec3d::Zero(); + m_cut_contours.object_id = model_object->id(); + m_cut_contours.instance_idx = instance_idx; + m_cut_contours.volumes_idxs = volumes_idxs; + m_cut_contours.volumes_trafos = volumes_trafos; + m_cut_contours.contours.reset(); + + MeshSlicingParams slicing_params; + slicing_params.trafo = first_glvolume->get_instance_transformation().get_matrix(); + slicing_params.trafo.pretranslate(Vec3d(0., 0., first_glvolume->get_sla_shift_z())); + + const Polygons polys = slice_mesh(m_cut_contours.mesh.its, m_cut_z, slicing_params); + if (!polys.empty()) { + m_cut_contours.contours.init_from(polys, static_cast(m_cut_z)); +#if ENABLE_LEGACY_OPENGL_REMOVAL + m_cut_contours.contours.set_color(ColorRGBA::WHITE()); +#else + m_cut_contours.contours.set_color(-1, { 1.0f, 1.0f, 1.0f, 1.0f }); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + } + } + else if (box.center() != m_cut_contours.position) { + m_cut_contours.shift = box.center() - m_cut_contours.position; + } + } + else + m_cut_contours.contours.reset(); +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index bfde306a92..0a7274e2ee 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -69,7 +69,12 @@ protected: virtual void on_start_dragging() override; virtual void on_dragging(const UpdateData& data) override; virtual void on_render() override; +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else virtual void on_render_for_picking() override; +#endif // ENABLE_RAYCAST_PICKING virtual void on_render_input_window(float x, float y, float bottom_limit) override; private: diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp index caa6ef0f53..3af58dd960 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp @@ -1,484 +1,529 @@ -// 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" -#if ENABLE_LEGACY_OPENGL_REMOVAL -#include "slic3r/GUI/GUI_App.hpp" -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES -#include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - -#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" - -#include "libslic3r/Geometry/ConvexHull.hpp" -#include "libslic3r/Model.hpp" - -#include - -#include - -namespace Slic3r { -namespace GUI { - -static const Slic3r::ColorRGBA DEFAULT_PLANE_COLOR = { 0.9f, 0.9f, 0.9f, 0.5f }; -static const Slic3r::ColorRGBA DEFAULT_HOVER_PLANE_COLOR = { 0.9f, 0.9f, 0.9f, 0.75f }; - -GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -{} - -bool GLGizmoFlatten::on_mouse(const wxMouseEvent &mouse_event) -{ - if (mouse_event.Moving()) { - // only for sure - m_mouse_left_down = false; - return false; - } - if (mouse_event.LeftDown()) { - if (m_hover_id != -1) { - m_mouse_left_down = true; - Selection &selection = m_parent.get_selection(); - if (selection.is_single_full_instance()) { - // Rotate the object so the normal points downward: - selection.flattening_rotate(m_planes[m_hover_id].normal); - m_parent.do_rotate(L("Gizmo-Place on Face")); - } - return true; - } - - // fix: prevent restart gizmo when reselect object - // take responsibility for left up - if (m_parent.get_first_hover_volume_idx() >= 0) m_mouse_left_down = true; - - } else if (mouse_event.LeftUp()) { - if (m_mouse_left_down) { - if (m_hover_id == -1) - // no plane hovered - return false; - else { - // responsible for mouse left up after selecting plane - m_mouse_left_down = false; - return true; - } - } - } else if (mouse_event.Leaving()) { - m_mouse_left_down = false; - } - return false; -} - -void GLGizmoFlatten::data_changed() -{ - const Selection & selection = m_parent.get_selection(); - const ModelObject *model_object = nullptr; - if (selection.is_single_full_instance() || - selection.is_from_single_object() ) { - model_object = selection.get_model()->objects[selection.get_object_idx()]; - } - set_flattening_data(model_object); -} - -bool GLGizmoFlatten::on_init() -{ - m_shortcut_key = WXK_CONTROL_F; - return true; -} - -void GLGizmoFlatten::on_set_state() -{ -} - -CommonGizmosDataID GLGizmoFlatten::on_get_requirements() const -{ - return CommonGizmosDataID::SelectionInfo; -} - -std::string GLGizmoFlatten::on_get_name() const -{ - return _u8L("Place on face"); -} - -bool GLGizmoFlatten::on_is_activable() const -{ - // This is assumed in GLCanvas3D::do_rotate, do not change this - // without updating that function too. - return m_parent.get_selection().is_single_full_instance(); -} - -void GLGizmoFlatten::on_render() -{ - const Selection& selection = m_parent.get_selection(); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader("flat"); - if (shader == nullptr) - return; - - shader->start_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); - - glsafe(::glEnable(GL_DEPTH_TEST)); - glsafe(::glEnable(GL_BLEND)); - - if (selection.is_single_full_instance()) { - const Transform3d& m = selection.get_first_volume()->get_instance_transformation().get_matrix(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d view_model_matrix = camera.get_view_matrix() * - Geometry::assemble_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * m; - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(0.f, 0.f, selection.get_first_volume()->get_sla_shift_z())); - glsafe(::glMultMatrixd(m.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - if (this->is_plane_update_necessary()) - update_planes(); - for (int i = 0; i < (int)m_planes.size(); ++i) { -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_planes[i].vbo.set_color(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR : DEFAULT_PLANE_COLOR); - m_planes[i].vbo.render(); -#else - glsafe(::glColor4fv(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR.data() : DEFAULT_PLANE_COLOR.data())); - if (m_planes[i].vbo.has_VBOs()) - m_planes[i].vbo.render(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - } - - glsafe(::glEnable(GL_CULL_FACE)); - glsafe(::glDisable(GL_BLEND)); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -} - -void GLGizmoFlatten::on_render_for_picking() -{ - const Selection& selection = m_parent.get_selection(); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader("flat"); - if (shader == nullptr) - return; - - shader->start_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - glsafe(::glDisable(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_BLEND)); - - if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) { - const Transform3d& m = selection.get_first_volume()->get_instance_transformation().get_matrix(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d view_model_matrix = camera.get_view_matrix() * - Geometry::assemble_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * m; - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(0.f, 0.f, selection.get_first_volume()->get_sla_shift_z())); - glsafe(::glMultMatrixd(m.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - if (this->is_plane_update_necessary()) - update_planes(); - for (int i = 0; i < (int)m_planes.size(); ++i) { -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_planes[i].vbo.set_color(picking_color_component(i)); -#else - glsafe(::glColor4fv(picking_color_component(i).data())); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - m_planes[i].vbo.render(); - } -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - } - - glsafe(::glEnable(GL_CULL_FACE)); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -} - -void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object) -{ - if (model_object != m_old_model_object) { - m_planes.clear(); - m_planes_valid = false; - } -} - -void GLGizmoFlatten::update_planes() -{ - const ModelObject* mo = m_c->selection_info()->model_object(); - TriangleMesh ch; - for (const ModelVolume* vol : mo->volumes) { - if (vol->type() != ModelVolumeType::MODEL_PART) - continue; - TriangleMesh vol_ch = vol->get_convex_hull(); - vol_ch.transform(vol->get_matrix()); - ch.merge(vol_ch); - } - ch = ch.convex_hull_3d(); - m_planes.clear(); -#if ENABLE_WORLD_COORDINATE - const Transform3d inst_matrix = mo->instances.front()->get_matrix_no_offset(); -#else - const Transform3d& inst_matrix = mo->instances.front()->get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE - - // Following constants are used for discarding too small polygons. - const float minimal_area = 5.f; // in square mm (world coordinates) - const float minimal_side = 1.f; // mm - - // Now we'll go through all the facets and append Points of facets sharing the same normal. - // This part is still performed in mesh coordinate system. - const int num_of_facets = ch.facets_count(); - const std::vector face_normals = its_face_normals(ch.its); - const std::vector face_neighbors = its_face_neighbors(ch.its); - std::vector facet_queue(num_of_facets, 0); - std::vector facet_visited(num_of_facets, false); - int facet_queue_cnt = 0; - const stl_normal* normal_ptr = nullptr; - int facet_idx = 0; - while (1) { - // Find next unvisited triangle: - for (; facet_idx < num_of_facets; ++ facet_idx) - if (!facet_visited[facet_idx]) { - facet_queue[facet_queue_cnt ++] = facet_idx; - facet_visited[facet_idx] = true; - normal_ptr = &face_normals[facet_idx]; - m_planes.emplace_back(); - break; - } - if (facet_idx == num_of_facets) - break; // Everything was visited already - - while (facet_queue_cnt > 0) { - int facet_idx = facet_queue[-- facet_queue_cnt]; - const stl_normal& this_normal = face_normals[facet_idx]; - 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) { - const Vec3i face = ch.its.indices[facet_idx]; - for (int j=0; j<3; ++j) - m_planes.back().vertices.emplace_back(ch.its.vertices[face[j]].cast()); - - facet_visited[facet_idx] = true; - for (int j = 0; j < 3; ++ j) - if (int neighbor_idx = face_neighbors[facet_idx][j]; neighbor_idx >= 0 && ! facet_visited[neighbor_idx]) - facet_queue[facet_queue_cnt ++] = neighbor_idx; - } - } - 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. - 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 (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(); - } - - // Let's prepare transformation of the normal vector from mesh to instance coordinates. - Geometry::Transformation t(inst_matrix); - Vec3d scaling = t.get_scaling_factor(); - t.set_scaling_factor(Vec3d(1./scaling(0), 1./scaling(1), 1./scaling(2))); - - // Now we'll go through all the polygons, transform the points into xy plane to process them: - for (unsigned int polygon_id=0; polygon_id < m_planes.size(); ++polygon_id) { - Pointf3s& polygon = m_planes[polygon_id].vertices; - const Vec3d& normal = m_planes[polygon_id].normal; - - // transform the normal according to the instance matrix: - Vec3d normal_transformed = t.get_matrix() * normal; - - // We are going to rotate about z and y to flatten the plane - Eigen::Quaterniond q; - Transform3d m = Transform3d::Identity(); - m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(normal_transformed, Vec3d::UnitZ()).toRotationMatrix(); - polygon = transform(polygon, m); - - // Now to remove the inner points. We'll misuse Geometry::convex_hull for that, but since - // it works in fixed point representation, we will rescale the polygon to avoid overflows. - // And yes, it is a nasty thing to do. Whoever has time is free to refactor. - Vec3d bb_size = BoundingBoxf3(polygon).size(); - float sf = std::min(1./bb_size(0), 1./bb_size(1)); - Transform3d tr = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d(sf, sf, 1.f)); - polygon = transform(polygon, tr); - polygon = Slic3r::Geometry::convex_hull(polygon); - polygon = transform(polygon, tr.inverse()); - - // Calculate area of the polygons and discard ones that are too small - float& area = m_planes[polygon_id].area; - area = 0.f; - for (unsigned int i = 0; i < polygon.size(); i++) // Shoelace formula - area += polygon[i](0)*polygon[i + 1 < polygon.size() ? i + 1 : 0](1) - polygon[i + 1 < polygon.size() ? i + 1 : 0](0)*polygon[i](1); - area = 0.5f * std::abs(area); - - bool discard = false; - if (area < minimal_area) - discard = true; - else { - // We also check the inner angles and discard polygons with angles smaller than the following threshold - const double angle_threshold = ::cos(10.0 * (double)PI / 180.0); - - for (unsigned int i = 0; i < polygon.size(); ++i) { - const Vec3d& prec = polygon[(i == 0) ? polygon.size() - 1 : i - 1]; - const Vec3d& curr = polygon[i]; - const Vec3d& next = polygon[(i == polygon.size() - 1) ? 0 : i + 1]; - - if ((prec - curr).normalized().dot((next - curr).normalized()) > angle_threshold) { - discard = true; - break; - } - } - } - - if (discard) { - m_planes[polygon_id--] = std::move(m_planes.back()); - m_planes.pop_back(); - continue; - } - - // We will shrink the polygon a little bit so it does not touch the object edges: - Vec3d centroid = std::accumulate(polygon.begin(), polygon.end(), Vec3d(0.0, 0.0, 0.0)); - centroid /= (double)polygon.size(); - for (auto& vertex : polygon) - vertex = 0.9f*vertex + 0.1f*centroid; - - // Polygon is now simple and convex, we'll round the corners to make them look nicer. - // The algorithm takes a vertex, calculates middles of respective sides and moves the vertex - // towards their average (controlled by 'aggressivity'). This is repeated k times. - // In next iterations, the neighbours are not always taken at the middle (to increase the - // rounding effect at the corners, where we need it most). - const unsigned int k = 10; // number of iterations - const float aggressivity = 0.2f; // agressivity - const unsigned int N = polygon.size(); - std::vector> neighbours; - if (k != 0) { - Pointf3s points_out(2*k*N); // vector long enough to store the future vertices - for (unsigned int j=0; jvolumes) { - m_volumes_matrices.push_back(vol->get_matrix()); - m_volumes_types.push_back(vol->type()); - } - 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) { -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLModel::Geometry init_data; - init_data.format = { GLModel::Geometry::EPrimitiveType::TriangleFan, GLModel::Geometry::EVertexLayout::P3N3 }; - init_data.reserve_vertices(plane.vertices.size()); - init_data.reserve_indices(plane.vertices.size()); - // vertices + indices - for (size_t i = 0; i < plane.vertices.size(); ++i) { - init_data.add_vertex((Vec3f)plane.vertices[i].cast(), (Vec3f)plane.normal.cast()); - init_data.add_index((unsigned int)i); - } - plane.vbo.init_from(std::move(init_data)); -#else - plane.vbo.reserve(plane.vertices.size()); - for (const auto& vert : plane.vertices) - plane.vbo.push_geometry(vert, plane.normal); - for (size_t i=1; iselection_info()->model_object(); - if (m_state != On || ! mo || mo->instances.empty()) - return false; - - 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 (! 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 < 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; -} - -} // namespace GUI -} // namespace Slic3r +// 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" +#if ENABLE_LEGACY_OPENGL_REMOVAL +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" + +#include "libslic3r/Geometry/ConvexHull.hpp" +#include "libslic3r/Model.hpp" + +#include + +#include + +namespace Slic3r { +namespace GUI { + +static const Slic3r::ColorRGBA DEFAULT_PLANE_COLOR = { 0.9f, 0.9f, 0.9f, 0.5f }; +static const Slic3r::ColorRGBA DEFAULT_HOVER_PLANE_COLOR = { 0.9f, 0.9f, 0.9f, 0.75f }; + +GLGizmoFlatten::GLGizmoFlatten(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +{} + +bool GLGizmoFlatten::on_mouse(const wxMouseEvent &mouse_event) +{ + if (mouse_event.Moving()) { + // only for sure + m_mouse_left_down = false; + return false; + } + if (mouse_event.LeftDown()) { + if (m_hover_id != -1) { + m_mouse_left_down = true; + Selection &selection = m_parent.get_selection(); + if (selection.is_single_full_instance()) { + // Rotate the object so the normal points downward: + selection.flattening_rotate(m_planes[m_hover_id].normal); + m_parent.do_rotate(L("Gizmo-Place on Face")); + } + return true; + } + } + else if (mouse_event.LeftUp()) { + if (m_mouse_left_down) { + // responsible for mouse left up after selecting plane + m_mouse_left_down = false; + return true; + } + + } + else if (mouse_event.Leaving()) + m_mouse_left_down = false; + + return false; +} + +void GLGizmoFlatten::data_changed() +{ + const Selection & selection = m_parent.get_selection(); + const ModelObject *model_object = nullptr; + if (selection.is_single_full_instance() || + selection.is_from_single_object() ) { + model_object = selection.get_model()->objects[selection.get_object_idx()]; + } + set_flattening_data(model_object); +} + +bool GLGizmoFlatten::on_init() +{ + m_shortcut_key = WXK_CONTROL_F; + return true; +} + +void GLGizmoFlatten::on_set_state() +{ +} + +CommonGizmosDataID GLGizmoFlatten::on_get_requirements() const +{ + return CommonGizmosDataID::SelectionInfo; +} + +std::string GLGizmoFlatten::on_get_name() const +{ + return _u8L("Place on face"); +} + +bool GLGizmoFlatten::on_is_activable() const +{ + // This is assumed in GLCanvas3D::do_rotate, do not change this + // without updating that function too. + return m_parent.get_selection().is_single_full_instance(); +} + +void GLGizmoFlatten::on_render() +{ + const Selection& selection = m_parent.get_selection(); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); + + glsafe(::glEnable(GL_DEPTH_TEST)); + glsafe(::glEnable(GL_BLEND)); + + if (selection.is_single_full_instance()) { + const Transform3d& inst_matrix = selection.get_first_volume()->get_instance_transformation().get_matrix(); +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d model_matrix = Geometry::assemble_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * inst_matrix; + const Transform3d view_model_matrix = camera.get_view_matrix() * model_matrix; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(0.f, 0.f, selection.get_first_volume()->get_sla_shift_z())); + glsafe(::glMultMatrixd(inst_matrix.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + if (this->is_plane_update_necessary()) + update_planes(); + for (int i = 0; i < (int)m_planes.size(); ++i) { +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_planes_casters[i]->set_transform(model_matrix); + m_planes[i].vbo.model.set_color(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR : DEFAULT_PLANE_COLOR); + m_planes[i].vbo.model.render(); +#else + m_planes[i].vbo.set_color(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR : DEFAULT_PLANE_COLOR); + m_planes[i].vbo.render(); +#endif // ENABLE_RAYCAST_PICKING +#else + glsafe(::glColor4fv(i == m_hover_id ? DEFAULT_HOVER_PLANE_COLOR.data() : DEFAULT_PLANE_COLOR.data())); + if (m_planes[i].vbo.has_VBOs()) + m_planes[i].vbo.render(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + } +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + } + + glsafe(::glEnable(GL_CULL_FACE)); + glsafe(::glDisable(GL_BLEND)); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->stop_using(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoFlatten::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); + + assert(m_planes_casters.empty()); + + if (!m_planes.empty()) { + const Selection& selection = m_parent.get_selection(); + const Transform3d matrix = Geometry::assemble_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * + selection.get_first_volume()->get_instance_transformation().get_matrix(); + + for (int i = 0; i < (int)m_planes.size(); ++i) { + m_planes_casters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_planes[i].vbo.mesh_raycaster, matrix)); + } + } +} + +void GLGizmoFlatten::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_parent.set_raycaster_gizmos_on_top(false); + m_planes_casters.clear(); +} +#else +void GLGizmoFlatten::on_render_for_picking() +{ + const Selection& selection = m_parent.get_selection(); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; + + shader->start_using(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + glsafe(::glDisable(GL_DEPTH_TEST)); + glsafe(::glDisable(GL_BLEND)); + + if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) { + const Transform3d& m = selection.get_first_volume()->get_instance_transformation().get_matrix(); +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d view_model_matrix = camera.get_view_matrix() * + Geometry::assemble_transform(selection.get_first_volume()->get_sla_shift_z() * Vec3d::UnitZ()) * m; + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(0.f, 0.f, selection.get_first_volume()->get_sla_shift_z())); + glsafe(::glMultMatrixd(m.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + if (this->is_plane_update_necessary()) + update_planes(); + for (int i = 0; i < (int)m_planes.size(); ++i) { +#if ENABLE_LEGACY_OPENGL_REMOVAL + m_planes[i].vbo.set_color(picking_color_component(i)); +#else + glsafe(::glColor4fv(picking_color_component(i).data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + m_planes[i].vbo.render(); + } +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + } + + glsafe(::glEnable(GL_CULL_FACE)); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->stop_using(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} +#endif // ENABLE_RAYCAST_PICKING + +void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object) +{ + if (model_object != m_old_model_object) { + m_planes.clear(); +#if ENABLE_RAYCAST_PICKING + on_unregister_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + } +} + +void GLGizmoFlatten::update_planes() +{ + const ModelObject* mo = m_c->selection_info()->model_object(); + TriangleMesh ch; + for (const ModelVolume* vol : mo->volumes) { + if (vol->type() != ModelVolumeType::MODEL_PART) + continue; + TriangleMesh vol_ch = vol->get_convex_hull(); + vol_ch.transform(vol->get_matrix()); + ch.merge(vol_ch); + } + ch = ch.convex_hull_3d(); + m_planes.clear(); +#if ENABLE_RAYCAST_PICKING + on_unregister_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING +#if ENABLE_WORLD_COORDINATE + const Transform3d inst_matrix = mo->instances.front()->get_matrix_no_offset(); +#else + const Transform3d& inst_matrix = mo->instances.front()->get_matrix(true); +#endif // ENABLE_WORLD_COORDINATE + + // Following constants are used for discarding too small polygons. + const float minimal_area = 5.f; // in square mm (world coordinates) + const float minimal_side = 1.f; // mm + + // Now we'll go through all the facets and append Points of facets sharing the same normal. + // This part is still performed in mesh coordinate system. + const int num_of_facets = ch.facets_count(); + const std::vector face_normals = its_face_normals(ch.its); + const std::vector face_neighbors = its_face_neighbors(ch.its); + std::vector facet_queue(num_of_facets, 0); + std::vector facet_visited(num_of_facets, false); + int facet_queue_cnt = 0; + const stl_normal* normal_ptr = nullptr; + int facet_idx = 0; + while (1) { + // Find next unvisited triangle: + for (; facet_idx < num_of_facets; ++ facet_idx) + if (!facet_visited[facet_idx]) { + facet_queue[facet_queue_cnt ++] = facet_idx; + facet_visited[facet_idx] = true; + normal_ptr = &face_normals[facet_idx]; + m_planes.emplace_back(); + break; + } + if (facet_idx == num_of_facets) + break; // Everything was visited already + + while (facet_queue_cnt > 0) { + int facet_idx = facet_queue[-- facet_queue_cnt]; + const stl_normal& this_normal = face_normals[facet_idx]; + 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) { + const Vec3i face = ch.its.indices[facet_idx]; + for (int j=0; j<3; ++j) + m_planes.back().vertices.emplace_back(ch.its.vertices[face[j]].cast()); + + facet_visited[facet_idx] = true; + for (int j = 0; j < 3; ++ j) + if (int neighbor_idx = face_neighbors[facet_idx][j]; neighbor_idx >= 0 && ! facet_visited[neighbor_idx]) + facet_queue[facet_queue_cnt ++] = neighbor_idx; + } + } + 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. + 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 (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(); + } + + // Let's prepare transformation of the normal vector from mesh to instance coordinates. + Geometry::Transformation t(inst_matrix); + Vec3d scaling = t.get_scaling_factor(); + t.set_scaling_factor(Vec3d(1./scaling(0), 1./scaling(1), 1./scaling(2))); + + // Now we'll go through all the polygons, transform the points into xy plane to process them: + for (unsigned int polygon_id=0; polygon_id < m_planes.size(); ++polygon_id) { + Pointf3s& polygon = m_planes[polygon_id].vertices; + const Vec3d& normal = m_planes[polygon_id].normal; + + // transform the normal according to the instance matrix: + Vec3d normal_transformed = t.get_matrix() * normal; + + // We are going to rotate about z and y to flatten the plane + Eigen::Quaterniond q; + Transform3d m = Transform3d::Identity(); + m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(normal_transformed, Vec3d::UnitZ()).toRotationMatrix(); + polygon = transform(polygon, m); + + // Now to remove the inner points. We'll misuse Geometry::convex_hull for that, but since + // it works in fixed point representation, we will rescale the polygon to avoid overflows. + // And yes, it is a nasty thing to do. Whoever has time is free to refactor. + Vec3d bb_size = BoundingBoxf3(polygon).size(); + float sf = std::min(1./bb_size(0), 1./bb_size(1)); + Transform3d tr = Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), Vec3d(sf, sf, 1.f)); + polygon = transform(polygon, tr); + polygon = Slic3r::Geometry::convex_hull(polygon); + polygon = transform(polygon, tr.inverse()); + + // Calculate area of the polygons and discard ones that are too small + float& area = m_planes[polygon_id].area; + area = 0.f; + for (unsigned int i = 0; i < polygon.size(); i++) // Shoelace formula + area += polygon[i](0)*polygon[i + 1 < polygon.size() ? i + 1 : 0](1) - polygon[i + 1 < polygon.size() ? i + 1 : 0](0)*polygon[i](1); + area = 0.5f * std::abs(area); + + bool discard = false; + if (area < minimal_area) + discard = true; + else { + // We also check the inner angles and discard polygons with angles smaller than the following threshold + const double angle_threshold = ::cos(10.0 * (double)PI / 180.0); + + for (unsigned int i = 0; i < polygon.size(); ++i) { + const Vec3d& prec = polygon[(i == 0) ? polygon.size() - 1 : i - 1]; + const Vec3d& curr = polygon[i]; + const Vec3d& next = polygon[(i == polygon.size() - 1) ? 0 : i + 1]; + + if ((prec - curr).normalized().dot((next - curr).normalized()) > angle_threshold) { + discard = true; + break; + } + } + } + + if (discard) { + m_planes[polygon_id--] = std::move(m_planes.back()); + m_planes.pop_back(); + continue; + } + + // We will shrink the polygon a little bit so it does not touch the object edges: + Vec3d centroid = std::accumulate(polygon.begin(), polygon.end(), Vec3d(0.0, 0.0, 0.0)); + centroid /= (double)polygon.size(); + for (auto& vertex : polygon) + vertex = 0.9f*vertex + 0.1f*centroid; + + // Polygon is now simple and convex, we'll round the corners to make them look nicer. + // The algorithm takes a vertex, calculates middles of respective sides and moves the vertex + // towards their average (controlled by 'aggressivity'). This is repeated k times. + // In next iterations, the neighbours are not always taken at the middle (to increase the + // rounding effect at the corners, where we need it most). + const unsigned int k = 10; // number of iterations + const float aggressivity = 0.2f; // agressivity + const unsigned int N = polygon.size(); + std::vector> neighbours; + if (k != 0) { + Pointf3s points_out(2*k*N); // vector long enough to store the future vertices + for (unsigned int j=0; jvolumes) { + m_volumes_matrices.push_back(vol->get_matrix()); + m_volumes_types.push_back(vol->type()); + } + 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) { +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + indexed_triangle_set its; + its.vertices.reserve(plane.vertices.size()); + its.indices.reserve(plane.vertices.size() / 3); + for (size_t i = 0; i < plane.vertices.size(); ++i) { + its.vertices.emplace_back((Vec3f)plane.vertices[i].cast()); + } + for (size_t i = 1; i < plane.vertices.size() - 1; ++i) { + its.indices.emplace_back(0, i, i + 1); // triangle fan + } + plane.vbo.model.init_from(its); + plane.vbo.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); +#else + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::TriangleFan, GLModel::Geometry::EVertexLayout::P3N3 }; + init_data.reserve_vertices(plane.vertices.size()); + init_data.reserve_indices(plane.vertices.size()); + // vertices + indices + for (size_t i = 0; i < plane.vertices.size(); ++i) { + init_data.add_vertex((Vec3f)plane.vertices[i].cast(), (Vec3f)plane.normal.cast()); + init_data.add_index((unsigned int)i); + } + plane.vbo.init_from(std::move(init_data)); +#endif // ENABLE_RAYCAST_PICKING +#else + plane.vbo.reserve(plane.vertices.size()); + for (const auto& vert : plane.vertices) + plane.vbo.push_geometry(vert, plane.normal); + for (size_t i=1; iselection_info()->model_object(); + if (m_state != On || ! mo || mo->instances.empty()) + return false; + + if (m_planes.empty() || 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 (! 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 < 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; +} + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp index 3244056a47..f1813c4bd0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp @@ -4,11 +4,13 @@ #include "GLGizmoBase.hpp" #if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/GLModel.hpp" +#if ENABLE_RAYCAST_PICKING +#include "slic3r/GUI/MeshUtils.hpp" +#endif // ENABLE_RAYCAST_PICKING #else #include "slic3r/GUI/3DScene.hpp" #endif // ENABLE_LEGACY_OPENGL_REMOVAL - namespace Slic3r { enum class ModelVolumeType : int; @@ -26,12 +28,19 @@ private: struct PlaneData { std::vector vertices; // should be in fact local in update_planes() #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + PickingModel vbo; +#else GLModel vbo; +#endif // ENABLE_RAYCAST_PICKING #else GLIndexedVertexArray vbo; #endif // ENABLE_LEGACY_OPENGL_REMOVAL Vec3d normal; float area; +#if ENABLE_RAYCAST_PICKING + int picking_id{ -1 }; +#endif // ENABLE_RAYCAST_PICKING }; // This holds information to decide whether recalculation is necessary: @@ -41,10 +50,11 @@ private: Vec3d m_first_instance_mirror; std::vector m_planes; +#if ENABLE_RAYCAST_PICKING + std::vector> m_planes_casters; +#endif // ENABLE_RAYCAST_PICKING bool m_mouse_left_down = false; // for detection left_up of this gizmo - bool m_planes_valid = false; const ModelObject* m_old_model_object = nullptr; - std::vector instances_matrices; void update_planes(); bool is_plane_update_necessary() const; @@ -67,7 +77,12 @@ protected: std::string on_get_name() const override; bool on_is_activable() const override; void on_render() override; +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else void on_render_for_picking() override; +#endif // ENABLE_RAYCAST_PICKING void on_set_state() override; CommonGizmosDataID on_get_requirements() const override; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp index 64ae135623..bbae3f2429 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -1,992 +1,1112 @@ -#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) -{ -} - - -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::data_changed() -{ - 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() -{ - if (!m_cylinder.is_initialized()) - m_cylinder.init_from(its_make_cylinder(1.0, 1.0)); - - 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 (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 Selection& selection = m_parent.get_selection(); -//#if ENABLE_RENDER_PICKING_PASS -// m_z_shift = selection.get_first_volume()->get_sla_shift_z(); -//#endif - - glsafe(::glEnable(GL_DEPTH_TEST)); - render_points(selection, true); -} - -void GLGizmoHollow::render_points(const Selection& selection, bool picking) -{ -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat") : wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - shader->start_using(); - ScopeGuard guard([shader]() { shader->stop_using(); }); -#else - GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); - if (shader) - shader->start_using(); - ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - const GLVolume* vol = selection.get_first_volume(); - Geometry::Transformation trafo = vol->get_instance_transformation() * vol->get_volume_transformation(); - -#if ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_WORLD_COORDINATE - const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_scaling_factor_matrix().inverse(); -#else - const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); -#endif // ENABLE_WORLD_COORDINATE - const Transform3d instance_matrix = Geometry::translation_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * trafo.get_matrix(); - - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d& view_matrix = camera.get_view_matrix(); - const Transform3d& projection_matrix = camera.get_projection_matrix(); - - shader->set_uniform("projection_matrix", projection_matrix); -#else - const Transform3d& instance_scaling_matrix_inverse = trafo.get_matrix(true, true, false, true).inverse(); - const Transform3d& instance_matrix = trafo.get_matrix(); - - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); - glsafe(::glMultMatrixd(instance_matrix.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - ColorRGBA render_color; - const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; - const 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) - render_color = picking_color_component(i); - else { - if (size_t(m_hover_id) == i) - render_color = ColorRGBA::CYAN(); - else if (m_c->hollowed_mesh() && - i < m_c->hollowed_mesh()->get_drainholes().size() && - m_c->hollowed_mesh()->get_drainholes()[i].failed) { - render_color = { 1.0f, 0.0f, 0.0f, 0.5f }; - } - else // neither hover nor picking - render_color = point_selected ? ColorRGBA(1.0f, 0.3f, 0.3f, 0.5f) : ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); - } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_cylinder.set_color(render_color); -#else - const_cast(&m_cylinder)->set_color(-1, render_color); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d hole_matrix = Geometry::assemble_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(drain_hole.pos.x(), drain_hole.pos.y(), drain_hole.pos.z())); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - if (vol->is_left_handed()) - glFrontFace(GL_CW); - - // Matrices set, we can render the point mark now. - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); - const Eigen::AngleAxisd aa(q); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * - Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_cylinder.render(); - - if (vol->is_left_handed()) - glFrontFace(GL_CCW); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - } - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -} - -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() * sel_info->model_object()->volumes.front()->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_first_volume(); - Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_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::EState::Select : GLSelectionRectangle::EState::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::EState::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; idx wx/types.h - Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); - Vec2d mouse_pos = mouse_coord.cast(); - - static bool pending_right_up = false; - if (mouse_event.LeftDown()) { - bool control_down = mouse_event.CmdDown(); - bool grabber_contains_mouse = (get_hover_id() != -1); - if ((!control_down || grabber_contains_mouse) && - gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) - // the gizmo got the event and took some action, there is no need - // to do anything more - return true; - } else if (mouse_event.Dragging()) { - if (m_parent.get_move_volume_id() != -1) - // don't allow dragging objects with the Sla gizmo on - return true; - - bool control_down = mouse_event.CmdDown(); - if (control_down) { - // CTRL has been pressed while already dragging -> stop current action - if (mouse_event.LeftIsDown()) - gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); - else if (mouse_event.RightIsDown()) { - pending_right_up = false; - } - } else if(gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { - // the gizmo got the event and took some action, no need to do - // anything more here - m_parent.set_as_dirty(); - return true; - } - } else if (mouse_event.LeftUp()) { - if (!m_parent.is_mouse_dragging()) { - bool control_down = mouse_event.CmdDown(); - // in case 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, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); - return true; - } - } else if (mouse_event.RightDown()) { - if (m_parent.get_selection().get_object_idx() != -1 && - gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { - // 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 - return true; - } - } else if (mouse_event.RightUp()) { - if (pending_right_up) { - pending_right_up = false; - return true; - } - } - return false; -} - -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(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(0.5f); - - const float settings_sliders_left = - std::max(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(0.5f), clipping_slider_left); - - 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); - - const float button_preview_width = m_imgui->calc_button_size(m_desc.at("preview")).x; - - float window_width = minimal_slider_width + std::max({settings_sliders_left, clipping_slider_left, diameter_slider_left}); - window_width = std::max(window_width, button_preview_width); - - 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); - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("offset")); - ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x); - ImGui::PushItemWidth(window_width - settings_sliders_left); - m_imgui->slider_float("##offset", &offset, offset_min, offset_max, "%.1f mm", 1.0f, true, _L(opts[0].second->tooltip)); - - bool slider_clicked = m_imgui->get_last_slider_status().clicked; // someone clicked the slider - bool slider_edited =m_imgui->get_last_slider_status().edited; // someone is dragging the slider - bool slider_released =m_imgui->get_last_slider_status().deactivated_after_edit; // someone has just released the slider - - if (current_mode >= quality_mode) { - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("quality")); - ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x); - m_imgui->slider_float("##quality", &quality, quality_min, quality_max, "%.1f", 1.0f, true, _L(opts[1].second->tooltip)); - - slider_clicked |= m_imgui->get_last_slider_status().clicked; - slider_edited |= m_imgui->get_last_slider_status().edited; - slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit; - } - - if (current_mode >= closing_d_mode) { - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("closing_distance")); - ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x); - m_imgui->slider_float("##closing_distance", &closing_d, closing_d_min, closing_d_max, "%.1f mm", 1.0f, true, _L(opts[2].second->tooltip)); - - slider_clicked |= m_imgui->get_last_slider_status().clicked; - slider_edited |= m_imgui->get_last_slider_status().edited; - slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit; - } - - 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 = 60.; - if (m_new_hole_radius * 2.f > diameter_upper_cap) - m_new_hole_radius = diameter_upper_cap / 2.f; - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("hole_diameter")); - ImGui::SameLine(diameter_slider_left, m_imgui->get_item_spacing().x); - ImGui::PushItemWidth(window_width - diameter_slider_left); - - float diam = 2.f * m_new_hole_radius; - m_imgui->slider_float("##hole_diameter", &diam, 1.f, 25.f, "%.1f mm", 1.f, false); - // Let's clamp the value (which could have been entered by keyboard) to a larger range - // than the slider. This allows entering off-scale values and still protects against - //complete non-sense. - diam = std::clamp(diam, 0.1f, diameter_upper_cap); - m_new_hole_radius = diam / 2.f; - bool clicked = m_imgui->get_last_slider_status().clicked; - bool edited = m_imgui->get_last_slider_status().edited; - bool deactivated = m_imgui->get_last_slider_status().deactivated_after_edit; - - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc["hole_depth"]); - ImGui::SameLine(diameter_slider_left, m_imgui->get_item_spacing().x); - m_imgui->slider_float("##hole_depth", &m_new_hole_height, 0.f, 10.f, "%.1f mm", 1.f, false); - // Same as above: - m_new_hole_height = std::clamp(m_new_hole_height, 0.f, 100.f); - - clicked |= m_imgui->get_last_slider_status().clicked; - edited |= m_imgui->get_last_slider_status().edited; - deactivated |= m_imgui->get_last_slider_status().deactivated_after_edit;; - - // 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) { - 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(settings_sliders_left, m_imgui->get_item_spacing().x); - ImGui::PushItemWidth(window_width - settings_sliders_left); - float clp_dist = m_c->object_clipper()->get_position(); - if (m_imgui->slider_float("##clp_dist", &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 _u8L("Hollow and drill"); -} - - -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_dragging(const UpdateData &data) -{ - assert(m_hover_id != -1); - std::pair pos_and_normal; - if (!unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) - return; - sla::DrainHoles &drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; - drain_holes[m_hover_id].pos = pos_and_normal.first; - drain_holes[m_hover_id].normal = -pos_and_normal.second; -} - - -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 && ! drain_holes.empty()) { - 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 +#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) +{ +} + + +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::data_changed() +{ + 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; +#if ENABLE_RAYCAST_PICKING + if (m_raycasters.empty()) + on_register_raycasters_for_picking(); + else + update_raycasters_for_picking_transform(); +#endif // ENABLE_RAYCAST_PICKING + } +} + + + +void GLGizmoHollow::on_render() +{ +#if !ENABLE_RAYCAST_PICKING + if (!m_cylinder.is_initialized()) + m_cylinder.init_from(its_make_cylinder(1.0, 1.0)); +#endif // !ENABLE_RAYCAST_PICKING + + 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 (selection.is_from_single_instance()) +#if ENABLE_RAYCAST_PICKING + render_points(selection); +#else + render_points(selection, false); +#endif // ENABLE_RAYCAST_PICKING + + m_selection_rectangle.render(m_parent); + m_c->object_clipper()->render_cut(); + m_c->supports_clipper()->render_cut(); + + glsafe(::glDisable(GL_BLEND)); +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoHollow::on_register_raycasters_for_picking() +{ + assert(m_raycasters.empty()); + + init_cylinder_model(); + + set_sla_auxiliary_volumes_picking_state(false); + + const CommonGizmosDataObjects::SelectionInfo* info = m_c->selection_info(); + if (info != nullptr && !info->model_object()->sla_drain_holes.empty()) { + const sla::DrainHoles& drain_holes = info->model_object()->sla_drain_holes; + for (int i = 0; i < (int)drain_holes.size(); ++i) { + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_cylinder.mesh_raycaster, Transform3d::Identity())); + } + update_raycasters_for_picking_transform(); + } +} + +void GLGizmoHollow::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_raycasters.clear(); + set_sla_auxiliary_volumes_picking_state(true); +} +#else +void GLGizmoHollow::on_render_for_picking() +{ + const Selection& selection = m_parent.get_selection(); + glsafe(::glEnable(GL_DEPTH_TEST)); + render_points(selection, true); +} +#endif // ENABLE_RAYCAST_PICKING + +#if ENABLE_RAYCAST_PICKING +void GLGizmoHollow::render_points(const Selection& selection) +#else +void GLGizmoHollow::render_points(const Selection& selection, bool picking) +#endif // ENABLE_RAYCAST_PICKING +{ +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#else + GLShaderProgram* shader = picking ? wxGetApp().get_shader("flat") : wxGetApp().get_shader("gouraud_light"); +#endif // ENABLE_RAYCAST_PICKING + if (shader == nullptr) + return; + + shader->start_using(); + ScopeGuard guard([shader]() { shader->stop_using(); }); +#else + GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); + if (shader) + shader->start_using(); + ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + const GLVolume* vol = selection.get_first_volume(); + const Transform3d trafo = vol->world_matrix(); + +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_WORLD_COORDINATE + const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_scaling_factor_matrix().inverse(); +#else + const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse(); +#endif // ENABLE_WORLD_COORDINATE + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#else + const Transform3d& instance_scaling_matrix_inverse = trafo.get_matrix(true, true, false, true).inverse(); + const Transform3d& instance_matrix = trafo.get_matrix(); + + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); + glsafe(::glMultMatrixd(instance_matrix.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + ColorRGBA render_color; + const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + const 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 ENABLE_RAYCAST_PICKING + const bool clipped = is_mesh_point_clipped(drain_hole.pos.cast()); + m_raycasters[i]->set_active(!clipped); + if (clipped) + continue; +#else + if (is_mesh_point_clipped(drain_hole.pos.cast())) + continue; +#endif // ENABLE_RAYCAST_PICKING + + // First decide about the color of the point. +#if !ENABLE_RAYCAST_PICKING + if (picking) + render_color = picking_color_component(i); + else { +#endif // !ENABLE_RAYCAST_PICKING + if (size_t(m_hover_id) == i) + render_color = ColorRGBA::CYAN(); + else if (m_c->hollowed_mesh() && + i < m_c->hollowed_mesh()->get_drainholes().size() && + m_c->hollowed_mesh()->get_drainholes()[i].failed) { + render_color = { 1.0f, 0.0f, 0.0f, 0.5f }; + } + else + render_color = point_selected ? ColorRGBA(1.0f, 0.3f, 0.3f, 0.5f) : ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f); +#if !ENABLE_RAYCAST_PICKING + } +#endif // !ENABLE_RAYCAST_PICKING + +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_cylinder.model.set_color(render_color); +#else + m_cylinder.set_color(render_color); +#endif // ENABLE_RAYCAST_PICKING + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + const Transform3d hole_matrix = Geometry::translation_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; +#else + const_cast(&m_cylinder)->set_color(-1, render_color); + // 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.x(), drain_hole.pos.y(), drain_hole.pos.z())); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + if (vol->is_left_handed()) + glsafe(::glFrontFace(GL_CW)); + + // Matrices set, we can render the point mark now. + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); + const Eigen::AngleAxisd aa(q); +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d model_matrix = trafo * hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#else + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_cylinder.model.render(); +#else + m_cylinder.render(); +#endif // ENABLE_RAYCAST_PICKING + + if (vol->is_left_handed()) + glsafe(::glFrontFace(GL_CCW)); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + } + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +} + +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() * sel_info->model_object()->volumes.front()->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_first_volume(); + Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_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::EState::Select : GLSelectionRectangle::EState::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; +#if ENABLE_RAYCAST_PICKING + on_unregister_raycasters_for_picking(); + on_register_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + } + 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; +#if ENABLE_RAYCAST_PICKING + std::vector points_idxs = m_selection_rectangle.contains(points); + m_selection_rectangle.stop_dragging(); +#else + std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); +#endif // ENABLE_RAYCAST_PICKING + 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::EState::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; idx wx/types.h + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); + + static bool pending_right_up = false; + if (mouse_event.LeftDown()) { + bool control_down = mouse_event.CmdDown(); + bool grabber_contains_mouse = (get_hover_id() != -1); + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + // the gizmo got the event and took some action, there is no need + // to do anything more + return true; + } else if (mouse_event.Dragging()) { + if (m_parent.get_move_volume_id() != -1) + // don't allow dragging objects with the Sla gizmo on + return true; + + bool control_down = mouse_event.CmdDown(); + if (control_down) { + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) { + pending_right_up = false; + } + } else if(gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } + } else if (mouse_event.LeftUp()) { + if (!m_parent.is_mouse_dragging()) { + bool control_down = mouse_event.CmdDown(); + // in case 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, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + return true; + } + } else if (mouse_event.RightDown()) { + if (m_parent.get_selection().get_object_idx() != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { + // 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 + return true; + } + } else if (mouse_event.RightUp()) { + if (pending_right_up) { + pending_right_up = false; + return true; + } + } + return false; +} + +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); + }); +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoHollow::set_sla_auxiliary_volumes_picking_state(bool state) +{ + std::vector>* raycasters = m_parent.get_raycasters_for_picking(SceneRaycaster::EType::Volume); + if (raycasters != nullptr) { + const Selection& selection = m_parent.get_selection(); + const Selection::IndicesList ids = selection.get_volume_idxs(); + for (unsigned int id : ids) { + const GLVolume* v = selection.get_volume(id); + if (v->is_sla_pad() || v->is_sla_support()) { + auto it = std::find_if(raycasters->begin(), raycasters->end(), [v](std::shared_ptr item) { return item->get_raycaster() == v->mesh_raycaster.get(); }); + if (it != raycasters->end()) + (*it)->set_active(state); + } + } + } +} + +void GLGizmoHollow::update_raycasters_for_picking_transform() +{ + const CommonGizmosDataObjects::SelectionInfo* info = m_c->selection_info(); + if (info != nullptr) { + const sla::DrainHoles& drain_holes = info->model_object()->sla_drain_holes; + if (!drain_holes.empty()) { + assert(!m_raycasters.empty()); + + const GLVolume* vol = m_parent.get_selection().get_first_volume(); + const Transform3d instance_scaling_matrix_inverse = vol->get_instance_transformation().get_scaling_factor_matrix().inverse(); + + for (size_t i = 0; i < drain_holes.size(); ++i) { + const sla::DrainHole& drain_hole = drain_holes[i]; + const Transform3d hole_matrix = Geometry::translation_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); + const Eigen::AngleAxisd aa(q); + const Transform3d matrix = vol->world_matrix() * hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + m_raycasters[i]->set_transform(matrix); + } + } + } +} +#endif // ENABLE_RAYCAST_PICKING + +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(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(0.5f); + + const float settings_sliders_left = + std::max(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(0.5f), clipping_slider_left); + + 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); + + const float button_preview_width = m_imgui->calc_button_size(m_desc.at("preview")).x; + + float window_width = minimal_slider_width + std::max({settings_sliders_left, clipping_slider_left, diameter_slider_left}); + window_width = std::max(window_width, button_preview_width); + + 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); + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("offset")); + ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x); + ImGui::PushItemWidth(window_width - settings_sliders_left); + m_imgui->slider_float("##offset", &offset, offset_min, offset_max, "%.1f mm", 1.0f, true, _L(opts[0].second->tooltip)); + + bool slider_clicked = m_imgui->get_last_slider_status().clicked; // someone clicked the slider + bool slider_edited =m_imgui->get_last_slider_status().edited; // someone is dragging the slider + bool slider_released =m_imgui->get_last_slider_status().deactivated_after_edit; // someone has just released the slider + + if (current_mode >= quality_mode) { + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("quality")); + ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x); + m_imgui->slider_float("##quality", &quality, quality_min, quality_max, "%.1f", 1.0f, true, _L(opts[1].second->tooltip)); + + slider_clicked |= m_imgui->get_last_slider_status().clicked; + slider_edited |= m_imgui->get_last_slider_status().edited; + slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit; + } + + if (current_mode >= closing_d_mode) { + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("closing_distance")); + ImGui::SameLine(settings_sliders_left, m_imgui->get_item_spacing().x); + m_imgui->slider_float("##closing_distance", &closing_d, closing_d_min, closing_d_max, "%.1f mm", 1.0f, true, _L(opts[2].second->tooltip)); + + slider_clicked |= m_imgui->get_last_slider_status().clicked; + slider_edited |= m_imgui->get_last_slider_status().edited; + slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit; + } + + 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 = 60.; + if (m_new_hole_radius * 2.f > diameter_upper_cap) + m_new_hole_radius = diameter_upper_cap / 2.f; + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("hole_diameter")); + ImGui::SameLine(diameter_slider_left, m_imgui->get_item_spacing().x); + ImGui::PushItemWidth(window_width - diameter_slider_left); + + float diam = 2.f * m_new_hole_radius; + m_imgui->slider_float("##hole_diameter", &diam, 1.f, 25.f, "%.1f mm", 1.f, false); + // Let's clamp the value (which could have been entered by keyboard) to a larger range + // than the slider. This allows entering off-scale values and still protects against + //complete non-sense. + diam = std::clamp(diam, 0.1f, diameter_upper_cap); + m_new_hole_radius = diam / 2.f; + bool clicked = m_imgui->get_last_slider_status().clicked; + bool edited = m_imgui->get_last_slider_status().edited; + bool deactivated = m_imgui->get_last_slider_status().deactivated_after_edit; + + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc["hole_depth"]); + ImGui::SameLine(diameter_slider_left, m_imgui->get_item_spacing().x); + m_imgui->slider_float("##hole_depth", &m_new_hole_height, 0.f, 10.f, "%.1f mm", 1.f, false); + // Same as above: + m_new_hole_height = std::clamp(m_new_hole_height, 0.f, 100.f); + + clicked |= m_imgui->get_last_slider_status().clicked; + edited |= m_imgui->get_last_slider_status().edited; + deactivated |= m_imgui->get_last_slider_status().deactivated_after_edit;; + + // 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) { + 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(settings_sliders_left, m_imgui->get_item_spacing().x); + ImGui::PushItemWidth(window_width - settings_sliders_left); + float clp_dist = m_c->object_clipper()->get_position(); + if (m_imgui->slider_float("##clp_dist", &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 _u8L("Hollow and drill"); +} + + +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_dragging(const UpdateData &data) +{ + assert(m_hover_id != -1); + std::pair pos_and_normal; + if (!unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + sla::DrainHoles &drain_holes = m_c->selection_info()->model_object()->sla_drain_holes; + drain_holes[m_hover_id].pos = pos_and_normal.first; + drain_holes[m_hover_id].normal = -pos_and_normal.second; +} + + +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 && !drain_holes.empty()) { + 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; +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoHollow::init_cylinder_model() +{ + if (!m_cylinder.model.is_initialized()) { + indexed_triangle_set its = its_make_cylinder(1.0, 1.0); + m_cylinder.model.init_from(its); + m_cylinder.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } +} +#endif // ENABLE_RAYCAST_PICKING + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp index feab896cc5..aa8cdda043 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -28,8 +28,7 @@ private: public: GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); - virtual ~GLGizmoHollow() = default; - void data_changed() override; + void data_changed() override; 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 { @@ -43,18 +42,37 @@ public: /// Keep information about mouse click /// Return True when use the information otherwise False. bool on_mouse(const wxMouseEvent &mouse_event) override; -private: + +protected: bool on_init() override; void on_render() override; +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else void on_render_for_picking() override; +#endif // ENABLE_RAYCAST_PICKING +private: +#if ENABLE_RAYCAST_PICKING + void render_points(const Selection& selection); +#else void render_points(const Selection& selection, bool picking = false); +#endif // ENABLE_RAYCAST_PICKING void hollow_mesh(bool postpone_error_messages = false); - bool unsaved_changes() const; +#if ENABLE_RAYCAST_PICKING + void set_sla_auxiliary_volumes_picking_state(bool state); + void update_raycasters_for_picking_transform(); +#endif // ENABLE_RAYCAST_PICKING ObjectID m_old_mo_id = -1; +#if ENABLE_RAYCAST_PICKING + PickingModel m_cylinder; + std::vector> m_raycasters; +#else GLModel m_cylinder; +#endif // ENABLE_RAYCAST_PICKING float m_new_hole_radius = 2.f; // Size of a new hole. float m_new_hole_height = 6.f; @@ -109,6 +127,10 @@ protected: bool on_is_selectable() const override; void on_load(cereal::BinaryInputArchive& ar) override; void on_save(cereal::BinaryOutputArchive& ar) const override; + +#if ENABLE_RAYCAST_PICKING + void init_cylinder_model(); +#endif // ENABLE_RAYCAST_PICKING }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp index b6861254a9..89cdf748f0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.cpp @@ -193,28 +193,27 @@ void GLGizmoMmuSegmentation::render_triangles(const Selection &selection) const if (is_left_handed) glsafe(::glFrontFace(GL_CW)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d matrix = camera.get_view_matrix() * trafo_matrix; - shader->set_uniform("view_model_matrix", matrix); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * trafo_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); #else glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->set_uniform("volume_world_matrix", trafo_matrix); shader->set_uniform("volume_mirrored", is_left_handed); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); #else m_triangle_selectors[mesh_id]->render(m_imgui); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - -#if !ENABLE_GL_SHADERS_ATTRIBUTES glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + if (is_left_handed) glsafe(::glFrontFace(GL_CCW)); } @@ -583,11 +582,11 @@ ColorRGBA GLGizmoMmuSegmentation::get_cursor_sphere_right_button_color() const return color; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void TriangleSelectorMmGui::render(ImGuiWrapper* imgui, const Transform3d& matrix) #else void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { if (m_update_render_data) update_render_data(); @@ -596,13 +595,14 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) if (!shader) return; assert(shader->get_name() == "mm_gouraud"); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d view_model_matrix = camera.get_view_matrix() * matrix; - shader->set_uniform("view_model_matrix", view_model_matrix); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (size_t color_idx = 0; color_idx < m_gizmo_scene.triangle_indices.size(); ++color_idx) { if (m_gizmo_scene.has_VBOs(color_idx)) { @@ -616,11 +616,7 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui) } #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES render_paint_contour(matrix); -#else - render_paint_contour(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else if (m_paint_contour.has_VBO()) { ScopeGuard guard_mm_gouraud([shader]() { shader->start_using(); }); @@ -712,6 +708,13 @@ void GLMmSegmentationGizmo3DScene::release_geometry() { glsafe(::glDeleteBuffers(1, &triangle_indices_VBO_id)); triangle_indices_VBO_id = 0; } +#if ENABLE_GL_CORE_PROFILE + if (this->vertices_VAO_id > 0) { + glsafe(::glDeleteVertexArrays(1, &this->vertices_VAO_id)); + this->vertices_VAO_id = 0; + } +#endif // ENABLE_GL_CORE_PROFILE + this->clear(); } @@ -719,17 +722,26 @@ void GLMmSegmentationGizmo3DScene::render(size_t triangle_indices_idx) const { assert(triangle_indices_idx < this->triangle_indices_VBO_ids.size()); assert(this->triangle_indices_sizes.size() == this->triangle_indices_VBO_ids.size()); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + assert(this->vertices_VAO_id != 0); +#endif // ENABLE_GL_CORE_PROFILE assert(this->vertices_VBO_id != 0); assert(this->triangle_indices_VBO_ids[triangle_indices_idx] != 0); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader == nullptr) return; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(this->vertices_VAO_id)); + // the following binding is needed to set the vertex attributes +#endif // ENABLE_GL_CORE_PROFILE glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_VBO_id)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const GLint position_id = shader->get_attrib_location("v_position"); if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (GLvoid*)0)); @@ -745,31 +757,50 @@ void GLMmSegmentationGizmo3DScene::render(size_t triangle_indices_idx) const // Render using the Vertex Buffer Objects. if (this->triangle_indices_sizes[triangle_indices_idx] > 0) { -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->triangle_indices_VBO_ids[triangle_indices_idx])); glsafe(::glDrawElements(GL_TRIANGLES, GLsizei(this->triangle_indices_sizes[triangle_indices_idx]), GL_UNSIGNED_INT, nullptr)); glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (position_id != -1) glsafe(::glDisableVertexAttribArray(position_id)); #else glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE } void GLMmSegmentationGizmo3DScene::finalize_vertices() { +#if ENABLE_GL_CORE_PROFILE + assert(this->vertices_VAO_id == 0); +#endif // ENABLE_GL_CORE_PROFILE assert(this->vertices_VBO_id == 0); if (!this->vertices.empty()) { +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &this->vertices_VAO_id)); + glsafe(::glBindVertexArray(this->vertices_VAO_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glGenBuffers(1, &this->vertices_VBO_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->vertices_VBO_id)); glsafe(::glBufferData(GL_ARRAY_BUFFER, this->vertices.size() * sizeof(float), this->vertices.data(), GL_STATIC_DRAW)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); this->vertices.clear(); + +#if ENABLE_GL_CORE_PROFILE + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(0)); +#endif // ENABLE_GL_CORE_PROFILE } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp index 5d23973379..502db6ebc8 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMmuSegmentation.hpp @@ -55,7 +55,10 @@ public: // 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_VBO_id{0}; +#if ENABLE_GL_CORE_PROFILE + unsigned int vertices_VAO_id{ 0 }; +#endif // ENABLE_GL_CORE_PROFILE + unsigned int vertices_VBO_id{ 0 }; std::vector triangle_indices_VBO_ids; }; @@ -66,13 +69,13 @@ public: : TriangleSelectorGUI(mesh), m_colors(colors), m_default_volume_color(default_volume_color), m_gizmo_scene(2 * (colors.size() + 1)) {} ~TriangleSelectorMmGui() override = default; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render(ImGuiWrapper* imgui, const Transform3d& matrix) override; #else // Render current selection. Transformation matrices are supposed // to be already set. void render(ImGuiWrapper* imgui) override; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL private: void update_render_data(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index a64174c1f2..bf414d04c0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -5,9 +5,9 @@ #if ENABLE_WORLD_COORDINATE #include "slic3r/GUI/GUI_ObjectManipulation.hpp" #endif // ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include @@ -61,15 +61,11 @@ bool GLGizmoMove3D::on_init() { for (int i = 0; i < 3; ++i) { m_grabbers.push_back(Grabber()); -#if ENABLE_GIZMO_GRABBER_REFACTOR m_grabbers.back().extensions = GLGizmoBase::EGrabberExtension::PosZ; -#endif // ENABLE_GIZMO_GRABBER_REFACTOR } -#if ENABLE_GIZMO_GRABBER_REFACTOR m_grabbers[0].angles = { 0.0, 0.5 * double(PI), 0.0 }; m_grabbers[1].angles = { -0.5 * double(PI), 0.0, 0.0 }; -#endif // ENABLE_GIZMO_GRABBER_REFACTOR m_shortcut_key = WXK_CONTROL_M; @@ -149,27 +145,22 @@ void GLGizmoMove3D::on_dragging(const UpdateData& data) void GLGizmoMove3D::on_render() { -#if !ENABLE_GIZMO_GRABBER_REFACTOR - if (!m_cone.is_initialized()) - m_cone.init_from(its_make_cone(1.0, 1.0, double(PI) / 18.0)); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); #if ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL calc_selection_box_and_center(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Transform3d base_matrix = local_transform(m_parent.get_selection()); for (int i = 0; i < 3; ++i) { m_grabbers[i].matrix = base_matrix; } #else transform_to_local(m_parent.get_selection()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const Vec3d zero = Vec3d::Zero(); const Vec3d half_box_size = 0.5 * m_bounding_box.size(); @@ -203,7 +194,10 @@ void GLGizmoMove3D::on_render() m_grabbers[2].color = AXES_COLOR[2]; #endif // ENABLE_WORLD_COORDINATE - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); #if ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WORLD_COORDINATE @@ -248,12 +242,13 @@ void GLGizmoMove3D::on_render() if (m_hover_id == -1) { #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); @@ -261,7 +256,13 @@ void GLGizmoMove3D::on_render() shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // draw axes for (unsigned int i = 0; i < 3; ++i) { @@ -290,34 +291,21 @@ void GLGizmoMove3D::on_render() // draw grabbers #if ENABLE_WORLD_COORDINATE render_grabbers(m_bounding_box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - for (unsigned int i = 0; i < 3; ++i) { - if (m_grabbers[i].enabled) -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_grabber_extension((Axis)i, base_matrix, m_bounding_box, false); -#else - render_grabber_extension((Axis)i, m_bounding_box, false); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - } -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #else render_grabbers(box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - for (unsigned int i = 0; i < 3; ++i) { - if (m_grabbers[i].enabled) - render_grabber_extension((Axis)i, box, false); - } -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #endif // ENABLE_WORLD_COORDINATE } else { // draw axis #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix()* base_matrix); @@ -325,7 +313,12 @@ void GLGizmoMove3D::on_render() shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.5f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE render_grabber_connection(m_hover_id); shader->stop_using(); @@ -358,32 +351,33 @@ void GLGizmoMove3D::on_render() m_grabbers[m_hover_id].render(true, mean_size); shader->stop_using(); } -#if !ENABLE_GIZMO_GRABBER_REFACTOR -#if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_grabber_extension((Axis)m_hover_id, base_matrix, m_bounding_box, false); -#else - render_grabber_extension((Axis)m_hover_id, m_bounding_box, false); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#else - render_grabber_extension((Axis)m_hover_id, box, false); -#endif // ENABLE_WORLD_COORDINATE -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR } #if ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE } +#if ENABLE_RAYCAST_PICKING +void GLGizmoMove3D::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); +} + +void GLGizmoMove3D::on_unregister_raycasters_for_picking() +{ + m_parent.set_raycaster_gizmos_on_top(false); +} +#else void GLGizmoMove3D::on_render_for_picking() { glsafe(::glDisable(GL_DEPTH_TEST)); #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Transform3d base_matrix = local_transform(m_parent.get_selection()); for (int i = 0; i < 3; ++i) { m_grabbers[i].matrix = base_matrix; @@ -391,32 +385,18 @@ void GLGizmoMove3D::on_render_for_picking() #else glsafe(::glPushMatrix()); transform_to_local(m_parent.get_selection()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL render_grabbers_for_picking(m_bounding_box); -#if ENABLE_GL_SHADERS_ATTRIBUTES -#if !ENABLE_GIZMO_GRABBER_REFACTOR - render_grabber_extension(X, base_matrix, m_bounding_box, true); - render_grabber_extension(Y, base_matrix, m_bounding_box, true); - render_grabber_extension(Z, base_matrix, m_bounding_box, true); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR +#if ENABLE_LEGACY_OPENGL_REMOVAL #else -#if !ENABLE_GIZMO_GRABBER_REFACTOR - render_grabber_extension(X, m_bounding_box, true); - render_grabber_extension(Y, m_bounding_box, true); - render_grabber_extension(Z, m_bounding_box, true); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR glsafe(::glPopMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #else const BoundingBoxf3& box = m_parent.get_selection().get_bounding_box(); render_grabbers_for_picking(box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - render_grabber_extension(X, box, true); - render_grabber_extension(Y, box, true); - render_grabber_extension(Z, box, true); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #endif // ENABLE_WORLD_COORDINATE } +#endif // ENABLE_RAYCAST_PICKING double GLGizmoMove3D::calc_projection(const UpdateData& data) const { @@ -444,74 +424,8 @@ double GLGizmoMove3D::calc_projection(const UpdateData& data) const return projection; } -#if !ENABLE_GIZMO_GRABBER_REFACTOR -#if ENABLE_WORLD_COORDINATE && ENABLE_GL_SHADERS_ATTRIBUTES -void GLGizmoMove3D::render_grabber_extension(Axis axis, const Transform3d& base_matrix, const BoundingBoxf3& box, bool picking) -#else -void GLGizmoMove3D::render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking) -#endif // ENABLE_WORLD_COORDINATE && ENABLE_GL_SHADERS_ATTRIBUTES -{ - const Vec3d box_size = box.size(); - const float mean_size = float((box_size.x() + box_size.y() + box_size.z()) / 3.0); - const double size = m_dragging ? double(m_grabbers[axis].get_dragging_half_size(mean_size)) : double(m_grabbers[axis].get_half_size(mean_size)); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); -#else - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - if (shader == nullptr) - return; - -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_cone.set_color((!picking && m_hover_id != -1) ? complementary(m_grabbers[axis].color) : m_grabbers[axis].color); - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); -#else - m_cone.set_color(-1, (!picking && m_hover_id != -1) ? complementary(m_grabbers[axis].color) : m_grabbers[axis].color); - if (!picking) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d view_model_matrix = camera.get_view_matrix() * base_matrix * Geometry::assemble_transform(m_grabbers[axis].center); - if (axis == X) - view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY()); - else if (axis == Y) - view_model_matrix = view_model_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX()); - view_model_matrix = view_model_matrix * Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslated(m_grabbers[axis].center.x(), m_grabbers[axis].center.y(), m_grabbers[axis].center.z())); - if (axis == X) - glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); - else if (axis == Y) - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_cone.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - -#if !ENABLE_LEGACY_OPENGL_REMOVAL - if (! picking) -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); -} -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR - #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL Transform3d GLGizmoMove3D::local_transform(const Selection& selection) const { Transform3d ret = Geometry::assemble_transform(m_center); @@ -537,7 +451,7 @@ void GLGizmoMove3D::transform_to_local(const Selection& selection) const glsafe(::glMultMatrixd(orient_matrix.data())); } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoMove3D::calc_selection_box_and_center() { diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 199618f3d1..7a4d82a41c 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -25,9 +25,6 @@ class GLGizmoMove3D : public GLGizmoBase Vec3d m_starting_box_center{ Vec3d::Zero() }; Vec3d m_starting_box_bottom_center{ Vec3d::Zero() }; -#if !ENABLE_GIZMO_GRABBER_REFACTOR - GLModel m_cone; -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #if ENABLE_LEGACY_OPENGL_REMOVAL struct GrabberConnection { @@ -65,29 +62,26 @@ protected: void on_stop_dragging() override; void on_dragging(const UpdateData& data) override; void on_render() override; +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else void on_render_for_picking() override; +#endif // ENABLE_RAYCAST_PICKING private: double calc_projection(const UpdateData& data) const; #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL Transform3d local_transform(const Selection& selection) const; #else void transform_to_local(const Selection& selection) const; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void calc_selection_box_and_center(); #endif // ENABLE_WORLD_COORDINATE -#if !ENABLE_GIZMO_GRABBER_REFACTOR -#if ENABLE_WORLD_COORDINATE && ENABLE_GL_SHADERS_ATTRIBUTES - void render_grabber_extension(Axis axis, const Transform3d& base_matrix, const BoundingBoxf3& box, bool picking); -#else - void render_grabber_extension(Axis axis, const BoundingBoxf3& box, bool picking); -#endif // ENABLE_WORLD_COORDINATE && ENABLE_GL_SHADERS_ATTRIBUTES -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR }; - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp index 4e03abb33a..62611ac253 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp @@ -1,1407 +1,1435 @@ -// 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 "slic3r/GUI/OpenGLManager.hpp" -#include "slic3r/Utils/UndoRedo.hpp" -#include "libslic3r/Model.hpp" -#include "libslic3r/PresetBundle.hpp" -#include "libslic3r/TriangleMesh.hpp" - -#include -#include - -namespace Slic3r::GUI { - -#if ENABLE_LEGACY_OPENGL_REMOVAL -std::shared_ptr GLGizmoPainterBase::s_sphere = nullptr; -#else -std::shared_ptr GLGizmoPainterBase::s_sphere = nullptr; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -{ -} - -GLGizmoPainterBase::~GLGizmoPainterBase() -{ -#if ENABLE_LEGACY_OPENGL_REMOVAL - if (s_sphere != nullptr) - s_sphere.reset(); -#else - if (s_sphere != nullptr && s_sphere->has_VBOs()) - s_sphere->release_geometry(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -} - -void GLGizmoPainterBase::data_changed() -{ - if (m_state != On) - return; - - const ModelObject* mo = m_c->selection_info() ? m_c->selection_info()->model_object() : nullptr; - const Selection & selection = m_parent.get_selection(); - 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; - } -} - -GLGizmoPainterBase::ClippingPlaneDataWrapper GLGizmoPainterBase::get_clipping_plane_data() const -{ - ClippingPlaneDataWrapper clp_data_out{{0.f, 0.f, 1.f, FLT_MAX}, {-FLT_MAX, FLT_MAX}}; - // 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) - if (bool clipping_plane_active = m_c->object_clipper()->get_position() != 0.; clipping_plane_active) { - const ClippingPlane *clp = m_c->object_clipper()->get_clipping_plane(); - for (size_t i = 0; i < 3; ++i) - clp_data_out.clp_dataf[i] = -1.f * float(clp->get_data()[i]); - clp_data_out.clp_dataf[3] = float(clp->get_data()[3]); - } - - // z_range is calculated in the same way as in GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) - if (m_c->get_canvas()->get_use_clipping_planes()) { - const std::array &clps = m_c->get_canvas()->get_clipping_planes(); - clp_data_out.z_range = {float(-clps[0].get_data()[3]), float(clps[1].get_data()[3])}; - } - - return clp_data_out; -} - -void GLGizmoPainterBase::render_triangles(const Selection& selection) const -{ - auto* shader = wxGetApp().get_shader("gouraud"); - if (! shader) - return; - shader->start_using(); - shader->set_uniform("slope.actived", false); - shader->set_uniform("print_volume.type", 0); - shader->set_uniform("clipping_plane", this->get_clipping_plane_data().clp_dataf); - ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); - - const ModelObject *mo = m_c->selection_info()->model_object(); - 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)); - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d matrix = camera.get_view_matrix() * trafo_matrix; - shader->set_uniform("view_model_matrix", matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - shader->set_uniform("normal_matrix", (Matrix3d)matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glPushMatrix()); - glsafe(::glMultMatrixd(trafo_matrix.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - // For printers with multiple extruders, it is necessary to pass trafo_matrix - // to the shader input variable print_box.volume_world_matrix before - // rendering the painted triangles. When this matrix is not set, the - // wrong transformation matrix is used for "Clipping of view". - shader->set_uniform("volume_world_matrix", trafo_matrix); - -#if ENABLE_GL_SHADERS_ATTRIBUTES - m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); -#else - m_triangle_selectors[mesh_id]->render(m_imgui); - - glsafe(::glPopMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - if (is_left_handed) - glsafe(::glFrontFace(GL_CCW)); - } -} - -void GLGizmoPainterBase::render_cursor() -{ - // 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_tool_type == ToolType::BRUSH) { - if (m_cursor_type == TriangleSelector::SPHERE) - render_cursor_sphere(trafo_matrices[m_rr.mesh_id]); - else if (m_cursor_type == TriangleSelector::CIRCLE) - render_cursor_circle(); - } -} - -void GLGizmoPainterBase::render_cursor_circle() -{ -#if !ENABLE_GL_SHADERS_ATTRIBUTES - const Camera &camera = wxGetApp().plater()->get_camera(); - const float zoom = float(camera.get_zoom()); - const float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - - const Size cnv_size = m_parent.get_canvas_size(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const float cnv_width = float(cnv_size.get_width()); - const float cnv_height = float(cnv_size.get_height()); - if (cnv_width == 0.0f || cnv_height == 0.0f) - return; - - const float cnv_inv_width = 1.0f / cnv_width; - const float cnv_inv_height = 1.0f / cnv_height; - - const Vec2d center = m_parent.get_local_mouse_position(); - const float radius = m_cursor_radius * float(wxGetApp().plater()->get_camera().get_zoom()); -#else - const float cnv_half_width = 0.5f * float(cnv_size.get_width()); - const float cnv_half_height = 0.5f * float(cnv_size.get_height()); - if (cnv_half_width == 0.0f || cnv_half_height == 0.0f) - return; - const Vec2d mouse_pos(m_parent.get_local_mouse_position().x(), m_parent.get_local_mouse_position().y()); - Vec2d center(mouse_pos.x() - cnv_half_width, cnv_half_height - mouse_pos.y()); - center = center * inv_zoom; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - glsafe(::glLineWidth(1.5f)); -#if !ENABLE_LEGACY_OPENGL_REMOVAL - static const std::array color = { 0.f, 1.f, 0.3f }; - glsafe(::glColor3fv(color.data())); -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - glsafe(::glDisable(GL_DEPTH_TEST)); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - 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 - const double gui_scale = camera.get_gui_scale(); - glsafe(::glScaled(gui_scale, gui_scale, 1.0)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - - glsafe(::glPushAttrib(GL_ENABLE_BIT)); - glsafe(::glLineStipple(4, 0xAAAA)); - glsafe(::glEnable(GL_LINE_STIPPLE)); - -#if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - radius) > EPSILON) { - m_old_cursor_radius = radius; -#else - if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - m_cursor_radius) > EPSILON) { - m_old_cursor_radius = m_cursor_radius; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_old_center = center; - m_circle.reset(); - - GLModel::Geometry init_data; - static const unsigned int StepsCount = 32; - static const float StepSize = 2.0f * float(PI) / float(StepsCount); - init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2 }; - init_data.color = { 0.0f, 1.0f, 0.3f, 1.0f }; - init_data.reserve_vertices(StepsCount); - init_data.reserve_indices(StepsCount); - - // vertices + indices - for (unsigned int i = 0; i < StepsCount; ++i) { - const float angle = float(i) * StepSize; -#if ENABLE_GL_SHADERS_ATTRIBUTES - init_data.add_vertex(Vec2f(2.0f * ((center.x() + ::cos(angle) * radius) * cnv_inv_width - 0.5f), - -2.0f * ((center.y() + ::sin(angle) * radius) * cnv_inv_height - 0.5f))); -#else - init_data.add_vertex(Vec2f(center.x() + ::cos(angle) * m_cursor_radius, center.y() + ::sin(angle) * m_cursor_radius)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - init_data.add_index(i); - } - - m_circle.init_from(std::move(init_data)); - } - - GLShaderProgram* shader = GUI::wxGetApp().get_shader("flat"); - if (shader != nullptr) { - shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader->set_uniform("view_model_matrix", Transform3d::Identity()); - shader->set_uniform("projection_matrix", Transform3d::Identity()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_circle.render(); - shader->stop_using(); - } -#else - ::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()); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - glsafe(::glPopAttrib()); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glEnable(GL_DEPTH_TEST)); -} - - -void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const -{ - if (s_sphere == nullptr) { -#if ENABLE_LEGACY_OPENGL_REMOVAL - s_sphere = std::make_shared(); - s_sphere->init_from(its_make_sphere(1.0, double(PI) / 12.0)); -#else - s_sphere = std::make_shared(); - s_sphere->load_its_flat_shading(its_make_sphere(1.0, double(PI) / 12.0)); - s_sphere->finalize_geometry(true); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader("flat"); - if (shader == nullptr) - return; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_WORLD_COORDINATE - const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_scaling_factor_matrix().inverse(); -#else - const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); -#endif // ENABLE_WORLD_COORDINATE - const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed(); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - 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.x(), m_rr.hit.y(), m_rr.hit.z())); - glsafe(::glMultMatrixd(complete_scaling_matrix_inverse.data())); - glsafe(::glScaled(m_cursor_radius, m_cursor_radius, m_cursor_radius)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - - if (is_left_handed) - glFrontFace(GL_CW); - - ColorRGBA render_color = { 0.0f, 0.0f, 0.0f, 0.25f }; - if (m_button_down == Button::Left) - render_color = this->get_cursor_sphere_left_button_color(); - else if (m_button_down == Button::Right) - render_color = this->get_cursor_sphere_right_button_color(); -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader->start_using(); - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - Transform3d view_model_matrix = camera.get_view_matrix() * trafo * - Geometry::assemble_transform(m_rr.hit.cast()) * complete_scaling_matrix_inverse * - Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), m_cursor_radius * Vec3d::Ones()); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - assert(s_sphere != nullptr); - s_sphere->set_color(render_color); -#else - glsafe(::glColor4fv(render_color.data())); - - assert(s_sphere != nullptr); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - s_sphere->render(); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - if (is_left_handed) - glFrontFace(GL_CCW); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -} - - -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); -} - -// Interpolate points between the previous and current mouse positions, which are then projected onto the object. -// Returned projected mouse positions are grouped by mesh_idx. It may contain multiple std::vector -// with the same mesh_idx, but all items in std::vector always have the same mesh_idx. -std::vector> GLGizmoPainterBase::get_projected_mouse_positions(const Vec2d &mouse_position, const double resolution, const std::vector &trafo_matrices) const -{ - // List of mouse positions that will be used as seeds for painting. - std::vector mouse_positions{mouse_position}; - if (m_last_mouse_click != Vec2d::Zero()) { - // 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 (size_t patches_in_between = size_t((mouse_position - m_last_mouse_click).norm() / resolution); patches_in_between > 0) { - const Vec2d diff = (m_last_mouse_click - mouse_position) / (patches_in_between + 1); - for (size_t patch_idx = 1; patch_idx <= patches_in_between; ++patch_idx) - mouse_positions.emplace_back(mouse_position + patch_idx * diff); - mouse_positions.emplace_back(m_last_mouse_click); - } - } - - const Camera &camera = wxGetApp().plater()->get_camera(); - std::vector mesh_hit_points; - mesh_hit_points.reserve(mouse_positions.size()); - - // In mesh_hit_points only the last item could have mesh_id == -1, any other items mustn't. - for (const Vec2d &mp : mouse_positions) { - update_raycast_cache(mp, camera, trafo_matrices); - mesh_hit_points.push_back({m_rr.hit, m_rr.mesh_id, m_rr.facet}); - if (m_rr.mesh_id == -1) - break; - } - - // Divide mesh_hit_points into groups with the same mesh_idx. It may contain multiple groups with the same mesh_idx. - std::vector> mesh_hit_points_by_mesh; - for (size_t prev_mesh_hit_point = 0, curr_mesh_hit_point = 0; curr_mesh_hit_point < mesh_hit_points.size(); ++curr_mesh_hit_point) { - size_t next_mesh_hit_point = curr_mesh_hit_point + 1; - if (next_mesh_hit_point >= mesh_hit_points.size() || mesh_hit_points[curr_mesh_hit_point].mesh_idx != mesh_hit_points[next_mesh_hit_point].mesh_idx) { - mesh_hit_points_by_mesh.emplace_back(); - mesh_hit_points_by_mesh.back().insert(mesh_hit_points_by_mesh.back().end(), mesh_hit_points.begin() + int(prev_mesh_hit_point), mesh_hit_points.begin() + int(next_mesh_hit_point)); - prev_mesh_hit_point = next_mesh_hit_point; - } - } - - auto on_same_facet = [](std::vector &hit_points) -> bool { - for (const ProjectedMousePosition &mesh_hit_point : hit_points) - if (mesh_hit_point.facet_idx != hit_points.front().facet_idx) - return false; - return true; - }; - - struct Plane - { - Vec3d origin; - Vec3d first_axis; - Vec3d second_axis; - }; - auto find_plane = [](std::vector &hit_points) -> std::optional { - assert(hit_points.size() >= 3); - for (size_t third_idx = 2; third_idx < hit_points.size(); ++third_idx) { - const Vec3d &first_point = hit_points[third_idx - 2].mesh_hit.cast(); - const Vec3d &second_point = hit_points[third_idx - 1].mesh_hit.cast(); - const Vec3d &third_point = hit_points[third_idx].mesh_hit.cast(); - - const Vec3d first_vec = first_point - second_point; - const Vec3d second_vec = third_point - second_point; - - // If three points aren't collinear, then there exists only one plane going through all points. - if (first_vec.cross(second_vec).squaredNorm() > sqr(EPSILON)) { - const Vec3d first_axis_vec_n = first_vec.normalized(); - // Make second_vec perpendicular to first_axis_vec_n using Gram–Schmidt orthogonalization process - const Vec3d second_axis_vec_n = (second_vec - (first_vec.dot(second_vec) / first_vec.dot(first_vec)) * first_vec).normalized(); - return Plane{second_point, first_axis_vec_n, second_axis_vec_n}; - } - } - - return std::nullopt; - }; - - for(std::vector &hit_points : mesh_hit_points_by_mesh) { - assert(!hit_points.empty()); - if (hit_points.back().mesh_idx == -1) - break; - - if (hit_points.size() <= 2) - continue; - - if (on_same_facet(hit_points)) { - hit_points = {hit_points.front(), hit_points.back()}; - } else if (std::optional plane = find_plane(hit_points); plane) { - Polyline polyline; - polyline.points.reserve(hit_points.size()); - // Project hit_points into its plane to simplified them in the next step. - for (auto &hit_point : hit_points) { - const Vec3d &point = hit_point.mesh_hit.cast(); - const double x_cord = plane->first_axis.dot(point - plane->origin); - const double y_cord = plane->second_axis.dot(point - plane->origin); - polyline.points.emplace_back(scale_(x_cord), scale_(y_cord)); - } - - polyline.simplify(scale_(m_cursor_radius) / 10.); - - const int mesh_idx = hit_points.front().mesh_idx; - std::vector new_hit_points; - new_hit_points.reserve(polyline.points.size()); - // Project 2D simplified hit_points beck to 3D. - for (const Point &point : polyline.points) { - const double x_cord = unscale(point.x()); - const double y_cord = unscale(point.y()); - const Vec3d new_hit_point = plane->origin + x_cord * plane->first_axis + y_cord * plane->second_axis; - const int facet_idx = m_c->raycaster()->raycasters()[mesh_idx]->get_closest_facet(new_hit_point.cast()); - new_hit_points.push_back({new_hit_point.cast(), mesh_idx, size_t(facet_idx)}); - } - - hit_points = new_hit_points; - } else { - hit_points = {hit_points.front(), hit_points.back()}; - } - } - - return mesh_hit_points_by_mesh; -} - -// 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) { - if (m_tool_type == ToolType::BRUSH && (m_cursor_type == TriangleSelector::CursorType::SPHERE || m_cursor_type == TriangleSelector::CursorType::CIRCLE)) { - m_cursor_radius = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_cursor_radius - this->get_cursor_radius_step(), this->get_cursor_radius_min()) - : std::min(m_cursor_radius + this->get_cursor_radius_step(), this->get_cursor_radius_max()); - m_parent.set_as_dirty(); - return true; - } else if (m_tool_type == ToolType::SMART_FILL) { - m_smart_fill_angle = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_smart_fill_angle - SmartFillAngleStep, SmartFillAngleMin) - : std::min(m_smart_fill_angle + SmartFillAngleStep, SmartFillAngleMax); - m_parent.set_as_dirty(); - if (m_rr.mesh_id != -1) { - 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()]; -#if ENABLE_WORLD_COORDINATE - const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset(); -#else - const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix(true) * mo->volumes[m_rr.mesh_id]->get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE - const Transform3d trafo_matrix = mi->get_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix(); - m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, this->get_clipping_plane_in_volume_coordinates(trafo_matrix), m_smart_fill_angle, - m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, true); - m_triangle_selectors[m_rr.mesh_id]->request_update_render_data(); - m_seed_fill_last_mesh_id = m_rr.mesh_id; - } - return true; - } - - return false; - } - } - - 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 ? this->get_left_button_state_type() : this->get_right_button_state_type(); - else - new_state = action == SLAGizmoEventType::LeftDown ? this->get_left_button_state_type() : this->get_right_button_state_type(); - } - - 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(); -#if ENABLE_WORLD_COORDINATE - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); -#else - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE - - // Precalculate transformations of individual meshes. - std::vector trafo_matrices; - std::vector trafo_matrices_not_translate; - for (const ModelVolume *mv : mo->volumes) - if (mv->is_model_part()) { - trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); -#if ENABLE_WORLD_COORDINATE - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset()); -#else - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); -#endif // ENABLE_WORLD_COORDINATE - } - - std::vector> projected_mouse_positions_by_mesh = get_projected_mouse_positions(mouse_position, 1., trafo_matrices); - m_last_mouse_click = Vec2d::Zero(); // only actual hits should be saved - - for (const std::vector &projected_mouse_positions : projected_mouse_positions_by_mesh) { - assert(!projected_mouse_positions.empty()); - const int mesh_idx = projected_mouse_positions.front().mesh_idx; - const 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 (mesh_idx != -1) - if (m_button_down == Button::None) - m_button_down = ((action == SLAGizmoEventType::LeftDown) ? Button::Left : Button::Right); - - // 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) - if (mesh_idx == -1) - return dragging_while_painting; - - const Transform3d &trafo_matrix = trafo_matrices[mesh_idx]; - const Transform3d &trafo_matrix_not_translate = trafo_matrices_not_translate[mesh_idx]; - - // Calculate direction from camera to the hit (in mesh coords): - Vec3f camera_pos = (trafo_matrix.inverse() * camera.get_position()).cast(); - - assert(mesh_idx < int(m_triangle_selectors.size())); - const TriangleSelector::ClippingPlane &clp = this->get_clipping_plane_in_volume_coordinates(trafo_matrix); - if (m_tool_type == ToolType::SMART_FILL || m_tool_type == ToolType::BUCKET_FILL || (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER)) { - for(const ProjectedMousePosition &projected_mouse_position : projected_mouse_positions) { - assert(projected_mouse_position.mesh_idx == mesh_idx); - const Vec3f mesh_hit = projected_mouse_position.mesh_hit; - const int facet_idx = int(projected_mouse_position.facet_idx); - m_triangle_selectors[mesh_idx]->seed_fill_apply_on_triangles(new_state); - if (m_tool_type == ToolType::SMART_FILL) - m_triangle_selectors[mesh_idx]->seed_fill_select_triangles(mesh_hit, facet_idx, trafo_matrix_not_translate, clp, m_smart_fill_angle, - m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, true); - else if (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER) - m_triangle_selectors[mesh_idx]->bucket_fill_select_triangles(mesh_hit, facet_idx, clp, false, true); - else if (m_tool_type == ToolType::BUCKET_FILL) - m_triangle_selectors[mesh_idx]->bucket_fill_select_triangles(mesh_hit, facet_idx, clp, true, true); - - m_seed_fill_last_mesh_id = -1; - } - } else if (m_tool_type == ToolType::BRUSH) { - assert(m_cursor_type == TriangleSelector::CursorType::CIRCLE || m_cursor_type == TriangleSelector::CursorType::SPHERE); - - if (projected_mouse_positions.size() == 1) { - const ProjectedMousePosition &first_position = projected_mouse_positions.front(); - std::unique_ptr cursor = TriangleSelector::SinglePointCursor::cursor_factory(first_position.mesh_hit, - camera_pos, m_cursor_radius, - m_cursor_type, trafo_matrix, clp); - m_triangle_selectors[mesh_idx]->select_patch(int(first_position.facet_idx), std::move(cursor), new_state, trafo_matrix_not_translate, - m_triangle_splitting_enabled, m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f); - } else { - for (auto first_position_it = projected_mouse_positions.cbegin(); first_position_it != projected_mouse_positions.cend() - 1; ++first_position_it) { - auto second_position_it = first_position_it + 1; - std::unique_ptr cursor = TriangleSelector::DoublePointCursor::cursor_factory(first_position_it->mesh_hit, second_position_it->mesh_hit, camera_pos, m_cursor_radius, m_cursor_type, trafo_matrix, clp); - m_triangle_selectors[mesh_idx]->select_patch(int(first_position_it->facet_idx), std::move(cursor), new_state, trafo_matrix_not_translate, m_triangle_splitting_enabled, m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f); - } - } - } - - m_triangle_selectors[mesh_idx]->request_update_render_data(); - m_last_mouse_click = mouse_position; - } - - return true; - } - - if (action == SLAGizmoEventType::Moving && (m_tool_type == ToolType::SMART_FILL || m_tool_type == ToolType::BUCKET_FILL || (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER))) { - if (m_triangle_selectors.empty()) - return false; - - 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(); -#if ENABLE_WORLD_COORDINATE - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); -#else - const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); -#endif // ENABLE_WORLD_COORDINATE - - // Precalculate transformations of individual meshes. - std::vector trafo_matrices; - std::vector trafo_matrices_not_translate; - for (const ModelVolume *mv : mo->volumes) - if (mv->is_model_part()) { - trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); -#if ENABLE_WORLD_COORDINATE - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset()); -#else - trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); -#endif // ENABLE_WORLD_COORDINATE - } - - // Now "click" into all the prepared points and spill paint around them. - update_raycast_cache(mouse_position, camera, trafo_matrices); - - auto seed_fill_unselect_all = [this]() { - for (auto &triangle_selector : m_triangle_selectors) { - triangle_selector->seed_fill_unselect_all_triangles(); - triangle_selector->request_update_render_data(); - } - }; - - if (m_rr.mesh_id == -1) { - // Clean selected by seed fill for all triangles in all meshes when a mouse isn't pointing on any mesh. - seed_fill_unselect_all(); - m_seed_fill_last_mesh_id = -1; - - // In case we have no valid hit, we can return. - return false; - } - - // The mouse moved from one object's volume to another one. So it is needed to unselect all triangles selected by seed fill. - if(m_rr.mesh_id != m_seed_fill_last_mesh_id) - seed_fill_unselect_all(); - - const Transform3d &trafo_matrix = trafo_matrices[m_rr.mesh_id]; - const Transform3d &trafo_matrix_not_translate = trafo_matrices_not_translate[m_rr.mesh_id]; - - assert(m_rr.mesh_id < int(m_triangle_selectors.size())); - const TriangleSelector::ClippingPlane &clp = this->get_clipping_plane_in_volume_coordinates(trafo_matrix); - if (m_tool_type == ToolType::SMART_FILL) - m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, clp, m_smart_fill_angle, - m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f); - else if (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER) - m_triangle_selectors[m_rr.mesh_id]->bucket_fill_select_triangles(m_rr.hit, int(m_rr.facet), clp, false); - else if (m_tool_type == ToolType::BUCKET_FILL) - m_triangle_selectors[m_rr.mesh_id]->bucket_fill_select_triangles(m_rr.hit, int(m_rr.facet), clp, true); - m_triangle_selectors[m_rr.mesh_id]->request_update_render_data(); - m_seed_fill_last_mesh_id = m_rr.mesh_id; - return true; - } - - if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::RightUp) - && m_button_down != Button::None) { - // Take snapshot and update ModelVolume data. - wxString action_name = this->handle_snapshot_action_name(shift_down, m_button_down); - Plater::TakeSnapshot snapshot(wxGetApp().plater(), action_name, UndoRedo::SnapshotType::GizmoAction); - update_model_object(); - - m_button_down = Button::None; - m_last_mouse_click = Vec2d::Zero(); - return true; - } - - return false; -} - -bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event) -{ - // wxCoord == int --> wx/types.h - Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); - Vec2d mouse_pos = mouse_coord.cast(); - - if (mouse_event.Moving()) { - gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false); - return false; - } - - // when control is down we allow scene pan and rotation even when clicking - // over some object - bool control_down = mouse_event.CmdDown(); - bool grabber_contains_mouse = (get_hover_id() != -1); - - const Selection &selection = m_parent.get_selection(); - int selected_object_idx = selection.get_object_idx(); - if (mouse_event.LeftDown()) { - if ((!control_down || grabber_contains_mouse) && - gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) - // the gizmo got the event and took some action, there is no need - // to do anything more - return true; - } else if (mouse_event.RightDown()){ - if (!control_down && selected_object_idx != -1 && - gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) - // event was taken care of - return true; - } else if (mouse_event.Dragging()) { - if (m_parent.get_move_volume_id() != -1) - // don't allow dragging objects with the Sla gizmo on - return true; - if (!control_down && gizmo_event(SLAGizmoEventType::Dragging, - mouse_pos, mouse_event.ShiftDown(), - mouse_event.AltDown(), false)) { - // the gizmo got the event and took some action, no need to do - // anything more here - m_parent.set_as_dirty(); - return true; - } - if(control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) - { - // CTRL has been pressed while already dragging -> stop current action - if (mouse_event.LeftIsDown()) - gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); - else if (mouse_event.RightIsDown()) - gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); - return false; - } - } else if (mouse_event.LeftUp()) { - if (!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, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); - return true; - } - } else if (mouse_event.RightUp()) { - if (!m_parent.is_mouse_dragging()) { - gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); - 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() || wxGetApp().get_mode() == comSimple) - 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(); - return std::all_of(list.cbegin(), list.cend(), [&selection](unsigned int idx) { return !selection.get_volume(idx)->is_outside; }); -} - -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_state == Off && m_old_state != Off) { // the gizmo was just turned Off - // we are actually shutting down - on_shutdown(); - 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; -} - -TriangleSelector::ClippingPlane GLGizmoPainterBase::get_clipping_plane_in_volume_coordinates(const Transform3d &trafo) const { - const ::Slic3r::GUI::ClippingPlane *const clipping_plane = m_c->object_clipper()->get_clipping_plane(); - if (clipping_plane == nullptr || !clipping_plane->is_active()) - return {}; - - const Vec3d clp_normal = clipping_plane->get_normal(); - const double clp_offset = clipping_plane->get_offset(); - - const Transform3d trafo_normal = Transform3d(trafo.linear().transpose()); - const Transform3d trafo_inv = trafo.inverse(); - - Vec3d point_on_plane = clp_normal * clp_offset; - Vec3d point_on_plane_transformed = trafo_inv * point_on_plane; - Vec3d normal_transformed = trafo_normal * clp_normal; - auto offset_transformed = float(point_on_plane_transformed.dot(normal_transformed)); - - return TriangleSelector::ClippingPlane({float(normal_transformed.x()), float(normal_transformed.y()), float(normal_transformed.z()), offset_transformed}); -} - -ColorRGBA TriangleSelectorGUI::get_seed_fill_color(const ColorRGBA& base_color) -{ - return saturate(base_color, 0.75f); -} - -#if ENABLE_GL_SHADERS_ATTRIBUTES -void TriangleSelectorGUI::render(ImGuiWrapper* imgui, const Transform3d& matrix) -#else -void TriangleSelectorGUI::render(ImGuiWrapper* imgui) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -{ - static const ColorRGBA enforcers_color = { 0.47f, 0.47f, 1.0f, 1.0f }; - static const ColorRGBA blockers_color = { 1.0f, 0.44f, 0.44f, 1.0f }; - - if (m_update_render_data) { - update_render_data(); - m_update_render_data = false; - } - - auto* shader = wxGetApp().get_current_shader(); - if (! shader) - return; - - assert(shader->get_name() == "gouraud"); - - for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), - std::make_pair(&m_iva_blockers, blockers_color)}) { -#if ENABLE_LEGACY_OPENGL_REMOVAL - iva.first->set_color(iva.second); - iva.first->render(); -#else - if (iva.first->has_VBOs()) { - shader->set_uniform("uniform_color", iva.second); - iva.first->render(); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - for (auto& iva : m_iva_seed_fills) { - size_t color_idx = &iva - &m_iva_seed_fills.front(); - const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : - color_idx == 2 ? blockers_color : - GLVolume::NEUTRAL_COLOR); - iva.set_color(color); - iva.render(); - } -#else - for (auto& iva : m_iva_seed_fills) - if (iva.has_VBOs()) { - size_t color_idx = &iva - &m_iva_seed_fills.front(); - const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : - color_idx == 2 ? blockers_color : - GLVolume::NEUTRAL_COLOR); - shader->set_uniform("uniform_color", color); - iva.render(); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_paint_contour(matrix); -#else - render_paint_contour(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#else - if (m_paint_contour.has_VBO()) { - ScopeGuard guard_gouraud([shader]() { shader->start_using(); }); - shader->stop_using(); - - auto *contour_shader = wxGetApp().get_shader("mm_contour"); - contour_shader->start_using(); - contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001); - m_paint_contour.render(); - contour_shader->stop_using(); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG - if (imgui) - render_debug(imgui); - else - assert(false); // If you want debug output, pass ptr to ImGuiWrapper. -#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG -} - -void TriangleSelectorGUI::update_render_data() -{ - int enf_cnt = 0; - int blc_cnt = 0; - std::vector seed_fill_cnt(m_iva_seed_fills.size(), 0); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) { - iva->reset(); - } - - for (auto& iva : m_iva_seed_fills) { - iva.reset(); - } - - GLModel::Geometry iva_enforcers_data; - iva_enforcers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; - GLModel::Geometry iva_blockers_data; - iva_blockers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; - std::array iva_seed_fills_data; - for (auto& data : iva_seed_fills_data) - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; -#else - for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) - iva->release_geometry(); - - for (auto &iva : m_iva_seed_fills) - iva.release_geometry(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - // small value used to offset triangles along their normal to avoid z-fighting - static const float offset = 0.001f; - - for (const Triangle &tr : m_triangles) { - if (!tr.valid() || tr.is_split() || (tr.get_state() == EnforcerBlockerType::NONE && !tr.is_selected_by_seed_fill())) - continue; - - int tr_state = int(tr.get_state()); -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLModel::Geometry &iva = tr.is_selected_by_seed_fill() ? iva_seed_fills_data[tr_state] : - tr.get_state() == EnforcerBlockerType::ENFORCER ? iva_enforcers_data : - iva_blockers_data; -#else - GLIndexedVertexArray &iva = tr.is_selected_by_seed_fill() ? m_iva_seed_fills[tr_state] : - tr.get_state() == EnforcerBlockerType::ENFORCER ? m_iva_enforcers : - m_iva_blockers; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - int &cnt = tr.is_selected_by_seed_fill() ? seed_fill_cnt[tr_state] : - tr.get_state() == EnforcerBlockerType::ENFORCER ? enf_cnt : - blc_cnt; - const Vec3f &v0 = m_vertices[tr.verts_idxs[0]].v; - const Vec3f &v1 = m_vertices[tr.verts_idxs[1]].v; - const Vec3f &v2 = m_vertices[tr.verts_idxs[2]].v; - //FIXME the normal may likely be pulled from m_triangle_selectors, but it may not be worth the effort - // or the current implementation may be more cache friendly. - const Vec3f n = (v1 - v0).cross(v2 - v1).normalized(); - // small value used to offset triangles along their normal to avoid z-fighting - const Vec3f offset_n = offset * n; -#if ENABLE_LEGACY_OPENGL_REMOVAL - iva.add_vertex(v0 + offset_n, n); - iva.add_vertex(v1 + offset_n, n); - iva.add_vertex(v2 + offset_n, n); - iva.add_triangle((unsigned int)cnt, (unsigned int)cnt + 1, (unsigned int)cnt + 2); -#else - iva.push_geometry(v0 + offset_n, n); - iva.push_geometry(v1 + offset_n, n); - iva.push_geometry(v2 + offset_n, n); - iva.push_triangle(cnt, cnt + 1, cnt + 2); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - cnt += 3; - } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - if (!iva_enforcers_data.is_empty()) - m_iva_enforcers.init_from(std::move(iva_enforcers_data)); - if (!iva_blockers_data.is_empty()) - m_iva_blockers.init_from(std::move(iva_blockers_data)); - for (size_t i = 0; i < m_iva_seed_fills.size(); ++i) { - if (!iva_seed_fills_data[i].is_empty()) - m_iva_seed_fills[i].init_from(std::move(iva_seed_fills_data[i])); - } - - update_paint_contour(); -#else - for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) - iva->finalize_geometry(true); - - for (auto &iva : m_iva_seed_fills) - iva.finalize_geometry(true); - - m_paint_contour.release_geometry(); - std::vector contour_edges = this->get_seed_fill_contour(); - m_paint_contour.contour_vertices.reserve(contour_edges.size() * 6); - for (const Vec2i &edge : contour_edges) { - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.x()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.y()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.z()); - - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.x()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.y()); - m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.z()); - } - - m_paint_contour.contour_indices.assign(m_paint_contour.contour_vertices.size() / 3, 0); - std::iota(m_paint_contour.contour_indices.begin(), m_paint_contour.contour_indices.end(), 0); - m_paint_contour.contour_indices_size = m_paint_contour.contour_indices.size(); - - m_paint_contour.finalize_geometry(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -} - -#if !ENABLE_LEGACY_OPENGL_REMOVAL -void GLPaintContour::render() const -{ - assert(this->m_contour_VBO_id != 0); - assert(this->m_contour_EBO_id != 0); - - glsafe(::glLineWidth(4.0f)); - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_contour_VBO_id)); - glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), nullptr)); - - glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); - - if (this->contour_indices_size > 0) { - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_contour_EBO_id)); - glsafe(::glDrawElements(GL_LINES, GLsizei(this->contour_indices_size), GL_UNSIGNED_INT, nullptr)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - } - - glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); - - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); -} - -void GLPaintContour::finalize_geometry() -{ - assert(this->m_contour_VBO_id == 0); - assert(this->m_contour_EBO_id == 0); - - if (!this->contour_vertices.empty()) { - glsafe(::glGenBuffers(1, &this->m_contour_VBO_id)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_contour_VBO_id)); - glsafe(::glBufferData(GL_ARRAY_BUFFER, this->contour_vertices.size() * sizeof(float), this->contour_vertices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); - this->contour_vertices.clear(); - } - - if (!this->contour_indices.empty()) { - glsafe(::glGenBuffers(1, &this->m_contour_EBO_id)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_contour_EBO_id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->contour_indices.size() * sizeof(unsigned int), this->contour_indices.data(), GL_STATIC_DRAW)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); - this->contour_indices.clear(); - } -} - -void GLPaintContour::release_geometry() -{ - if (this->m_contour_VBO_id) { - glsafe(::glDeleteBuffers(1, &this->m_contour_VBO_id)); - this->m_contour_VBO_id = 0; - } - if (this->m_contour_EBO_id) { - glsafe(::glDeleteBuffers(1, &this->m_contour_EBO_id)); - this->m_contour_EBO_id = 0; - } - this->clear(); -} -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - -#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 - }; - -#if ENABLE_LEGACY_OPENGL_REMOVAL - for (auto& va : m_varrays) - va.reset(); -#else - for (auto& va : m_varrays) - va.release_geometry(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - std::array cnts; - - ::glScalef(1.01f, 1.01f, 1.01f); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - std::array varrays_data; - for (auto& data : varrays_data) - data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - for (int tr_id=0; tr_idadd_vertex(m_vertices[tr.verts_idxs[i]].v, Vec3f(0.0f, 0.0f, 1.0f)); - } - va->add_uint_triangle((unsigned int)*cnt, (unsigned int)*cnt + 1, (unsigned int)*cnt + 2); -#else - 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); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - *cnt += 3; - } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - for (int i = 0; i < 3; ++i) { - if (!varrays_data[i].is_empty()) - m_varrays[i].init_from(std::move(varrays_data[i])); - } -#else -// for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) -// iva->finalize_geometry(true); -// -// for (auto& iva : m_iva_seed_fills) -// iva.finalize_geometry(true); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); - if (curr_shader != nullptr) - curr_shader->stop_using(); - - GLShaderProgram* shader = wxGetApp().get_shader("flat"); - if (shader != nullptr) { - shader->start_using(); - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - shader->set_uniform("view_model_matrix", camera.get_view_matrix()); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); - for (vtype i : {ORIGINAL, SPLIT, INVALID}) { -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLModel& va = m_varrays[i]; - switch (i) { - case ORIGINAL: va.set_color({ 0.0f, 0.0f, 1.0f, 1.0f }); break; - case SPLIT: va.set_color({ 1.0f, 0.0f, 0.0f, 1.0f }); break; - case INVALID: va.set_color({ 1.0f, 1.0f, 0.0f, 1.0f }); break; - } - va.render(); -#else - 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(); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - } - ::glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); - -#if ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); - } - - if (curr_shader != nullptr) - curr_shader->start_using(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -} -#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG - -#if ENABLE_LEGACY_OPENGL_REMOVAL -void TriangleSelectorGUI::update_paint_contour() -{ - m_paint_contour.reset(); - - GLModel::Geometry init_data; - const std::vector contour_edges = this->get_seed_fill_contour(); - init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; - init_data.reserve_vertices(2 * contour_edges.size()); - init_data.reserve_indices(2 * contour_edges.size()); -#if ENABLE_GL_SHADERS_ATTRIBUTES - init_data.color = ColorRGBA::WHITE(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -// - // vertices + indices - unsigned int vertices_count = 0; - for (const Vec2i& edge : contour_edges) { - init_data.add_vertex(m_vertices[edge(0)].v); - init_data.add_vertex(m_vertices[edge(1)].v); - vertices_count += 2; - init_data.add_line(vertices_count - 2, vertices_count - 1); - } - - if (!init_data.is_empty()) - m_paint_contour.init_from(std::move(init_data)); -} - -#if ENABLE_GL_SHADERS_ATTRIBUTES -void TriangleSelectorGUI::render_paint_contour(const Transform3d& matrix) -#else -void TriangleSelectorGUI::render_paint_contour() -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -{ - auto* curr_shader = wxGetApp().get_current_shader(); - if (curr_shader != nullptr) - curr_shader->stop_using(); - - auto* contour_shader = wxGetApp().get_shader("mm_contour"); - if (contour_shader != nullptr) { - contour_shader->start_using(); - - contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - contour_shader->set_uniform("view_model_matrix", camera.get_view_matrix() * matrix); - contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - m_paint_contour.render(); - contour_shader->stop_using(); - } - - if (curr_shader != nullptr) - curr_shader->start_using(); -} -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -} // namespace Slic3r::GUI +// 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 "slic3r/GUI/OpenGLManager.hpp" +#include "slic3r/Utils/UndoRedo.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/TriangleMesh.hpp" + +#include +#include + +namespace Slic3r::GUI { + +#if ENABLE_LEGACY_OPENGL_REMOVAL +std::shared_ptr GLGizmoPainterBase::s_sphere = nullptr; +#else +std::shared_ptr GLGizmoPainterBase::s_sphere = nullptr; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +{ +} + +GLGizmoPainterBase::~GLGizmoPainterBase() +{ +#if ENABLE_LEGACY_OPENGL_REMOVAL + if (s_sphere != nullptr) + s_sphere.reset(); +#else + if (s_sphere != nullptr && s_sphere->has_VBOs()) + s_sphere->release_geometry(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} + +void GLGizmoPainterBase::data_changed() +{ + if (m_state != On) + return; + + const ModelObject* mo = m_c->selection_info() ? m_c->selection_info()->model_object() : nullptr; + const Selection & selection = m_parent.get_selection(); + 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; + } +} + +GLGizmoPainterBase::ClippingPlaneDataWrapper GLGizmoPainterBase::get_clipping_plane_data() const +{ + ClippingPlaneDataWrapper clp_data_out{{0.f, 0.f, 1.f, FLT_MAX}, {-FLT_MAX, FLT_MAX}}; + // 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) + if (bool clipping_plane_active = m_c->object_clipper()->get_position() != 0.; clipping_plane_active) { + const ClippingPlane *clp = m_c->object_clipper()->get_clipping_plane(); + for (size_t i = 0; i < 3; ++i) + clp_data_out.clp_dataf[i] = -1.f * float(clp->get_data()[i]); + clp_data_out.clp_dataf[3] = float(clp->get_data()[3]); + } + + // z_range is calculated in the same way as in GLCanvas3D::_render_objects(GLVolumeCollection::ERenderType type) + if (m_c->get_canvas()->get_use_clipping_planes()) { + const std::array &clps = m_c->get_canvas()->get_clipping_planes(); + clp_data_out.z_range = {float(-clps[0].get_data()[3]), float(clps[1].get_data()[3])}; + } + + return clp_data_out; +} + +void GLGizmoPainterBase::render_triangles(const Selection& selection) const +{ + auto* shader = wxGetApp().get_shader("gouraud"); + if (! shader) + return; + shader->start_using(); + shader->set_uniform("slope.actived", false); + shader->set_uniform("print_volume.type", 0); + shader->set_uniform("clipping_plane", this->get_clipping_plane_data().clp_dataf); + ScopeGuard guard([shader]() { if (shader) shader->stop_using(); }); + + const ModelObject *mo = m_c->selection_info()->model_object(); + 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)); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("view_model_matrix", view_matrix * trafo_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#else + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixd(trafo_matrix.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + // For printers with multiple extruders, it is necessary to pass trafo_matrix + // to the shader input variable print_box.volume_world_matrix before + // rendering the painted triangles. When this matrix is not set, the + // wrong transformation matrix is used for "Clipping of view". + shader->set_uniform("volume_world_matrix", trafo_matrix); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + m_triangle_selectors[mesh_id]->render(m_imgui, trafo_matrix); +#else + m_triangle_selectors[mesh_id]->render(m_imgui); + + glsafe(::glPopMatrix()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + if (is_left_handed) + glsafe(::glFrontFace(GL_CCW)); + } +} + +void GLGizmoPainterBase::render_cursor() +{ + // 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_tool_type == ToolType::BRUSH) { + if (m_cursor_type == TriangleSelector::SPHERE) + render_cursor_sphere(trafo_matrices[m_rr.mesh_id]); + else if (m_cursor_type == TriangleSelector::CIRCLE) + render_cursor_circle(); + } +} + +void GLGizmoPainterBase::render_cursor_circle() +{ +#if !ENABLE_LEGACY_OPENGL_REMOVAL + const Camera &camera = wxGetApp().plater()->get_camera(); + const float zoom = float(camera.get_zoom()); + const float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + + const Size cnv_size = m_parent.get_canvas_size(); +#if ENABLE_LEGACY_OPENGL_REMOVAL + const float cnv_width = float(cnv_size.get_width()); + const float cnv_height = float(cnv_size.get_height()); + if (cnv_width == 0.0f || cnv_height == 0.0f) + return; + + const float cnv_inv_width = 1.0f / cnv_width; + const float cnv_inv_height = 1.0f / cnv_height; + + const Vec2d center = m_parent.get_local_mouse_position(); +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const float zoom = float(wxGetApp().plater()->get_camera().get_zoom()); + const float radius = m_cursor_radius * zoom; +#else + const float radius = m_cursor_radius * float(wxGetApp().plater()->get_camera().get_zoom()); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES +#else + const float cnv_half_width = 0.5f * float(cnv_size.get_width()); + const float cnv_half_height = 0.5f * float(cnv_size.get_height()); + if (cnv_half_width == 0.0f || cnv_half_height == 0.0f) + return; + const Vec2d mouse_pos(m_parent.get_local_mouse_position().x(), m_parent.get_local_mouse_position().y()); + Vec2d center(mouse_pos.x() - cnv_half_width, cnv_half_height - mouse_pos.y()); + center = center * inv_zoom; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.5f)); +#if !ENABLE_LEGACY_OPENGL_REMOVAL + static const std::array color = { 0.f, 1.f, 0.3f }; + glsafe(::glColor3fv(color.data())); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glDisable(GL_DEPTH_TEST)); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + 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 + const double gui_scale = camera.get_gui_scale(); + glsafe(::glScaled(gui_scale, gui_scale, 1.0)); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + +#if !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES + glsafe(::glPushAttrib(GL_ENABLE_BIT)); + glsafe(::glLineStipple(4, 0xAAAA)); + glsafe(::glEnable(GL_LINE_STIPPLE)); +#endif // !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES + +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (!m_circle.is_initialized() || std::abs(m_old_cursor_radius - radius) > EPSILON) { + m_old_cursor_radius = radius; + m_circle.reset(); +#else + if (!m_circle.is_initialized() || !m_old_center.isApprox(center) || std::abs(m_old_cursor_radius - radius) > EPSILON) { + m_old_cursor_radius = radius; + m_old_center = center; + m_circle.reset(); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + + GLModel::Geometry init_data; +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const unsigned int StepsCount = (unsigned int)(2 * (4 + int(252 * (zoom - 1.0f) / (250.0f - 1.0f)))); + const float StepSize = 2.0f * float(PI) / float(StepsCount); + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P2 }; +#else + static const unsigned int StepsCount = 32; + static const float StepSize = 2.0f * float(PI) / float(StepsCount); + init_data.format = { GLModel::Geometry::EPrimitiveType::LineLoop, GLModel::Geometry::EVertexLayout::P2 }; +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + init_data.color = { 0.0f, 1.0f, 0.3f, 1.0f }; + init_data.reserve_vertices(StepsCount); + init_data.reserve_indices(StepsCount); + + // vertices + indices + for (unsigned int i = 0; i < StepsCount; ++i) { +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (i % 2 != 0) continue; + + const float angle_i = float(i) * StepSize; + const unsigned int j = (i + 1) % StepsCount; + const float angle_j = float(j) * StepSize; + const Vec2d v_i(::cos(angle_i), ::sin(angle_i)); + const Vec2d v_j(::cos(angle_j), ::sin(angle_j)); + init_data.add_vertex(Vec2f(v_i.x(), v_i.y())); + init_data.add_vertex(Vec2f(v_j.x(), v_j.y())); + const size_t vcount = init_data.vertices_count(); + init_data.add_line(vcount - 2, vcount - 1); +#else + const float angle = float(i) * StepSize; + init_data.add_vertex(Vec2f(2.0f * ((center.x() + ::cos(angle) * radius) * cnv_inv_width - 0.5f), + -2.0f * ((center.y() + ::sin(angle) * radius) * cnv_inv_height - 0.5f))); + init_data.add_index(i); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + } + + m_circle.init_from(std::move(init_data)); + } + +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + GLShaderProgram* shader = GUI::wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE + if (shader != nullptr) { + shader->start_using(); +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + const Transform3d view_model_matrix = Geometry::translation_transform(Vec3d(2.0f * (center.x() * cnv_inv_width - 0.5f), -2.0f * (center.y() * cnv_inv_height - 0.5f), 0.0)) * + Geometry::scale_transform(Vec3d(2.0f * radius * cnv_inv_width, 2.0f * radius * cnv_inv_height, 1.0f)); + shader->set_uniform("view_model_matrix", view_model_matrix); +#else + shader->set_uniform("view_model_matrix", Transform3d::Identity()); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + shader->set_uniform("projection_matrix", Transform3d::Identity()); +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = wxGetApp().plater()->get_camera().get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE + m_circle.render(); + shader->stop_using(); + } +#else + ::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()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES + glsafe(::glPopAttrib()); +#endif // !ENABLE_GL_CORE_PROFILE && !ENABLE_OPENGL_ES +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glEnable(GL_DEPTH_TEST)); +} + + +void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const +{ + if (s_sphere == nullptr) { +#if ENABLE_LEGACY_OPENGL_REMOVAL + s_sphere = std::make_shared(); + s_sphere->init_from(its_make_sphere(1.0, double(PI) / 12.0)); +#else + s_sphere = std::make_shared(); + s_sphere->load_its_flat_shading(its_make_sphere(1.0, double(PI) / 12.0)); + s_sphere->finalize_geometry(true); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + } + +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader == nullptr) + return; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_WORLD_COORDINATE + const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_scaling_factor_matrix().inverse(); +#else + const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse(); +#endif // ENABLE_WORLD_COORDINATE + const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed(); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + 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.x(), m_rr.hit.y(), m_rr.hit.z())); + glsafe(::glMultMatrixd(complete_scaling_matrix_inverse.data())); + glsafe(::glScaled(m_cursor_radius, m_cursor_radius, m_cursor_radius)); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + + if (is_left_handed) + glsafe(::glFrontFace(GL_CW)); + + ColorRGBA render_color = { 0.0f, 0.0f, 0.0f, 0.25f }; + if (m_button_down == Button::Left) + render_color = this->get_cursor_sphere_left_button_color(); + else if (m_button_down == Button::Right) + render_color = this->get_cursor_sphere_right_button_color(); +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + Transform3d view_model_matrix = camera.get_view_matrix() * trafo * + Geometry::assemble_transform(m_rr.hit.cast()) * complete_scaling_matrix_inverse * + Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), m_cursor_radius * Vec3d::Ones()); + + shader->set_uniform("view_model_matrix", view_model_matrix); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + assert(s_sphere != nullptr); + s_sphere->set_color(render_color); +#else + glsafe(::glColor4fv(render_color.data())); + + assert(s_sphere != nullptr); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + s_sphere->render(); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->stop_using(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + if (is_left_handed) + glsafe(::glFrontFace(GL_CCW)); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +} + + +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); +} + +// Interpolate points between the previous and current mouse positions, which are then projected onto the object. +// Returned projected mouse positions are grouped by mesh_idx. It may contain multiple std::vector +// with the same mesh_idx, but all items in std::vector always have the same mesh_idx. +std::vector> GLGizmoPainterBase::get_projected_mouse_positions(const Vec2d &mouse_position, const double resolution, const std::vector &trafo_matrices) const +{ + // List of mouse positions that will be used as seeds for painting. + std::vector mouse_positions{mouse_position}; + if (m_last_mouse_click != Vec2d::Zero()) { + // 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 (size_t patches_in_between = size_t((mouse_position - m_last_mouse_click).norm() / resolution); patches_in_between > 0) { + const Vec2d diff = (m_last_mouse_click - mouse_position) / (patches_in_between + 1); + for (size_t patch_idx = 1; patch_idx <= patches_in_between; ++patch_idx) + mouse_positions.emplace_back(mouse_position + patch_idx * diff); + mouse_positions.emplace_back(m_last_mouse_click); + } + } + + const Camera &camera = wxGetApp().plater()->get_camera(); + std::vector mesh_hit_points; + mesh_hit_points.reserve(mouse_positions.size()); + + // In mesh_hit_points only the last item could have mesh_id == -1, any other items mustn't. + for (const Vec2d &mp : mouse_positions) { + update_raycast_cache(mp, camera, trafo_matrices); + mesh_hit_points.push_back({m_rr.hit, m_rr.mesh_id, m_rr.facet}); + if (m_rr.mesh_id == -1) + break; + } + + // Divide mesh_hit_points into groups with the same mesh_idx. It may contain multiple groups with the same mesh_idx. + std::vector> mesh_hit_points_by_mesh; + for (size_t prev_mesh_hit_point = 0, curr_mesh_hit_point = 0; curr_mesh_hit_point < mesh_hit_points.size(); ++curr_mesh_hit_point) { + size_t next_mesh_hit_point = curr_mesh_hit_point + 1; + if (next_mesh_hit_point >= mesh_hit_points.size() || mesh_hit_points[curr_mesh_hit_point].mesh_idx != mesh_hit_points[next_mesh_hit_point].mesh_idx) { + mesh_hit_points_by_mesh.emplace_back(); + mesh_hit_points_by_mesh.back().insert(mesh_hit_points_by_mesh.back().end(), mesh_hit_points.begin() + int(prev_mesh_hit_point), mesh_hit_points.begin() + int(next_mesh_hit_point)); + prev_mesh_hit_point = next_mesh_hit_point; + } + } + + auto on_same_facet = [](std::vector &hit_points) -> bool { + for (const ProjectedMousePosition &mesh_hit_point : hit_points) + if (mesh_hit_point.facet_idx != hit_points.front().facet_idx) + return false; + return true; + }; + + struct Plane + { + Vec3d origin; + Vec3d first_axis; + Vec3d second_axis; + }; + auto find_plane = [](std::vector &hit_points) -> std::optional { + assert(hit_points.size() >= 3); + for (size_t third_idx = 2; third_idx < hit_points.size(); ++third_idx) { + const Vec3d &first_point = hit_points[third_idx - 2].mesh_hit.cast(); + const Vec3d &second_point = hit_points[third_idx - 1].mesh_hit.cast(); + const Vec3d &third_point = hit_points[third_idx].mesh_hit.cast(); + + const Vec3d first_vec = first_point - second_point; + const Vec3d second_vec = third_point - second_point; + + // If three points aren't collinear, then there exists only one plane going through all points. + if (first_vec.cross(second_vec).squaredNorm() > sqr(EPSILON)) { + const Vec3d first_axis_vec_n = first_vec.normalized(); + // Make second_vec perpendicular to first_axis_vec_n using Gram–Schmidt orthogonalization process + const Vec3d second_axis_vec_n = (second_vec - (first_vec.dot(second_vec) / first_vec.dot(first_vec)) * first_vec).normalized(); + return Plane{second_point, first_axis_vec_n, second_axis_vec_n}; + } + } + + return std::nullopt; + }; + + for(std::vector &hit_points : mesh_hit_points_by_mesh) { + assert(!hit_points.empty()); + if (hit_points.back().mesh_idx == -1) + break; + + if (hit_points.size() <= 2) + continue; + + if (on_same_facet(hit_points)) { + hit_points = {hit_points.front(), hit_points.back()}; + } else if (std::optional plane = find_plane(hit_points); plane) { + Polyline polyline; + polyline.points.reserve(hit_points.size()); + // Project hit_points into its plane to simplified them in the next step. + for (auto &hit_point : hit_points) { + const Vec3d &point = hit_point.mesh_hit.cast(); + const double x_cord = plane->first_axis.dot(point - plane->origin); + const double y_cord = plane->second_axis.dot(point - plane->origin); + polyline.points.emplace_back(scale_(x_cord), scale_(y_cord)); + } + + polyline.simplify(scale_(m_cursor_radius) / 10.); + + const int mesh_idx = hit_points.front().mesh_idx; + std::vector new_hit_points; + new_hit_points.reserve(polyline.points.size()); + // Project 2D simplified hit_points beck to 3D. + for (const Point &point : polyline.points) { + const double x_cord = unscale(point.x()); + const double y_cord = unscale(point.y()); + const Vec3d new_hit_point = plane->origin + x_cord * plane->first_axis + y_cord * plane->second_axis; + const int facet_idx = m_c->raycaster()->raycasters()[mesh_idx]->get_closest_facet(new_hit_point.cast()); + new_hit_points.push_back({new_hit_point.cast(), mesh_idx, size_t(facet_idx)}); + } + + hit_points = new_hit_points; + } else { + hit_points = {hit_points.front(), hit_points.back()}; + } + } + + return mesh_hit_points_by_mesh; +} + +// 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) { + if (m_tool_type == ToolType::BRUSH && (m_cursor_type == TriangleSelector::CursorType::SPHERE || m_cursor_type == TriangleSelector::CursorType::CIRCLE)) { + m_cursor_radius = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_cursor_radius - this->get_cursor_radius_step(), this->get_cursor_radius_min()) + : std::min(m_cursor_radius + this->get_cursor_radius_step(), this->get_cursor_radius_max()); + m_parent.set_as_dirty(); + return true; + } else if (m_tool_type == ToolType::SMART_FILL) { + m_smart_fill_angle = action == SLAGizmoEventType::MouseWheelDown ? std::max(m_smart_fill_angle - SmartFillAngleStep, SmartFillAngleMin) + : std::min(m_smart_fill_angle + SmartFillAngleStep, SmartFillAngleMax); + m_parent.set_as_dirty(); + if (m_rr.mesh_id != -1) { + 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()]; +#if ENABLE_WORLD_COORDINATE + const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix_no_offset() * mo->volumes[m_rr.mesh_id]->get_matrix_no_offset(); +#else + const Transform3d trafo_matrix_not_translate = mi->get_transformation().get_matrix(true) * mo->volumes[m_rr.mesh_id]->get_matrix(true); +#endif // ENABLE_WORLD_COORDINATE + const Transform3d trafo_matrix = mi->get_transformation().get_matrix() * mo->volumes[m_rr.mesh_id]->get_matrix(); + m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, this->get_clipping_plane_in_volume_coordinates(trafo_matrix), m_smart_fill_angle, + m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, true); + m_triangle_selectors[m_rr.mesh_id]->request_update_render_data(); + m_seed_fill_last_mesh_id = m_rr.mesh_id; + } + return true; + } + + return false; + } + } + + 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 ? this->get_left_button_state_type() : this->get_right_button_state_type(); + else + new_state = action == SLAGizmoEventType::LeftDown ? this->get_left_button_state_type() : this->get_right_button_state_type(); + } + + 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(); +#if ENABLE_WORLD_COORDINATE + const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); +#else + const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); +#endif // ENABLE_WORLD_COORDINATE + + // Precalculate transformations of individual meshes. + std::vector trafo_matrices; + std::vector trafo_matrices_not_translate; + for (const ModelVolume *mv : mo->volumes) + if (mv->is_model_part()) { + trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); +#if ENABLE_WORLD_COORDINATE + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix_no_offset()); +#else + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); +#endif // ENABLE_WORLD_COORDINATE + } + + std::vector> projected_mouse_positions_by_mesh = get_projected_mouse_positions(mouse_position, 1., trafo_matrices); + m_last_mouse_click = Vec2d::Zero(); // only actual hits should be saved + + for (const std::vector &projected_mouse_positions : projected_mouse_positions_by_mesh) { + assert(!projected_mouse_positions.empty()); + const int mesh_idx = projected_mouse_positions.front().mesh_idx; + const 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 (mesh_idx != -1) + if (m_button_down == Button::None) + m_button_down = ((action == SLAGizmoEventType::LeftDown) ? Button::Left : Button::Right); + + // 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) + if (mesh_idx == -1) + return dragging_while_painting; + + const Transform3d &trafo_matrix = trafo_matrices[mesh_idx]; + const Transform3d &trafo_matrix_not_translate = trafo_matrices_not_translate[mesh_idx]; + + // Calculate direction from camera to the hit (in mesh coords): + Vec3f camera_pos = (trafo_matrix.inverse() * camera.get_position()).cast(); + + assert(mesh_idx < int(m_triangle_selectors.size())); + const TriangleSelector::ClippingPlane &clp = this->get_clipping_plane_in_volume_coordinates(trafo_matrix); + if (m_tool_type == ToolType::SMART_FILL || m_tool_type == ToolType::BUCKET_FILL || (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER)) { + for(const ProjectedMousePosition &projected_mouse_position : projected_mouse_positions) { + assert(projected_mouse_position.mesh_idx == mesh_idx); + const Vec3f mesh_hit = projected_mouse_position.mesh_hit; + const int facet_idx = int(projected_mouse_position.facet_idx); + m_triangle_selectors[mesh_idx]->seed_fill_apply_on_triangles(new_state); + if (m_tool_type == ToolType::SMART_FILL) + m_triangle_selectors[mesh_idx]->seed_fill_select_triangles(mesh_hit, facet_idx, trafo_matrix_not_translate, clp, m_smart_fill_angle, + m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f, true); + else if (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER) + m_triangle_selectors[mesh_idx]->bucket_fill_select_triangles(mesh_hit, facet_idx, clp, false, true); + else if (m_tool_type == ToolType::BUCKET_FILL) + m_triangle_selectors[mesh_idx]->bucket_fill_select_triangles(mesh_hit, facet_idx, clp, true, true); + + m_seed_fill_last_mesh_id = -1; + } + } else if (m_tool_type == ToolType::BRUSH) { + assert(m_cursor_type == TriangleSelector::CursorType::CIRCLE || m_cursor_type == TriangleSelector::CursorType::SPHERE); + + if (projected_mouse_positions.size() == 1) { + const ProjectedMousePosition &first_position = projected_mouse_positions.front(); + std::unique_ptr cursor = TriangleSelector::SinglePointCursor::cursor_factory(first_position.mesh_hit, + camera_pos, m_cursor_radius, + m_cursor_type, trafo_matrix, clp); + m_triangle_selectors[mesh_idx]->select_patch(int(first_position.facet_idx), std::move(cursor), new_state, trafo_matrix_not_translate, + m_triangle_splitting_enabled, m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f); + } else { + for (auto first_position_it = projected_mouse_positions.cbegin(); first_position_it != projected_mouse_positions.cend() - 1; ++first_position_it) { + auto second_position_it = first_position_it + 1; + std::unique_ptr cursor = TriangleSelector::DoublePointCursor::cursor_factory(first_position_it->mesh_hit, second_position_it->mesh_hit, camera_pos, m_cursor_radius, m_cursor_type, trafo_matrix, clp); + m_triangle_selectors[mesh_idx]->select_patch(int(first_position_it->facet_idx), std::move(cursor), new_state, trafo_matrix_not_translate, m_triangle_splitting_enabled, m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f); + } + } + } + + m_triangle_selectors[mesh_idx]->request_update_render_data(); + m_last_mouse_click = mouse_position; + } + + return true; + } + + if (action == SLAGizmoEventType::Moving && (m_tool_type == ToolType::SMART_FILL || m_tool_type == ToolType::BUCKET_FILL || (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER))) { + if (m_triangle_selectors.empty()) + return false; + + 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(); +#if ENABLE_WORLD_COORDINATE + const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix_no_offset(); +#else + const Transform3d instance_trafo_not_translate = mi->get_transformation().get_matrix(true); +#endif // ENABLE_WORLD_COORDINATE + + // Precalculate transformations of individual meshes. + std::vector trafo_matrices; + std::vector trafo_matrices_not_translate; + for (const ModelVolume *mv : mo->volumes) + if (mv->is_model_part()) { + trafo_matrices.emplace_back(instance_trafo * mv->get_matrix()); +#if ENABLE_WORLD_COORDINATE + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate* mv->get_matrix_no_offset()); +#else + trafo_matrices_not_translate.emplace_back(instance_trafo_not_translate * mv->get_matrix(true)); +#endif // ENABLE_WORLD_COORDINATE + } + + // Now "click" into all the prepared points and spill paint around them. + update_raycast_cache(mouse_position, camera, trafo_matrices); + + auto seed_fill_unselect_all = [this]() { + for (auto &triangle_selector : m_triangle_selectors) { + triangle_selector->seed_fill_unselect_all_triangles(); + triangle_selector->request_update_render_data(); + } + }; + + if (m_rr.mesh_id == -1) { + // Clean selected by seed fill for all triangles in all meshes when a mouse isn't pointing on any mesh. + seed_fill_unselect_all(); + m_seed_fill_last_mesh_id = -1; + + // In case we have no valid hit, we can return. + return false; + } + + // The mouse moved from one object's volume to another one. So it is needed to unselect all triangles selected by seed fill. + if(m_rr.mesh_id != m_seed_fill_last_mesh_id) + seed_fill_unselect_all(); + + const Transform3d &trafo_matrix = trafo_matrices[m_rr.mesh_id]; + const Transform3d &trafo_matrix_not_translate = trafo_matrices_not_translate[m_rr.mesh_id]; + + assert(m_rr.mesh_id < int(m_triangle_selectors.size())); + const TriangleSelector::ClippingPlane &clp = this->get_clipping_plane_in_volume_coordinates(trafo_matrix); + if (m_tool_type == ToolType::SMART_FILL) + m_triangle_selectors[m_rr.mesh_id]->seed_fill_select_triangles(m_rr.hit, int(m_rr.facet), trafo_matrix_not_translate, clp, m_smart_fill_angle, + m_paint_on_overhangs_only ? m_highlight_by_angle_threshold_deg : 0.f); + else if (m_tool_type == ToolType::BRUSH && m_cursor_type == TriangleSelector::CursorType::POINTER) + m_triangle_selectors[m_rr.mesh_id]->bucket_fill_select_triangles(m_rr.hit, int(m_rr.facet), clp, false); + else if (m_tool_type == ToolType::BUCKET_FILL) + m_triangle_selectors[m_rr.mesh_id]->bucket_fill_select_triangles(m_rr.hit, int(m_rr.facet), clp, true); + m_triangle_selectors[m_rr.mesh_id]->request_update_render_data(); + m_seed_fill_last_mesh_id = m_rr.mesh_id; + return true; + } + + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::RightUp) + && m_button_down != Button::None) { + // Take snapshot and update ModelVolume data. + wxString action_name = this->handle_snapshot_action_name(shift_down, m_button_down); + Plater::TakeSnapshot snapshot(wxGetApp().plater(), action_name, UndoRedo::SnapshotType::GizmoAction); + update_model_object(); + + m_button_down = Button::None; + m_last_mouse_click = Vec2d::Zero(); + return true; + } + + return false; +} + +bool GLGizmoPainterBase::on_mouse(const wxMouseEvent &mouse_event) +{ + // wxCoord == int --> wx/types.h + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); + + if (mouse_event.Moving()) { + gizmo_event(SLAGizmoEventType::Moving, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false); + return false; + } + + // when control is down we allow scene pan and rotation even when clicking + // over some object + bool control_down = mouse_event.CmdDown(); + bool grabber_contains_mouse = (get_hover_id() != -1); + + const Selection &selection = m_parent.get_selection(); + int selected_object_idx = selection.get_object_idx(); + if (mouse_event.LeftDown()) { + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + // the gizmo got the event and took some action, there is no need + // to do anything more + return true; + } else if (mouse_event.RightDown()){ + if (!control_down && selected_object_idx != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) + // event was taken care of + return true; + } else if (mouse_event.Dragging()) { + if (m_parent.get_move_volume_id() != -1) + // don't allow dragging objects with the Sla gizmo on + return true; + if (!control_down && gizmo_event(SLAGizmoEventType::Dragging, + mouse_pos, mouse_event.ShiftDown(), + mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } + if(control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())) + { + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + return false; + } + } else if (mouse_event.LeftUp()) { + if (!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, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + return true; + } + } else if (mouse_event.RightUp()) { + if (!m_parent.is_mouse_dragging()) { + gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), control_down); + 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() || wxGetApp().get_mode() == comSimple) + 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(); + return std::all_of(list.cbegin(), list.cend(), [&selection](unsigned int idx) { return !selection.get_volume(idx)->is_outside; }); +} + +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_state == Off && m_old_state != Off) { // the gizmo was just turned Off + // we are actually shutting down + on_shutdown(); + 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; +} + +TriangleSelector::ClippingPlane GLGizmoPainterBase::get_clipping_plane_in_volume_coordinates(const Transform3d &trafo) const { + const ::Slic3r::GUI::ClippingPlane *const clipping_plane = m_c->object_clipper()->get_clipping_plane(); + if (clipping_plane == nullptr || !clipping_plane->is_active()) + return {}; + + const Vec3d clp_normal = clipping_plane->get_normal(); + const double clp_offset = clipping_plane->get_offset(); + + const Transform3d trafo_normal = Transform3d(trafo.linear().transpose()); + const Transform3d trafo_inv = trafo.inverse(); + + Vec3d point_on_plane = clp_normal * clp_offset; + Vec3d point_on_plane_transformed = trafo_inv * point_on_plane; + Vec3d normal_transformed = trafo_normal * clp_normal; + auto offset_transformed = float(point_on_plane_transformed.dot(normal_transformed)); + + return TriangleSelector::ClippingPlane({float(normal_transformed.x()), float(normal_transformed.y()), float(normal_transformed.z()), offset_transformed}); +} + +ColorRGBA TriangleSelectorGUI::get_seed_fill_color(const ColorRGBA& base_color) +{ + return saturate(base_color, 0.75f); +} + +#if ENABLE_LEGACY_OPENGL_REMOVAL +void TriangleSelectorGUI::render(ImGuiWrapper* imgui, const Transform3d& matrix) +#else +void TriangleSelectorGUI::render(ImGuiWrapper* imgui) +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +{ + static const ColorRGBA enforcers_color = { 0.47f, 0.47f, 1.0f, 1.0f }; + static const ColorRGBA blockers_color = { 1.0f, 0.44f, 0.44f, 1.0f }; + + if (m_update_render_data) { + update_render_data(); + m_update_render_data = false; + } + + auto* shader = wxGetApp().get_current_shader(); + if (! shader) + return; + + assert(shader->get_name() == "gouraud"); + + for (auto iva : {std::make_pair(&m_iva_enforcers, enforcers_color), + std::make_pair(&m_iva_blockers, blockers_color)}) { +#if ENABLE_LEGACY_OPENGL_REMOVAL + iva.first->set_color(iva.second); + iva.first->render(); +#else + if (iva.first->has_VBOs()) { + shader->set_uniform("uniform_color", iva.second); + iva.first->render(); + } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + } + +#if ENABLE_LEGACY_OPENGL_REMOVAL + for (auto& iva : m_iva_seed_fills) { + size_t color_idx = &iva - &m_iva_seed_fills.front(); + const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : + color_idx == 2 ? blockers_color : + GLVolume::NEUTRAL_COLOR); + iva.set_color(color); + iva.render(); + } +#else + for (auto& iva : m_iva_seed_fills) + if (iva.has_VBOs()) { + size_t color_idx = &iva - &m_iva_seed_fills.front(); + const ColorRGBA& color = TriangleSelectorGUI::get_seed_fill_color(color_idx == 1 ? enforcers_color : + color_idx == 2 ? blockers_color : + GLVolume::NEUTRAL_COLOR); + shader->set_uniform("uniform_color", color); + iva.render(); + } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_LEGACY_OPENGL_REMOVAL + render_paint_contour(matrix); +#else + if (m_paint_contour.has_VBO()) { + ScopeGuard guard_gouraud([shader]() { shader->start_using(); }); + shader->stop_using(); + + auto *contour_shader = wxGetApp().get_shader("mm_contour"); + contour_shader->start_using(); + contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001); + m_paint_contour.render(); + contour_shader->stop_using(); + } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG + if (imgui) + render_debug(imgui); + else + assert(false); // If you want debug output, pass ptr to ImGuiWrapper. +#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG +} + +void TriangleSelectorGUI::update_render_data() +{ + int enf_cnt = 0; + int blc_cnt = 0; + std::vector seed_fill_cnt(m_iva_seed_fills.size(), 0); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) { + iva->reset(); + } + + for (auto& iva : m_iva_seed_fills) { + iva.reset(); + } + + GLModel::Geometry iva_enforcers_data; + iva_enforcers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + GLModel::Geometry iva_blockers_data; + iva_blockers_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; + std::array iva_seed_fills_data; + for (auto& data : iva_seed_fills_data) + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3 }; +#else + for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) + iva->release_geometry(); + + for (auto &iva : m_iva_seed_fills) + iva.release_geometry(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + // small value used to offset triangles along their normal to avoid z-fighting + static const float offset = 0.001f; + + for (const Triangle &tr : m_triangles) { + if (!tr.valid() || tr.is_split() || (tr.get_state() == EnforcerBlockerType::NONE && !tr.is_selected_by_seed_fill())) + continue; + + int tr_state = int(tr.get_state()); +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLModel::Geometry &iva = tr.is_selected_by_seed_fill() ? iva_seed_fills_data[tr_state] : + tr.get_state() == EnforcerBlockerType::ENFORCER ? iva_enforcers_data : + iva_blockers_data; +#else + GLIndexedVertexArray &iva = tr.is_selected_by_seed_fill() ? m_iva_seed_fills[tr_state] : + tr.get_state() == EnforcerBlockerType::ENFORCER ? m_iva_enforcers : + m_iva_blockers; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + int &cnt = tr.is_selected_by_seed_fill() ? seed_fill_cnt[tr_state] : + tr.get_state() == EnforcerBlockerType::ENFORCER ? enf_cnt : + blc_cnt; + const Vec3f &v0 = m_vertices[tr.verts_idxs[0]].v; + const Vec3f &v1 = m_vertices[tr.verts_idxs[1]].v; + const Vec3f &v2 = m_vertices[tr.verts_idxs[2]].v; + //FIXME the normal may likely be pulled from m_triangle_selectors, but it may not be worth the effort + // or the current implementation may be more cache friendly. + const Vec3f n = (v1 - v0).cross(v2 - v1).normalized(); + // small value used to offset triangles along their normal to avoid z-fighting + const Vec3f offset_n = offset * n; +#if ENABLE_LEGACY_OPENGL_REMOVAL + iva.add_vertex(v0 + offset_n, n); + iva.add_vertex(v1 + offset_n, n); + iva.add_vertex(v2 + offset_n, n); + iva.add_triangle((unsigned int)cnt, (unsigned int)cnt + 1, (unsigned int)cnt + 2); +#else + iva.push_geometry(v0 + offset_n, n); + iva.push_geometry(v1 + offset_n, n); + iva.push_geometry(v2 + offset_n, n); + iva.push_triangle(cnt, cnt + 1, cnt + 2); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + cnt += 3; + } + +#if ENABLE_LEGACY_OPENGL_REMOVAL + if (!iva_enforcers_data.is_empty()) + m_iva_enforcers.init_from(std::move(iva_enforcers_data)); + if (!iva_blockers_data.is_empty()) + m_iva_blockers.init_from(std::move(iva_blockers_data)); + for (size_t i = 0; i < m_iva_seed_fills.size(); ++i) { + if (!iva_seed_fills_data[i].is_empty()) + m_iva_seed_fills[i].init_from(std::move(iva_seed_fills_data[i])); + } + + update_paint_contour(); +#else + for (auto *iva : {&m_iva_enforcers, &m_iva_blockers}) + iva->finalize_geometry(true); + + for (auto &iva : m_iva_seed_fills) + iva.finalize_geometry(true); + + m_paint_contour.release_geometry(); + std::vector contour_edges = this->get_seed_fill_contour(); + m_paint_contour.contour_vertices.reserve(contour_edges.size() * 6); + for (const Vec2i &edge : contour_edges) { + m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.x()); + m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.y()); + m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(0)].v.z()); + + m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.x()); + m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.y()); + m_paint_contour.contour_vertices.emplace_back(m_vertices[edge(1)].v.z()); + } + + m_paint_contour.contour_indices.assign(m_paint_contour.contour_vertices.size() / 3, 0); + std::iota(m_paint_contour.contour_indices.begin(), m_paint_contour.contour_indices.end(), 0); + m_paint_contour.contour_indices_size = m_paint_contour.contour_indices.size(); + + m_paint_contour.finalize_geometry(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} + +#if !ENABLE_LEGACY_OPENGL_REMOVAL +void GLPaintContour::render() const +{ + assert(this->m_contour_VBO_id != 0); + assert(this->m_contour_EBO_id != 0); + + glsafe(::glLineWidth(4.0f)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_contour_VBO_id)); + glsafe(::glVertexPointer(3, GL_FLOAT, 3 * sizeof(float), nullptr)); + + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + + if (this->contour_indices_size > 0) { + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_contour_EBO_id)); + glsafe(::glDrawElements(GL_LINES, GLsizei(this->contour_indices_size), GL_UNSIGNED_INT, nullptr)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +} + +void GLPaintContour::finalize_geometry() +{ + assert(this->m_contour_VBO_id == 0); + assert(this->m_contour_EBO_id == 0); + + if (!this->contour_vertices.empty()) { + glsafe(::glGenBuffers(1, &this->m_contour_VBO_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, this->m_contour_VBO_id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, this->contour_vertices.size() * sizeof(float), this->contour_vertices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + this->contour_vertices.clear(); + } + + if (!this->contour_indices.empty()) { + glsafe(::glGenBuffers(1, &this->m_contour_EBO_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->m_contour_EBO_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->contour_indices.size() * sizeof(unsigned int), this->contour_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + this->contour_indices.clear(); + } +} + +void GLPaintContour::release_geometry() +{ + if (this->m_contour_VBO_id) { + glsafe(::glDeleteBuffers(1, &this->m_contour_VBO_id)); + this->m_contour_VBO_id = 0; + } + if (this->m_contour_EBO_id) { + glsafe(::glDeleteBuffers(1, &this->m_contour_EBO_id)); + this->m_contour_EBO_id = 0; + } + this->clear(); +} +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + +#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 + }; + +#if ENABLE_LEGACY_OPENGL_REMOVAL + for (auto& va : m_varrays) + va.reset(); +#else + for (auto& va : m_varrays) + va.release_geometry(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + std::array cnts; + + ::glScalef(1.01f, 1.01f, 1.01f); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + std::array varrays_data; + for (auto& data : varrays_data) + data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3, GLModel::Geometry::EIndexType::UINT }; +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + for (int tr_id=0; tr_idadd_vertex(m_vertices[tr.verts_idxs[i]].v, Vec3f(0.0f, 0.0f, 1.0f)); + } + va->add_uint_triangle((unsigned int)*cnt, (unsigned int)*cnt + 1, (unsigned int)*cnt + 2); +#else + 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); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + *cnt += 3; + } + +#if ENABLE_LEGACY_OPENGL_REMOVAL + for (int i = 0; i < 3; ++i) { + if (!varrays_data[i].is_empty()) + m_varrays[i].init_from(std::move(varrays_data[i])); + } +#else +// for (auto* iva : { &m_iva_enforcers, &m_iva_blockers }) +// iva->finalize_geometry(true); +// +// for (auto& iva : m_iva_seed_fills) +// iva.finalize_geometry(true); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + if (shader != nullptr) { + shader->start_using(); + + const Camera& camera = wxGetApp().plater()->get_camera(); + shader->set_uniform("view_model_matrix", camera.get_view_matrix()); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); + for (vtype i : {ORIGINAL, SPLIT, INVALID}) { +#if ENABLE_LEGACY_OPENGL_REMOVAL + GLModel& va = m_varrays[i]; + switch (i) { + case ORIGINAL: va.set_color({ 0.0f, 0.0f, 1.0f, 1.0f }); break; + case SPLIT: va.set_color({ 1.0f, 0.0f, 0.0f, 1.0f }); break; + case INVALID: va.set_color({ 1.0f, 1.0f, 0.0f, 1.0f }); break; + } + va.render(); +#else + 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(); + } +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + } + ::glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + shader->stop_using(); + } + + if (curr_shader != nullptr) + curr_shader->start_using(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} +#endif // PRUSASLICER_TRIANGLE_SELECTOR_DEBUG + +#if ENABLE_LEGACY_OPENGL_REMOVAL +void TriangleSelectorGUI::update_paint_contour() +{ + m_paint_contour.reset(); + + GLModel::Geometry init_data; + const std::vector contour_edges = this->get_seed_fill_contour(); + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.reserve_vertices(2 * contour_edges.size()); + init_data.reserve_indices(2 * contour_edges.size()); + init_data.color = ColorRGBA::WHITE(); + + // vertices + indices + unsigned int vertices_count = 0; + for (const Vec2i& edge : contour_edges) { + init_data.add_vertex(m_vertices[edge(0)].v); + init_data.add_vertex(m_vertices[edge(1)].v); + vertices_count += 2; + init_data.add_line(vertices_count - 2, vertices_count - 1); + } + + if (!init_data.is_empty()) + m_paint_contour.init_from(std::move(init_data)); +} + +void TriangleSelectorGUI::render_paint_contour(const Transform3d& matrix) +{ + auto* curr_shader = wxGetApp().get_current_shader(); + if (curr_shader != nullptr) + curr_shader->stop_using(); + + auto* contour_shader = wxGetApp().get_shader("mm_contour"); + if (contour_shader != nullptr) { + contour_shader->start_using(); + + contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001); + const Camera& camera = wxGetApp().plater()->get_camera(); + contour_shader->set_uniform("view_model_matrix", camera.get_view_matrix() * matrix); + contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + m_paint_contour.render(); + contour_shader->stop_using(); + } + + if (curr_shader != nullptr) + curr_shader->start_using(); +} +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + +} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp index 64f5317937..04f24b20d3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp @@ -77,7 +77,7 @@ public: : TriangleSelector(mesh) {} virtual ~TriangleSelectorGUI() = default; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL virtual void render(ImGuiWrapper* imgui, const Transform3d& matrix); void render(const Transform3d& matrix) { this->render(nullptr, matrix); } #else @@ -85,7 +85,7 @@ public: // to be already set. virtual void render(ImGuiWrapper *imgui); void render() { this->render(nullptr); } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void request_update_render_data() { m_update_render_data = true; } @@ -119,14 +119,10 @@ private: protected: #if ENABLE_LEGACY_OPENGL_REMOVAL - GLModel m_paint_contour; + GLModel m_paint_contour; void update_paint_contour(); -#if ENABLE_GL_SHADERS_ATTRIBUTES void render_paint_contour(const Transform3d& matrix); -#else - void render_paint_contour(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #else GLPaintContour m_paint_contour; #endif // ENABLE_LEGACY_OPENGL_REMOVAL @@ -142,7 +138,10 @@ private: ObjectID m_old_mo_id; size_t m_old_volumes_size = 0; void on_render() override {} +#if !ENABLE_RAYCAST_PICKING void on_render_for_picking() override {} +#endif // !ENABLE_RAYCAST_PICKING + public: GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); ~GLGizmoPainterBase() override; @@ -214,7 +213,9 @@ protected: #if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_circle; +#if !ENABLE_GL_CORE_PROFILE Vec2d m_old_center{ Vec2d::Zero() }; +#endif // !ENABLE_GL_CORE_PROFILE float m_old_cursor_radius{ 0.0f }; #endif // ENABLE_LEGACY_OPENGL_REMOVAL diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp index 886b2be7a4..bf313dce7d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp @@ -94,9 +94,7 @@ void GLGizmoRotate::disable_grabber() { m_grabbers[0].enabled = false; } bool GLGizmoRotate::on_init() { m_grabbers.push_back(Grabber()); -#if ENABLE_GIZMO_GRABBER_REFACTOR m_grabbers.back().extensions = (GLGizmoBase::EGrabberExtension)(int(GLGizmoBase::EGrabberExtension::PosY) | int(GLGizmoBase::EGrabberExtension::NegY)); -#endif // ENABLE_GIZMO_GRABBER_REFACTOR return true; } @@ -156,11 +154,6 @@ void GLGizmoRotate::on_render() if (!m_grabbers.front().enabled) return; -#if !ENABLE_GIZMO_GRABBER_REFACTOR - if (!m_cone.is_initialized()) - m_cone.init_from(its_make_cone(1.0, 1.0, double(PI) / 12.0)); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR - const Selection& selection = m_parent.get_selection(); #if !ENABLE_WORLD_COORDINATE const BoundingBoxf3& box = selection.get_bounding_box(); @@ -185,30 +178,41 @@ void GLGizmoRotate::on_render() glsafe(::glEnable(GL_DEPTH_TEST)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL m_grabbers.front().matrix = local_transform(selection); #else glsafe(::glPushMatrix()); transform_to_local(selection); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); #if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); const Transform3d view_model_matrix = camera.get_view_matrix() * m_grabbers.front().matrix; shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE const bool radius_changed = std::abs(m_old_radius - m_radius) > EPSILON; m_old_radius = m_radius; - ColorRGBA color((m_hover_id != -1) ? m_drag_color : m_highlight_color); + const ColorRGBA color = (m_hover_id != -1) ? m_drag_color : m_highlight_color; render_circle(color, radius_changed); if (m_hover_id != -1) { const bool hover_radius_changed = std::abs(m_old_hover_radius - m_radius) > EPSILON; @@ -242,51 +246,41 @@ void GLGizmoRotate::on_render() #if ENABLE_WORLD_COORDINATE render_grabber(m_bounding_box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - render_grabber_extension(m_bounding_box, false); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #else render_grabber(box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - render_grabber_extension(box, false); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #endif // ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } +#if !ENABLE_RAYCAST_PICKING void GLGizmoRotate::on_render_for_picking() { const Selection& selection = m_parent.get_selection(); glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL m_grabbers.front().matrix = local_transform(selection); #else glsafe(::glPushMatrix()); transform_to_local(selection); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WORLD_COORDINATE render_grabbers_for_picking(m_bounding_box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - render_grabber_extension(m_bounding_box, true); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #else const BoundingBoxf3& box = selection.get_bounding_box(); render_grabbers_for_picking(box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - render_grabber_extension(box, true); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #endif // ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } +#endif // !ENABLE_RAYCAST_PICKING #if ENABLE_WORLD_COORDINATE void GLGizmoRotate::init_data_from_selection(const Selection& selection) @@ -655,84 +649,7 @@ void GLGizmoRotate::render_grabber(const BoundingBoxf3& box) render_grabbers(box); } -#if !ENABLE_GIZMO_GRABBER_REFACTOR -void GLGizmoRotate::render_grabber_extension(const BoundingBoxf3& box, bool picking) -{ - const float mean_size = float((box.size().x() + box.size().y() + box.size().z()) / 3.0); - const double size = m_dragging ? double(m_grabbers.front().get_dragging_half_size(mean_size)) : double(m_grabbers.front().get_half_size(mean_size)); - #if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); - if (shader == nullptr) - return; - - m_cone.set_color((!picking && m_hover_id != -1) ? complementary(m_grabbers.front().color) : m_grabbers.front().color); - - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); -#else - GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); - if (shader == nullptr) - return; - - m_cone.set_color(-1, (!picking && m_hover_id != -1) ? complementary(m_grabbers.front().color) : m_grabbers.front().color); - if (!picking) { - shader->start_using(); - shader->set_uniform("emission_factor", 0.1f); - } -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - const Vec3d& center = m_grabbers.front().center; - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d& view_matrix = camera.get_view_matrix(); - shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - - Transform3d view_model_matrix = view_matrix * m_grabbers.front().matrix * - Geometry::assemble_transform(center, Vec3d(0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_cone.render(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - view_model_matrix = view_matrix * m_grabbers.front().matrix * - Geometry::assemble_transform(center, Vec3d(-0.5 * PI, 0.0, m_angle)) * - Geometry::assemble_transform(2.0 * size * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(0.75 * size, 0.75 * size, 3.0 * size)); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glPopMatrix()); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(center.x(), center.y(), center.z())); - glsafe(::glRotated(Geometry::rad2deg(m_angle), 0.0, 0.0, 1.0)); - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); - glsafe(::glTranslated(0.0, 0.0, 2.0 * size)); - glsafe(::glScaled(0.75 * size, 0.75 * size, 3.0 * size)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_cone.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - -#if !ENABLE_LEGACY_OPENGL_REMOVAL - if (! picking) -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - shader->stop_using(); -} -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR - -#if ENABLE_GL_SHADERS_ATTRIBUTES Transform3d GLGizmoRotate::local_transform(const Selection& selection) const { Transform3d ret; @@ -810,7 +727,7 @@ void GLGizmoRotate::transform_to_local(const Selection& selection) const } } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WORLD_COORDINATE Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray) const @@ -852,7 +769,21 @@ Vec3d GLGizmoRotate::mouse_position_in_local_plane(const Linef3& mouse_ray, cons #endif // ENABLE_WORLD_COORDINATE m.translate(-m_center); - return transform(mouse_ray, m).intersect_plane(0.0); + + const Linef3 local_mouse_ray = transform(mouse_ray, m); + if (std::abs(local_mouse_ray.vector().dot(Vec3d::UnitZ())) < EPSILON) { + // if the ray is parallel to the plane containing the circle + if (std::abs(local_mouse_ray.vector().dot(Vec3d::UnitY())) > 1.0 - EPSILON) + // if the ray is parallel to grabber direction + return Vec3d::UnitX(); + else { + const Vec3d world_pos = (local_mouse_ray.a.x() >= 0.0) ? mouse_ray.a - m_center : mouse_ray.b - m_center; + m.translate(m_center); + return m * world_pos; + } + } + else + return local_mouse_ray.intersect_plane(0.0); } GLGizmoRotate3D::GLGizmoRotate3D(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) @@ -972,6 +903,25 @@ void GLGizmoRotate3D::on_render() m_gizmos[Z].render(); } +#if ENABLE_RAYCAST_PICKING +void GLGizmoRotate3D::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); + for (GLGizmoRotate& g : m_gizmos) { + g.register_raycasters_for_picking(); + } +} + +void GLGizmoRotate3D::on_unregister_raycasters_for_picking() +{ + for (GLGizmoRotate& g : m_gizmos) { + g.unregister_raycasters_for_picking(); + } + m_parent.set_raycaster_gizmos_on_top(false); +} +#endif // ENABLE_RAYCAST_PICKING + GLGizmoRotate3D::RotoptimzeWindow::RotoptimzeWindow(ImGuiWrapper * imgui, State & state, const Alignment &alignment) diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index a12796b0ba..eb957e08f2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -6,6 +6,7 @@ namespace Slic3r { namespace GUI { class Selection; + class GLGizmoRotate : public GLGizmoBase { static const float Offset; @@ -39,9 +40,6 @@ private: Transform3d m_orient_matrix{ Transform3d::Identity() }; #endif // ENABLE_WORLD_COORDINATE -#if !ENABLE_GIZMO_GRABBER_REFACTOR - GLModel m_cone; -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR #if ENABLE_LEGACY_OPENGL_REMOVAL GLModel m_circle; GLModel m_scale; @@ -89,13 +87,16 @@ public: /// Return True when use the information otherwise False. bool on_mouse(const wxMouseEvent &mouse_event) override; void dragging(const UpdateData &data); + protected: bool on_init() override; std::string on_get_name() const override { return ""; } void on_start_dragging() override; void on_dragging(const UpdateData &data) override; void on_render() override; +#if !ENABLE_RAYCAST_PICKING void on_render_for_picking() override; +#endif // !ENABLE_RAYCAST_PICKING private: #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -113,15 +114,12 @@ private: void render_angle() const; #endif // ENABLE_LEGACY_OPENGL_REMOVAL void render_grabber(const BoundingBoxf3& box); -#if !ENABLE_GIZMO_GRABBER_REFACTOR - void render_grabber_extension(const BoundingBoxf3& box, bool picking); -#endif // !ENABLE_GIZMO_GRABBER_REFACTOR -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL Transform3d local_transform(const Selection& selection) const; #else void transform_to_local(const Selection& selection) const; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // returns the intersection of the mouse ray with the plane perpendicular to the gizmo axis, in local coordinate #if ENABLE_WORLD_COORDINATE @@ -187,11 +185,16 @@ protected: void on_dragging(const UpdateData &data) override; void on_render() override; +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else void on_render_for_picking() override { for (GLGizmoRotate& g : m_gizmos) { g.render_for_picking(); } } +#endif // ENABLE_RAYCAST_PICKING void on_render_input_window(float x, float y, float bottom_limit) override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index fd08152076..c2700df443 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -5,9 +5,9 @@ #if ENABLE_WORLD_COORDINATE #include "slic3r/GUI/GUI_ObjectManipulation.hpp" #endif // ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #include @@ -367,9 +367,13 @@ void GLGizmoScale3D::on_render() } #endif // ENABLE_WORLD_COORDINATE - glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth((m_hover_id != -1) ? 2.0f : 1.5f)); + #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Transform3d base_matrix = local_transform(selection); for (int i = 0; i < 10; ++i) { m_grabbers[i].matrix = base_matrix; @@ -377,7 +381,7 @@ void GLGizmoScale3D::on_render() #else glsafe(::glPushMatrix()); transform_to_local(selection); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL const float grabber_mean_size = (float)((m_bounding_box.size().x() + m_bounding_box.size().y() + m_bounding_box.size().z()) / 3.0); #else @@ -388,10 +392,13 @@ void GLGizmoScale3D::on_render() if (m_hover_id == -1) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); @@ -399,7 +406,12 @@ void GLGizmoScale3D::on_render() shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE if (m_grabbers[0].enabled && m_grabbers[1].enabled) render_grabbers_connection(0, 1, m_grabbers[0].color); if (m_grabbers[2].enabled && m_grabbers[3].enabled) @@ -439,10 +451,13 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 0 || m_hover_id == 1) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); @@ -450,7 +465,12 @@ void GLGizmoScale3D::on_render() shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE render_grabbers_connection(0, 1, m_grabbers[0].color); shader->stop_using(); } @@ -476,10 +496,13 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 2 || m_hover_id == 3) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); @@ -487,7 +510,12 @@ void GLGizmoScale3D::on_render() shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE render_grabbers_connection(2, 3, m_grabbers[2].color); shader->stop_using(); } @@ -513,10 +541,13 @@ void GLGizmoScale3D::on_render() else if (m_hover_id == 4 || m_hover_id == 5) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); @@ -524,7 +555,12 @@ void GLGizmoScale3D::on_render() shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE render_grabbers_connection(4, 5, m_grabbers[4].color); shader->stop_using(); } @@ -550,10 +586,13 @@ void GLGizmoScale3D::on_render() else if (m_hover_id >= 6) { #if ENABLE_LEGACY_OPENGL_REMOVAL // draw connections +#if ENABLE_GL_CORE_PROFILE + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * base_matrix); @@ -561,7 +600,12 @@ void GLGizmoScale3D::on_render() shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 0.25f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE render_grabbers_connection(6, 7, m_drag_color); render_grabbers_connection(7, 8, m_drag_color); render_grabbers_connection(8, 9, m_drag_color); @@ -593,17 +637,29 @@ void GLGizmoScale3D::on_render() } #if ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE } +#if ENABLE_RAYCAST_PICKING +void GLGizmoScale3D::on_register_raycasters_for_picking() +{ + // the gizmo grabbers are rendered on top of the scene, so the raytraced picker should take it into account + m_parent.set_raycaster_gizmos_on_top(true); +} + +void GLGizmoScale3D::on_unregister_raycasters_for_picking() +{ + m_parent.set_raycaster_gizmos_on_top(false); +} +#else void GLGizmoScale3D::on_render_for_picking() { glsafe(::glDisable(GL_DEPTH_TEST)); #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Transform3d base_matrix = local_transform(m_parent.get_selection()); for (int i = 0; i < 10; ++i) { m_grabbers[i].matrix = base_matrix; @@ -611,15 +667,16 @@ void GLGizmoScale3D::on_render_for_picking() #else glsafe(::glPushMatrix()); transform_to_local(m_parent.get_selection()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL render_grabbers_for_picking(m_bounding_box); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #else render_grabbers_for_picking(m_parent.get_selection().get_bounding_box()); #endif // ENABLE_WORLD_COORDINATE } +#endif // !ENABLE_RAYCAST_PICKING #if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2, const ColorRGBA& color) @@ -844,7 +901,7 @@ double GLGizmoScale3D::calc_ratio(const UpdateData& data) const } #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL Transform3d GLGizmoScale3D::local_transform(const Selection& selection) const { Transform3d ret = Geometry::assemble_transform(m_center); @@ -869,7 +926,7 @@ void GLGizmoScale3D::transform_to_local(const Selection& selection) const glsafe(::glMultMatrixd(orient_matrix.data())); } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE } // namespace GUI diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index eb095b9541..0b9ae702d6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp @@ -93,7 +93,12 @@ protected: virtual void on_stop_dragging() override; virtual void on_dragging(const UpdateData& data) override; virtual void on_render() override; +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else virtual void on_render_for_picking() override; +#endif // ENABLE_RAYCAST_PICKING private: #if ENABLE_LEGACY_OPENGL_REMOVAL @@ -107,11 +112,11 @@ private: double calc_ratio(const UpdateData& data) const; #if ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL Transform3d local_transform(const Selection& selection) const; #else void transform_to_local(const Selection& selection) const; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp index 5f6cd7a95f..418f180de0 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp @@ -110,8 +110,7 @@ void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit) window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_sphere + cursor_type_radio_circle); 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); + m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, caption); ImGui::SameLine(caption_max); m_imgui->text(text); }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp index 0768f789a6..a127369532 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.cpp @@ -696,7 +696,30 @@ void GLGizmoSimplify::update_model(const State::Data &data) auto color = glmodel.get_color(); // when not reset it keeps old shape glmodel.reset(); +#if ENABLE_OPENGL_ES + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Triangles, GLModel::Geometry::EVertexLayout::P3N3E3 }; + init_data.reserve_vertices(3 * its.indices.size()); + init_data.reserve_indices(3 * its.indices.size()); + + // vertices + indices + std::array barycentric_coords = { Vec3f::UnitX(), Vec3f::UnitY(), Vec3f::UnitZ() }; + unsigned int vertices_counter = 0; + for (uint32_t i = 0; i < its.indices.size(); ++i) { + const stl_triangle_vertex_indices face = its.indices[i]; + const stl_vertex vertex[3] = { its.vertices[face[0]], its.vertices[face[1]], its.vertices[face[2]] }; + const stl_vertex n = face_normal_normalized(vertex); + for (size_t j = 0; j < 3; ++j) { + init_data.add_vertex(vertex[j], n, barycentric_coords[j]); + } + vertices_counter += 3; + init_data.add_triangle(vertices_counter - 3, vertices_counter - 2, vertices_counter - 1); + } + + glmodel.init_from(std::move(init_data)); +#else glmodel.init_from(its); +#endif // ENABLE_OPENGL_ES #if ENABLE_LEGACY_OPENGL_REMOVAL glmodel.set_color(color); #else @@ -736,47 +759,69 @@ void GLGizmoSimplify::on_render() GLModel &glmodel = it->second; const Transform3d trafo_matrix = selected_volume->world_matrix(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo_matrix.data())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL auto* gouraud_shader = wxGetApp().get_shader("gouraud_light"); +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + bool depth_test_enabled = ::glIsEnabled(GL_DEPTH_TEST); +#else glsafe(::glPushAttrib(GL_DEPTH_TEST)); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES glsafe(::glEnable(GL_DEPTH_TEST)); gouraud_shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d view_model_matrix = camera.get_view_matrix() * trafo_matrix; + const Transform3d& view_matrix = camera.get_view_matrix(); + const Transform3d view_model_matrix = view_matrix * trafo_matrix; gouraud_shader->set_uniform("view_model_matrix", view_model_matrix); gouraud_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); - gouraud_shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * trafo_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + gouraud_shader->set_uniform("view_normal_matrix", view_normal_matrix); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL glmodel.render(); gouraud_shader->stop_using(); if (m_show_wireframe) { +#if ENABLE_OPENGL_ES + auto* contour_shader = wxGetApp().get_shader("wireframe"); +#else auto *contour_shader = wxGetApp().get_shader("mm_contour"); +#endif // ENABLE_OPENGL_ES contour_shader->start_using(); contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL contour_shader->set_uniform("view_model_matrix", view_model_matrix); contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); const ColorRGBA color = glmodel.get_color(); glmodel.set_color(ColorRGBA::WHITE()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glLineWidth(1.0f)); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) +#endif // ENABLE_GL_CORE_PROFILE + glsafe(::glLineWidth(1.0f)); +#if !ENABLE_OPENGL_ES glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)); +#endif // !ENABLE_OPENGL_ES glmodel.render(); +#if !ENABLE_OPENGL_ES glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_OPENGL_ES +#if ENABLE_LEGACY_OPENGL_REMOVAL glmodel.set_color(color); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL contour_shader->stop_using(); } +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (depth_test_enabled) + glsafe(::glEnable(GL_DEPTH_TEST)); +#else glsafe(::glPopAttrib()); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } } diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp index 03c51c50b4..8317b45d71 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSimplify.hpp @@ -38,7 +38,9 @@ protected: // must implement virtual bool on_init() override { return true;}; virtual void on_render() override; - virtual void on_render_for_picking() override{}; +#if !ENABLE_RAYCAST_PICKING + virtual void on_render_for_picking() override{}; +#endif // !ENABLE_RAYCAST_PICKING CommonGizmosDataID on_get_requirements() const override; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index edae75b80f..026fae17b6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -1,1374 +1,1539 @@ -// 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/Camera.hpp" -#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" -#include "slic3r/GUI/MainFrame.hpp" -#include "slic3r/Utils/UndoRedo.hpp" - -#include - -#include -#include -#include - -#include "slic3r/GUI/GUI_App.hpp" -#include "slic3r/GUI/GUI.hpp" -#include "slic3r/GUI/GUI_ObjectSettings.hpp" -#include "slic3r/GUI/GUI_ObjectList.hpp" -#include "slic3r/GUI/Plater.hpp" -#include "slic3r/GUI/NotificationManager.hpp" -#include "slic3r/GUI/MsgDialog.hpp" -#include "libslic3r/PresetBundle.hpp" -#include "libslic3r/SLAPrint.hpp" - - -namespace Slic3r { -namespace GUI { - -GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) - : GLGizmoBase(parent, icon_filename, sprite_id) -{} - -bool GLGizmoSlaSupports::on_init() -{ - m_shortcut_key = WXK_CONTROL_L; - - m_desc["head_diameter"] = _L("Head diameter") + ": "; - m_desc["lock_supports"] = _L("Lock supports under new islands"); - m_desc["remove_selected"] = _L("Remove selected points"); - m_desc["remove_all"] = _L("Remove all points"); - m_desc["apply_changes"] = _L("Apply changes"); - m_desc["discard_changes"] = _L("Discard changes"); - m_desc["minimal_distance"] = _L("Minimal points distance") + ": "; - m_desc["points_density"] = _L("Support points density") + ": "; - m_desc["auto_generate"] = _L("Auto-generate points"); - m_desc["manual_editing"] = _L("Manual editing"); - m_desc["clipping_of_view"] = _L("Clipping of view")+ ": "; - m_desc["reset_direction"] = _L("Reset direction"); - - m_cone.init_from(its_make_cone(1., 1., 2 * PI / 24)); - m_cylinder.init_from(its_make_cylinder(1., 1., 2 * PI / 24.)); - m_sphere.init_from(its_make_sphere(1., (2 * M_PI) / 24.)); - - return true; -} - -void GLGizmoSlaSupports::data_changed() -{ - 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 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(); - } -} - - - -void GLGizmoSlaSupports::on_render() -{ - if (!m_cone.is_initialized()) - m_cone.init_from(its_make_cone(1.0, 1.0, double(PI) / 12.0)); - if (!m_sphere.is_initialized()) - m_sphere.init_from(its_make_sphere(1.0, double(PI) / 12.0)); - if (!m_cylinder.is_initialized()) - m_cylinder.init_from(its_make_cylinder(1.0, 1.0, double(PI) / 12.0)); - - ModelObject* mo = m_c->selection_info()->model_object(); - const Selection& selection = m_parent.get_selection(); - - // If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off - if (m_state == On - && (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; - } - - glsafe(::glEnable(GL_BLEND)); - glsafe(::glEnable(GL_DEPTH_TEST)); - - if (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 GLGizmoSlaSupports::on_render_for_picking() -{ - const Selection& selection = m_parent.get_selection(); - //glsafe(::glEnable(GL_DEPTH_TEST)); - render_points(selection, true); -} - -void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) -{ - const size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); - - const bool has_points = (cache_size != 0); - const bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh() - && ! m_c->selection_info()->model_object()->sla_drain_holes.empty()); - - if (! has_points && ! has_holes) - return; - -#if ENABLE_LEGACY_OPENGL_REMOVAL - GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); - if (shader == nullptr) - return; - - shader->start_using(); - ScopeGuard guard([shader]() { shader->stop_using(); }); -#else - GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); - if (shader != nullptr) - shader->start_using(); - ScopeGuard guard([shader]() { - if (shader != nullptr) - shader->stop_using(); - }); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - - const GLVolume* vol = selection.get_first_volume(); - Geometry::Transformation transformation(vol->get_instance_transformation().get_matrix() * vol->get_volume_transformation().get_matrix()); -#if ENABLE_WORLD_COORDINATE - const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); -#else - const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse(); -#endif // ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d instance_matrix = Geometry::assemble_transform(m_c->selection_info()->get_sla_shift() * Vec3d::UnitZ()) * transformation.get_matrix(); - const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d& view_matrix = camera.get_view_matrix(); - const Transform3d& projection_matrix = camera.get_projection_matrix(); - - shader->set_uniform("projection_matrix", projection_matrix); -#else - const Transform3d& instance_matrix = transformation.get_matrix(); - const float z_shift = m_c->selection_info()->get_sla_shift(); - glsafe(::glPushMatrix()); - glsafe(::glTranslated(0.0, 0.0, z_shift)); - glsafe(::glMultMatrixd(instance_matrix.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - ColorRGBA render_color; - for (size_t i = 0; i < cache_size; ++i) { - const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; - const bool point_selected = m_editing_mode ? m_editing_cache[i].selected : false; - - if (is_mesh_point_clipped(support_point.pos.cast())) - continue; - - // First decide about the color of the point. - if (picking) - render_color = picking_color_component(i); - else { - if (size_t(m_hover_id) == i && m_editing_mode) // ignore hover state unless editing mode is active - render_color = { 0.f, 1.f, 1.f, 1.f }; - else { // neigher hover nor picking - bool supports_new_island = m_lock_unique_islands && support_point.is_new_island; - if (m_editing_mode) { - if (point_selected) - render_color = { 1.f, 0.3f, 0.3f, 1.f}; - else - if (supports_new_island) - render_color = { 0.3f, 0.3f, 1.f, 1.f }; - else - render_color = { 0.7f, 0.7f, 0.7f, 1.f }; - } - else - render_color = { 0.5f, 0.5f, 0.5f, 1.f }; - } - } - -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_cone.set_color(render_color); - m_sphere.set_color(render_color); - if (!picking) -#else - m_cone.set_color(-1, render_color); - m_sphere.set_color(-1, render_color); - if (shader && !picking) -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - shader->set_uniform("emission_factor", 0.5f); - - // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d support_matrix = Geometry::assemble_transform(support_point.pos.cast()) * instance_scaling_matrix_inverse; -#else - glsafe(::glPushMatrix()); - glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - if (vol->is_left_handed()) - glFrontFace(GL_CW); - - // Matrices set, we can render the point mark now. - // If in editing mode, we'll also render a cone pointing to the sphere. - if (m_editing_mode) { - // in case the normal is not yet cached, find and cache it - if (m_editing_cache[i].normal == Vec3f::Zero()) - m_c->raycaster()->raycaster()->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); - - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); - const Eigen::AngleAxisd aa(q); - const double cone_radius = 0.25; // mm - const double cone_height = 0.75; -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * Transform3d(aa.toRotationMatrix()) * - Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), - Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glPushMatrix()); - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); - glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); - glsafe(::glRotated(180., 1., 0., 0.)); - glsafe(::glScaled(cone_radius, cone_radius, cone_height)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_cone.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - } - - const double radius = (double)support_point.head_front_radius * RenderPointScale; -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d view_model_matrix = view_matrix * instance_matrix * support_matrix * - Geometry::assemble_transform(Vec3d::Zero(), Vec3d::Zero(), radius * Vec3d::Ones()); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glPushMatrix()); - glsafe(::glScaled(radius, radius, radius)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_sphere.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - - if (vol->is_left_handed()) - glFrontFace(GL_CCW); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - } - - // Now render the drain holes: - if (has_holes && ! picking) { - render_color = { 0.7f, 0.7f, 0.7f, 0.7f }; -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_cylinder.set_color(render_color); -#else - m_cylinder.set_color(-1, render_color); - if (shader != nullptr) -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - shader->set_uniform("emission_factor", 0.5f); - 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; - -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d hole_matrix = Geometry::assemble_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; -#else - // 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.x(), drain_hole.pos.y(), drain_hole.pos.z())); - glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - - if (vol->is_left_handed()) - glFrontFace(GL_CW); - - // Matrices set, we can render the point mark now. - Eigen::Quaterniond q; - q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); - const Eigen::AngleAxisd aa(q); -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d view_model_matrix = view_matrix * instance_matrix * hole_matrix * Transform3d(aa.toRotationMatrix()) * - Geometry::assemble_transform(-drain_hole.height * Vec3d::UnitZ(), Vec3d::Zero(), Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); - - shader->set_uniform("view_model_matrix", view_model_matrix); - shader->set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); - glsafe(::glTranslated(0., 0., -drain_hole.height)); - glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - m_cylinder.render(); - - if (vol->is_left_handed()) - glFrontFace(GL_CCW); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - } - } - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -} - - - -bool GLGizmoSlaSupports::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() * sel_info->model_object()->volumes.front()->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 GLGizmoSlaSupports::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_first_volume(); - Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_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)) - { - // 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; - } - } - - 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 GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) -{ - ModelObject* mo = m_c->selection_info()->model_object(); - int active_inst = m_c->selection_info()->get_active_instance(); - - if (m_editing_mode) { - - // left down with shift - show the selection rectangle: - 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::EState::Select : GLSelectionRectangle::EState::Deselect); - } - } - else { - if (m_editing_cache[m_hover_id].selected) - 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 support point")); - m_editing_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); - 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; i()); - - // 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. We want to check not only - // the point itself, but also the center of base of its cone, so the points don't hide - // under every miniature irregularity on the model. Remember the actual number and - // append the cone bases. - size_t orig_pts_num = points_inside.size(); - for (size_t idx : points_idxs) - points_inside.emplace_back((trafo.get_matrix().cast() * (m_editing_cache[idx].support_point.pos + m_editing_cache[idx].normal)).cast()); - - 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 (idx >= orig_pts_num) // this is a cone-base, get index of point it belongs to - idx -= orig_pts_num; - if (rectangle_status == GLSelectionRectangle::EState::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::ApplyChanges) { - editing_mode_apply_changes(); - return true; - } - - if (action == SLAGizmoEventType::DiscardChanges) { - ask_about_changes_call_after([this](){ editing_mode_apply_changes(); }, - [this](){ editing_mode_discard_changes(); }); - 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 (!m_editing_mode) { - if (action == SLAGizmoEventType::AutomaticGeneration) { - auto_generate(); - return true; - } - - if (action == SLAGizmoEventType::ManualEditing) { - switch_to_editing_mode(); - 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 GLGizmoSlaSupports::delete_selected_points(bool force) -{ - if (! m_editing_mode) { - std::cout << "DEBUGGING: delete_selected_points called out of editing mode!" << std::endl; - std::abort(); - } - - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Delete support point")); - - for (unsigned int idx=0; idx GLGizmoSlaSupports::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.push_back(object_cfg.option(key)); - else - if (print_cfg.has(key)) - out.push_back(print_cfg.option(key)); - else { // we must get it from defaults - if (default_cfg == nullptr) - default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); - out.push_back(default_cfg->option(key)); - } - } - - return out; -} - - - -/* -void GLGizmoSlaSupports::find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& idxs) const -{ - if (aabb->is_leaf()) { // this is a facet - // corner.dot(normal) - offset - idxs.push_back(aabb->m_primitive); - } - else { // not a leaf - using CornerType = Eigen::AlignedBox::CornerType; - bool sign = std::signbit(offset - normal.dot(aabb->m_box.corner(CornerType(0)))); - for (unsigned int i=1; i<8; ++i) - if (std::signbit(offset - normal.dot(aabb->m_box.corner(CornerType(i)))) != sign) { - find_intersecting_facets(aabb->m_left, normal, offset, idxs); - find_intersecting_facets(aabb->m_right, normal, offset, idxs); - } - } -} - - - -void GLGizmoSlaSupports::make_line_segments() const -{ - TriangleMeshSlicer tms(&m_c->m_model_object->volumes.front()->mesh); - Vec3f normal(0.f, 1.f, 1.f); - double d = 0.; - - std::vector lines; - find_intersections(&m_AABB, normal, d, lines); - ExPolygons expolys; - tms.make_expolygons_simple(lines, &expolys); - - SVG svg("slice_loops.svg", get_extents(expolys)); - svg.draw(expolys); - //for (const IntersectionLine &l : lines[i]) - // svg.draw(l, "red", 0); - //svg.draw_outline(expolygons, "black", "blue", 0); - svg.Close(); -} -*/ - - -void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit) -{ - 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, - // so it is not delayed until the background process finishes. -RENDER_AGAIN: - //m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - //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)); - - m_imgui->begin(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_imgui->set_requires_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); - 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 = m_imgui->calc_text_size(m_desc.at("head_diameter")).x + m_imgui->scaled(1.f); - const float minimal_slider_width = m_imgui->scaled(4.f); - const float buttons_width_approx = m_imgui->calc_text_size(m_desc.at("apply_changes")).x + m_imgui->calc_text_size(m_desc.at("discard_changes")).x + m_imgui->scaled(1.5f); - const float lock_supports_width_approx = m_imgui->calc_text_size(m_desc.at("lock_supports")).x + m_imgui->scaled(2.f); - - 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; - - if (m_editing_mode) { - - 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); - - // 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 - float initial_value = m_new_point_head_diameter; - m_imgui->slider_float("##head_diameter", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f"); - if (m_imgui->get_last_slider_status().clicked) { - if (m_old_point_head_diameter == 0.f) - m_old_point_head_diameter = initial_value; - } - if (m_imgui->get_last_slider_status().edited) { - for (auto& cache_entry : m_editing_cache) - if (cache_entry.selected) - cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; - } - if (m_imgui->get_last_slider_status().deactivated_after_edit) { - // momentarily restore the old value to take snapshot - for (auto& cache_entry : m_editing_cache) - if (cache_entry.selected) - cache_entry.support_point.head_front_radius = m_old_point_head_diameter / 2.f; - float backup = m_new_point_head_diameter; - m_new_point_head_diameter = m_old_point_head_diameter; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Change point head diameter")); - m_new_point_head_diameter = backup; - for (auto& cache_entry : m_editing_cache) - if (cache_entry.selected) - cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; - m_old_point_head_diameter = 0.f; - } - - bool changed = m_lock_unique_islands; - m_imgui->checkbox(m_desc.at("lock_supports"), m_lock_unique_islands); - force_refresh |= changed != m_lock_unique_islands; - - 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(m_editing_cache.empty()); - remove_all = m_imgui->button(m_desc.at("remove_all")); - m_imgui->disabled_end(); - - m_imgui->text(" "); // vertical gap - - if (m_imgui->button(m_desc.at("apply_changes"))) { - editing_mode_apply_changes(); - force_refresh = true; - } - ImGui::SameLine(); - bool discard_changes = m_imgui->button(m_desc.at("discard_changes")); - if (discard_changes) { - editing_mode_discard_changes(); - force_refresh = true; - } - } - 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); - - std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); - float density = static_cast(opts[0])->value; - float minimal_point_distance = static_cast(opts[1])->value; - - m_imgui->slider_float("##minimal_point_distance", &minimal_point_distance, 0.f, 20.f, "%.f mm"); - bool slider_clicked = m_imgui->get_last_slider_status().clicked; // someone clicked the slider - bool slider_edited = m_imgui->get_last_slider_status().edited; // someone is dragging the slider - bool slider_released = m_imgui->get_last_slider_status().deactivated_after_edit; // someone has just released the slider - - ImGui::AlignTextToFramePadding(); - m_imgui->text(m_desc.at("points_density")); - ImGui::SameLine(settings_sliders_left); - - m_imgui->slider_float("##points_density", &density, 0.f, 200.f, "%.f %%"); - slider_clicked |= m_imgui->get_last_slider_status().clicked; - slider_edited |= m_imgui->get_last_slider_status().edited; - slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit; - - if (slider_clicked) { // stash the values of the settings so we know what to revert to after undo - m_minimal_point_distance_stash = minimal_point_distance; - m_density_stash = density; - } - if (slider_edited) { - mo->config.set("support_points_minimal_distance", minimal_point_distance); - mo->config.set("support_points_density_relative", (int)density); - } - if (slider_released) { - 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")); - 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(); - } - - bool generate = m_imgui->button(m_desc.at("auto_generate")); - - if (generate) - auto_generate(); - - ImGui::Separator(); - if (m_imgui->button(m_desc.at("manual_editing"))) - switch_to_editing_mode(); - - m_imgui->disabled_begin(m_normal_cache.empty()); - remove_all = m_imgui->button(m_desc.at("remove_all")); - m_imgui->disabled_end(); - - // m_imgui->text(""); - // 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: - 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 (m_imgui->slider_float("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f")) - m_c->object_clipper()->set_position(clp_dist, true); - - - if (m_imgui->button("?")) { - wxGetApp().CallAfter([]() { - SlaGizmoHelpDialog help_dlg; - help_dlg.ShowModal(); - }); - } - - m_imgui->end(); - - if (remove_selected || remove_all) { - force_refresh = false; - m_parent.set_as_dirty(); - bool was_in_editing = m_editing_mode; - if (! was_in_editing) - switch_to_editing_mode(); - if (remove_all) { - select_point(AllPoints); - delete_selected_points(true); // true - delete regardless of locked status - } - if (remove_selected) - delete_selected_points(false); // leave locked points - if (! was_in_editing) - editing_mode_apply_changes(); - - if (first_run) { - first_run = false; - goto RENDER_AGAIN; - } - } - - if (force_refresh) - m_parent.set_as_dirty(); -} - -bool GLGizmoSlaSupports::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 GLGizmoSlaSupports::on_is_selectable() const -{ - return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA); -} - -std::string GLGizmoSlaSupports::on_get_name() const -{ - return _u8L("SLA Support Points"); -} - -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::ask_about_changes_call_after(std::function on_yes, std::function on_no) -{ - wxGetApp().CallAfter([on_yes, on_no]() { - // Following is called through CallAfter, because otherwise there was a problem - // on OSX with the wxMessageDialog being shown several times when clicked into. - MessageDialog dlg(GUI::wxGetApp().mainframe, _L("Do you want to save your manually " - "edited support points?") + "\n",_L("Save support points?"), wxICON_QUESTION | wxYES | wxNO | wxCANCEL ); - int ret = dlg.ShowModal(); - if (ret == wxID_YES) - on_yes(); - else if (ret == wxID_NO) - on_no(); - }); -} - - -void GLGizmoSlaSupports::on_set_state() -{ - if (m_state == m_old_state) - return; - - if (m_state == On && m_old_state != On) { // the gizmo was just 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_editing_mode && unsaved_changes() && on_is_activable(); - if (will_ask) { - ask_about_changes_call_after([this](){ editing_mode_apply_changes(); }, - [this](){ editing_mode_discard_changes(); }); - // refuse to be turned off so the gizmo is active when the CallAfter is executed - m_state = m_old_state; - } - else { - // we are actually shutting down - disable_editing_mode(); // so it is not active next time the gizmo opens - m_old_mo_id = -1; - } - } - m_old_state = m_state; -} - - - -void GLGizmoSlaSupports::on_start_dragging() -{ - if (m_hover_id != -1) { - select_point(NoPoints); - select_point(m_hover_id); - m_point_before_drag = m_editing_cache[m_hover_id]; - } - else - m_point_before_drag = CacheEntry(); -} - - -void GLGizmoSlaSupports::on_stop_dragging() -{ - if (m_hover_id != -1) { - CacheEntry backup = m_editing_cache[m_hover_id]; - - if (m_point_before_drag.support_point.pos != Vec3f::Zero() // some point was touched - && backup.support_point.pos != m_point_before_drag.support_point.pos) // and it was moved, not just selected - { - m_editing_cache[m_hover_id] = m_point_before_drag; - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Move support point")); - m_editing_cache[m_hover_id] = backup; - } - } - m_point_before_drag = CacheEntry(); -} - -void GLGizmoSlaSupports::on_dragging(const UpdateData &data) -{ - assert(m_hover_id != -1); - if (!m_editing_mode) return; - if (m_editing_cache[m_hover_id].support_point.is_new_island && m_lock_unique_islands) - return; - - std::pair pos_and_normal; - if (!unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) - return; - - 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; -} - -void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) -{ - ar(m_new_point_head_diameter, - m_normal_cache, - m_editing_cache, - m_selection_empty - ); -} - - - -void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const -{ - ar(m_new_point_head_diameter, - m_normal_cache, - m_editing_cache, - m_selection_empty - ); -} - - - -void GLGizmoSlaSupports::select_point(int i) -{ - if (! m_editing_mode) { - std::cout << "DEBUGGING: select_point called when out of editing mode!" << std::endl; - std::abort(); - } - - if (i == AllPoints || i == NoPoints) { - for (auto& point_and_selection : m_editing_cache) - point_and_selection.selected = ( i == AllPoints ); - m_selection_empty = (i == NoPoints); - - if (i == AllPoints && ! m_editing_cache.empty()) - m_new_point_head_diameter = m_editing_cache[0].support_point.head_front_radius * 2.f; - } - else { - m_editing_cache[i].selected = true; - m_selection_empty = false; - m_new_point_head_diameter = m_editing_cache[i].support_point.head_front_radius * 2.f; - } -} - - -void GLGizmoSlaSupports::unselect_point(int i) -{ - if (! m_editing_mode) { - std::cout << "DEBUGGING: unselect_point called when out of editing mode!" << std::endl; - std::abort(); - } - - m_editing_cache[i].selected = false; - m_selection_empty = true; - for (const CacheEntry& ce : m_editing_cache) { - if (ce.selected) { - m_selection_empty = false; - break; - } - } -} - - - - -void GLGizmoSlaSupports::editing_mode_discard_changes() -{ - if (! m_editing_mode) { - std::cout << "DEBUGGING: editing_mode_discard_changes called when out of editing mode!" << std::endl; - std::abort(); - } - select_point(NoPoints); - disable_editing_mode(); -} - - - -void GLGizmoSlaSupports::editing_mode_apply_changes() -{ - // If there are no changes, don't touch the front-end. The data in the cache could have been - // taken from the backend and copying them to ModelObject would needlessly invalidate them. - disable_editing_mode(); // this leaves the editing mode undo/redo stack and must be done before the snapshot is taken - - if (unsaved_changes()) { - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Support points edit")); - - m_normal_cache.clear(); - for (const CacheEntry& ce : m_editing_cache) - m_normal_cache.push_back(ce.support_point); - - 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(); - } -} - - - -void GLGizmoSlaSupports::reload_cache() -{ - const ModelObject* mo = m_c->selection_info()->model_object(); - m_normal_cache.clear(); - 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 : 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() == mo->id()) - return po->is_step_done(slaposSupportPoints); - } - return false; -} - -void GLGizmoSlaSupports::reslice_SLA_supports(bool postpone_error_messages) const -{ - wxGetApp().CallAfter([this, postpone_error_messages]() { - wxGetApp().plater()->reslice_SLA_supports( - *m_c->selection_info()->model_object(), postpone_error_messages); - }); -} - -bool GLGizmoSlaSupports::on_mouse(const wxMouseEvent &mouse_event){ - if (mouse_event.Moving()) return false; - if (use_grabbers(mouse_event)) return true; - - // wxCoord == int --> wx/types.h - Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); - Vec2d mouse_pos = mouse_coord.cast(); - - static bool pending_right_up = false; - if (mouse_event.LeftDown()) { - bool grabber_contains_mouse = (get_hover_id() != -1); - bool control_down = mouse_event.CmdDown(); - if ((!control_down || grabber_contains_mouse) && - gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) - return true; - } else if (mouse_event.Dragging()) { - bool control_down = mouse_event.CmdDown(); - if (m_parent.get_move_volume_id() != -1) { - // don't allow dragging objects with the Sla gizmo on - return true; - } else if (!control_down && - gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { - // the gizmo got the event and took some action, no need to do - // anything more here - m_parent.set_as_dirty(); - return true; - } else if (control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())){ - // CTRL has been pressed while already dragging -> stop current action - if (mouse_event.LeftIsDown()) - gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); - else if (mouse_event.RightIsDown()) - pending_right_up = false; - } - } else if (mouse_event.LeftUp() && !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, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); - return true; - }else if (mouse_event.RightDown()){ - if (m_parent.get_selection().get_object_idx() != -1 && - gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { - // 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 - return true; - } - } else if (pending_right_up && mouse_event.RightUp()) { - pending_right_up = false; - return true; - } - return false; -} - -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() == mo->id()) { - m_normal_cache.clear(); - const std::vector& points = po->get_support_points(); - auto mat = (po->trafo() * po->model_object()->volumes.front()->get_transformation().get_matrix()).inverse().cast(); - for (unsigned int i=0; isla_points_status = sla::PointsStatus::AutoGenerated; - break; - } - } - - // We don't copy the data into ModelObject, as this would stop the background processing. -} - - - -void GLGizmoSlaSupports::auto_generate() -{ - //wxMessageDialog dlg(GUI::wxGetApp().plater(), - MessageDialog 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); - - 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(); }); - mo->sla_points_status = sla::PointsStatus::Generating; - } -} - - - -void GLGizmoSlaSupports::switch_to_editing_mode() -{ - wxGetApp().plater()->enter_gizmos_stack(); - m_editing_mode = true; - m_editing_cache.clear(); - 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(); -} - - -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(); - } - wxGetApp().plater()->get_notification_manager()->close_notification_of_type(NotificationType::QuitSLAManualMode); -} - - - -bool GLGizmoSlaSupports::unsaved_changes() const -{ - if (m_editing_cache.size() != m_normal_cache.size()) - return true; - - for (size_t i=0; iSetFont(font); - - auto vsizer = new wxBoxSizer(wxVERTICAL); - auto gridsizer = new wxFlexGridSizer(2, 5, 15); - auto hsizer = new wxBoxSizer(wxHORIZONTAL); - - hsizer->AddSpacer(20); - hsizer->Add(vsizer); - hsizer->AddSpacer(20); - - vsizer->AddSpacer(20); - vsizer->Add(note_text, 1, wxALIGN_CENTRE_HORIZONTAL); - vsizer->AddSpacer(20); - vsizer->Add(gridsizer); - vsizer->AddSpacer(20); - - std::vector> shortcuts; - shortcuts.push_back(std::make_pair(_L("Left click"), _L("Add point"))); - shortcuts.push_back(std::make_pair(_L("Right click"), _L("Remove point"))); - shortcuts.push_back(std::make_pair(_L("Drag"), _L("Move point"))); - shortcuts.push_back(std::make_pair(ctrl+_L("Left click"), _L("Add point to selection"))); - shortcuts.push_back(std::make_pair(alt+_L("Left click"), _L("Remove point from selection"))); - shortcuts.push_back(std::make_pair(wxString("Shift+")+_L("Drag"), _L("Select by rectangle"))); - shortcuts.push_back(std::make_pair(alt+_(L("Drag")), _L("Deselect by rectangle"))); - shortcuts.push_back(std::make_pair(ctrl+"A", _L("Select all points"))); - shortcuts.push_back(std::make_pair("Delete", _L("Remove selected points"))); - shortcuts.push_back(std::make_pair(ctrl+_L("Mouse wheel"), _L("Move clipping plane"))); - shortcuts.push_back(std::make_pair("R", _L("Reset clipping plane"))); - shortcuts.push_back(std::make_pair("Enter", _L("Apply changes"))); - shortcuts.push_back(std::make_pair("Esc", _L("Discard changes"))); - shortcuts.push_back(std::make_pair("M", _L("Switch to editing mode"))); - shortcuts.push_back(std::make_pair("A", _L("Auto-generate points"))); - - for (const auto& pair : shortcuts) { - auto shortcut = new wxStaticText(this, wxID_ANY, pair.first); - auto desc = new wxStaticText(this, wxID_ANY, pair.second); - shortcut->SetFont(bold_font); - desc->SetFont(font); - gridsizer->Add(shortcut, -1, wxALIGN_CENTRE_VERTICAL); - gridsizer->Add(desc, -1, wxALIGN_CENTRE_VERTICAL); - } - - SetSizer(hsizer); - hsizer->SetSizeHints(this); -} - - - -} // namespace GUI -} // namespace Slic3r +// 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/Camera.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" +#include "slic3r/GUI/MainFrame.hpp" +#include "slic3r/Utils/UndoRedo.hpp" + +#include + +#include +#include +#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "slic3r/GUI/GUI_ObjectSettings.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "slic3r/GUI/NotificationManager.hpp" +#include "slic3r/GUI/MsgDialog.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "libslic3r/SLAPrint.hpp" + +#if ENABLE_RAYCAST_PICKING +static const double CONE_RADIUS = 0.25; +static const double CONE_HEIGHT = 0.75; +#endif // ENABLE_RAYCAST_PICKING + +namespace Slic3r { +namespace GUI { + +GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) +{} + +bool GLGizmoSlaSupports::on_init() +{ + m_shortcut_key = WXK_CONTROL_L; + + m_desc["head_diameter"] = _L("Head diameter") + ": "; + m_desc["lock_supports"] = _L("Lock supports under new islands"); + m_desc["remove_selected"] = _L("Remove selected points"); + m_desc["remove_all"] = _L("Remove all points"); + m_desc["apply_changes"] = _L("Apply changes"); + m_desc["discard_changes"] = _L("Discard changes"); + m_desc["minimal_distance"] = _L("Minimal points distance") + ": "; + m_desc["points_density"] = _L("Support points density") + ": "; + m_desc["auto_generate"] = _L("Auto-generate points"); + m_desc["manual_editing"] = _L("Manual editing"); + m_desc["clipping_of_view"] = _L("Clipping of view")+ ": "; + m_desc["reset_direction"] = _L("Reset direction"); + +#if !ENABLE_RAYCAST_PICKING + m_cone.init_from(its_make_cone(1., 1., 2 * PI / 24)); + m_cylinder.init_from(its_make_cylinder(1., 1., 2 * PI / 24.)); + m_sphere.init_from(its_make_sphere(1., (2 * M_PI) / 24.)); +#endif // !ENABLE_RAYCAST_PICKING + + return true; +} + +void GLGizmoSlaSupports::data_changed() +{ + 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 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 ENABLE_RAYCAST_PICKING + if (m_raycasters.empty()) + on_register_raycasters_for_picking(); + else + update_raycasters_for_picking_transform(); +#endif // ENABLE_RAYCAST_PICKING +} + + + +void GLGizmoSlaSupports::on_render() +{ +#if ENABLE_RAYCAST_PICKING + if (!m_sphere.model.is_initialized()) { + indexed_triangle_set its = its_make_sphere(1.0, double(PI) / 12.0); + m_sphere.model.init_from(its); + m_sphere.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } + if (!m_cone.model.is_initialized()) { + indexed_triangle_set its = its_make_cone(1.0, 1.0, double(PI) / 12.0); + m_cone.model.init_from(its); + m_cone.mesh_raycaster = std::make_unique(std::make_shared(std::move(its))); + } +#else + if (!m_cone.is_initialized()) + m_cone.init_from(its_make_cone(1.0, 1.0, double(PI) / 12.0)); + if (!m_sphere.is_initialized()) + m_sphere.init_from(its_make_sphere(1.0, double(PI) / 12.0)); +#endif // ENABLE_RAYCAST_PICKING + if (!m_cylinder.is_initialized()) + m_cylinder.init_from(its_make_cylinder(1.0, 1.0, double(PI) / 12.0)); + + ModelObject* mo = m_c->selection_info()->model_object(); + const Selection& selection = m_parent.get_selection(); + + // If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off + if (m_state == On + && (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; + } + + glsafe(::glEnable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + if (selection.is_from_single_instance()) +#if ENABLE_RAYCAST_PICKING + render_points(selection); +#else + render_points(selection, false); +#endif // ENABLE_RAYCAST_PICKING + + m_selection_rectangle.render(m_parent); + m_c->object_clipper()->render_cut(); + m_c->supports_clipper()->render_cut(); + + glsafe(::glDisable(GL_BLEND)); +} + +#if ENABLE_RAYCAST_PICKING +void GLGizmoSlaSupports::on_register_raycasters_for_picking() +{ + assert(m_raycasters.empty()); + set_sla_auxiliary_volumes_picking_state(false); + + if (m_editing_mode && !m_editing_cache.empty()) { + for (size_t i = 0; i < m_editing_cache.size(); ++i) { + m_raycasters.emplace_back(m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_sphere.mesh_raycaster, Transform3d::Identity()), + m_parent.add_raycaster_for_picking(SceneRaycaster::EType::Gizmo, i, *m_cone.mesh_raycaster, Transform3d::Identity())); + } + update_raycasters_for_picking_transform(); + } +} + +void GLGizmoSlaSupports::on_unregister_raycasters_for_picking() +{ + m_parent.remove_raycasters_for_picking(SceneRaycaster::EType::Gizmo); + m_raycasters.clear(); + set_sla_auxiliary_volumes_picking_state(true); +} +#else +void GLGizmoSlaSupports::on_render_for_picking() +{ + const Selection& selection = m_parent.get_selection(); + //glsafe(::glEnable(GL_DEPTH_TEST)); + render_points(selection, true); +} +#endif // ENABLE_RAYCAST_PICKING + +#if ENABLE_RAYCAST_PICKING +void GLGizmoSlaSupports::render_points(const Selection& selection) +#else +void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) +#endif // ENABLE_RAYCAST_PICKING +{ + const size_t cache_size = m_editing_mode ? m_editing_cache.size() : m_normal_cache.size(); + + const bool has_points = (cache_size != 0); + const bool has_holes = (! m_c->hollowed_mesh()->get_hollowed_mesh() + && ! m_c->selection_info()->model_object()->sla_drain_holes.empty()); + + if (! has_points && ! has_holes) + return; + +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light"); +#else + GLShaderProgram* shader = wxGetApp().get_shader(picking ? "flat" : "gouraud_light"); +#endif // ENABLE_RAYCAST_PICKING + if (shader == nullptr) + return; + + shader->start_using(); + ScopeGuard guard([shader]() { shader->stop_using(); }); +#else + GLShaderProgram* shader = picking ? nullptr : wxGetApp().get_shader("gouraud_light"); + if (shader != nullptr) + shader->start_using(); + ScopeGuard guard([shader]() { + if (shader != nullptr) + shader->stop_using(); + }); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + const GLVolume* vol = selection.get_first_volume(); + const Geometry::Transformation transformation(vol->world_matrix()); +#if ENABLE_WORLD_COORDINATE + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); +#else + const Transform3d& instance_scaling_matrix_inverse = transformation.get_matrix(true, true, false, true).inverse(); +#endif // ENABLE_WORLD_COORDINATE +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Camera& camera = wxGetApp().plater()->get_camera(); + const Transform3d& view_matrix = camera.get_view_matrix(); + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); +#else + const Transform3d& instance_matrix = transformation.get_matrix(); + const float z_shift = m_c->selection_info()->get_sla_shift(); + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, z_shift)); + glsafe(::glMultMatrixd(instance_matrix.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + ColorRGBA render_color; + for (size_t i = 0; i < cache_size; ++i) { + const sla::SupportPoint& support_point = m_editing_mode ? m_editing_cache[i].support_point : m_normal_cache[i]; + const bool point_selected = m_editing_mode ? m_editing_cache[i].selected : false; + +#if ENABLE_RAYCAST_PICKING + const bool clipped = is_mesh_point_clipped(support_point.pos.cast()); + if (!m_raycasters.empty()) { + m_raycasters[i].first->set_active(!clipped); + m_raycasters[i].second->set_active(!clipped); + } + if (clipped) + continue; +#else + if (is_mesh_point_clipped(support_point.pos.cast())) + continue; +#endif // ENABLE_RAYCAST_PICKING + + // First decide about the color of the point. +#if !ENABLE_RAYCAST_PICKING + if (picking) + render_color = picking_color_component(i); + else { +#endif // !ENABLE_RAYCAST_PICKING + if (size_t(m_hover_id) == i && m_editing_mode) // ignore hover state unless editing mode is active + render_color = { 0.f, 1.f, 1.f, 1.f }; + else { // neigher hover nor picking + bool supports_new_island = m_lock_unique_islands && support_point.is_new_island; + if (m_editing_mode) { + if (point_selected) + render_color = { 1.f, 0.3f, 0.3f, 1.f}; + else + if (supports_new_island) + render_color = { 0.3f, 0.3f, 1.f, 1.f }; + else + render_color = { 0.7f, 0.7f, 0.7f, 1.f }; + } + else + render_color = { 0.5f, 0.5f, 0.5f, 1.f }; + } +#if !ENABLE_RAYCAST_PICKING + } +#endif // !ENABLE_RAYCAST_PICKING + +#if ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_cone.model.set_color(render_color); + m_sphere.model.set_color(render_color); +#else + m_cone.set_color(render_color); + m_sphere.set_color(render_color); +#endif // ENABLE_RAYCAST_PICKING +#if !ENABLE_RAYCAST_PICKING + if (!picking) +#endif // !ENABLE_RAYCAST_PICKING +#else + m_cone.set_color(-1, render_color); + m_sphere.set_color(-1, render_color); + if (shader && !picking) +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + shader->set_uniform("emission_factor", 0.5f); + + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d support_matrix = Geometry::translation_transform(support_point.pos.cast()) * instance_scaling_matrix_inverse; +#else + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(support_point.pos.x(), support_point.pos.y(), support_point.pos.z())); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + if (vol->is_left_handed()) + glsafe(::glFrontFace(GL_CW)); + + // Matrices set, we can render the point mark now. + // If in editing mode, we'll also render a cone pointing to the sphere. + if (m_editing_mode) { + // in case the normal is not yet cached, find and cache it + if (m_editing_cache[i].normal == Vec3f::Zero()) + m_c->raycaster()->raycaster()->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal); + + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); + const Eigen::AngleAxisd aa(q); +#if !ENABLE_RAYCAST_PICKING + const double cone_radius = 0.25; // mm + const double cone_height = 0.75; +#endif // !ENABLE_RAYCAST_PICKING +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d model_matrix = vol->world_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) * +#if ENABLE_RAYCAST_PICKING + Geometry::assemble_transform((CONE_HEIGHT + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), + Vec3d(PI, 0.0, 0.0), Vec3d(CONE_RADIUS, CONE_RADIUS, CONE_HEIGHT)); +#else + Geometry::assemble_transform((cone_height + support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), + Vec3d(PI, 0.0, 0.0), Vec3d(cone_radius, cone_radius, cone_height)); +#endif // ENABLE_RAYCAST_PICKING + + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#else + glsafe(::glPushMatrix()); + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); + glsafe(::glTranslatef(0.f, 0.f, cone_height + support_point.head_front_radius * RenderPointScale)); + glsafe(::glRotated(180., 1., 0., 0.)); + glsafe(::glScaled(cone_radius, cone_radius, cone_height)); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_cone.model.render(); +#else + m_cone.render(); +#endif // ENABLE_RAYCAST_PICKING +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + } + + const double radius = (double)support_point.head_front_radius * RenderPointScale; +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d model_matrix = vol->world_matrix() * support_matrix * Geometry::scale_transform(radius); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#else + glsafe(::glPushMatrix()); + glsafe(::glScaled(radius, radius, radius)); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_RAYCAST_PICKING + m_sphere.model.render(); +#else + m_sphere.render(); +#endif // ENABLE_RAYCAST_PICKING +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + + if (vol->is_left_handed()) + glsafe(::glFrontFace(GL_CCW)); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + } + + // Now render the drain holes: +#if ENABLE_RAYCAST_PICKING + if (has_holes) { +#else + if (has_holes && ! picking) { +#endif // ENABLE_RAYCAST_PICKING + render_color = { 0.7f, 0.7f, 0.7f, 0.7f }; +#if ENABLE_LEGACY_OPENGL_REMOVAL + m_cylinder.set_color(render_color); +#else + m_cylinder.set_color(-1, render_color); + if (shader != nullptr) +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + shader->set_uniform("emission_factor", 0.5f); + 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; + +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d hole_matrix = Geometry::translation_transform(drain_hole.pos.cast()) * instance_scaling_matrix_inverse; +#else + // 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.x(), drain_hole.pos.y(), drain_hole.pos.z())); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + if (vol->is_left_handed()) + glsafe(::glFrontFace(GL_CW)); + + // Matrices set, we can render the point mark now. + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d::UnitZ(), instance_scaling_matrix_inverse * (-drain_hole.normal).cast()); + const Eigen::AngleAxisd aa(q); +#if ENABLE_LEGACY_OPENGL_REMOVAL + const Transform3d model_matrix = vol->world_matrix() * hole_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::translation_transform(-drain_hole.height * Vec3d::UnitZ()) * Geometry::scale_transform(Vec3d(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); + shader->set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader->set_uniform("view_normal_matrix", view_normal_matrix); +#else + glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis().x(), aa.axis().y(), aa.axis().z())); + glsafe(::glTranslated(0., 0., -drain_hole.height)); + glsafe(::glScaled(drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength)); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + m_cylinder.render(); + + if (vol->is_left_handed()) + glsafe(::glFrontFace(GL_CCW)); +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + } + } + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +} + + + +bool GLGizmoSlaSupports::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() * sel_info->model_object()->volumes.front()->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 GLGizmoSlaSupports::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_first_volume(); + Geometry::Transformation trafo = volume->get_instance_transformation() * volume->get_volume_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)) + { + // 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; + } + } + + 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 GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down) +{ + ModelObject* mo = m_c->selection_info()->model_object(); + int active_inst = m_c->selection_info()->get_active_instance(); + + if (m_editing_mode) { + + // left down with shift - show the selection rectangle: + 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::EState::Select : GLSelectionRectangle::EState::Deselect); + } + } + else { + if (m_editing_cache[m_hover_id].selected) + 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 support point")); + m_editing_cache.emplace_back(sla::SupportPoint(pos_and_normal.first, m_new_point_head_diameter/2.f, false), false, pos_and_normal.second); + m_parent.set_as_dirty(); + m_wait_for_up_event = true; +#if ENABLE_RAYCAST_PICKING + on_unregister_raycasters_for_picking(); + on_register_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + } + 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; i()); + + // Now ask the rectangle which of the points are inside. + std::vector points_inside; +#if ENABLE_RAYCAST_PICKING + std::vector points_idxs = m_selection_rectangle.contains(points); + m_selection_rectangle.stop_dragging(); +#else + std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); +#endif // ENABLE_RAYCAST_PICKING + for (size_t idx : points_idxs) + points_inside.push_back(points[idx].cast()); + + // Only select/deselect points that are actually visible. We want to check not only + // the point itself, but also the center of base of its cone, so the points don't hide + // under every miniature irregularity on the model. Remember the actual number and + // append the cone bases. + size_t orig_pts_num = points_inside.size(); + for (size_t idx : points_idxs) + points_inside.emplace_back((trafo.get_matrix().cast() * (m_editing_cache[idx].support_point.pos + m_editing_cache[idx].normal)).cast()); + + 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 (idx >= orig_pts_num) // this is a cone-base, get index of point it belongs to + idx -= orig_pts_num; + if (rectangle_status == GLSelectionRectangle::EState::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::ApplyChanges) { + editing_mode_apply_changes(); + return true; + } + + if (action == SLAGizmoEventType::DiscardChanges) { + ask_about_changes_call_after([this](){ editing_mode_apply_changes(); }, + [this](){ editing_mode_discard_changes(); }); + 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 (!m_editing_mode) { + if (action == SLAGizmoEventType::AutomaticGeneration) { + auto_generate(); + return true; + } + + if (action == SLAGizmoEventType::ManualEditing) { + switch_to_editing_mode(); + 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 GLGizmoSlaSupports::delete_selected_points(bool force) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: delete_selected_points called out of editing mode!" << std::endl; + std::abort(); + } + + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Delete support point")); + + for (unsigned int idx=0; idx GLGizmoSlaSupports::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.push_back(object_cfg.option(key)); + else + if (print_cfg.has(key)) + out.push_back(print_cfg.option(key)); + else { // we must get it from defaults + if (default_cfg == nullptr) + default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); + out.push_back(default_cfg->option(key)); + } + } + + return out; +} + + + +/* +void GLGizmoSlaSupports::find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& idxs) const +{ + if (aabb->is_leaf()) { // this is a facet + // corner.dot(normal) - offset + idxs.push_back(aabb->m_primitive); + } + else { // not a leaf + using CornerType = Eigen::AlignedBox::CornerType; + bool sign = std::signbit(offset - normal.dot(aabb->m_box.corner(CornerType(0)))); + for (unsigned int i=1; i<8; ++i) + if (std::signbit(offset - normal.dot(aabb->m_box.corner(CornerType(i)))) != sign) { + find_intersecting_facets(aabb->m_left, normal, offset, idxs); + find_intersecting_facets(aabb->m_right, normal, offset, idxs); + } + } +} + + + +void GLGizmoSlaSupports::make_line_segments() const +{ + TriangleMeshSlicer tms(&m_c->m_model_object->volumes.front()->mesh); + Vec3f normal(0.f, 1.f, 1.f); + double d = 0.; + + std::vector lines; + find_intersections(&m_AABB, normal, d, lines); + ExPolygons expolys; + tms.make_expolygons_simple(lines, &expolys); + + SVG svg("slice_loops.svg", get_extents(expolys)); + svg.draw(expolys); + //for (const IntersectionLine &l : lines[i]) + // svg.draw(l, "red", 0); + //svg.draw_outline(expolygons, "black", "blue", 0); + svg.Close(); +} +*/ + + +void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit) +{ + 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, + // so it is not delayed until the background process finishes. +RENDER_AGAIN: + //m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + //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)); + + m_imgui->begin(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_imgui->set_requires_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); + 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 = m_imgui->calc_text_size(m_desc.at("head_diameter")).x + m_imgui->scaled(1.f); + const float minimal_slider_width = m_imgui->scaled(4.f); + const float buttons_width_approx = m_imgui->calc_text_size(m_desc.at("apply_changes")).x + m_imgui->calc_text_size(m_desc.at("discard_changes")).x + m_imgui->scaled(1.5f); + const float lock_supports_width_approx = m_imgui->calc_text_size(m_desc.at("lock_supports")).x + m_imgui->scaled(2.f); + + 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; + + if (m_editing_mode) { + + 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); + + // 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 + float initial_value = m_new_point_head_diameter; + m_imgui->slider_float("##head_diameter", &m_new_point_head_diameter, 0.1f, diameter_upper_cap, "%.1f"); + if (m_imgui->get_last_slider_status().clicked) { + if (m_old_point_head_diameter == 0.f) + m_old_point_head_diameter = initial_value; + } + if (m_imgui->get_last_slider_status().edited) { + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; + } + if (m_imgui->get_last_slider_status().deactivated_after_edit) { + // momentarily restore the old value to take snapshot + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_old_point_head_diameter / 2.f; + float backup = m_new_point_head_diameter; + m_new_point_head_diameter = m_old_point_head_diameter; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Change point head diameter")); + m_new_point_head_diameter = backup; + for (auto& cache_entry : m_editing_cache) + if (cache_entry.selected) + cache_entry.support_point.head_front_radius = m_new_point_head_diameter / 2.f; + m_old_point_head_diameter = 0.f; + } + + bool changed = m_lock_unique_islands; + m_imgui->checkbox(m_desc.at("lock_supports"), m_lock_unique_islands); + force_refresh |= changed != m_lock_unique_islands; + + 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(m_editing_cache.empty()); + remove_all = m_imgui->button(m_desc.at("remove_all")); + m_imgui->disabled_end(); + + m_imgui->text(" "); // vertical gap + + if (m_imgui->button(m_desc.at("apply_changes"))) { + editing_mode_apply_changes(); + force_refresh = true; + } + ImGui::SameLine(); + bool discard_changes = m_imgui->button(m_desc.at("discard_changes")); + if (discard_changes) { + editing_mode_discard_changes(); + force_refresh = true; + } + } + 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); + + std::vector opts = get_config_options({"support_points_density_relative", "support_points_minimal_distance"}); + float density = static_cast(opts[0])->value; + float minimal_point_distance = static_cast(opts[1])->value; + + m_imgui->slider_float("##minimal_point_distance", &minimal_point_distance, 0.f, 20.f, "%.f mm"); + bool slider_clicked = m_imgui->get_last_slider_status().clicked; // someone clicked the slider + bool slider_edited = m_imgui->get_last_slider_status().edited; // someone is dragging the slider + bool slider_released = m_imgui->get_last_slider_status().deactivated_after_edit; // someone has just released the slider + + ImGui::AlignTextToFramePadding(); + m_imgui->text(m_desc.at("points_density")); + ImGui::SameLine(settings_sliders_left); + + m_imgui->slider_float("##points_density", &density, 0.f, 200.f, "%.f %%"); + slider_clicked |= m_imgui->get_last_slider_status().clicked; + slider_edited |= m_imgui->get_last_slider_status().edited; + slider_released |= m_imgui->get_last_slider_status().deactivated_after_edit; + + if (slider_clicked) { // stash the values of the settings so we know what to revert to after undo + m_minimal_point_distance_stash = minimal_point_distance; + m_density_stash = density; + } + if (slider_edited) { + mo->config.set("support_points_minimal_distance", minimal_point_distance); + mo->config.set("support_points_density_relative", (int)density); + } + if (slider_released) { + 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")); + 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(); + } + + bool generate = m_imgui->button(m_desc.at("auto_generate")); + + if (generate) + auto_generate(); + + ImGui::Separator(); + if (m_imgui->button(m_desc.at("manual_editing"))) + switch_to_editing_mode(); + + m_imgui->disabled_begin(m_normal_cache.empty()); + remove_all = m_imgui->button(m_desc.at("remove_all")); + m_imgui->disabled_end(); + + // m_imgui->text(""); + // 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: + 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 (m_imgui->slider_float("##clp_dist", &clp_dist, 0.f, 1.f, "%.2f")) + m_c->object_clipper()->set_position(clp_dist, true); + + + if (m_imgui->button("?")) { + wxGetApp().CallAfter([]() { + SlaGizmoHelpDialog help_dlg; + help_dlg.ShowModal(); + }); + } + + m_imgui->end(); + + if (remove_selected || remove_all) { + force_refresh = false; + m_parent.set_as_dirty(); + bool was_in_editing = m_editing_mode; + if (! was_in_editing) + switch_to_editing_mode(); + if (remove_all) { + select_point(AllPoints); + delete_selected_points(true); // true - delete regardless of locked status + } + if (remove_selected) + delete_selected_points(false); // leave locked points + if (! was_in_editing) + editing_mode_apply_changes(); + + if (first_run) { + first_run = false; + goto RENDER_AGAIN; + } + } + + if (force_refresh) + m_parent.set_as_dirty(); +} + +bool GLGizmoSlaSupports::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 GLGizmoSlaSupports::on_is_selectable() const +{ + return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA); +} + +std::string GLGizmoSlaSupports::on_get_name() const +{ + return _u8L("SLA Support Points"); +} + +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::ask_about_changes_call_after(std::function on_yes, std::function on_no) +{ + wxGetApp().CallAfter([on_yes, on_no]() { + // Following is called through CallAfter, because otherwise there was a problem + // on OSX with the wxMessageDialog being shown several times when clicked into. + MessageDialog dlg(GUI::wxGetApp().mainframe, _L("Do you want to save your manually " + "edited support points?") + "\n",_L("Save support points?"), wxICON_QUESTION | wxYES | wxNO | wxCANCEL ); + int ret = dlg.ShowModal(); + if (ret == wxID_YES) + on_yes(); + else if (ret == wxID_NO) + on_no(); + }); +} + + +void GLGizmoSlaSupports::on_set_state() +{ + if (m_state == m_old_state) + return; + + if (m_state == On && m_old_state != On) { // the gizmo was just 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_editing_mode && unsaved_changes() && on_is_activable(); + if (will_ask) { + ask_about_changes_call_after([this](){ editing_mode_apply_changes(); }, + [this](){ editing_mode_discard_changes(); }); + // refuse to be turned off so the gizmo is active when the CallAfter is executed + m_state = m_old_state; + } + else { + // we are actually shutting down + disable_editing_mode(); // so it is not active next time the gizmo opens + m_old_mo_id = -1; + } + } + m_old_state = m_state; +} + + + +void GLGizmoSlaSupports::on_start_dragging() +{ + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + m_point_before_drag = m_editing_cache[m_hover_id]; + } + else + m_point_before_drag = CacheEntry(); +} + + +void GLGizmoSlaSupports::on_stop_dragging() +{ + if (m_hover_id != -1) { + CacheEntry backup = m_editing_cache[m_hover_id]; + + if (m_point_before_drag.support_point.pos != Vec3f::Zero() // some point was touched + && backup.support_point.pos != m_point_before_drag.support_point.pos) // and it was moved, not just selected + { + m_editing_cache[m_hover_id] = m_point_before_drag; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Move support point")); + m_editing_cache[m_hover_id] = backup; + } + } + m_point_before_drag = CacheEntry(); +} + +void GLGizmoSlaSupports::on_dragging(const UpdateData &data) +{ + assert(m_hover_id != -1); + if (!m_editing_mode) return; + if (m_editing_cache[m_hover_id].support_point.is_new_island && m_lock_unique_islands) + return; + + std::pair pos_and_normal; + if (!unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + + 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; +} + +void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) +{ + ar(m_new_point_head_diameter, + m_normal_cache, + m_editing_cache, + m_selection_empty + ); +} + + + +void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const +{ + ar(m_new_point_head_diameter, + m_normal_cache, + m_editing_cache, + m_selection_empty + ); +} + + + +void GLGizmoSlaSupports::select_point(int i) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: select_point called when out of editing mode!" << std::endl; + std::abort(); + } + + if (i == AllPoints || i == NoPoints) { + for (auto& point_and_selection : m_editing_cache) + point_and_selection.selected = ( i == AllPoints ); + m_selection_empty = (i == NoPoints); + + if (i == AllPoints && !m_editing_cache.empty()) + m_new_point_head_diameter = m_editing_cache[0].support_point.head_front_radius * 2.f; + } + else { + m_editing_cache[i].selected = true; + m_selection_empty = false; + m_new_point_head_diameter = m_editing_cache[i].support_point.head_front_radius * 2.f; + } +} + + +void GLGizmoSlaSupports::unselect_point(int i) +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: unselect_point called when out of editing mode!" << std::endl; + std::abort(); + } + + m_editing_cache[i].selected = false; + m_selection_empty = true; + for (const CacheEntry& ce : m_editing_cache) { + if (ce.selected) { + m_selection_empty = false; + break; + } + } +} + + + + +void GLGizmoSlaSupports::editing_mode_discard_changes() +{ + if (! m_editing_mode) { + std::cout << "DEBUGGING: editing_mode_discard_changes called when out of editing mode!" << std::endl; + std::abort(); + } + select_point(NoPoints); + disable_editing_mode(); +} + + + +void GLGizmoSlaSupports::editing_mode_apply_changes() +{ + // If there are no changes, don't touch the front-end. The data in the cache could have been + // taken from the backend and copying them to ModelObject would needlessly invalidate them. + disable_editing_mode(); // this leaves the editing mode undo/redo stack and must be done before the snapshot is taken + + if (unsaved_changes()) { + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Support points edit")); + + m_normal_cache.clear(); + for (const CacheEntry& ce : m_editing_cache) + m_normal_cache.push_back(ce.support_point); + + 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(); + } +} + + + +void GLGizmoSlaSupports::reload_cache() +{ + const ModelObject* mo = m_c->selection_info()->model_object(); + m_normal_cache.clear(); + 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 : 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() == mo->id()) + return po->is_step_done(slaposSupportPoints); + } + return false; +} + +void GLGizmoSlaSupports::reslice_SLA_supports(bool postpone_error_messages) const +{ + wxGetApp().CallAfter([this, postpone_error_messages]() { + wxGetApp().plater()->reslice_SLA_supports( + *m_c->selection_info()->model_object(), postpone_error_messages); + }); +} + +bool GLGizmoSlaSupports::on_mouse(const wxMouseEvent &mouse_event){ + if (mouse_event.Moving()) return false; + if (use_grabbers(mouse_event)) return true; + + // wxCoord == int --> wx/types.h + Vec2i mouse_coord(mouse_event.GetX(), mouse_event.GetY()); + Vec2d mouse_pos = mouse_coord.cast(); + + static bool pending_right_up = false; + if (mouse_event.LeftDown()) { + bool grabber_contains_mouse = (get_hover_id() != -1); + bool control_down = mouse_event.CmdDown(); + if ((!control_down || grabber_contains_mouse) && + gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) + return true; + } else if (mouse_event.Dragging()) { + bool control_down = mouse_event.CmdDown(); + if (m_parent.get_move_volume_id() != -1) { + // don't allow dragging objects with the Sla gizmo on + return true; + } else if (!control_down && + gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), false)) { + // the gizmo got the event and took some action, no need to do + // anything more here + m_parent.set_as_dirty(); + return true; + } else if (control_down && (mouse_event.LeftIsDown() || mouse_event.RightIsDown())){ + // CTRL has been pressed while already dragging -> stop current action + if (mouse_event.LeftIsDown()) + gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, mouse_event.ShiftDown(), mouse_event.AltDown(), true); + else if (mouse_event.RightIsDown()) + pending_right_up = false; + } + } else if (mouse_event.LeftUp() && !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, mouse_event.ShiftDown(), mouse_event.AltDown(), mouse_event.CmdDown()); + return true; + }else if (mouse_event.RightDown()){ + if (m_parent.get_selection().get_object_idx() != -1 && + gizmo_event(SLAGizmoEventType::RightDown, mouse_pos, false, false, false)) { + // 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 + return true; + } + } else if (pending_right_up && mouse_event.RightUp()) { + pending_right_up = false; + return true; + } + return false; +} + +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() == mo->id()) { + m_normal_cache.clear(); + const std::vector& points = po->get_support_points(); + auto mat = (po->trafo() * po->model_object()->volumes.front()->get_transformation().get_matrix()).inverse().cast(); + for (unsigned int i=0; isla_points_status = sla::PointsStatus::AutoGenerated; + break; + } + } + + // We don't copy the data into ModelObject, as this would stop the background processing. +} + + + +void GLGizmoSlaSupports::auto_generate() +{ + //wxMessageDialog dlg(GUI::wxGetApp().plater(), + MessageDialog 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); + + 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(); }); + mo->sla_points_status = sla::PointsStatus::Generating; + } +} + + + +void GLGizmoSlaSupports::switch_to_editing_mode() +{ + wxGetApp().plater()->enter_gizmos_stack(); + m_editing_mode = true; + m_editing_cache.clear(); + for (const sla::SupportPoint& sp : m_normal_cache) + m_editing_cache.emplace_back(sp); + select_point(NoPoints); +#if ENABLE_RAYCAST_PICKING + on_register_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + + m_c->instances_hider()->show_supports(false); + m_parent.set_as_dirty(); +} + + +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(); +#if ENABLE_RAYCAST_PICKING + on_unregister_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + } + wxGetApp().plater()->get_notification_manager()->close_notification_of_type(NotificationType::QuitSLAManualMode); +} + + + +bool GLGizmoSlaSupports::unsaved_changes() const +{ + if (m_editing_cache.size() != m_normal_cache.size()) + return true; + + for (size_t i=0; i>* raycasters = m_parent.get_raycasters_for_picking(SceneRaycaster::EType::Volume); + if (raycasters != nullptr) { + const Selection& selection = m_parent.get_selection(); + const Selection::IndicesList ids = selection.get_volume_idxs(); + for (unsigned int id : ids) { + const GLVolume* v = selection.get_volume(id); + if (v->is_sla_pad() || v->is_sla_support()) { + auto it = std::find_if(raycasters->begin(), raycasters->end(), [v](std::shared_ptr item) { return item->get_raycaster() == v->mesh_raycaster.get(); }); + if (it != raycasters->end()) + (*it)->set_active(state); + } + } + } +} + +void GLGizmoSlaSupports::update_raycasters_for_picking_transform() +{ + if (!m_editing_cache.empty()) { + assert(!m_raycasters.empty()); + + const GLVolume* vol = m_parent.get_selection().get_first_volume(); + const Geometry::Transformation transformation(vol->world_matrix()); + const Transform3d instance_scaling_matrix_inverse = transformation.get_scaling_factor_matrix().inverse(); + for (size_t i = 0; i < m_editing_cache.size(); ++i) { + const Transform3d support_matrix = Geometry::translation_transform(m_editing_cache[i].support_point.pos.cast()) * instance_scaling_matrix_inverse; + + if (m_editing_cache[i].normal == Vec3f::Zero()) + 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::UnitZ(), instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast()); + const Eigen::AngleAxisd aa(q); + const Transform3d cone_matrix = vol->world_matrix() * support_matrix * Transform3d(aa.toRotationMatrix()) * + Geometry::assemble_transform((CONE_HEIGHT + m_editing_cache[i].support_point.head_front_radius * RenderPointScale) * Vec3d::UnitZ(), + Vec3d(PI, 0.0, 0.0), Vec3d(CONE_RADIUS, CONE_RADIUS, CONE_HEIGHT)); + m_raycasters[i].second->set_transform(cone_matrix); + + const double radius = (double)m_editing_cache[i].support_point.head_front_radius * RenderPointScale; + const Transform3d sphere_matrix = vol->world_matrix() * support_matrix * Geometry::scale_transform(radius); + m_raycasters[i].first->set_transform(sphere_matrix); + } + } +} +#endif // ENABLE_RAYCAST_PICKING + +SlaGizmoHelpDialog::SlaGizmoHelpDialog() +: wxDialog(nullptr, wxID_ANY, _L("SLA gizmo keyboard shortcuts"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER) +{ + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + const wxString ctrl = GUI::shortkey_ctrl_prefix(); + const wxString alt = GUI::shortkey_alt_prefix(); + + + // fonts + const wxFont& font = wxGetApp().small_font(); + const wxFont& bold_font = wxGetApp().bold_font(); + + auto note_text = new wxStaticText(this, wxID_ANY, _L("Note: some shortcuts work in (non)editing mode only.")); + note_text->SetFont(font); + + auto vsizer = new wxBoxSizer(wxVERTICAL); + auto gridsizer = new wxFlexGridSizer(2, 5, 15); + auto hsizer = new wxBoxSizer(wxHORIZONTAL); + + hsizer->AddSpacer(20); + hsizer->Add(vsizer); + hsizer->AddSpacer(20); + + vsizer->AddSpacer(20); + vsizer->Add(note_text, 1, wxALIGN_CENTRE_HORIZONTAL); + vsizer->AddSpacer(20); + vsizer->Add(gridsizer); + vsizer->AddSpacer(20); + + std::vector> shortcuts; + shortcuts.push_back(std::make_pair(_L("Left click"), _L("Add point"))); + shortcuts.push_back(std::make_pair(_L("Right click"), _L("Remove point"))); + shortcuts.push_back(std::make_pair(_L("Drag"), _L("Move point"))); + shortcuts.push_back(std::make_pair(ctrl+_L("Left click"), _L("Add point to selection"))); + shortcuts.push_back(std::make_pair(alt+_L("Left click"), _L("Remove point from selection"))); + shortcuts.push_back(std::make_pair(wxString("Shift+")+_L("Drag"), _L("Select by rectangle"))); + shortcuts.push_back(std::make_pair(alt+_(L("Drag")), _L("Deselect by rectangle"))); + shortcuts.push_back(std::make_pair(ctrl+"A", _L("Select all points"))); + shortcuts.push_back(std::make_pair("Delete", _L("Remove selected points"))); + shortcuts.push_back(std::make_pair(ctrl+_L("Mouse wheel"), _L("Move clipping plane"))); + shortcuts.push_back(std::make_pair("R", _L("Reset clipping plane"))); + shortcuts.push_back(std::make_pair("Enter", _L("Apply changes"))); + shortcuts.push_back(std::make_pair("Esc", _L("Discard changes"))); + shortcuts.push_back(std::make_pair("M", _L("Switch to editing mode"))); + shortcuts.push_back(std::make_pair("A", _L("Auto-generate points"))); + + for (const auto& pair : shortcuts) { + auto shortcut = new wxStaticText(this, wxID_ANY, pair.first); + auto desc = new wxStaticText(this, wxID_ANY, pair.second); + shortcut->SetFont(bold_font); + desc->SetFont(font); + gridsizer->Add(shortcut, -1, wxALIGN_CENTRE_VERTICAL); + gridsizer->Add(desc, -1, wxALIGN_CENTRE_VERTICAL); + } + + SetSizer(hsizer); + hsizer->SetSizeHints(this); +} + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp index 5eb29823ee..ed48b6e5e2 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -77,13 +77,27 @@ public: /// Keep information about mouse click /// Return True when use the information otherwise False. bool on_mouse(const wxMouseEvent &mouse_event) override; + private: bool on_init() override; void on_render() override; +#if ENABLE_RAYCAST_PICKING + virtual void on_register_raycasters_for_picking() override; + virtual void on_unregister_raycasters_for_picking() override; +#else void on_render_for_picking() override; +#endif // ENABLE_RAYCAST_PICKING +#if ENABLE_RAYCAST_PICKING + void render_points(const Selection& selection); +#else void render_points(const Selection& selection, bool picking = false); +#endif // ENABLE_RAYCAST_PICKING bool unsaved_changes() const; +#if ENABLE_RAYCAST_PICKING + void set_sla_auxiliary_volumes_picking_state(bool state); + void update_raycasters_for_picking_transform(); +#endif // ENABLE_RAYCAST_PICKING bool m_lock_unique_islands = false; bool m_editing_mode = false; // Is editing mode active? @@ -96,9 +110,15 @@ private: std::vector m_normal_cache; // to restore after discarding changes or undo/redo ObjectID m_old_mo_id; +#if ENABLE_RAYCAST_PICKING + PickingModel m_sphere; + PickingModel m_cone; + std::vector, std::shared_ptr>> m_raycasters; +#else GLModel m_cone; - GLModel m_cylinder; GLModel m_sphere; +#endif // ENABLE_RAYCAST_PICKING + GLModel m_cylinder; // 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. diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp index a77c1dd307..ce3ba1d4ab 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -1,567 +1,570 @@ -#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_first_volume()->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); - canvas->set_use_clipping_planes(true); - // Some objects may be sinking, do not show whatever is below the bed. - canvas->set_clipping_plane(0, ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); - canvas->set_clipping_plane(1, ClippingPlane(-Vec3d::UnitZ(), std::numeric_limits::max())); - - - std::vector meshes; - 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_plane(ClippingPlane(-Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); - m_clippers.back()->set_mesh(*mesh); - } - m_old_meshes = meshes; - } - } - else - canvas->toggle_model_objects_visibility(true); -} - -void InstancesHider::on_release() -{ - get_pool()->get_canvas()->toggle_model_objects_visibility(true); - get_pool()->get_canvas()->set_use_clipping_planes(false); - m_old_meshes.clear(); - m_clippers.clear(); -} - -void InstancesHider::show_supports(bool show) { - if (m_show_supports != show) { - m_show_supports = show; - on_update(); - } -} - -void InstancesHider::render_cut() const -{ - 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_transformation(trafo); - const ObjectClipper* obj_clipper = get_pool()->object_clipper(); - if (obj_clipper->is_valid() && obj_clipper->get_clipping_plane() - && obj_clipper->get_position() != 0.) { - ClippingPlane clp = *get_pool()->object_clipper()->get_clipping_plane(); - clp.set_normal(-clp.get_normal()); - clipper->set_limiting_plane(clp); - } - else - clipper->set_limiting_plane(ClippingPlane::ClipsNothing()); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -#if !ENABLE_LEGACY_OPENGL_REMOVAL - if (mv->is_model_part()) - glsafe(::glColor3f(0.8f, 0.3f, 0.0f)); - else { - const ColorRGBA color = color_from_model_volume(*mv); - glsafe(::glColor4fv(color.data())); - } -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL - glsafe(::glPushAttrib(GL_DEPTH_TEST)); - glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_LEGACY_OPENGL_REMOVAL - clipper->render_cut(mv->is_model_part() ? ColorRGBA(0.8f, 0.3f, 0.0f, 1.0f) : color_from_model_volume(*mv)); -#else - clipper->render_cut(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - glsafe(::glPopAttrib()); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - - ++clipper_id; - } -} - - - -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 >= 0 && m_print_object_idx < int(print_objects.size())) - ? 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_slice(); - if (! backend_mesh.empty()) { - m_hollowed_mesh_transformed.reset(new TriangleMesh(backend_mesh)); - Transform3d trafo_inv = (canvas->sla_print()->sla_trafo(*mo) * print_object->model_object()->volumes.front()->get_transformation().get_matrix()).inverse(); - m_hollowed_mesh_transformed->transform(trafo_inv); - m_drainholes = print_object->model_object()->sla_drain_holes; - m_old_hollowing_timestamp = timestamp; - - indexed_triangle_set interior = print_object->hollowed_interior_mesh(); - its_flip_triangles(interior); - m_hollowed_interior_transformed = std::make_unique(std::move(interior)); - m_hollowed_interior_transformed->transform(trafo_inv); - } - 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(); -} - -const TriangleMesh* HollowedMesh::get_hollowed_interior() const -{ - return m_hollowed_interior_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; - - if (has_hollowed) - m_clippers.front()->set_negative_mesh(*get_pool()->hollowed_mesh()->get_hollowed_interior()); - - m_active_inst_bb_radius = - mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius(); - } -} - - -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(); - const Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); - - size_t clipper_id = 0; - for (const ModelVolume* mv : mo->volumes) { - const 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); - clipper->set_limiting_plane(ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_LEGACY_OPENGL_REMOVAL - clipper->render_cut({ 1.0f, 0.37f, 0.0f, 1.0f }); -#else - glsafe(::glColor3f(1.0f, 0.37f, 0.0f)); - clipper->render_cut(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - - ++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 >= 0 && m_print_object_idx < int(print_objects.size())) - ? 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(); - const 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); - -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPushMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_clipper->render_cut({ 1.0f, 0.f, 0.37f, 1.0f }); -#else - glsafe(::glColor3f(1.0f, 0.f, 0.37f)); - m_clipper->render_cut(); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES -} - - -} // namespace GUI -} // namespace Slic3r +#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_first_volume()->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); + canvas->set_use_clipping_planes(true); + // Some objects may be sinking, do not show whatever is below the bed. + canvas->set_clipping_plane(0, ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); + canvas->set_clipping_plane(1, ClippingPlane(-Vec3d::UnitZ(), std::numeric_limits::max())); + + + std::vector meshes; + 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_plane(ClippingPlane(-Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); + m_clippers.back()->set_mesh(*mesh); + } + m_old_meshes = meshes; + } + } + else + canvas->toggle_model_objects_visibility(true); +} + +void InstancesHider::on_release() +{ + get_pool()->get_canvas()->toggle_model_objects_visibility(true); + get_pool()->get_canvas()->set_use_clipping_planes(false); + m_old_meshes.clear(); + m_clippers.clear(); +} + +void InstancesHider::show_supports(bool show) { + if (m_show_supports != show) { + m_show_supports = show; + on_update(); + } +} + +void InstancesHider::render_cut() const +{ + 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_transformation(trafo); + const ObjectClipper* obj_clipper = get_pool()->object_clipper(); + if (obj_clipper->is_valid() && obj_clipper->get_clipping_plane() + && obj_clipper->get_position() != 0.) { + ClippingPlane clp = *get_pool()->object_clipper()->get_clipping_plane(); + clp.set_normal(-clp.get_normal()); + clipper->set_limiting_plane(clp); + } + else + clipper->set_limiting_plane(ClippingPlane::ClipsNothing()); + +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPushMatrix()); + if (mv->is_model_part()) + glsafe(::glColor3f(0.8f, 0.3f, 0.0f)); + else { + const ColorRGBA color = color_from_model_volume(*mv); + glsafe(::glColor4fv(color.data())); + } +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + bool depth_test_enabled = ::glIsEnabled(GL_DEPTH_TEST); +#else + glsafe(::glPushAttrib(GL_DEPTH_TEST)); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + glsafe(::glDisable(GL_DEPTH_TEST)); +#if ENABLE_LEGACY_OPENGL_REMOVAL + clipper->render_cut(mv->is_model_part() ? ColorRGBA(0.8f, 0.3f, 0.0f, 1.0f) : color_from_model_volume(*mv)); +#else + clipper->render_cut(); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + if (depth_test_enabled) + glsafe(::glEnable(GL_DEPTH_TEST)); +#else + glsafe(::glPopAttrib()); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES +#if !ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glPopMatrix()); +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + + ++clipper_id; + } +} + + + +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 >= 0 && m_print_object_idx < int(print_objects.size())) + ? 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_slice(); + if (! backend_mesh.empty()) { + m_hollowed_mesh_transformed.reset(new TriangleMesh(backend_mesh)); + Transform3d trafo_inv = (canvas->sla_print()->sla_trafo(*mo) * print_object->model_object()->volumes.front()->get_transformation().get_matrix()).inverse(); + m_hollowed_mesh_transformed->transform(trafo_inv); + m_drainholes = print_object->model_object()->sla_drain_holes; + m_old_hollowing_timestamp = timestamp; + + indexed_triangle_set interior = print_object->hollowed_interior_mesh(); + its_flip_triangles(interior); + m_hollowed_interior_transformed = std::make_unique(std::move(interior)); + m_hollowed_interior_transformed->transform(trafo_inv); + } + 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(); +} + +const TriangleMesh* HollowedMesh::get_hollowed_interior() const +{ + return m_hollowed_interior_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) +#if ENABLE_RAYCAST_PICKING + m_raycasters.emplace_back(new MeshRaycaster(std::make_shared(*mesh))); +#else + m_raycasters.emplace_back(new MeshRaycaster(*mesh)); +#endif // ENABLE_RAYCAST_PICKING + 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; + + if (has_hollowed) + m_clippers.front()->set_negative_mesh(*get_pool()->hollowed_mesh()->get_hollowed_interior()); + + m_active_inst_bb_radius = + mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius(); + } +} + + +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(); + const Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation(); + + size_t clipper_id = 0; + for (const ModelVolume* mv : mo->volumes) { + const 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); + clipper->set_limiting_plane(ClippingPlane(Vec3d::UnitZ(), -SINKING_Z_THRESHOLD)); +#if ENABLE_LEGACY_OPENGL_REMOVAL + clipper->render_cut({ 1.0f, 0.37f, 0.0f, 1.0f }); +#else + glsafe(::glPushMatrix()); + glsafe(::glColor3f(1.0f, 0.37f, 0.0f)); + clipper->render_cut(); + glsafe(::glPopMatrix()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL + + ++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 >= 0 && m_print_object_idx < int(print_objects.size())) + ? 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(); + const 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); + +#if ENABLE_LEGACY_OPENGL_REMOVAL + m_clipper->render_cut({ 1.0f, 0.f, 0.37f, 1.0f }); +#else + glsafe(::glPushMatrix()); + glsafe(::glColor3f(1.0f, 0.f, 0.37f)); + m_clipper->render_cut(); + glsafe(::glPopMatrix()); +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +} + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp index 228f5b58c3..7dd2c110ea 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -73,7 +73,7 @@ enum class CommonGizmosDataID { // by GLGizmoManager, the gizmos keep a pointer to it. class CommonGizmosDataPool { public: - CommonGizmosDataPool(GLCanvas3D* canvas); + explicit CommonGizmosDataPool(GLCanvas3D* canvas); // Update all resources and release what is not used. // Accepts a bitmask of currently required resources. diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 20a3da1faf..b7b597ca1e 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -126,7 +126,7 @@ bool GLGizmosManager::init() return true; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL bool GLGizmosManager::init_arrow(const std::string& filename) { if (m_arrow_texture.get_id() != 0) @@ -151,7 +151,7 @@ bool GLGizmosManager::init_arrow(const BackgroundTexture::Metadata & arrow_textu return res; } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmosManager::set_overlay_icon_size(float size) { @@ -333,6 +333,7 @@ void GLGizmosManager::render_painter_gizmo() gizmo->render_painter_gizmo(); } +#if !ENABLE_RAYCAST_PICKING void GLGizmosManager::render_current_gizmo_for_picking_pass() const { if (! m_enabled || m_current == Undefined) @@ -341,6 +342,7 @@ void GLGizmosManager::render_current_gizmo_for_picking_pass() const m_gizmos[m_current]->render_for_picking(); } +#endif // !ENABLE_RAYCAST_PICKING void GLGizmosManager::render_overlay() { @@ -684,7 +686,7 @@ void GLGizmosManager::update_after_undo_redo(const UndoRedo::Snapshot& snapshot) dynamic_cast(m_gizmos[SlaSupports].get())->reslice_SLA_supports(true); } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmosManager::render_background(float left, float top, float right, float bottom, float border_w, float border_h) const { const unsigned int tex_id = m_background_texture.texture.get_id(); @@ -790,9 +792,9 @@ void GLGizmosManager::render_background(float left, float top, float right, floa GLTexture::render_sub_texture(tex_id, internal_right, right, bottom, internal_bottom, { { internal_right_uv, bottom_uv }, { right_uv, bottom_uv }, { right_uv, internal_bottom_uv }, { internal_right_uv, internal_bottom_uv } }); } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_type) const { const std::vector selectable_idxs = get_selectable_idxs(); @@ -878,9 +880,9 @@ void GLGizmosManager::render_arrow(const GLCanvas3D& parent, EType highlighted_t zoomed_top_y -= zoomed_stride_y; } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void GLGizmosManager::do_render_overlay() const { const std::vector selectable_idxs = get_selectable_idxs(); @@ -1025,7 +1027,7 @@ void GLGizmosManager::do_render_overlay() const m_gizmos[m_current]->render_input_window(width, current_y, toolbar_top); } } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL float GLGizmosManager::get_scaled_total_height() const { @@ -1122,6 +1124,10 @@ bool GLGizmosManager::activate_gizmo(EType type) if (old_gizmo.get_state() != GLGizmoBase::Off) return false; // gizmo refused to be turned off, do nothing. +#if ENABLE_RAYCAST_PICKING + old_gizmo.unregister_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + if (!m_serializing && old_gizmo.wants_enter_leave_snapshots()) Plater::TakeSnapshot snapshot(wxGetApp().plater(), @@ -1151,6 +1157,10 @@ bool GLGizmosManager::activate_gizmo(EType type) return false; // gizmo refused to be turned on. } +#if ENABLE_RAYCAST_PICKING + new_gizmo.register_raycasters_for_picking(); +#endif // ENABLE_RAYCAST_PICKING + // sucessful activation of gizmo return true; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index e376ef05b8..26389324b4 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -106,11 +106,11 @@ private: GLTexture m_icons_texture; bool m_icons_texture_dirty; BackgroundTexture m_background_texture; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL GLTexture m_arrow_texture; #else BackgroundTexture m_arrow_texture; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL Layout m_layout; EType m_current; EType m_hover; @@ -138,11 +138,11 @@ public: bool init(); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL bool init_arrow(const std::string& filename); #else bool init_arrow(const BackgroundTexture::Metadata& arrow_texture); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL template void load(Archive& ar) @@ -214,7 +214,9 @@ public: bool is_hiding_instances() const; void render_current_gizmo() const; +#if !ENABLE_RAYCAST_PICKING void render_current_gizmo_for_picking_pass() const; +#endif // !ENABLE_RAYCAST_PICKING void render_painter_gizmo(); void render_overlay(); @@ -243,11 +245,11 @@ private: bool alt_down = false, bool control_down = false); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void render_background(float left, float top, float right, float bottom, float border_w, float border_h) const; #else void render_background(float left, float top, float right, float bottom, float border) const; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL void do_render_overlay() const; diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index dce996ce01..5bc0b2a53f 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -32,14 +32,11 @@ #include "I18N.hpp" #include "Search.hpp" #include "BitmapCache.hpp" -#if ENABLE_GL_IMGUI_SHADERS #include "GUI_App.hpp" -#endif // ENABLE_GL_IMGUI_SHADERS #include "../Utils/MacDarkMode.hpp" - -#include "nanosvg/nanosvg.h" -#include "nanosvg/nanosvgrast.h" +#include +#include // suggest location #include "libslic3r/ClipperUtils.hpp" // Slic3r::intersection @@ -72,9 +69,7 @@ static const std::map font_icons = { {ImGui::LegendColorChanges , "legend_colorchanges" }, {ImGui::LegendPausePrints , "legend_pauseprints" }, {ImGui::LegendCustomGCodes , "legend_customgcodes" }, -#if ENABLE_SHOW_TOOLPATHS_COG {ImGui::LegendCOG , "legend_cog" }, -#endif // ENABLE_SHOW_TOOLPATHS_COG {ImGui::LegendShells , "legend_shells" }, {ImGui::LegendToolMarker , "legend_toolmarker" }, #endif // ENABLE_LEGEND_TOOLBAR_ICONS @@ -238,6 +233,9 @@ bool ImGuiWrapper::update_mouse_data(wxMouseEvent& evt) io.MouseDown[0] = evt.LeftIsDown(); io.MouseDown[1] = evt.RightIsDown(); io.MouseDown[2] = evt.MiddleIsDown(); + io.MouseDoubleClicked[0] = evt.LeftDClick(); + io.MouseDoubleClicked[1] = evt.RightDClick(); + io.MouseDoubleClicked[2] = evt.MiddleDClick(); float wheel_delta = static_cast(evt.GetWheelDelta()); if (wheel_delta != 0.0f) io.MouseWheel = static_cast(evt.GetWheelRotation()) / wheel_delta; @@ -576,7 +574,7 @@ bool ImGuiWrapper::slider_float(const char* label, float* v, float v_min, float const float max_tooltip_width = ImGui::GetFontSize() * 20.0f; // let the label string start with "##" to hide the automatic label from ImGui::SliderFloat() - bool label_visible = !boost::algorithm::istarts_with(label, "##"); + bool label_visible = !boost::algorithm::starts_with(label, "##"); std::string str_label = label_visible ? std::string("##") + std::string(label) : std::string(label); // removes 2nd evenience of "##", if present @@ -1678,7 +1676,7 @@ void ImGuiWrapper::init_font(bool compress) glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); glsafe(::glPixelStorei(GL_UNPACK_ROW_LENGTH, 0)); - if (compress && GLEW_EXT_texture_compression_s3tc) + if (compress && OpenGLManager::are_compressed_textures_supported()) glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); else glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); @@ -1786,11 +1784,11 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) if (draw_data == nullptr || draw_data->CmdListsCount == 0) return; -#if ENABLE_GL_IMGUI_SHADERS +#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* shader = wxGetApp().get_shader("imgui"); if (shader == nullptr) return; -#endif // ENABLE_GL_IMGUI_SHADERS +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) ImGuiIO& io = ImGui::GetIO(); @@ -1799,7 +1797,7 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) if (fb_width == 0 || fb_height == 0) return; -#if ENABLE_GL_IMGUI_SHADERS +#if ENABLE_LEGACY_OPENGL_REMOVAL GLShaderProgram* curr_shader = wxGetApp().get_current_shader(); if (curr_shader != nullptr) curr_shader->stop_using(); @@ -1807,8 +1805,41 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) shader->start_using(); #else draw_data->ScaleClipRects(io.DisplayFramebufferScale); -#endif // ENABLE_GL_IMGUI_SHADERS +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + // Backup GL state + GLenum last_active_texture; glsafe(::glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture)); + GLuint last_program; glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program)); + GLuint last_texture; glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture)); + GLuint last_array_buffer; glsafe(::glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer)); + GLuint last_vertex_array_object = 0; + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object)); + GLint last_viewport[4]; glsafe(::glGetIntegerv(GL_VIEWPORT, last_viewport)); + GLint last_scissor_box[4]; glsafe(::glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box)); + GLenum last_blend_src_rgb; glsafe(::glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb)); + GLenum last_blend_dst_rgb; glsafe(::glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb)); + GLenum last_blend_src_alpha; glsafe(::glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha)); + GLenum last_blend_dst_alpha; glsafe(::glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha)); + GLenum last_blend_equation_rgb; glsafe(::glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb)); + GLenum last_blend_equation_alpha; glsafe(::glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha)); + GLboolean last_enable_blend = ::glIsEnabled(GL_BLEND); + GLboolean last_enable_cull_face = ::glIsEnabled(GL_CULL_FACE); + GLboolean last_enable_depth_test = ::glIsEnabled(GL_DEPTH_TEST); + GLboolean last_enable_stencil_test = ::glIsEnabled(GL_STENCIL_TEST); + GLboolean last_enable_scissor_test = ::glIsEnabled(GL_SCISSOR_TEST); + + // set new GL state + glsafe(::glActiveTexture(GL_TEXTURE0)); + glsafe(::glEnable(GL_BLEND)); + glsafe(::glBlendEquation(GL_FUNC_ADD)); + glsafe(::glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)); + glsafe(::glDisable(GL_CULL_FACE)); + glsafe(::glDisable(GL_DEPTH_TEST)); + glsafe(::glDisable(GL_STENCIL_TEST)); + glsafe(::glEnable(GL_SCISSOR_TEST)); +#else // We are using the OpenGL fixed pipeline to make the example code simpler to read! // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill. GLint last_texture; glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture)); @@ -1821,19 +1852,21 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); glsafe(::glDisable(GL_CULL_FACE)); glsafe(::glDisable(GL_DEPTH_TEST)); + glsafe(::glDisable(GL_STENCIL_TEST)); glsafe(::glEnable(GL_SCISSOR_TEST)); -#if !ENABLE_GL_IMGUI_SHADERS +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisable(GL_LIGHTING)); glsafe(::glDisable(GL_COLOR_MATERIAL)); glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); glsafe(::glEnableClientState(GL_TEXTURE_COORD_ARRAY)); glsafe(::glEnableClientState(GL_COLOR_ARRAY)); -#endif // !ENABLE_GL_IMGUI_SHADERS +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glEnable(GL_TEXTURE_2D)); glsafe(::glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)); glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES -#if ENABLE_GL_IMGUI_SHADERS +#if ENABLE_LEGACY_OPENGL_REMOVAL // Setup viewport, orthographic projection matrix // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. glsafe(::glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height)); @@ -1862,7 +1895,7 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); -#endif // ENABLE_GL_IMGUI_SHADERS +#endif // ENABLE_LEGACY_OPENGL_REMOVAL // Will project scissor/clipping rectangles into framebuffer space const ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports @@ -1873,20 +1906,23 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) const ImDrawList* cmd_list = draw_data->CmdLists[n]; const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; -#if ENABLE_GL_IMGUI_SHADERS +#if ENABLE_LEGACY_OPENGL_REMOVAL const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); +#if ENABLE_GL_CORE_PROFILE + GLuint vao_id = 0; + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) { + glsafe(::glGenVertexArrays(1, &vao_id)); + glsafe(::glBindVertexArray(vao_id)); + } +#endif // ENABLE_GL_CORE_PROFILE + GLuint vbo_id; glsafe(::glGenBuffers(1, &vbo_id)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, vbo_id)); glsafe(::glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, vtx_buffer, GL_STATIC_DRAW)); - GLuint ibo_id; - glsafe(::glGenBuffers(1, &ibo_id)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_id)); - glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, idx_buffer, GL_STATIC_DRAW)); - const int position_id = shader->get_attrib_location("Position"); if (position_id != -1) { glsafe(::glVertexAttribPointer(position_id, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, pos))); @@ -1902,11 +1938,16 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glVertexAttribPointer(color_id, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (const void*)IM_OFFSETOF(ImDrawVert, col))); glsafe(::glEnableVertexAttribArray(color_id)); } + + GLuint ibo_id; + glsafe(::glGenBuffers(1, &ibo_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, idx_buffer, GL_STATIC_DRAW)); #else glsafe(::glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos)))); glsafe(::glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv)))); glsafe(::glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col)))); -#endif // ENABLE_GL_IMGUI_SHADERS +#endif // ENABLE_LEGACY_OPENGL_REMOVAL for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; ++cmd_i) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; @@ -1914,7 +1955,7 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) // User callback (registered via ImDrawList::AddCallback) pcmd->UserCallback(cmd_list, pcmd); else { -#if ENABLE_GL_IMGUI_SHADERS +#if ENABLE_LEGACY_OPENGL_REMOVAL // Project scissor/clipping rectangles into framebuffer space const ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); const ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); @@ -1940,30 +1981,52 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) // Bind texture, Draw glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); glsafe(::glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset)); -#endif // ENABLE_GL_IMGUI_SHADERS +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GL_IMGUI_SHADERS - if (position_id != -1) - glsafe(::glDisableVertexAttribArray(position_id)); - if (uv_id != -1) - glsafe(::glDisableVertexAttribArray(uv_id)); +#if ENABLE_LEGACY_OPENGL_REMOVAL + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + if (color_id != -1) glsafe(::glDisableVertexAttribArray(color_id)); + if (uv_id != -1) + glsafe(::glDisableVertexAttribArray(uv_id)); + if (position_id != -1) + glsafe(::glDisableVertexAttribArray(position_id)); - glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); glsafe(::glDeleteBuffers(1, &ibo_id)); glsafe(::glDeleteBuffers(1, &vbo_id)); -#endif // ENABLE_GL_IMGUI_SHADERS +#if ENABLE_GL_CORE_PROFILE + if (vao_id > 0) + glsafe(::glDeleteVertexArrays(1, &vao_id)); +#endif // ENABLE_GL_CORE_PROFILE +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + // Restore modified GL state + glsafe(::glBindTexture(GL_TEXTURE_2D, last_texture)); + glsafe(::glActiveTexture(last_active_texture)); + if (OpenGLManager::get_gl_info().is_version_greater_or_equal_to(3, 0)) + glsafe(::glBindVertexArray(last_vertex_array_object)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer)); + glsafe(::glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha)); + glsafe(::glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha)); + if (last_enable_blend) glsafe(::glEnable(GL_BLEND)); else glsafe(::glDisable(GL_BLEND)); + if (last_enable_cull_face) glsafe(::glEnable(GL_CULL_FACE)); else glsafe(::glDisable(GL_CULL_FACE)); + if (last_enable_depth_test) glsafe(::glEnable(GL_DEPTH_TEST)); else glsafe(::glDisable(GL_DEPTH_TEST)); + if (last_enable_stencil_test) glsafe(::glEnable(GL_STENCIL_TEST)); else glsafe(::glDisable(GL_STENCIL_TEST)); + if (last_enable_scissor_test) glsafe(::glEnable(GL_SCISSOR_TEST)); else glsafe(::glDisable(GL_SCISSOR_TEST)); + glsafe(::glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3])); + glsafe(::glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3])); +#else // Restore modified state glsafe(::glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_texture_env_mode)); glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture)); -#if !ENABLE_GL_IMGUI_SHADERS +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glDisableClientState(GL_COLOR_ARRAY)); glsafe(::glDisableClientState(GL_TEXTURE_COORD_ARRAY)); glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); @@ -1971,19 +2034,20 @@ void ImGuiWrapper::render_draw_data(ImDrawData *draw_data) glsafe(::glPopMatrix()); glsafe(::glMatrixMode(GL_PROJECTION)); glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_IMGUI_SHADERS +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopAttrib()); glsafe(::glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); - glsafe(::glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]))); + glsafe(::glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]))); glsafe(::glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3])); glsafe(::glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3])); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES -#if ENABLE_GL_IMGUI_SHADERS +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); if (curr_shader != nullptr) curr_shader->start_using(); -#endif // ENABLE_GL_IMGUI_SHADERS +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } bool ImGuiWrapper::display_initialized() const diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 9d322f729f..b14dc078c2 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -57,8 +57,8 @@ KBShortcutsDialog::KBShortcutsDialog() void KBShortcutsDialog::on_dpi_changed(const wxRect& suggested_rect) { - m_logo_bmp.msw_rescale(); - m_header_bitmap->SetBitmap(m_logo_bmp.bmp()); + //m_logo_bmp.msw_rescale(); + //m_header_bitmap->SetBitmap(m_logo_bmp.bmp()); msw_buttons_rescale(this, em_unit(), { wxID_OK }); Layout(); @@ -80,7 +80,7 @@ void KBShortcutsDialog::fill_shortcuts() { 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 + "I", L("Import STL/OBJ/AMF/3MF/STEP 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 @@ -173,10 +173,6 @@ void KBShortcutsDialog::fill_shortcuts() { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, #endif // __APPLE__ #endif // _WIN32 -#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({ { _L("Plater"), "" }, plater_shortcuts }); @@ -271,8 +267,8 @@ wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_f sizer->AddStretchSpacer(); // logo - m_logo_bmp = ScalableBitmap(this, wxGetApp().logo_name(), 32); - m_header_bitmap = new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp()); + m_header_bitmap = new wxStaticBitmap(panel, wxID_ANY, *get_bmp_bundle(wxGetApp().logo_name(), 32)); + sizer->Add(m_header_bitmap, 0, wxEXPAND | wxLEFT | wxRIGHT, 10); // text diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 0ec2b99643..04b95da464 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -622,6 +622,13 @@ void MainFrame::shutdown() wxGetApp().plater_ = nullptr; } +GalleryDialog* MainFrame::gallery_dialog() +{ + if (!m_gallery_dialog) + m_gallery_dialog = new GalleryDialog(this); + return m_gallery_dialog; +} + void MainFrame::update_title() { wxString title = wxEmptyString; @@ -1014,9 +1021,6 @@ void MainFrame::on_dpi_changed(const wxRect& suggested_rect) for (auto tab : wxGetApp().tabs_list) tab->msw_rescale(); - for (size_t id = 0; id < m_menubar->GetMenuCount(); id++) - msw_rescale_menu(m_menubar->GetMenu(id)); - // Workarounds for correct Window rendering after rescale /* Even if Window is maximized during moving, @@ -1051,7 +1055,7 @@ void MainFrame::on_sys_color_changed() #ifdef _MSW_DARK_MODE // update common mode sizer if (!wxGetApp().tabs_as_menu()) - dynamic_cast(m_tabpanel)->Rescale(); + dynamic_cast(m_tabpanel)->OnColorsChanged(); #endif #endif @@ -1215,7 +1219,7 @@ void MainFrame::init_menubar_as_editor() fileMenu->AppendSeparator(); wxMenu* import_menu = new wxMenu(); - append_menu_item(import_menu, wxID_ANY, _L("Import STL/OBJ/AM&F/3MF") + dots + "\tCtrl+I", _L("Load a model"), + append_menu_item(import_menu, wxID_ANY, _L("Import STL/OBJ/AM&F/3MF/STEP") + 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); @@ -1416,11 +1420,10 @@ void MainFrame::init_menubar_as_editor() windowMenu->AppendSeparator(); append_menu_item(windowMenu, wxID_ANY, _L("Shape Gallery"), _L("Open the dialog to modify shape gallery"), - [this](wxCommandEvent&) { - GalleryDialog dlg(this, true); - if (dlg.ShowModal() == wxID_OK) { + [this](wxCommandEvent&) { + if (gallery_dialog()->show(true) == wxID_OK) { wxArrayString input_files; - dlg.get_input_files(input_files); + m_gallery_dialog->get_input_files(input_files); if (!input_files.IsEmpty()) m_plater->sidebar().obj_list()->load_shape_object_from_gallery(input_files); } @@ -1612,9 +1615,9 @@ void MainFrame::update_menubar() 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_menu_bitmap(is_fff ? "spool" : "resin")); + m_changeable_menu_items[miMaterialTab] ->SetBitmap(*get_bmp_bundle(is_fff ? "spool" : "resin")); - m_changeable_menu_items[miPrinterTab] ->SetBitmap(create_menu_bitmap(is_fff ? "printer" : "sla_printer")); + m_changeable_menu_items[miPrinterTab] ->SetBitmap(*get_bmp_bundle(is_fff ? "printer" : "sla_printer")); } #if 0 diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index f385ee8f85..893febf4bd 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -33,6 +33,7 @@ class PrintHostQueueDialog; class Plater; class MainFrame; class PreferencesDialog; +class GalleryDialog; enum QuickSlice { @@ -146,6 +147,7 @@ public: void shutdown(); Plater* plater() { return m_plater; } + GalleryDialog* gallery_dialog(); void update_title(); @@ -207,6 +209,7 @@ public: PreferencesDialog* preferences_dialog { nullptr }; PrintHostQueueDialog* m_printhost_queue_dlg; // std::shared_ptr m_statusbar; + GalleryDialog* m_gallery_dialog{ nullptr }; #ifdef __APPLE__ std::unique_ptr m_taskbar_icon; diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index f2cefd6e1a..1abb126286 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -8,11 +8,9 @@ #if ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" #endif // ENABLE_LEGACY_OPENGL_REMOVAL #include "slic3r/GUI/Camera.hpp" -#if ENABLE_GL_SHADERS_ATTRIBUTES -#include "slic3r/GUI/Plater.hpp" -#endif // ENABLE_GL_SHADERS_ATTRIBUTES #include @@ -90,11 +88,9 @@ void MeshClipper::render_cut() GLShaderProgram* shader = wxGetApp().get_shader("flat"); if (shader != nullptr) { shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader->set_uniform("view_model_matrix", camera.get_view_matrix()); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_model.set_color(color); m_model.render(); shader->stop_using(); @@ -238,8 +234,13 @@ Vec3f MeshRaycaster::get_triangle_normal(size_t facet_idx) const return m_normals[facet_idx]; } +#if ENABLE_RAYCAST_PICKING void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, Vec3d& point, Vec3d& direction) +#else +void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction) const +#endif // ENABLE_RAYCAST_PICKING { Matrix4d modelview = camera.get_view_matrix().matrix(); Matrix4d projection= camera.get_projection_matrix().matrix(); @@ -247,9 +248,9 @@ void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3 Vec3d pt1; Vec3d pt2; - igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 0.), + igl::unproject(Vec3d(mouse_pos.x(), viewport[3] - mouse_pos.y(), 0.), modelview, projection, viewport, pt1); - igl::unproject(Vec3d(mouse_pos(0), viewport[3] - mouse_pos(1), 1.), + igl::unproject(Vec3d(mouse_pos.x(), viewport[3] - mouse_pos.y(), 1.), modelview, projection, viewport, pt2); Transform3d inv = trafo.inverse(); @@ -354,6 +355,40 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo return out; } +#if ENABLE_RAYCAST_PICKING +bool MeshRaycaster::closest_hit(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); + + const std::vector hits = m_emesh.query_ray_hits(point, direction.normalized()); + + if (hits.empty()) + return false; // no intersection found + + size_t hit_id = 0; + if (clipping_plane != nullptr) { + while (hit_id < hits.size() && clipping_plane->is_point_clipped(trafo * hits[hit_id].position())) { + ++hit_id; + } + } + + if (hit_id == hits.size()) + return false; // all points are obscured or cut by the clipping plane. + + const AABBMesh::hit_result& hit = hits[hit_id]; + + position = hit.position().cast(); + normal = hit.normal().cast(); + + if (facet_idx != nullptr) + *facet_idx = hit.face(); + + return true; +} +#endif // ENABLE_RAYCAST_PICKING Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const { diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index b03ca2f9ec..9f7d394a95 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -14,6 +14,9 @@ #endif // ENABLE_LEGACY_OPENGL_REMOVAL #include +#if ENABLE_RAYCAST_PICKING +#include +#endif // ENABLE_RAYCAST_PICKING namespace Slic3r { @@ -57,6 +60,10 @@ public: void set_offset(double offset) { m_data[3] = offset; } double get_offset() const { return m_data[3]; } Vec3d get_normal() const { return Vec3d(m_data[0], m_data[1], m_data[2]); } +#if ENABLE_RAYCAST_PICKING + void invert_normal() { m_data[0] *= -1.0; m_data[1] *= -1.0; m_data[2] *= -1.0; } + ClippingPlane inverted_normal() const { return ClippingPlane(-get_normal(), get_offset()); } +#endif // ENABLE_RAYCAST_PICKING bool is_active() const { return m_data[3] != DBL_MAX; } static ClippingPlane ClipsNothing() { return ClippingPlane(Vec3d(0., 0., 1.), DBL_MAX); } const std::array& get_data() const { return m_data; } @@ -123,6 +130,18 @@ private: // whether certain points are visible or obscured by the mesh etc. class MeshRaycaster { public: +#if ENABLE_RAYCAST_PICKING + explicit MeshRaycaster(std::shared_ptr mesh) + : m_mesh(mesh) + , m_emesh(*mesh, true) // calculate epsilon for triangle-ray intersection from an average edge length + , m_normals(its_face_normals(mesh->its)) + { + assert(m_mesh != nullptr); + } + + static void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction); +#else // The class references extern TriangleMesh, which must stay alive // during MeshRaycaster existence. MeshRaycaster(const TriangleMesh& mesh) @@ -131,8 +150,9 @@ public: { } - static void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3d& point, Vec3d& direction); + void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction) const; +#endif // ENABLE_RAYCAST_PICKING // Given a mouse position, this returns true in case it is on the mesh. bool unproject_on_mesh( @@ -155,10 +175,24 @@ public: const ClippingPlane* clipping_plane = nullptr // clipping plane (if active) ) const; +#if ENABLE_RAYCAST_PICKING + // Returns true if the ray, built from mouse position and camera direction, intersects the mesh. + // In this case, position and normal contain the position and normal, in model coordinates, of the intersection closest to the camera, + // depending on the position/orientation of the clipping_plane, if specified + bool closest_hit( + 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; +#endif // ENABLE_RAYCAST_PICKING + // 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; // Given a point in mesh coords, the method returns the closest facet from mesh. @@ -167,11 +201,26 @@ public: Vec3f get_triangle_normal(size_t facet_idx) const; private: +#if ENABLE_RAYCAST_PICKING + std::shared_ptr m_mesh; +#endif // ENABLE_RAYCAST_PICKING AABBMesh m_emesh; std::vector m_normals; }; - +#if ENABLE_RAYCAST_PICKING +struct PickingModel +{ + GLModel model; + std::unique_ptr mesh_raycaster; + + void reset() { + model.reset(); + mesh_raycaster.reset(); + } +}; +#endif // ENABLE_RAYCAST_PICKING + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 94e9ca5f3b..43e13841c5 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -99,9 +99,10 @@ void MsgDialog::apply_style(long style) if (style & wxNO) add_button(wxID_NO, (style & wxNO_DEFAULT)); if (style & wxCANCEL) add_button(wxID_CANCEL, (style & wxCANCEL_DEFAULT)); - logo->SetBitmap( create_scaled_bitmap(style & wxICON_WARNING ? "exclamation" : - style & wxICON_INFORMATION ? "info" : - style & wxICON_QUESTION ? "question" : "PrusaSlicer", this, 64, style & wxICON_ERROR)); + std::string icon_name = style & wxICON_WARNING ? "exclamation" : + style & wxICON_INFORMATION ? "info" : + style & wxICON_QUESTION ? "question" : "PrusaSlicer"; + logo->SetBitmap(*get_bmp_bundle(icon_name, 64)); } void MsgDialog::finalize() @@ -230,7 +231,7 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg, bool monospaced_ add_msg_content(this, content_sizer, msg, monospaced_font); // Use a small bitmap with monospaced font, as the error text will not be wrapped. - logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, monospaced_font ? 48 : /*1*/84)); + logo->SetBitmap(*get_bmp_bundle("PrusaSlicer_192px_grayscale.png", monospaced_font ? 48 : /*1*/84)); SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT*wxGetApp().em_unit())); diff --git a/src/slic3r/GUI/Notebook.cpp b/src/slic3r/GUI/Notebook.cpp index 9c5ccb834e..380b402d51 100644 --- a/src/slic3r/GUI/Notebook.cpp +++ b/src/slic3r/GUI/Notebook.cpp @@ -95,10 +95,6 @@ void ButtonsListCtrl::UpdateMode() void ButtonsListCtrl::Rescale() { - m_mode_sizer->msw_rescale(); - for (ScalableButton* btn : m_pageButtons) - btn->msw_rescale(); - int em = em_unit(this); m_btn_margin = std::lround(0.3 * em); m_line_margin = std::lround(0.1 * em); @@ -108,6 +104,14 @@ void ButtonsListCtrl::Rescale() m_sizer->Layout(); } +void ButtonsListCtrl::OnColorsChanged() +{ + for (ScalableButton* btn : m_pageButtons) + btn->sys_color_changed(); + + m_sizer->Layout(); +} + void ButtonsListCtrl::SetSelection(int sel) { if (m_selection == sel) diff --git a/src/slic3r/GUI/Notebook.hpp b/src/slic3r/GUI/Notebook.hpp index af03a6a080..bd6c5d85a8 100644 --- a/src/slic3r/GUI/Notebook.hpp +++ b/src/slic3r/GUI/Notebook.hpp @@ -21,6 +21,7 @@ public: void SetSelection(int sel); void UpdateMode(); void Rescale(); + void OnColorsChanged(); bool InsertPage(size_t n, const wxString& text, bool bSelect = false, const std::string& bmp_name = ""); void RemovePage(size_t n); bool SetPageImage(size_t n, const std::string& bmp_name) const; @@ -245,6 +246,11 @@ public: GetBtnsListCtrl()->Rescale(); } + void OnColorsChanged() + { + GetBtnsListCtrl()->OnColorsChanged(); + } + void OnNavigationKey(wxNavigationKeyEvent& event) { if (event.IsWindowChange()) { diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp index 1bd59b201d..ac3fb178e7 100644 --- a/src/slic3r/GUI/NotificationManager.cpp +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -795,6 +795,7 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW 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(); @@ -804,12 +805,21 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW imgui.text(_u8L("Eject drive") + " " + GUI::shortkey_ctrl_prefix() + "T"); ImGui::EndTooltip(); ImGui::PopStyleColor(); + // somehow the tooltip wont show if the render doesnt run twice + if (m_hover_once) { + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(0); + m_hover_once = false; + } } - if (m_hover_time == 0) + if (m_hover_time == 0) { m_hover_time = time_now; - } else + m_hover_once = true; + wxGetApp().plater()->get_current_canvas3D()->schedule_extra_frame(1500); + } + } else { m_hover_time = 0; - + m_hover_once = false; + } 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); @@ -834,6 +844,15 @@ void NotificationManager::ExportFinishedNotification::render_eject_button(ImGuiW } ImGui::PopStyleColor(5); } + +bool NotificationManager::ExportFinishedNotification::update_state(bool paused, const int64_t delta) +{ + bool ret = PopNotification::update_state(paused, delta); + if (!ret && m_hover_time != 0 && m_hover_time < wxGetLocalTime()) + return true; + return false; +} + bool NotificationManager::ExportFinishedNotification::on_text_click() { open_folder(m_export_dir_path); diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 2af4a80e41..23d4d20b05 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -670,6 +670,8 @@ private: bool m_to_removable; std::string m_export_path; std::string m_export_dir_path; + + bool update_state(bool paused, const int64_t delta) override; protected: // Reserves space on right for more buttons void count_spaces() override; @@ -689,6 +691,7 @@ private: void on_eject_click(); // local time of last hover for showing tooltip long m_hover_time { 0 }; + bool m_hover_once { false }; bool m_eject_pending { false }; }; diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 836ad0c38d..6c088aa797 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -19,12 +19,12 @@ static bool is_point_in_rect(const wxPoint& pt, const wxRect& rect) rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); } -static wxSize get_bitmap_size(const wxBitmap& bmp) +static wxSize get_bitmap_size(const wxBitmapBundle* bmp, wxWindow* parent) { -#ifdef __APPLE__ - return bmp.GetScaledSize(); +#ifdef __WIN32__ + return bmp->GetBitmapFor(parent).GetSize(); #else - return bmp.GetSize(); + return bmp->GetDefaultSize(); #endif } @@ -45,8 +45,8 @@ OG_CustomCtrl::OG_CustomCtrl( wxWindow* 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)); + m_bmp_mode_sz = get_bitmap_size(get_bmp_bundle("mode_simple", wxOSX ? 10 : 12), this); + m_bmp_blinking_sz = get_bitmap_size(get_bmp_bundle("search_blink"), this); init_ctrl_lines();// from og.lines() @@ -416,8 +416,8 @@ void OG_CustomCtrl::msw_rescale() m_v_gap = lround(1.0 * m_em_unit); m_h_gap = lround(0.2 * m_em_unit); - m_bmp_mode_sz = create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12).GetSize(); - m_bmp_blinking_sz = create_scaled_bitmap("search_blink", this).GetSize(); + m_bmp_mode_sz = get_bitmap_size(get_bmp_bundle("mode_simple", wxOSX ? 10 : 12), this); + m_bmp_blinking_sz = get_bitmap_size(get_bmp_bundle("search_blink"), this); m_max_win_width = 0; @@ -497,7 +497,7 @@ void OG_CustomCtrl::CtrlLine::msw_rescale() { // if we have a single option with no label, no sidetext if (draw_just_act_buttons) - height = get_bitmap_size(create_scaled_bitmap("empty")).GetHeight(); + height = get_bitmap_size(get_bmp_bundle("empty"), ctrl).GetHeight(); if (ctrl->opt_group->label_width != 0 && !og_line.label.IsEmpty()) { wxSize label_sz = ctrl->GetTextExtent(og_line.label); @@ -666,13 +666,13 @@ wxCoord OG_CustomCtrl::CtrlLine::draw_mode_bmp(wxDC& dc, wxCoord v_pos) ConfigOptionMode mode = og_line.get_options()[0].opt.mode; const std::string& bmp_name = mode == ConfigOptionMode::comSimple ? "mode_simple" : mode == ConfigOptionMode::comAdvanced ? "mode_advanced" : "mode_expert"; - wxBitmap bmp = create_scaled_bitmap(bmp_name, ctrl, wxOSX ? 10 : 12); - wxCoord y_draw = v_pos + lround((height - get_bitmap_size(bmp).GetHeight()) / 2); + wxBitmapBundle* bmp = get_bmp_bundle(bmp_name, wxOSX ? 10 : 12); + wxCoord y_draw = v_pos + lround((height - get_bitmap_size(bmp, ctrl).GetHeight()) / 2); if (og_line.get_options().front().opt.gui_type != ConfigOptionDef::GUIType::legend) - dc.DrawBitmap(bmp, 0, y_draw); + dc.DrawBitmap(bmp->GetBitmapFor(ctrl), 0, y_draw); - return get_bitmap_size(bmp).GetWidth() + ctrl->m_h_gap; + return get_bitmap_size(bmp, ctrl).GetWidth() + ctrl->m_h_gap; } wxCoord OG_CustomCtrl::CtrlLine::draw_text(wxDC& dc, wxPoint pos, const wxString& text, const wxColour* color, int width, bool is_url/* = false*/) @@ -734,33 +734,33 @@ wxCoord OG_CustomCtrl::CtrlLine::draw_text(wxDC& dc, wxPoint pos, const wxStr wxPoint OG_CustomCtrl::CtrlLine::draw_blinking_bmp(wxDC& dc, wxPoint pos, bool is_blinking) { - wxBitmap bmp_blinking = create_scaled_bitmap(is_blinking ? "search_blink" : "empty", ctrl); + wxBitmapBundle* bmp_blinking = get_bmp_bundle(is_blinking ? "search_blink" : "empty"); wxCoord h_pos = pos.x; - wxCoord v_pos = pos.y + lround((height - get_bitmap_size(bmp_blinking).GetHeight()) / 2); + wxCoord v_pos = pos.y + lround((height - get_bitmap_size(bmp_blinking, ctrl).GetHeight()) / 2); - dc.DrawBitmap(bmp_blinking, h_pos, v_pos); + dc.DrawBitmap(bmp_blinking->GetBitmapFor(ctrl), h_pos, v_pos); - int bmp_dim = get_bitmap_size(bmp_blinking).GetWidth(); + int bmp_dim = get_bitmap_size(bmp_blinking, ctrl).GetWidth(); h_pos += bmp_dim + ctrl->m_h_gap; return wxPoint(h_pos, v_pos); } -wxCoord OG_CustomCtrl::CtrlLine::draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmap& bmp_undo_to_sys, const wxBitmap& bmp_undo, bool is_blinking, size_t rect_id) +wxCoord OG_CustomCtrl::CtrlLine::draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmapBundle& bmp_undo_to_sys, const wxBitmapBundle& bmp_undo, bool is_blinking, size_t rect_id) { pos = draw_blinking_bmp(dc, pos, is_blinking); wxCoord h_pos = pos.x; wxCoord v_pos = pos.y; - dc.DrawBitmap(bmp_undo_to_sys, h_pos, v_pos); + dc.DrawBitmap(bmp_undo_to_sys.GetBitmapFor(ctrl), h_pos, v_pos); - int bmp_dim = get_bitmap_size(bmp_undo_to_sys).GetWidth(); + int bmp_dim = get_bitmap_size(&bmp_undo_to_sys, ctrl).GetWidth(); rects_undo_to_sys_icon[rect_id] = wxRect(h_pos, v_pos, bmp_dim, bmp_dim); h_pos += bmp_dim + ctrl->m_h_gap; - dc.DrawBitmap(bmp_undo, h_pos, v_pos); + dc.DrawBitmap(bmp_undo.GetBitmapFor(ctrl), h_pos, v_pos); - bmp_dim = get_bitmap_size(bmp_undo).GetWidth(); + bmp_dim = get_bitmap_size(&bmp_undo, ctrl).GetWidth(); rects_undo_icon[rect_id] = wxRect(h_pos, v_pos, bmp_dim, bmp_dim); h_pos += bmp_dim + ctrl->m_h_gap; diff --git a/src/slic3r/GUI/OG_CustomCtrl.hpp b/src/slic3r/GUI/OG_CustomCtrl.hpp index c15132fec2..0308322f7f 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.hpp +++ b/src/slic3r/GUI/OG_CustomCtrl.hpp @@ -63,7 +63,7 @@ class OG_CustomCtrl :public wxPanel wxCoord draw_mode_bmp(wxDC& dc, wxCoord v_pos); wxCoord draw_text (wxDC& dc, wxPoint pos, const wxString& text, const wxColour* color, int width, bool is_url = false); wxPoint draw_blinking_bmp(wxDC& dc, wxPoint pos, bool is_blinking); - wxCoord draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmap& bmp_undo_to_sys, const wxBitmap& bmp_undo, bool is_blinking, size_t rect_id = 0); + wxCoord draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmapBundle& bmp_undo_to_sys, const wxBitmapBundle& bmp_undo, bool is_blinking, size_t rect_id = 0); bool launch_browser() const; bool is_separator() const { return og_line.is_separator(); } diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp index 8a80ccc796..722a1278e4 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.cpp +++ b/src/slic3r/GUI/ObjectDataViewModel.cpp @@ -56,6 +56,7 @@ const std::map INFO_ITEMS{ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const wxString& sub_obj_name, Slic3r::ModelVolumeType type, + const wxBitmapBundle& bmp, const bool is_text_volume, const wxString& extruder, const int idx/* = -1*/, @@ -101,7 +102,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent } else if (type == itLayerRoot) { - m_bmp = create_scaled_bitmap(LayerRootIcon); // FIXME: pass window ptr + m_bmp = *get_bmp_bundle(LayerRootIcon); m_name = _(L("Layers")); } else if (type == itInfo) @@ -132,7 +133,7 @@ ObjectDataViewModelNode::ObjectDataViewModelNode(ObjectDataViewModelNode* parent } const std::string label_range = (boost::format(" %.2f-%.2f ") % layer_range.first % layer_range.second).str(); m_name = _(L("Range")) + label_range + "(" + _(L("mm")) + ")"; - m_bmp = create_scaled_bitmap(LayerIcon); // FIXME: pass window ptr + m_bmp = *get_bmp_bundle(LayerIcon); set_action_and_extruder_icons(); init_container(); @@ -151,7 +152,7 @@ void ObjectDataViewModelNode::set_action_and_extruder_icons() { m_action_icon_name = m_type & itObject ? "advanced_plus" : m_type & (itVolume | itLayer) ? "cog" : /*m_type & itInstance*/ "set_separate_obj"; - m_action_icon = create_scaled_bitmap(m_action_icon_name); // FIXME: pass window ptr + m_action_icon = *get_bmp_bundle(m_action_icon_name); // set extruder bitmap set_extruder_icon(); @@ -170,7 +171,7 @@ void ObjectDataViewModelNode::set_printable_icon(PrintIndicator printable) { m_printable = printable; m_printable_icon = m_printable == piUndef ? m_empty_bmp : - create_scaled_bitmap(m_printable == piPrintable ? "eye_open.png" : "eye_closed.png"); + *get_bmp_bundle(m_printable == piPrintable ? "eye_open" : "eye_closed"); } void ObjectDataViewModelNode::set_warning_icon(const std::string& warning_icon_name) @@ -185,14 +186,14 @@ void ObjectDataViewModelNode::update_settings_digest_bitmaps() m_bmp = m_empty_bmp; std::string scaled_bitmap_name = m_name.ToUTF8().data(); - scaled_bitmap_name += "-em" + std::to_string(wxGetApp().em_unit()) + (wxGetApp().dark_mode() ? "-dm" : ""); + scaled_bitmap_name += (wxGetApp().dark_mode() ? "-dm" : ""); - wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name); + wxBitmapBundle *bmp = m_bitmap_cache->find_bndl(scaled_bitmap_name); if (bmp == nullptr) { - std::vector bmps; + std::vector bmps; for (auto& category : m_opt_categories) - bmps.emplace_back(SettingsFactory::get_category_bitmap(category, false)); - bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); + bmps.emplace_back(SettingsFactory::get_category_bitmap(category)); + bmp = m_bitmap_cache->insert_bndl(scaled_bitmap_name, bmps); } m_bmp = *bmp; @@ -216,13 +217,13 @@ bool ObjectDataViewModelNode::update_settings_digest(const std::vectorfind(scaled_bitmap_name); + // TODO: usi text bitmap + wxBitmapBundle *bmp = m_bitmap_cache->find_bndl(scaled_bitmap_name); if (bmp == nullptr) { - std::vector bmps; + std::vector bmps; - bmps.emplace_back(GetWarningBitmap(warning_icon_name)); - bmps.emplace_back(bitmaps[node->volume_type()]); + bmps.emplace_back(&GetWarningBitmap(warning_icon_name)); + bmps.emplace_back(m_volume_bmps[static_cast(node.GetType())]); - bmp = m_bitmap_cache->insert(scaled_bitmap_name, bmps); + bmp = m_bitmap_cache->insert_bndl(scaled_bitmap_name, bmps); } return *bmp; } -wxBitmap ObjectDataViewModel::GetVolumeIcon(const ObjectDataViewModelNode* node) -{ - return GetVolumeIcon(node, node->m_warning_icon_name); -} - void ObjectDataViewModel::AddWarningIcon(const wxDataViewItem& item, const std::string& warning_icon_name) { if (!item.IsOk()) @@ -1757,7 +1755,7 @@ void ObjectDataViewModel::AddWarningIcon(const wxDataViewItem& item, const std:: } if (node->GetType() & itVolume) { - node->SetWarningBitmap(GetVolumeIcon(node, warning_icon_name), warning_icon_name); + node->SetWarningBitmap(GetVolumeIcon(*node, warning_icon_name), warning_icon_name); node->GetParent()->SetWarningBitmap(GetWarningBitmap(warning_icon_name), warning_icon_name); return; } @@ -1774,7 +1772,7 @@ void ObjectDataViewModel::DeleteWarningIcon(const wxDataViewItem& item, const bo return; if (node->GetType() & itVolume) { - node->SetWarningBitmap(m_volume_bmps[static_cast(node->volume_type())], ""); + node->SetWarningBitmap(*m_volume_bmps[static_cast(node->volume_type())], ""); return; } diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp index 9fdcc81ceb..95eb7f95d5 100644 --- a/src/slic3r/GUI/ObjectDataViewModel.hpp +++ b/src/slic3r/GUI/ObjectDataViewModel.hpp @@ -63,21 +63,21 @@ class ObjectDataViewModelNode { ObjectDataViewModelNode* m_parent; MyObjectTreeModelNodePtrArray m_children; - wxBitmap m_empty_bmp; + wxBitmapBundle m_empty_bmp; size_t m_volumes_cnt = 0; std::vector< std::string > m_opt_categories; t_layer_height_range m_layer_range = { 0.0f, 0.0f }; wxString m_name; - wxBitmap& m_bmp = m_empty_bmp; + wxBitmapBundle& m_bmp = m_empty_bmp; ItemType m_type; int m_idx = -1; bool m_container = false; wxString m_extruder = "default"; - wxBitmap m_extruder_bmp; - wxBitmap m_action_icon; + wxBitmapBundle m_extruder_bmp; + wxBitmapBundle m_action_icon; PrintIndicator m_printable {piUndef}; - wxBitmap m_printable_icon; + wxBitmapBundle m_printable_icon; std::string m_warning_icon_name{ "" }; std::string m_action_icon_name = ""; @@ -100,6 +100,7 @@ public: ObjectDataViewModelNode(ObjectDataViewModelNode* parent, const wxString& sub_obj_name, Slic3r::ModelVolumeType type, + const wxBitmapBundle& bmp, const bool is_text_volume, const wxString& extruder, const int idx = -1, @@ -179,10 +180,11 @@ public: } bool SetValue(const wxVariant &variant, unsigned int col); - void SetBitmap(const wxBitmap &icon) { m_bmp = icon; } + void SetVolumeType(ModelVolumeType type) { m_volume_type = type; } + void SetBitmap(const wxBitmapBundle &icon) { m_bmp = icon; } void SetExtruder(const wxString &extruder) { m_extruder = extruder; } - void SetWarningBitmap(const wxBitmap& icon, const std::string& warning_icon_name) { m_bmp = icon; m_warning_icon_name = warning_icon_name; } - const wxBitmap& GetBitmap() const { return m_bmp; } + void SetWarningBitmap(const wxBitmapBundle& icon, const std::string& warning_icon_name) { m_bmp = icon; m_warning_icon_name = warning_icon_name; } + const wxBitmapBundle& GetBitmap() const { return m_bmp; } const wxString& GetName() const { return m_name; } ItemType GetType() const { return m_type; } InfoItemType GetInfoItemType() const { return m_info_item_type; } @@ -236,6 +238,7 @@ public: int volume_type() const { return int(m_volume_type); } bool is_text_volume() const { return m_is_text_volume; } void msw_rescale(); + void sys_color_changed(); #ifndef NDEBUG bool valid(); @@ -258,12 +261,12 @@ wxDECLARE_EVENT(wxCUSTOMEVT_LAST_VOLUME_IS_DELETED, wxCommandEvent); class ObjectDataViewModel :public wxDataViewModel { std::vector m_objects; - std::vector m_volume_bmps; - std::vector m_text_volume_bmps; - std::map m_info_bmps; - wxBitmap m_empty_bmp; - wxBitmap m_warning_bmp; - wxBitmap m_warning_manifold_bmp; + std::vector m_volume_bmps; + std::vector m_text_volume_bmps; + std::map m_info_bmps; + wxBitmapBundle m_empty_bmp; + wxBitmapBundle m_warning_bmp; + wxBitmapBundle m_warning_manifold_bmp; wxDataViewCtrl* m_ctrl { nullptr }; @@ -318,7 +321,7 @@ public: // helper method for wxLog wxString GetName(const wxDataViewItem &item) const; - wxBitmap& GetBitmap(const wxDataViewItem &item) const; + wxBitmapBundle& GetBitmap(const wxDataViewItem &item) const; wxString GetExtruder(const wxDataViewItem &item) const; int GetExtruderNumber(const wxDataViewItem &item) const; @@ -385,12 +388,11 @@ public: wxDataViewItem SetObjectPrintableState(PrintIndicator printable, wxDataViewItem obj_item); void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; } - // Rescale bitmaps for existing Items - void Rescale(); + // Rescale bitmaps for existing Items + void UpdateBitmaps(); - wxBitmap GetVolumeIcon(const ObjectDataViewModelNode* node, - const std::string& warning_icon_name); - wxBitmap GetVolumeIcon(const ObjectDataViewModelNode* node); + wxBitmapBundle GetVolumeIcon(const ObjectDataViewModelNode& node, + const std::string& warning_icon_name = std::string()); void AddWarningIcon(const wxDataViewItem& item, const std::string& warning_name); void DeleteWarningIcon(const wxDataViewItem& item, const bool unmark_object = false); void UpdateWarningIcon(const wxDataViewItem& item, const std::string& warning_name); @@ -407,7 +409,7 @@ private: wxDataViewItem AddInstanceRoot(const wxDataViewItem& parent_item); void AddAllChildren(const wxDataViewItem& parent); - wxBitmap& GetWarningBitmap(const std::string& warning_icon_name); + wxBitmapBundle& GetWarningBitmap(const std::string& warning_icon_name); }; diff --git a/src/slic3r/GUI/OpenGLManager.cpp b/src/slic3r/GUI/OpenGLManager.cpp index 3bf0b1b270..2924470e07 100644 --- a/src/slic3r/GUI/OpenGLManager.cpp +++ b/src/slic3r/GUI/OpenGLManager.cpp @@ -2,6 +2,9 @@ #include "OpenGLManager.hpp" #include "GUI.hpp" +#if ENABLE_GL_CORE_PROFILE +#include "GUI_Init.hpp" +#endif // ENABLE_GL_CORE_PROFILE #include "I18N.hpp" #include "3DScene.hpp" @@ -30,6 +33,7 @@ namespace GUI { std::string gl_get_string_safe(GLenum param, const std::string& default_value) { const char* value = (const char*)::glGetString(param); + glcheck(); return std::string((value != nullptr) ? value : default_value); } @@ -95,10 +99,10 @@ float OpenGLManager::GLInfo::get_max_anisotropy() const void OpenGLManager::GLInfo::detect() const { - *const_cast(&m_version) = gl_get_string_safe(GL_VERSION, "N/A"); + *const_cast(&m_version) = gl_get_string_safe(GL_VERSION, "N/A"); *const_cast(&m_glsl_version) = gl_get_string_safe(GL_SHADING_LANGUAGE_VERSION, "N/A"); - *const_cast(&m_vendor) = gl_get_string_safe(GL_VENDOR, "N/A"); - *const_cast(&m_renderer) = gl_get_string_safe(GL_RENDERER, "N/A"); + *const_cast(&m_vendor) = gl_get_string_safe(GL_VENDOR, "N/A"); + *const_cast(&m_renderer) = gl_get_string_safe(GL_RENDERER, "N/A"); int* max_tex_size = const_cast(&m_max_tex_size); glsafe(::glGetIntegerv(GL_MAX_TEXTURE_SIZE, max_tex_size)); @@ -126,8 +130,16 @@ static bool version_greater_or_equal_to(const std::string& version, unsigned int if (tokens.empty()) return false; +#if ENABLE_OPENGL_ES + const std::string version_container = (tokens.size() > 1 && boost::istarts_with(tokens[1], "ES")) ? tokens[2] : tokens[0]; +#endif // ENABLE_OPENGL_ES + std::vector numbers; +#if ENABLE_OPENGL_ES + boost::split(numbers, version_container, boost::is_any_of("."), boost::token_compress_on); +#else boost::split(numbers, tokens[0], boost::is_any_of("."), boost::token_compress_on); +#endif // ENABLE_OPENGL_ES unsigned int gl_major = 0; unsigned int gl_minor = 0; @@ -180,14 +192,21 @@ std::string OpenGLManager::GLInfo::to_string(bool for_github) const out << h2_start << "OpenGL installation" << h2_end << line_end; out << b_start << "GL version: " << b_end << m_version << line_end; +#if ENABLE_GL_CORE_PROFILE + out << b_start << "Profile: " << b_end << (is_core_profile() ? "Core" : "Compatibility") << line_end; +#endif // ENABLE_GL_CORE_PROFILE out << b_start << "Vendor: " << b_end << m_vendor << line_end; out << b_start << "Renderer: " << b_end << m_renderer << line_end; out << b_start << "GLSL version: " << b_end << m_glsl_version << line_end; { +#if ENABLE_GL_CORE_PROFILE + std::vector extensions_list = get_extensions_list(); +#else + const std::string extensions_str = gl_get_string_safe(GL_EXTENSIONS, ""); std::vector extensions_list; - std::string extensions_str = gl_get_string_safe(GL_EXTENSIONS, ""); boost::split(extensions_list, extensions_str, boost::is_any_of(" "), boost::token_compress_on); +#endif // ENABLE_GL_CORE_PROFILE if (!extensions_list.empty()) { if (for_github) @@ -208,8 +227,34 @@ std::string OpenGLManager::GLInfo::to_string(bool for_github) const return out.str(); } +#if ENABLE_GL_CORE_PROFILE +std::vector OpenGLManager::GLInfo::get_extensions_list() const +{ + std::vector ret; + + if (is_core_profile()) { + GLint n = 0; + glsafe(::glGetIntegerv(GL_NUM_EXTENSIONS, &n)); + ret.reserve(n); + for (GLint i = 0; i < n; ++i) { + const char* extension = (const char*)::glGetStringi(GL_EXTENSIONS, i); + glcheck(); + if (extension != nullptr) + ret.emplace_back(extension); + } + } + else { + const std::string extensions_str = gl_get_string_safe(GL_EXTENSIONS, ""); + boost::split(ret, extensions_str, boost::is_any_of(" "), boost::token_compress_on); + } + + return ret; +} +#endif // ENABLE_GL_CORE_PROFILE + OpenGLManager::GLInfo OpenGLManager::s_gl_info; bool OpenGLManager::s_compressed_textures_supported = false; +bool OpenGLManager::m_use_manually_generated_mipmaps = true; OpenGLManager::EMultisampleState OpenGLManager::s_multisample = OpenGLManager::EMultisampleState::Unknown; OpenGLManager::EFramebufferType OpenGLManager::s_framebuffers_type = OpenGLManager::EFramebufferType::Unknown; @@ -235,19 +280,83 @@ OpenGLManager::~OpenGLManager() #endif //__APPLE__ } +#if ENABLE_OPENGL_DEBUG_OPTION +#ifdef _WIN32 +static void APIENTRY CustomGLDebugOutput(GLenum source, GLenum type, unsigned int id, GLenum severity, GLsizei length, const char* message, const void* userParam) +#else +static void CustomGLDebugOutput(GLenum source, GLenum type, unsigned int id, GLenum severity, GLsizei length, const char* message, const void* userParam) +#endif // _WIN32 +{ + if (severity == GL_DEBUG_SEVERITY_NOTIFICATION) + return; + + std::string out = "OpenGL DEBUG message ["; + switch (type) + { + case GL_DEBUG_TYPE_ERROR: out += "Error"; break; + case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: out += "Deprecated Behaviour"; break; + case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: out += "Undefined Behaviour"; break; + case GL_DEBUG_TYPE_PORTABILITY: out += "Portability"; break; + case GL_DEBUG_TYPE_PERFORMANCE: out += "Performance"; break; + case GL_DEBUG_TYPE_MARKER: out += "Marker"; break; + case GL_DEBUG_TYPE_PUSH_GROUP: out += "Push Group"; break; + case GL_DEBUG_TYPE_POP_GROUP: out += "Pop Group"; break; + case GL_DEBUG_TYPE_OTHER: out += "Other"; break; + } + out += "/"; + switch (source) + { + case GL_DEBUG_SOURCE_API: out += "API"; break; + case GL_DEBUG_SOURCE_WINDOW_SYSTEM: out += "Window System"; break; + case GL_DEBUG_SOURCE_SHADER_COMPILER: out += "Shader Compiler"; break; + case GL_DEBUG_SOURCE_THIRD_PARTY: out += "Third Party"; break; + case GL_DEBUG_SOURCE_APPLICATION: out += "Application"; break; + case GL_DEBUG_SOURCE_OTHER: out += "Other"; break; + } + out += "/"; + switch (severity) + { + case GL_DEBUG_SEVERITY_HIGH: out += "high"; break; + case GL_DEBUG_SEVERITY_MEDIUM: out += "medium"; break; + case GL_DEBUG_SEVERITY_LOW: out += "low"; break; + case GL_DEBUG_SEVERITY_NOTIFICATION: out += "notification"; break; + } + out += "]:\n"; + std::cout << out << "(" << id << "): " << message << "\n\n"; +} +#endif // ENABLE_OPENGL_DEBUG_OPTION + bool OpenGLManager::init_gl() { if (!m_gl_initialized) { +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + glewExperimental = true; +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES GLenum err = glewInit(); if (err != GLEW_OK) { BOOST_LOG_TRIVIAL(error) << "Unable to init glew library: " << glewGetErrorString(err); return false; } + +#if ENABLE_GL_CORE_PROFILE + do { + // glewInit() generates an OpenGL GL_INVALID_ENUM error + err = ::glGetError(); + } while (err != GL_NO_ERROR); +#endif // ENABLE_GL_CORE_PROFILE + m_gl_initialized = true; +#if ENABLE_GL_CORE_PROFILE + if (GLEW_ARB_texture_compression) + s_compressed_textures_supported = true; + else + s_compressed_textures_supported = false; +#else if (GLEW_EXT_texture_compression_s3tc) s_compressed_textures_supported = true; else s_compressed_textures_supported = false; +#endif // ENABLE_GL_CORE_PROFILE if (GLEW_ARB_framebuffer_object) s_framebuffers_type = EFramebufferType::Arb; @@ -256,12 +365,27 @@ bool OpenGLManager::init_gl() else s_framebuffers_type = EFramebufferType::Unknown; +#if ENABLE_OPENGL_ES bool valid_version = s_gl_info.is_version_greater_or_equal_to(2, 0); +#elif ENABLE_GL_CORE_PROFILE + bool valid_version = s_gl_info.is_core_profile() ? s_gl_info.is_version_greater_or_equal_to(3, 2) : s_gl_info.is_version_greater_or_equal_to(2, 0); +#else + bool valid_version = s_gl_info.is_version_greater_or_equal_to(2, 0); +#endif // ENABLE_OPENGL_ES + if (!valid_version) { // Complain about the OpenGL version. wxString message = from_u8((boost::format( +#if ENABLE_OPENGL_ES + _utf8(L("PrusaSlicer requires OpenGL ES 2.0 capable graphics driver to run correctly, \n" + "while OpenGL version %s, render %s, vendor %s was detected."))) % s_gl_info.get_version() % s_gl_info.get_renderer() % s_gl_info.get_vendor()).str()); +#elif ENABLE_GL_CORE_PROFILE + _utf8(L("PrusaSlicer requires OpenGL %s capable graphics driver to run correctly, \n" + "while OpenGL version %s, render %s, vendor %s was detected."))) % (s_gl_info.is_core_profile() ? "3.3" : "2.0") % s_gl_info.get_version() % s_gl_info.get_renderer() % s_gl_info.get_vendor()).str()); +#else _utf8(L("PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" "while OpenGL version %s, render %s, vendor %s was detected."))) % s_gl_info.get_version() % s_gl_info.get_renderer() % s_gl_info.get_vendor()).str()); +#endif // ENABLE_OPENGL_ES message += "\n"; message += _L("You may need to update your graphics card driver."); #ifdef _WIN32 @@ -279,16 +403,141 @@ bool OpenGLManager::init_gl() _utf8(L("Unable to load the following shaders:\n%s"))) % error).str()); wxMessageBox(message, wxString("PrusaSlicer - ") + _L("Error loading shaders"), wxOK | wxICON_ERROR); } +#if ENABLE_OPENGL_DEBUG_OPTION + if (m_debug_enabled && GLEW_KHR_debug) { + ::glEnable(GL_DEBUG_OUTPUT); + ::glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); + ::glDebugMessageCallback(CustomGLDebugOutput, nullptr); + ::glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE); + } +#endif // ENABLE_OPENGL_DEBUG_OPTION } + +#ifdef _WIN32 + // Since AMD driver version 22.7.1, there is probably some bug in the driver that causes the issue with the missing + // texture of the bed. It seems that this issue only triggers when mipmaps are generated manually + // (combined with a texture compression) and when mipmaps are generated through OpenGL glGenerateMipmap is working. + // So, for newer drivers than 22.6.1, the last working driver version, we use mipmaps generated through OpenGL. + if (const auto gl_info = OpenGLManager::get_gl_info(); boost::contains(gl_info.get_vendor(), "ATI Technologies Inc.")) { + // WHQL drivers seem to have one more version number at the end besides non-WHQL drivers. + // WHQL: 4.6.14800 Compatibility Profile Context 22.6.1 30.0.21023.1015 + // Non-WHQL: 4.6.0 Compatibility Profile Context 22.8.1.220810 + std::regex version_rgx(R"(Compatibility\sProfile\sContext\s(\d+)\.(\d+)\.(\d+))"); + if (std::smatch matches; std::regex_search(gl_info.get_version(), matches, version_rgx) && matches.size() == 4) { + int version_major = std::stoi(matches[1].str()); + int version_minor = std::stoi(matches[2].str()); + int version_patch = std::stoi(matches[3].str()); + BOOST_LOG_TRIVIAL(debug) << "Found AMD driver version: " << version_major << "." << version_minor << "." << version_patch; + + if (version_major > 22 || (version_major == 22 && version_minor > 6) || (version_major == 22 && version_minor == 6 && version_patch > 1)) { + m_use_manually_generated_mipmaps = false; + BOOST_LOG_TRIVIAL(debug) << "Mipmapping through OpenGL was enabled."; + } + } else { + BOOST_LOG_TRIVIAL(error) << "Not recognized format of version."; + } + } else { + BOOST_LOG_TRIVIAL(error) << "Unable to parse version of AMD driver."; + } +#endif } return true; } +#if ENABLE_GL_CORE_PROFILE +#if ENABLE_OPENGL_DEBUG_OPTION +wxGLContext* OpenGLManager::init_glcontext(wxGLCanvas& canvas, const std::pair& required_opengl_version, bool enable_debug) +#else +wxGLContext* OpenGLManager::init_glcontext(wxGLCanvas& canvas, const std::pair& required_opengl_version) +#endif // ENABLE_OPENGL_DEBUG_OPTION +#else wxGLContext* OpenGLManager::init_glcontext(wxGLCanvas& canvas) +#endif // ENABLE_GL_CORE_PROFILE { if (m_context == nullptr) { +#if ENABLE_OPENGL_ES + wxGLContextAttrs attrs; + attrs.PlatformDefaults().ES2().MajorVersion(2).EndList(); + m_context = new wxGLContext(&canvas, nullptr, &attrs); +#elif ENABLE_GL_CORE_PROFILE +#if ENABLE_OPENGL_DEBUG_OPTION + m_debug_enabled = enable_debug; +#endif // ENABLE_OPENGL_DEBUG_OPTION + + const int gl_major = required_opengl_version.first; + const int gl_minor = required_opengl_version.second; + const bool supports_core_profile = (gl_major < 3) ? false : (gl_major > 3) ? true : gl_minor >= 2; + + if (gl_major == 0) { + // search for highest supported core profile version + // disable wxWidgets logging to avoid showing the log dialog in case the following code fails generating a valid gl context + wxLogNull logNo; + for (auto v = OpenGLVersions::core.rbegin(); v != OpenGLVersions::core.rend(); ++v) { + wxGLContextAttrs attrs; +#if ENABLE_OPENGL_DEBUG_OPTION + attrs.PlatformDefaults().MajorVersion(v->first).MinorVersion(v->second).CoreProfile().ForwardCompatible(); + if (m_debug_enabled) + attrs.DebugCtx(); + attrs.EndList(); +#else + attrs.PlatformDefaults().MajorVersion(gl_major).MinorVersion(gl_minor).CoreProfile().ForwardCompatible().EndList(); +#endif // ENABLE_OPENGL_DEBUG_OPTION + m_context = new wxGLContext(&canvas, nullptr, &attrs); + if (m_context->IsOK()) { + s_gl_info.set_core_profile(true); + break; + } + else { + delete m_context; + m_context = nullptr; + } + } + } + + if (m_context == nullptr) { + // search for requested core profile version + if (supports_core_profile) { + // disable wxWidgets logging to avoid showing the log dialog in case the following code fails generating a valid gl context + wxLogNull logNo; + wxGLContextAttrs attrs; +#if ENABLE_OPENGL_DEBUG_OPTION + attrs.PlatformDefaults().MajorVersion(gl_major).MinorVersion(gl_minor).CoreProfile().ForwardCompatible(); + if (m_debug_enabled) + attrs.DebugCtx(); + attrs.EndList(); +#else + attrs.PlatformDefaults().MajorVersion(gl_major).MinorVersion(gl_minor).CoreProfile().ForwardCompatible().EndList(); +#endif // ENABLE_OPENGL_DEBUG_OPTION + m_context = new wxGLContext(&canvas, nullptr, &attrs); + if (!m_context->IsOK()) { + BOOST_LOG_TRIVIAL(error) << "Unable to create context for required OpenGL " << gl_major << "." << gl_minor; + delete m_context; + m_context = nullptr; + } + else + s_gl_info.set_core_profile(true); + } + } + +#if ENABLE_OPENGL_DEBUG_OPTION + if (m_context == nullptr) { + wxGLContextAttrs attrs; + attrs.PlatformDefaults(); + if (m_debug_enabled) + attrs.DebugCtx(); + attrs.EndList(); + // if no valid context was created use the default one + m_context = new wxGLContext(&canvas, nullptr, &attrs); + } +#else + if (m_context == nullptr) + // if no valid context was created use the default one + m_context = new wxGLContext(&canvas); +#endif // ENABLE_OPENGL_DEBUG_OPTION +#else m_context = new wxGLContext(&canvas); +#endif // ENABLE_OPENGL_ES #ifdef __APPLE__ // Part of hack to remove crash when closing the application on OSX 10.9.5 when building against newer wxWidgets @@ -302,8 +551,16 @@ wxGLContext* OpenGLManager::init_glcontext(wxGLCanvas& canvas) wxGLCanvas* OpenGLManager::create_wxglcanvas(wxWindow& parent) { - int attribList[] = { - WX_GL_RGBA, +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + wxGLAttributes attribList; + attribList.PlatformDefaults().RGBA().DoubleBuffer().MinRGBA(8, 8, 8, 8).Depth(24).SampleBuffers(1).Samplers(4).EndList(); +#ifdef __APPLE__ + // on MAC the method RGBA() has no effect + attribList.SetNeedsARB(true); +#endif // __APPLE__ +#else + 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, @@ -317,6 +574,7 @@ wxGLCanvas* OpenGLManager::create_wxglcanvas(wxWindow& parent) WX_GL_SAMPLES, 4, 0 }; +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES if (s_multisample == EMultisampleState::Unknown) { detect_multisample(attribList); @@ -324,13 +582,30 @@ wxGLCanvas* OpenGLManager::create_wxglcanvas(wxWindow& parent) // std::cout << "Multisample " << (can_multisample() ? "enabled" : "disabled") << std::endl; } - if (! can_multisample()) + if (!can_multisample()) +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + { + attribList.Reset(); + attribList.PlatformDefaults().RGBA().DoubleBuffer().MinRGBA(8, 8, 8, 8).Depth(24).EndList(); +#ifdef __APPLE__ + // on MAC the method RGBA() has no effect + attribList.SetNeedsARB(true); +#endif // __APPLE__ + } + + return new wxGLCanvas(&parent, attribList, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS); +#else attribList[12] = 0; return new wxGLCanvas(&parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES } +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES +void OpenGLManager::detect_multisample(const wxGLAttributes& attribList) +#else void OpenGLManager::detect_multisample(int* attribList) +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES { int wxVersion = wxMAJOR_VERSION * 10000 + wxMINOR_VERSION * 100 + wxRELEASE_NUMBER; bool enable_multisample = wxVersion >= 30003; diff --git a/src/slic3r/GUI/OpenGLManager.hpp b/src/slic3r/GUI/OpenGLManager.hpp index 0b505c6455..5c810d83ef 100644 --- a/src/slic3r/GUI/OpenGLManager.hpp +++ b/src/slic3r/GUI/OpenGLManager.hpp @@ -6,6 +6,9 @@ class wxWindow; class wxGLCanvas; class wxGLContext; +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES +class wxGLAttributes; +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES namespace Slic3r { namespace GUI { @@ -24,6 +27,7 @@ public: class GLInfo { bool m_detected{ false }; + bool m_core_profile{ false }; int m_max_tex_size{ 0 }; float m_max_anisotropy{ 0.0f }; @@ -40,7 +44,18 @@ public: const std::string& get_vendor() const; const std::string& get_renderer() const; + bool is_core_profile() const { return m_core_profile; } + void set_core_profile(bool value) { m_core_profile = value; } + bool is_mesa() const; + bool is_es() const { + return +#if ENABLE_OPENGL_ES + true; +#else + false; +#endif // ENABLE_OPENGL_ES + } int get_max_tex_size() const; float get_max_anisotropy() const; @@ -52,6 +67,10 @@ public: // Otherwise HTML formatted for the system info dialog. std::string to_string(bool for_github) const; +#if ENABLE_GL_CORE_PROFILE + std::vector get_extensions_list() const; +#endif // ENABLE_GL_CORE_PROFILE + private: void detect() const; }; @@ -76,6 +95,9 @@ private: bool m_gl_initialized{ false }; wxGLContext* m_context{ nullptr }; +#if ENABLE_OPENGL_DEBUG_OPTION + bool m_debug_enabled{ false }; +#endif // ENABLE_OPENGL_DEBUG_OPTION GLShadersManager m_shaders_manager; static GLInfo s_gl_info; #ifdef __APPLE__ @@ -86,12 +108,21 @@ private: static EMultisampleState s_multisample; static EFramebufferType s_framebuffers_type; + static bool m_use_manually_generated_mipmaps; public: OpenGLManager() = default; ~OpenGLManager(); bool init_gl(); +#if ENABLE_GL_CORE_PROFILE +#if ENABLE_OPENGL_DEBUG_OPTION + wxGLContext* init_glcontext(wxGLCanvas& canvas, const std::pair& required_opengl_version, bool enable_debug); +#else + wxGLContext* init_glcontext(wxGLCanvas& canvas, const std::pair& required_opengl_version); +#endif // ENABLE_OPENGL_DEBUG_OPTION +#else wxGLContext* init_glcontext(wxGLCanvas& canvas); +#endif // ENABLE_GL_CORE_PROFILE GLShaderProgram* get_shader(const std::string& shader_name) { return m_shaders_manager.get_shader(shader_name); } GLShaderProgram* get_current_shader() { return m_shaders_manager.get_current_shader(); } @@ -102,9 +133,14 @@ public: 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; } + static bool use_manually_generated_mipmaps() { return m_use_manually_generated_mipmaps; } private: +#if ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES + static void detect_multisample(const wxGLAttributes& attribList); +#else static void detect_multisample(int* attribList); +#endif // ENABLE_GL_CORE_PROFILE || ENABLE_OPENGL_ES }; } // namespace GUI diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 257fe2532c..1855b6a4e5 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -597,6 +597,12 @@ void ConfigOptionsGroup::back_to_sys_value(const std::string& opt_key) void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config, const std::string& opt_key) { boost::any value; + if (opt_key == "bed_shape") { + for (const std::string& key : {"bed_custom_texture", "bed_custom_model"}) { + value = config.opt_string(key); + this->change_opt_value(key, value); + } + } if (opt_key == "extruders_count") { auto *nozzle_diameter = dynamic_cast(config.option("nozzle_diameter")); value = int(nozzle_diameter->values.size()); @@ -728,7 +734,6 @@ void ConfigOptionsGroup::msw_rescale() // check if window is ScalableButton ScalableButton* sc_btn = dynamic_cast(win); if (sc_btn) { - sc_btn->msw_rescale(); sc_btn->SetSize(sc_btn->GetBestSize()); return; } @@ -773,7 +778,7 @@ void ConfigOptionsGroup::sys_color_changed() wxWindow* win = item->GetWindow(); // check if window is ScalableButton if (ScalableButton* sc_btn = dynamic_cast(win)) { - sc_btn->msw_rescale(); + sc_btn->sys_color_changed(); return; } wxGetApp().UpdateDarkUI(win, dynamic_cast(win) != nullptr); diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index f3efd06807..f74da354df 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -18,6 +18,11 @@ #define wxOSX true #else #define wxOSX false +#endif +#ifdef __WXGTK3__ + #define wxGTK3 true +#else + #define wxGTK3 false #endif #define BORDER(a, b) ((wxOSX ? a : b)) @@ -171,9 +176,8 @@ public: void show_field(const t_config_option_key& opt_key, bool show = true); void hide_field(const t_config_option_key& opt_key) { show_field(opt_key, false); } - void set_name(const wxString& new_name) { - stb->SetLabel(new_name); - } + void set_name(const wxString& new_name) { stb->SetLabel(new_name); } + wxString get_name() const { return stb->GetLabel(); } inline void enable() { for (auto& field : m_fields) field.second->enable(); } inline void disable() { for (auto& field : m_fields) field.second->disable(); } diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp index 83c7e592ae..dfebad4424 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.cpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp @@ -142,10 +142,10 @@ void PresetForPrinter::AllowDelete() m_presets_list->update(); } -void PresetForPrinter::msw_rescale() +void PresetForPrinter::on_sys_color_changed() { - m_presets_list->msw_rescale(); - m_delete_preset_btn->msw_rescale(); + m_presets_list->sys_color_changed(); + m_delete_preset_btn->sys_color_changed(); } @@ -603,19 +603,10 @@ void PhysicalPrinterDialog::on_dpi_changed(const wxRect& suggested_rect) { const int& em = em_unit(); - m_add_preset_btn->msw_rescale(); - m_printhost_browse_btn->msw_rescale(); - m_printhost_test_btn->msw_rescale(); - if (m_printhost_cafile_browse_btn) - m_printhost_cafile_browse_btn->msw_rescale(); - m_optgroup->msw_rescale(); msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL }); - for (PresetForPrinter* preset : m_presets) - preset->msw_rescale(); - const wxSize& size = wxSize(45 * em, 35 * em); SetMinSize(size); @@ -623,6 +614,18 @@ void PhysicalPrinterDialog::on_dpi_changed(const wxRect& suggested_rect) Refresh(); } +void PhysicalPrinterDialog::on_sys_color_changed() +{ + m_add_preset_btn->sys_color_changed(); + m_printhost_browse_btn->sys_color_changed(); + m_printhost_test_btn->sys_color_changed(); + if (m_printhost_cafile_browse_btn) + m_printhost_cafile_browse_btn->sys_color_changed(); + + for (PresetForPrinter* preset : m_presets) + preset->on_sys_color_changed(); +} + void PhysicalPrinterDialog::OnOK(wxEvent& event) { wxString printer_name = m_printer_name->GetValue(); diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.hpp b/src/slic3r/GUI/PhysicalPrinterDialog.hpp index cb9a48b3e2..d8bb70d3c4 100644 --- a/src/slic3r/GUI/PhysicalPrinterDialog.hpp +++ b/src/slic3r/GUI/PhysicalPrinterDialog.hpp @@ -48,8 +48,7 @@ public: void SuppressDelete(); void AllowDelete(); - void msw_rescale(); - void on_sys_color_changed() {}; + void on_sys_color_changed(); }; @@ -98,7 +97,7 @@ public: void DeletePreset(PresetForPrinter* preset_for_printer); protected: void on_dpi_changed(const wxRect& suggested_rect) override; - void on_sys_color_changed() override {}; + void on_sys_color_changed() override; bool had_all_mk3; }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3797e32082..5a8af43e57 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -180,7 +180,6 @@ public: bool showing_manifold_warning_icon; void show_sizer(bool show); - void msw_rescale(); void update_warning_icon(const std::string& warning_icon_name); }; @@ -210,7 +209,7 @@ ObjectInfo::ObjectInfo(wxWindow *parent) : init_info_label(&info_size, _L("Size")); - info_icon = new wxStaticBitmap(parent, wxID_ANY, create_scaled_bitmap("info")); + info_icon = new wxStaticBitmap(parent, wxID_ANY, *get_bmp_bundle("info")); info_icon->SetToolTip(_L("For a multipart object, this value isn't accurate.\n" "It doesn't take account of intersections and negative volumes.")); auto* volume_info_sizer = new wxBoxSizer(wxHORIZONTAL); @@ -223,7 +222,7 @@ ObjectInfo::ObjectInfo(wxWindow *parent) : info_manifold = new wxStaticText(parent, wxID_ANY, ""); info_manifold->SetFont(wxGetApp().small_font()); - manifold_warning_icon = new wxStaticBitmap(parent, wxID_ANY, create_scaled_bitmap(m_warning_icon_name)); + manifold_warning_icon = new wxStaticBitmap(parent, wxID_ANY, *get_bmp_bundle(m_warning_icon_name)); auto *sizer_manifold = new wxBoxSizer(wxHORIZONTAL); sizer_manifold->Add(manifold_warning_icon, 0, wxLEFT, 2); sizer_manifold->Add(info_manifold, 0, wxLEFT, 2); @@ -242,17 +241,11 @@ void ObjectInfo::show_sizer(bool show) manifold_warning_icon->Show(showing_manifold_warning_icon && show); } -void ObjectInfo::msw_rescale() -{ - manifold_warning_icon->SetBitmap(create_scaled_bitmap(m_warning_icon_name)); - info_icon->SetBitmap(create_scaled_bitmap("info")); -} - void ObjectInfo::update_warning_icon(const std::string& warning_icon_name) { if ((showing_manifold_warning_icon = !warning_icon_name.empty())) { m_warning_icon_name = warning_icon_name; - manifold_warning_icon->SetBitmap(create_scaled_bitmap(m_warning_icon_name)); + manifold_warning_icon->SetBitmap(*get_bmp_bundle(m_warning_icon_name)); } } @@ -350,9 +343,6 @@ void FreqChangedParams::msw_rescale() { m_og->msw_rescale(); m_og_sla->msw_rescale(); - - for (auto btn: m_empty_buttons) - btn->msw_rescale(); } void FreqChangedParams::sys_color_changed() @@ -361,7 +351,7 @@ void FreqChangedParams::sys_color_changed() m_og_sla->sys_color_changed(); for (auto btn: m_empty_buttons) - btn->msw_rescale(); + btn->sys_color_changed(); wxGetApp().UpdateDarkUI(m_wiping_dialog_button, true); } @@ -450,7 +440,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) : */ auto empty_widget = [this] (wxWindow* parent) { auto sizer = new wxBoxSizer(wxHORIZONTAL); - auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_transparent.png", wxEmptyString, + auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_transparent", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, int(0.3 * wxGetApp().em_unit())); m_empty_buttons.push_back(btn); @@ -508,7 +498,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) : } })); - auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_transparent.png", wxEmptyString, + auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_transparent", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW); sizer->Add(btn , 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, int(0.3 * wxGetApp().em_unit())); @@ -798,7 +788,9 @@ Sidebar::Sidebar(Plater *parent) p->sizer_filaments = new wxBoxSizer(wxVERTICAL); - auto init_combo = [this](PlaterPresetComboBox **combo, wxString label, Preset::Type preset_type, bool filament) { + const int margin_5 = int(0.5 * wxGetApp().em_unit());// 5; + + auto init_combo = [this, margin_5](PlaterPresetComboBox **combo, wxString label, Preset::Type preset_type, bool filament) { auto *text = new wxStaticText(p->presets_panel, wxID_ANY, label + " :"); text->SetFont(wxGetApp().small_font()); *combo = new PlaterPresetComboBox(p->presets_panel, preset_type); @@ -813,9 +805,19 @@ Sidebar::Sidebar(Plater *parent) auto *sizer_filaments = this->p->sizer_filaments; sizer_presets->Add(text, 0, wxALIGN_LEFT | wxEXPAND | wxRIGHT, 4); if (! filament) { - sizer_presets->Add(combo_and_btn_sizer, 0, wxEXPAND | wxBOTTOM, 1); + sizer_presets->Add(combo_and_btn_sizer, 0, wxEXPAND | +#ifdef __WXGTK3__ + wxRIGHT, margin_5); +#else + wxBOTTOM, 1); +#endif // __WXGTK3__ } else { - sizer_filaments->Add(combo_and_btn_sizer, 0, wxEXPAND | wxBOTTOM, 1); + sizer_filaments->Add(combo_and_btn_sizer, 0, wxEXPAND | +#ifdef __WXGTK3__ + wxRIGHT, margin_5); +#else + wxBOTTOM, 1); +#endif // __WXGTK3__ (*combo)->set_extruder_idx(0); sizer_presets->Add(sizer_filaments, 1, wxEXPAND); } @@ -828,13 +830,15 @@ Sidebar::Sidebar(Plater *parent) init_combo(&p->combo_sla_material, _L("SLA material"), Preset::TYPE_SLA_MATERIAL, false); init_combo(&p->combo_printer, _L("Printer"), Preset::TYPE_PRINTER, false); - const int margin_5 = int(0.5*wxGetApp().em_unit());// 5; - p->sizer_params = new wxBoxSizer(wxVERTICAL); // Frequently changed parameters p->frequently_changed_parameters = new FreqChangedParams(p->scrolled); - p->sizer_params->Add(p->frequently_changed_parameters->get_sizer(), 0, wxEXPAND | wxTOP | wxBOTTOM, wxOSX ? 1 : margin_5); + p->sizer_params->Add(p->frequently_changed_parameters->get_sizer(), 0, wxEXPAND | wxTOP | wxBOTTOM +#ifdef __WXGTK3__ + | wxRIGHT +#endif // __WXGTK3__ + , wxOSX ? 1 : margin_5); // Object List p->object_list = new ObjectList(p->scrolled); @@ -862,12 +866,15 @@ Sidebar::Sidebar(Plater *parent) // Sizer in the scrolled area if (p->mode_sizer) scrolled_sizer->Add(p->mode_sizer, 0, wxALIGN_CENTER_HORIZONTAL); + + int size_margin = wxGTK3 ? wxLEFT | wxRIGHT : wxLEFT; + is_msw ? - scrolled_sizer->Add(p->presets_panel, 0, wxEXPAND | wxLEFT, margin_5) : - scrolled_sizer->Add(p->sizer_presets, 0, wxEXPAND | wxLEFT, margin_5); - scrolled_sizer->Add(p->sizer_params, 1, wxEXPAND | wxLEFT, margin_5); - scrolled_sizer->Add(p->object_info, 0, wxEXPAND | wxTOP | wxLEFT, margin_5); - scrolled_sizer->Add(p->sliced_info, 0, wxEXPAND | wxTOP | wxLEFT, margin_5); + scrolled_sizer->Add(p->presets_panel, 0, wxEXPAND | size_margin, margin_5) : + scrolled_sizer->Add(p->sizer_presets, 0, wxEXPAND | size_margin, margin_5); + scrolled_sizer->Add(p->sizer_params, 1, wxEXPAND | size_margin, margin_5); + scrolled_sizer->Add(p->object_info, 0, wxEXPAND | wxTOP | size_margin, margin_5); + scrolled_sizer->Add(p->sliced_info, 0, wxEXPAND | wxTOP | size_margin, margin_5); // Buttons underneath the scrolled area @@ -985,7 +992,12 @@ void Sidebar::init_filament_combo(PlaterPresetComboBox **combo, const int extr_i int(0.3*wxGetApp().em_unit())); auto /***/sizer_filaments = this->p->sizer_filaments; - sizer_filaments->Add(combo_and_btn_sizer, 1, wxEXPAND | wxBOTTOM, 1); + sizer_filaments->Add(combo_and_btn_sizer, 1, wxEXPAND | +#ifdef __WXGTK3__ + wxRIGHT, int(0.5 * wxGetApp().em_unit())); +#else + wxBOTTOM, 1); +#endif // __WXGTK3__ } void Sidebar::remove_unused_filament_combos(const size_t current_extruder_count) @@ -1103,9 +1115,6 @@ void Sidebar::msw_rescale() { SetMinSize(wxSize(40 * wxGetApp().em_unit(), -1)); - if (p->mode_sizer) - p->mode_sizer->msw_rescale(); - for (PlaterPresetComboBox* combo : std::vector { p->combo_print, p->combo_sla_print, p->combo_sla_material, @@ -1117,14 +1126,8 @@ void Sidebar::msw_rescale() p->frequently_changed_parameters->msw_rescale(); p->object_list->msw_rescale(); p->object_manipulation->msw_rescale(); - p->object_settings->msw_rescale(); p->object_layers->msw_rescale(); - p->object_info->msw_rescale(); - - p->btn_send_gcode->msw_rescale(); -// p->btn_eject_device->msw_rescale(); - p->btn_export_gcode_removable->msw_rescale(); #ifdef _WIN32 const int scaled_height = p->btn_export_gcode_removable->GetBitmapHeight(); #else @@ -1145,14 +1148,13 @@ void Sidebar::sys_color_changed() for (wxWindow* win : std::vector{ this, p->sliced_info->GetStaticBox(), p->object_info->GetStaticBox(), p->btn_reslice, p->btn_export_gcode }) wxGetApp().UpdateDarkUI(win); - p->object_info->msw_rescale(); for (wxWindow* win : std::vector{ p->scrolled, p->presets_panel }) wxGetApp().UpdateAllStaticTextDarkUI(win); for (wxWindow* btn : std::vector{ p->btn_reslice, p->btn_export_gcode }) wxGetApp().UpdateDarkUI(btn, true); if (p->mode_sizer) - p->mode_sizer->msw_rescale(); + p->mode_sizer->sys_color_changed(); p->frequently_changed_parameters->sys_color_changed(); p->object_settings->sys_color_changed(); #endif @@ -1170,11 +1172,12 @@ void Sidebar::sys_color_changed() p->object_layers->sys_color_changed(); // btn...->msw_rescale() updates icon on button, so use it - p->btn_send_gcode->msw_rescale(); + p->btn_send_gcode->sys_color_changed(); // p->btn_eject_device->msw_rescale(); - p->btn_export_gcode_removable->msw_rescale(); + p->btn_export_gcode_removable->sys_color_changed(); p->scrolled->Layout(); + p->scrolled->Refresh(); p->searcher.dlg_sys_color_changed(); } @@ -2420,9 +2423,20 @@ std::vector Plater::priv::load_files(const std::vector& input_ const auto loading = _L("Loading") + dots; - // Create wxProgressDialog on heap, see the linux ifdef below. - auto progress_dlg = new wxProgressDialog(loading, "", 100, find_toplevel_parent(q), wxPD_AUTO_HIDE); + // The situation with wxProgressDialog is quite interesting here. + // On Linux (only), there are issues when FDM/SLA is switched during project file loading (disabling of controls, + // see a comment below). This can be bypassed by creating the wxProgressDialog on heap and destroying it + // when loading a project file. However, creating the dialog on heap causes issues on macOS, where it does not + // appear at all. Therefore, we create the dialog on stack on Win and macOS, and on heap on Linux, which + // is the only system that needed the workarounds in the first place. +#ifdef __linux__ + auto progress_dlg = new wxProgressDialog(loading, "", 100, find_toplevel_parent(q), wxPD_APP_MODAL | wxPD_AUTO_HIDE); Slic3r::ScopeGuard([&progress_dlg](){ if (progress_dlg) progress_dlg->Destroy(); progress_dlg = nullptr; }); +#else + wxProgressDialog progress_dlg_stack(loading, "", 100, find_toplevel_parent(q), wxPD_APP_MODAL | wxPD_AUTO_HIDE); + wxProgressDialog* progress_dlg = &progress_dlg_stack; +#endif + wxBusyCursor busy; @@ -3137,6 +3151,8 @@ void Plater::priv::split_object() for (size_t idx : idxs) { get_selection().add_object((unsigned int)idx, false); + // update printable state for new volumes on canvas3D + q->canvas3D()->update_instance_printable_state_for_object(idx); } } } @@ -3323,6 +3339,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool sidebar->set_btn_label(ActionButtonType::abExport, _(label_btn_export)); sidebar->set_btn_label(ActionButtonType::abSendGCode, _(label_btn_send)); + dirty_state.update_from_preview(); const wxString slice_string = background_process.running() && wxGetApp().get_mode() == comSimple ? _L("Slicing") + dots : _L("Slice now"); @@ -3861,9 +3878,12 @@ void Plater::priv::reload_from_disk() new_volume->set_type(old_volume->type()); new_volume->set_material_id(old_volume->material_id()); #if ENABLE_WORLD_COORDINATE - new_volume->set_transformation(Geometry::translation_transform(old_volume->source.transform.get_offset()) * - old_volume->get_transformation().get_matrix_no_offset() * old_volume->source.transform.get_matrix_no_offset()); - new_volume->translate(new_volume->get_transformation().get_matrix_no_offset() * (new_volume->source.mesh_offset - old_volume->source.mesh_offset)); + new_volume->set_transformation( + old_volume->get_transformation().get_matrix() * + old_volume->source.transform.get_matrix_no_offset() * + Geometry::translation_transform(new_volume->source.mesh_offset - old_volume->source.mesh_offset) * + new_volume->source.transform.get_matrix_no_offset().inverse() + ); #else new_volume->set_transformation(Geometry::assemble_transform(old_volume->source.transform.get_offset()) * old_volume->get_transformation().get_matrix(true) * @@ -5573,7 +5593,7 @@ void ProjectDropDialog::on_dpi_changed(const wxRect& suggested_rect) bool Plater::load_files(const wxArrayString& filenames) { - const std::regex pattern_drop(".*[.](stl|obj|amf|3mf|prusa)", std::regex::icase); + const std::regex pattern_drop(".*[.](stl|obj|amf|3mf|prusa|step|stp)", std::regex::icase); const std::regex pattern_gcode_drop(".*[.](gcode|g)", std::regex::icase); std::vector paths; @@ -6977,8 +6997,6 @@ void Plater::msw_rescale() p->sidebar->msw_rescale(); - p->menus.msw_rescale(); - Layout(); GetParent()->Layout(); } diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index 27cd113fb1..9e526cc3de 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -454,12 +454,15 @@ void PreferencesDialog::build() "If disabled, you can reorder Model Parts, Negative Volumes and Modifiers. But one of the model parts have to be on the first place."), app_config->get("order_volumes") == "1"); -#if ENABLE_SHOW_NON_MANIFOLD_EDGES append_bool_option(m_optgroup_gui, "non_manifold_edges", L("Show non-manifold edges"), L("If enabled, shows non-manifold edges."), app_config->get("non_manifold_edges") == "1"); -#endif // ENABLE_SHOW_NON_MANIFOLD_EDGES + + append_bool_option(m_optgroup_gui, "allow_auto_color_change", + L("Allow automatically color change"), + L("If enabled, related notification will be shown, when sliced object looks like a logo or a sign."), + app_config->get("allow_auto_color_change") == "1"); #ifdef _MSW_DARK_MODE append_bool_option(m_optgroup_gui, "tabs_as_menu", diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index ed4888a878..597c30312e 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -108,8 +108,8 @@ PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const default: break; } - m_bitmapCompatible = ScalableBitmap(this, "flag_green"); - m_bitmapIncompatible = ScalableBitmap(this, "flag_red"); + m_bitmapCompatible = get_bmp_bundle("flag_green"); + m_bitmapIncompatible = get_bmp_bundle("flag_red"); // parameters for an icon's drawing fill_width_height(); @@ -242,12 +242,12 @@ void PresetComboBox::update(std::string select_preset_name) const std::deque& presets = m_collection->get_presets(); - std::map> nonsys_presets; - std::map incomp_presets; + std::map> nonsys_presets; + std::map incomp_presets; wxString selected = ""; if (!presets.front().is_visible) - set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); + set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i) { @@ -268,7 +268,7 @@ void PresetComboBox::update(std::string select_preset_name) } std::string main_icon_name = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - wxBitmap* bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, preset.is_compatible, preset.is_system || preset.is_default); + auto bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, preset.is_compatible, preset.is_system || preset.is_default); assert(bmp); if (!is_enabled) @@ -280,17 +280,17 @@ void PresetComboBox::update(std::string select_preset_name) } else { - nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); + nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); if (preset.name == select_preset_name || (select_preset_name.empty() && is_enabled)) selected = get_preset_name(preset); } if (i + 1 == m_collection->num_default_presets()) - set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); + set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); } if (!nonsys_presets.empty()) { - set_label_marker(Append(separator(L("User presets")), wxNullBitmap)); - for (std::map>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { + set_label_marker(Append(separator(L("User presets")), NullBitmapBndl())); + for (std::map>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { int item_id = Append(it->first, *it->second.first); bool is_enabled = it->second.second; if (!is_enabled) @@ -300,8 +300,8 @@ void PresetComboBox::update(std::string select_preset_name) } if (!incomp_presets.empty()) { - set_label_marker(Append(separator(L("Incompatible presets")), wxNullBitmap)); - for (std::map::iterator it = incomp_presets.begin(); it != incomp_presets.end(); ++it) { + set_label_marker(Append(separator(L("Incompatible presets")), NullBitmapBndl())); + for (std::map::iterator it = incomp_presets.begin(); it != incomp_presets.end(); ++it) { set_label_marker(Append(it->first, *it->second), LABEL_ITEM_DISABLED); } } @@ -337,7 +337,6 @@ bool PresetComboBox::del_physical_printer(const wxString& note_string/* = wxEmpt msg += note_string + "\n"; msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), printer_name); - //if (wxMessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != wxID_YES) if (MessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != wxID_YES) return false; @@ -364,7 +363,8 @@ void PresetComboBox::show_all(bool show_all) void PresetComboBox::update() { - this->update(into_u8(this->GetString(this->GetSelection()))); + int n = this->GetSelection(); + this->update(n < 0 ? "" : into_u8(this->GetString(n))); } void PresetComboBox::update_from_bundle() @@ -375,42 +375,31 @@ void PresetComboBox::update_from_bundle() void PresetComboBox::msw_rescale() { m_em_unit = em_unit(this); +} - m_bitmapIncompatible.msw_rescale(); - m_bitmapCompatible.msw_rescale(); - - // parameters for an icon's drawing - fill_width_height(); +void PresetComboBox::sys_color_changed() +{ + m_bitmapCompatible = get_bmp_bundle("flag_green"); + m_bitmapIncompatible = get_bmp_bundle("flag_red"); + wxGetApp().UpdateDarkUI(this); // update the control to redraw the icons update(); } -void PresetComboBox::sys_color_changed() -{ - wxGetApp().UpdateDarkUI(this); - msw_rescale(); -} - void PresetComboBox::fill_width_height() { - // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size, so - // set a bitmap's height to m_bitmapCompatible->GetHeight() and norm_icon_width to m_bitmapCompatible->GetWidth() - icon_height = m_bitmapCompatible.GetBmpHeight(); - norm_icon_width = m_bitmapCompatible.GetBmpWidth(); + icon_height = 16; + norm_icon_width = 16; - /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display. - * So set sizes for solid_colored icons used for filament preset - * and scale them in respect to em_unit value - */ - const float scale_f = (float)m_em_unit * 0.1f; - - thin_icon_width = lroundf(8 * scale_f); // analogue to 8px; + thin_icon_width = 8; wide_icon_width = norm_icon_width + thin_icon_width; - space_icon_width = lroundf(2 * scale_f); - thin_space_icon_width = lroundf(4 * scale_f); - wide_space_icon_width = lroundf(6 * scale_f); + null_icon_width = 2 * norm_icon_width; + + space_icon_width = 2; + thin_space_icon_width = 4; + wide_space_icon_width = 6; } wxString PresetComboBox::separator(const std::string& label) @@ -418,7 +407,8 @@ wxString PresetComboBox::separator(const std::string& label) return wxString::FromUTF8(separator_head()) + _(label) + wxString::FromUTF8(separator_tail()); } -wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, const std::string& main_icon_name, + +wxBitmapBundle* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, const std::string& main_icon_name, bool is_compatible/* = true*/, bool is_system/* = false*/, bool is_single_bar/* = false*/, const std::string& filament_rgb/* = ""*/, const std::string& extruder_rgb/* = ""*/, const std::string& material_rgb/* = ""*/) { @@ -434,45 +424,41 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, con bitmap_key += ",dark"; bitmap_key += material_rgb; - wxBitmap* bmp = bitmap_cache().find(bitmap_key); - if (bmp == nullptr) { + wxBitmapBundle* bmp_bndl = bitmap_cache().find_bndl(bitmap_key); + if (bmp_bndl == nullptr) { // Create the bitmap with color bars. - std::vector bmps; + std::vector bmps; if (wide_icons) // Paint a red flag for incompatible presets. - bmps.emplace_back(is_compatible ? bitmap_cache().mkclear(norm_icon_width, icon_height) : m_bitmapIncompatible.bmp()); + bmps.emplace_back(is_compatible ? get_empty_bmp_bundle(norm_icon_width, icon_height) : m_bitmapIncompatible); if (m_type == Preset::TYPE_FILAMENT && !filament_rgb.empty()) { // Paint the color bars. - ColorRGB color; - decode_color(filament_rgb, color); - bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, color, false, 1, dark_mode)); - if (!is_single_bar) { - decode_color(extruder_rgb, color); - bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, color, false, 1, dark_mode)); - } + bmps.emplace_back(get_solid_bmp_bundle(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, filament_rgb)); + if (!is_single_bar) + bmps.emplace_back(get_solid_bmp_bundle(thin_icon_width, icon_height, extruder_rgb)); // Paint a lock at the system presets. - bmps.emplace_back(bitmap_cache().mkclear(space_icon_width, icon_height)); + bmps.emplace_back(get_empty_bmp_bundle(space_icon_width, icon_height)); } else { // Paint the color bars. - bmps.emplace_back(bitmap_cache().mkclear(thin_space_icon_width, icon_height)); + bmps.emplace_back(get_empty_bmp_bundle(thin_space_icon_width, icon_height)); if (m_type == Preset::TYPE_SLA_MATERIAL) - bmps.emplace_back(create_scaled_bitmap(main_icon_name, this, 16, false, material_rgb)); + bmps.emplace_back(bitmap_cache().from_svg(main_icon_name, 16, 16, dark_mode, material_rgb)); else - bmps.emplace_back(create_scaled_bitmap(main_icon_name)); + bmps.emplace_back(get_bmp_bundle(main_icon_name)); // Paint a lock at the system presets. - bmps.emplace_back(bitmap_cache().mkclear(wide_space_icon_width, icon_height)); + bmps.emplace_back(get_empty_bmp_bundle(wide_space_icon_width, icon_height)); } - bmps.emplace_back(is_system ? create_scaled_bitmap("lock_closed") : bitmap_cache().mkclear(norm_icon_width, icon_height)); - bmp = bitmap_cache().insert(bitmap_key, bmps); + bmps.emplace_back(is_system ? get_bmp_bundle("lock_closed") : get_empty_bmp_bundle(norm_icon_width, icon_height)); + bmp_bndl = bitmap_cache().insert_bndl(bitmap_key, bmps); } - return bmp; + return bmp_bndl; } -wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name, +wxBitmapBundle* PresetComboBox::get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name, bool is_enabled/* = true*/, bool is_compatible/* = true*/, bool is_system/* = false*/) { bitmap_key += !is_enabled ? "_disabled" : ""; @@ -482,20 +468,26 @@ wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, const std::string& m if (wxGetApp().dark_mode()) bitmap_key += ",dark"; - wxBitmap* bmp = bitmap_cache().find(bitmap_key); + wxBitmapBundle* bmp = bitmap_cache().find_bndl(bitmap_key); if (bmp == nullptr) { // Create the bitmap with color bars. - std::vector bmps; - bmps.emplace_back(m_type == Preset::TYPE_PRINTER ? create_scaled_bitmap(main_icon_name, this, 16, !is_enabled) : - is_compatible ? m_bitmapCompatible.bmp() : m_bitmapIncompatible.bmp()); + std::vector bmps; + bmps.emplace_back(m_type == Preset::TYPE_PRINTER ? get_bmp_bundle(main_icon_name) : + is_compatible ? m_bitmapCompatible : m_bitmapIncompatible); // Paint a lock at the system presets. - bmps.emplace_back(is_system ? create_scaled_bitmap(next_icon_name, this, 16, !is_enabled) : bitmap_cache().mkclear(norm_icon_width, icon_height)); - bmp = bitmap_cache().insert(bitmap_key, bmps); + bmps.emplace_back(is_system ? get_bmp_bundle(next_icon_name) : get_empty_bmp_bundle(norm_icon_width, icon_height)); + bmp = bitmap_cache().insert_bndl(bitmap_key, bmps); } return bmp; } +wxBitmapBundle PresetComboBox::NullBitmapBndl() +{ + assert(null_icon_width > 0); + return *get_empty_bmp_bundle(null_icon_width, icon_height); +} + bool PresetComboBox::is_selected_physical_printer() { auto selected_item = this->GetSelection(); @@ -782,14 +774,16 @@ void PlaterPresetComboBox::update() // and draw a red flag in front of the selected preset. bool wide_icons = selected_preset && !selected_preset->is_compatible; - std::map nonsys_presets; + null_icon_width = (wide_icons ? 3 : 2) * norm_icon_width + thin_space_icon_width + wide_space_icon_width; + + std::map nonsys_presets; wxString selected_user_preset; wxString tooltip; const std::deque& presets = m_collection->get_presets(); if (!presets.front().is_visible) - this->set_label_marker(this->Append(separator(L("System presets")), wxNullBitmap)); + this->set_label_marker(this->Append(separator(L("System presets")), NullBitmapBndl())); for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i) { @@ -823,7 +817,7 @@ void PlaterPresetComboBox::update() material_rgb = print_config_def.get("material_colour")->get_default_value()->value; } - wxBitmap* bmp = get_bmp(bitmap_key, wide_icons, bitmap_type_name, + auto bmp = get_bmp(bitmap_key, wide_icons, bitmap_type_name, preset.is_compatible, preset.is_system || preset.is_default, single_bar, filament_rgb, extruder_rgb, material_rgb); assert(bmp); @@ -844,12 +838,12 @@ void PlaterPresetComboBox::update() } } if (i + 1 == m_collection->num_default_presets()) - set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); + set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); } if (!nonsys_presets.empty()) { - set_label_marker(Append(separator(L("User presets")), wxNullBitmap)); - for (std::map::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { + set_label_marker(Append(separator(L("User presets")), NullBitmapBndl())); + for (std::map::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { Append(it->first, *it->second); validate_selection(it->first == selected_user_preset); } @@ -859,7 +853,7 @@ void PlaterPresetComboBox::update() { // add Physical printers, if any exists if (!m_preset_bundle->physical_printers.empty()) { - set_label_marker(Append(separator(L("Physical printers")), wxNullBitmap)); + set_label_marker(Append(separator(L("Physical printers")), NullBitmapBndl())); const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { @@ -868,7 +862,7 @@ void PlaterPresetComboBox::update() if (!preset || !preset->is_visible) continue; std::string main_icon_name, bitmap_key = main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - wxBitmap* bmp = get_bmp(main_icon_name, wide_icons, main_icon_name); + auto bmp = get_bmp(main_icon_name, wide_icons, main_icon_name); assert(bmp); set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); @@ -879,7 +873,7 @@ void PlaterPresetComboBox::update() } if (m_type == Preset::TYPE_PRINTER || m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL) { - wxBitmap* bmp = get_bmp("edit_preset_list", wide_icons, "edit_uni"); + auto bmp = get_bmp("edit_preset_list", wide_icons, "edit_uni"); assert(bmp); if (m_type == Preset::TYPE_FILAMENT) @@ -916,9 +910,20 @@ void PlaterPresetComboBox::update() void PlaterPresetComboBox::msw_rescale() { PresetComboBox::msw_rescale(); - edit_btn->msw_rescale(); +#ifdef __WXMSW__ + // Use this part of code just on Windows to avoid of some layout issues on Linux + // see https://github.com/prusa3d/PrusaSlicer/issues/5163 and https://github.com/prusa3d/PrusaSlicer/issues/5505 + // Update control min size after rescale (changed Display DPI under MSW) + if (GetMinWidth() != 20 * m_em_unit) + SetMinSize(wxSize(20 * m_em_unit, GetSize().GetHeight())); +#endif //__WXMSW__ } +void PlaterPresetComboBox::sys_color_changed() +{ + PresetComboBox::sys_color_changed(); + edit_btn->sys_color_changed(); +} // --------------------------------- // *** TabPresetComboBox *** @@ -981,10 +986,10 @@ void TabPresetComboBox::update() const std::deque& presets = m_collection->get_presets(); - std::map> nonsys_presets; + std::map> nonsys_presets; wxString selected = ""; if (!presets.front().is_visible) - set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); + set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); size_t idx_selected = m_collection->get_selected_idx(); if (m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection()) { @@ -1011,7 +1016,7 @@ void TabPresetComboBox::update() } std::string main_icon_name = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - wxBitmap* bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, preset.is_compatible, preset.is_system || preset.is_default); + auto bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, preset.is_compatible, preset.is_system || preset.is_default); assert(bmp); if (preset.is_default || preset.is_system) { @@ -1022,18 +1027,18 @@ void TabPresetComboBox::update() } else { - std::pair pair(bmp, is_enabled); - nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); + std::pair pair(bmp, is_enabled); + nonsys_presets.emplace(get_preset_name(preset), std::pair(bmp, is_enabled)); if (i == idx_selected) selected = get_preset_name(preset); } if (i + 1 == m_collection->num_default_presets()) - set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); + set_label_marker(Append(separator(L("System presets")), NullBitmapBndl())); } if (!nonsys_presets.empty()) { - set_label_marker(Append(separator(L("User presets")), wxNullBitmap)); - for (std::map>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { + set_label_marker(Append(separator(L("User presets")), NullBitmapBndl())); + for (std::map>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { int item_id = Append(it->first, *it->second.first); bool is_enabled = it->second.second; if (!is_enabled) @@ -1046,7 +1051,7 @@ void TabPresetComboBox::update() { // add Physical printers, if any exists if (!m_preset_bundle->physical_printers.empty()) { - set_label_marker(Append(separator(L("Physical printers")), wxNullBitmap)); + set_label_marker(Append(separator(L("Physical printers")), NullBitmapBndl())); const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { @@ -1056,7 +1061,7 @@ void TabPresetComboBox::update() continue; std::string main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - wxBitmap* bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false); + auto bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false); assert(bmp); set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); @@ -1067,7 +1072,7 @@ void TabPresetComboBox::update() // add "Add/Remove printers" item std::string icon_name = "edit_uni"; - wxBitmap* bmp = get_bmp("edit_preset_list, tab,", icon_name, ""); + auto bmp = get_bmp("edit_preset_list, tab,", icon_name, ""); assert(bmp); set_label_marker(Append(separator(L("Add/Remove printers")), *bmp), LABEL_ITEM_WIZARD_PRINTERS); diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp index 40a0cfc28b..9fe75c1265 100644 --- a/src/slic3r/GUI/PresetComboBoxes.hpp +++ b/src/slic3r/GUI/PresetComboBoxes.hpp @@ -1,7 +1,7 @@ #ifndef slic3r_PresetComboBoxes_hpp_ #define slic3r_PresetComboBoxes_hpp_ -//#include +#include #include #include "libslic3r/Preset.hpp" @@ -88,9 +88,9 @@ protected: static BitmapCache& bitmap_cache(); // Indicator, that the preset is compatible with the selected printer. - ScalableBitmap m_bitmapCompatible; + wxBitmapBundle* m_bitmapCompatible; // Indicator, that the preset is NOT compatible with the selected printer. - ScalableBitmap m_bitmapIncompatible; + wxBitmapBundle* m_bitmapIncompatible; int m_last_selected; int m_em_unit; @@ -99,6 +99,7 @@ protected: // parameters for an icon's drawing int icon_height; int norm_icon_width; + int null_icon_width; int thin_icon_width; int wide_icon_width; int space_icon_width; @@ -120,13 +121,15 @@ protected: #endif // __linux__ static wxString separator(const std::string& label); - wxBitmap* get_bmp( std::string bitmap_key, bool wide_icons, const std::string& main_icon_name, + wxBitmapBundle* get_bmp( std::string bitmap_key, bool wide_icons, const std::string& main_icon_name, bool is_compatible = true, bool is_system = false, bool is_single_bar = false, const std::string& filament_rgb = "", const std::string& extruder_rgb = "", const std::string& material_rgb = ""); - wxBitmap* get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name, + wxBitmapBundle* get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name, bool is_enabled = true, bool is_compatible = true, bool is_system = false); + wxBitmapBundle NullBitmapBndl(); + private: void fill_width_height(); }; @@ -155,6 +158,7 @@ public: wxString get_preset_name(const Preset& preset) override; void update() override; void msw_rescale() override; + void sys_color_changed() override; void OnSelect(wxCommandEvent& evt) override; private: diff --git a/src/slic3r/GUI/ProjectDirtyStateManager.cpp b/src/slic3r/GUI/ProjectDirtyStateManager.cpp index 89c13b6406..d30e5d5109 100644 --- a/src/slic3r/GUI/ProjectDirtyStateManager.cpp +++ b/src/slic3r/GUI/ProjectDirtyStateManager.cpp @@ -7,6 +7,8 @@ #include "I18N.hpp" #include "Plater.hpp" +#include "libslic3r/Model.hpp" + #include #include @@ -38,12 +40,18 @@ void ProjectDirtyStateManager::update_from_presets() app.mainframe->update_title(); } +void ProjectDirtyStateManager::update_from_preview() +{ + m_custom_gcode_per_print_z_dirty = m_initial_custom_gcode_per_print_z != wxGetApp().model().custom_gcode_per_print_z; +} + void ProjectDirtyStateManager::reset_after_save() { this->reset_initial_presets(); m_plater_dirty = false; m_presets_dirty = false; m_project_config_dirty = false; + m_custom_gcode_per_print_z_dirty = false; wxGetApp().mainframe->update_title(); } @@ -54,6 +62,7 @@ void ProjectDirtyStateManager::reset_initial_presets() for (const PresetCollection *preset_collection : app.get_active_preset_collections()) m_initial_presets[preset_collection->type()] = preset_collection->get_selected_preset_name(); m_initial_project_config = app.preset_bundle->project_config; + m_initial_custom_gcode_per_print_z = app.model().custom_gcode_per_print_z; } #if ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW diff --git a/src/slic3r/GUI/ProjectDirtyStateManager.hpp b/src/slic3r/GUI/ProjectDirtyStateManager.hpp index 6841c89c69..e4e2668fdc 100644 --- a/src/slic3r/GUI/ProjectDirtyStateManager.hpp +++ b/src/slic3r/GUI/ProjectDirtyStateManager.hpp @@ -2,6 +2,7 @@ #define slic3r_ProjectDirtyStateManager_hpp_ #include "libslic3r/Preset.hpp" +#include "libslic3r/CustomGCode.hpp" namespace Slic3r { namespace GUI { @@ -11,10 +12,11 @@ class ProjectDirtyStateManager public: void update_from_undo_redo_stack(bool dirty); void update_from_presets(); + void update_from_preview(); void reset_after_save(); void reset_initial_presets(); - bool is_dirty() const { return m_plater_dirty || m_project_config_dirty || m_presets_dirty; } + bool is_dirty() const { return m_plater_dirty || m_project_config_dirty || m_presets_dirty || m_custom_gcode_per_print_z_dirty; } bool is_presets_dirty() const { return m_presets_dirty; } #if ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW @@ -28,9 +30,12 @@ private: bool m_presets_dirty { false }; // Is the project config dirty? bool m_project_config_dirty { false }; + // Is the custom_gcode_per_print_z dirty? + bool m_custom_gcode_per_print_z_dirty { false }; // Keeps track of preset names selected at the time of last project save. std::array m_initial_presets; DynamicPrintConfig m_initial_project_config; + CustomGCode::Info m_initial_custom_gcode_per_print_z; }; } // namespace GUI diff --git a/src/slic3r/GUI/SavePresetDialog.cpp b/src/slic3r/GUI/SavePresetDialog.cpp index 460b30126e..2a2e3bb100 100644 --- a/src/slic3r/GUI/SavePresetDialog.cpp +++ b/src/slic3r/GUI/SavePresetDialog.cpp @@ -56,7 +56,7 @@ SavePresetDialog::Item::Item(Preset::Type type, const std::string& suffix, wxBox wxStaticText* label_top = new wxStaticText(m_parent, wxID_ANY, from_u8((boost::format(_utf8(L("Save %s as:"))) % into_u8(tab->title())).str())); - m_valid_bmp = new wxStaticBitmap(m_parent, wxID_ANY, create_scaled_bitmap("tick_mark", m_parent)); + m_valid_bmp = new wxStaticBitmap(m_parent, wxID_ANY, *get_bmp_bundle("tick_mark")); m_combo = new wxComboBox(m_parent, wxID_ANY, from_u8(preset_name), wxDefaultPosition, wxSize(35 * wxGetApp().em_unit(), -1)); for (const std::string& value : values) @@ -173,7 +173,7 @@ void SavePresetDialog::Item::update_valid_bmp() { std::string bmp_name = m_valid_type == Warning ? "exclamation" : m_valid_type == NoValid ? "cross" : "tick_mark" ; - m_valid_bmp->SetBitmap(create_scaled_bitmap(bmp_name, m_parent)); + m_valid_bmp->SetBitmap(*get_bmp_bundle(bmp_name)); } void SavePresetDialog::Item::accept() diff --git a/src/slic3r/GUI/SceneRaycaster.cpp b/src/slic3r/GUI/SceneRaycaster.cpp new file mode 100644 index 0000000000..49a59789e3 --- /dev/null +++ b/src/slic3r/GUI/SceneRaycaster.cpp @@ -0,0 +1,212 @@ +#include "libslic3r/libslic3r.h" +#include "SceneRaycaster.hpp" + +#include "Camera.hpp" +#include "GUI_App.hpp" + +#if ENABLE_RAYCAST_PICKING + +namespace Slic3r { +namespace GUI { + +SceneRaycaster::SceneRaycaster() { +#if ENABLE_RAYCAST_PICKING_DEBUG + // hit point + m_sphere.init_from(its_make_sphere(1.0, double(PI) / 16.0)); + m_sphere.set_color(ColorRGBA::YELLOW()); + + // hit normal + GLModel::Geometry init_data; + init_data.format = { GLModel::Geometry::EPrimitiveType::Lines, GLModel::Geometry::EVertexLayout::P3 }; + init_data.color = ColorRGBA::YELLOW(); + init_data.reserve_vertices(2); + init_data.reserve_indices(2); + + // vertices + init_data.add_vertex((Vec3f)Vec3f::Zero()); + init_data.add_vertex((Vec3f)Vec3f::UnitZ()); + + // indices + init_data.add_line(0, 1); + + m_line.init_from(std::move(init_data)); +#endif // ENABLE_RAYCAST_PICKING_DEBUG +} + +std::shared_ptr SceneRaycaster::add_raycaster(EType type, int id, const MeshRaycaster& raycaster, + const Transform3d& trafo, bool use_back_faces) +{ + switch (type) { + case EType::Bed: { return m_bed.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } + case EType::Volume: { return m_volumes.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } + case EType::Gizmo: { return m_gizmos.emplace_back(std::make_shared(encode_id(type, id), raycaster, trafo, use_back_faces)); } + default: { assert(false); return nullptr; } + }; +} + +void SceneRaycaster::remove_raycasters(EType type, int id) +{ + std::vector>* raycasters = get_raycasters(type); + auto it = raycasters->begin(); + while (it != raycasters->end()) { + if ((*it)->get_id() == encode_id(type, id)) + it = raycasters->erase(it); + else + ++it; + } +} + +void SceneRaycaster::remove_raycasters(EType type) +{ + switch (type) { + case EType::Bed: { m_bed.clear(); break; } + case EType::Volume: { m_volumes.clear(); break; } + case EType::Gizmo: { m_gizmos.clear(); break; } + default: { break; } + }; +} + +void SceneRaycaster::remove_raycaster(std::shared_ptr item) +{ + for (auto it = m_bed.begin(); it != m_bed.end(); ++it) { + if (*it == item) { + m_bed.erase(it); + return; + } + } + for (auto it = m_volumes.begin(); it != m_volumes.end(); ++it) { + if (*it == item) { + m_volumes.erase(it); + return; + } + } + for (auto it = m_gizmos.begin(); it != m_gizmos.end(); ++it) { + if (*it == item) { + m_gizmos.erase(it); + return; + } + } +} + +SceneRaycaster::HitResult SceneRaycaster::hit(const Vec2d& mouse_pos, const Camera& camera, const ClippingPlane* clipping_plane) +{ + double closest_hit_squared_distance = std::numeric_limits::max(); + auto is_closest = [&closest_hit_squared_distance](const Camera& camera, const Vec3f& hit) { + const double hit_squared_distance = (camera.get_position() - hit.cast()).squaredNorm(); + const bool ret = hit_squared_distance < closest_hit_squared_distance; + if (ret) + closest_hit_squared_distance = hit_squared_distance; + return ret; + }; + +#if ENABLE_RAYCAST_PICKING_DEBUG + m_last_hit.reset(); +#endif // ENABLE_RAYCAST_PICKING_DEBUG + + HitResult ret; + + auto test_raycasters = [this, is_closest, clipping_plane](EType type, const Vec2d& mouse_pos, const Camera& camera, HitResult& ret) { + const ClippingPlane* clip_plane = (clipping_plane != nullptr && type == EType::Volume) ? clipping_plane : nullptr; + std::vector>* raycasters = get_raycasters(type); + const Vec3f camera_forward = camera.get_dir_forward().cast(); + HitResult current_hit = { type }; + for (std::shared_ptr item : *raycasters) { + if (!item->is_active()) + continue; + + current_hit.raycaster_id = item->get_id(); + const Transform3d& trafo = item->get_transform(); + if (item->get_raycaster()->closest_hit(mouse_pos, trafo, camera, current_hit.position, current_hit.normal, clip_plane)) { + current_hit.position = (trafo * current_hit.position.cast()).cast(); + current_hit.normal = (trafo.matrix().block(0, 0, 3, 3).inverse().transpose() * current_hit.normal.cast()).normalized().cast(); + if (item->use_back_faces() || current_hit.normal.dot(camera_forward) < 0.0f){ + if (is_closest(camera, current_hit.position)) { + ret = current_hit; + } + } + } + } + }; + + if (!m_gizmos.empty()) + test_raycasters(EType::Gizmo, mouse_pos, camera, ret); + + if (!m_gizmos_on_top || !ret.is_valid()) { + if (camera.is_looking_downward() && !m_bed.empty()) + test_raycasters(EType::Bed, mouse_pos, camera, ret); + if (!m_volumes.empty()) + test_raycasters(EType::Volume, mouse_pos, camera, ret); + } + + if (ret.is_valid()) + ret.raycaster_id = decode_id(ret.type, ret.raycaster_id); + +#if ENABLE_RAYCAST_PICKING_DEBUG + m_last_hit = ret; +#endif // ENABLE_RAYCAST_PICKING_DEBUG + return ret; +} + +#if ENABLE_RAYCAST_PICKING_DEBUG +void SceneRaycaster::render_hit(const Camera& camera) +{ + if (!m_last_hit.has_value() || !(*m_last_hit).is_valid()) + return; + + GLShaderProgram* shader = wxGetApp().get_shader("flat"); + shader->start_using(); + + shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + + const Transform3d sphere_view_model_matrix = camera.get_view_matrix() * Geometry::translation_transform((*m_last_hit).position.cast()) * + Geometry::scale_transform(4.0 * camera.get_inv_zoom()); + shader->set_uniform("view_model_matrix", sphere_view_model_matrix); + m_sphere.render(); + + Eigen::Quaterniond q; + Transform3d m = Transform3d::Identity(); + m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3d::UnitZ(), (*m_last_hit).normal.cast()).toRotationMatrix(); + + const Transform3d line_view_model_matrix = sphere_view_model_matrix * m * Geometry::scale_transform(10.0); + shader->set_uniform("view_model_matrix", line_view_model_matrix); + m_line.render(); + + shader->stop_using(); +} +#endif // ENABLE_RAYCAST_PICKING_DEBUG + +std::vector>* SceneRaycaster::get_raycasters(EType type) +{ + std::vector>* ret = nullptr; + switch (type) + { + case EType::Bed: { ret = &m_bed; break; } + case EType::Volume: { ret = &m_volumes; break; } + case EType::Gizmo: { ret = &m_gizmos; break; } + default: { break; } + } + assert(ret != nullptr); + return ret; +} + +int SceneRaycaster::base_id(EType type) +{ + switch (type) + { + case EType::Bed: { return int(EIdBase::Bed); } + case EType::Volume: { return int(EIdBase::Volume); } + case EType::Gizmo: { return int(EIdBase::Gizmo); } + default: { break; } + }; + + assert(false); + return -1; +} + +int SceneRaycaster::encode_id(EType type, int id) { return base_id(type) + id; } +int SceneRaycaster::decode_id(EType type, int id) { return id - base_id(type); } + +} // namespace GUI +} // namespace Slic3r + +#endif // ENABLE_RAYCAST_PICKING diff --git a/src/slic3r/GUI/SceneRaycaster.hpp b/src/slic3r/GUI/SceneRaycaster.hpp new file mode 100644 index 0000000000..8993c51a98 --- /dev/null +++ b/src/slic3r/GUI/SceneRaycaster.hpp @@ -0,0 +1,116 @@ +#ifndef slic3r_SceneRaycaster_hpp_ +#define slic3r_SceneRaycaster_hpp_ + +#if ENABLE_RAYCAST_PICKING + +#include "MeshUtils.hpp" +#include "GLModel.hpp" +#include +#include +#include + +namespace Slic3r { +namespace GUI { + +struct Camera; + +class SceneRaycasterItem +{ + int m_id{ -1 }; + bool m_active{ true }; + bool m_use_back_faces{ false }; + const MeshRaycaster* m_raycaster; + Transform3d m_trafo; + +public: + SceneRaycasterItem(int id, const MeshRaycaster& raycaster, const Transform3d& trafo, bool use_back_faces = false) + : m_id(id), m_raycaster(&raycaster), m_trafo(trafo), m_use_back_faces(use_back_faces) + {} + + int get_id() const { return m_id; } + bool is_active() const { return m_active; } + void set_active(bool active) { m_active = active; } + bool use_back_faces() const { return m_use_back_faces; } + const MeshRaycaster* get_raycaster() const { return m_raycaster; } + const Transform3d& get_transform() const { return m_trafo; } + void set_transform(const Transform3d& trafo) { m_trafo = trafo; } +}; + +class SceneRaycaster +{ +public: + enum class EType + { + None, + Bed, + Volume, + Gizmo + }; + + enum class EIdBase + { + Bed = 0, + Volume = 1000, + Gizmo = 1000000 + }; + + struct HitResult + { + EType type{ EType::None }; + int raycaster_id{ -1 }; + Vec3f position{ Vec3f::Zero() }; + Vec3f normal{ Vec3f::Zero() }; + + bool is_valid() const { return raycaster_id != -1; } + }; + +private: + std::vector> m_bed; + std::vector> m_volumes; + std::vector> m_gizmos; + + // When set to true, if checking gizmos returns a valid hit, + // the search is not performed on other types + bool m_gizmos_on_top{ false }; + +#if ENABLE_RAYCAST_PICKING_DEBUG + GLModel m_sphere; + GLModel m_line; + std::optional m_last_hit; +#endif // ENABLE_RAYCAST_PICKING_DEBUG + +public: + SceneRaycaster(); + + std::shared_ptr add_raycaster(EType type, int picking_id, const MeshRaycaster& raycaster, + const Transform3d& trafo, bool use_back_faces = false); + void remove_raycasters(EType type, int id); + void remove_raycasters(EType type); + void remove_raycaster(std::shared_ptr item); + + std::vector>* get_raycasters(EType type); + + void set_gizmos_on_top(bool value) { m_gizmos_on_top = value; } + + HitResult hit(const Vec2d& mouse_pos, const Camera& camera, const ClippingPlane* clipping_plane = nullptr); + +#if ENABLE_RAYCAST_PICKING_DEBUG + void render_hit(const Camera& camera); + + size_t beds_count() const { return m_bed.size(); } + size_t volumes_count() const { return m_volumes.size(); } + size_t gizmos_count() const { return m_gizmos.size(); } +#endif // ENABLE_RAYCAST_PICKING_DEBUG + +private: + static int encode_id(EType type, int id); + static int decode_id(EType type, int id); + static int base_id(EType type); +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // ENABLE_RAYCAST_PICKING + +#endif // slic3r_SceneRaycaster_hpp_ diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp index 6b5edc30e0..52e58193c7 100644 --- a/src/slic3r/GUI/Search.cpp +++ b/src/slic3r/GUI/Search.cpp @@ -720,12 +720,9 @@ void SearchDialog::msw_rescale() { const int& em = em_unit(); - search_list_model->msw_rescale(); search_list->GetColumn(SearchListModel::colIcon )->SetWidth(3 * em); search_list->GetColumn(SearchListModel::colMarkedText)->SetWidth(45 * em); - msw_buttons_rescale(this, em, { wxID_CANCEL }); - const wxSize& size = wxSize(40 * em, 30 * em); SetMinSize(size); @@ -743,7 +740,7 @@ void SearchDialog::on_sys_color_changed() #endif // msw_rescale updates just icons, so use it - search_list_model->msw_rescale(); + search_list_model->sys_color_changed(); Refresh(); } @@ -776,10 +773,10 @@ void SearchListModel::Prepend(const std::string& label) RowPrepended(); } -void SearchListModel::msw_rescale() +void SearchListModel::sys_color_changed() { for (ScalableBitmap& bmp : m_icon) - bmp.msw_rescale(); + bmp.sys_color_changed(); } wxString SearchListModel::GetColumnType(unsigned int col) const @@ -795,7 +792,7 @@ void SearchListModel::GetValueByRow(wxVariant& variant, switch (col) { case colIcon: - variant << m_icon[m_values[row].second].bmp(); + variant << m_icon[m_values[row].second].bmp().GetBitmapFor(m_icon[m_values[row].second].parent()); break; case colMarkedText: variant = m_values[row].first; diff --git a/src/slic3r/GUI/Search.hpp b/src/slic3r/GUI/Search.hpp index 49866d0661..0d78511324 100644 --- a/src/slic3r/GUI/Search.hpp +++ b/src/slic3r/GUI/Search.hpp @@ -213,7 +213,7 @@ public: void Clear(); void Prepend(const std::string& text); - void msw_rescale(); + void sys_color_changed(); // implementation of base class virtuals to define model diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp index 7a54f84f7c..f32153f560 100644 --- a/src/slic3r/GUI/Selection.cpp +++ b/src/slic3r/GUI/Selection.cpp @@ -1718,30 +1718,25 @@ void Selection::render_center(bool gizmo_is_dragging) glsafe(::glDisable(GL_DEPTH_TEST)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); Transform3d view_model_matrix = camera.get_view_matrix() * Geometry::assemble_transform(center); shader->set_uniform("view_model_matrix", view_model_matrix); shader->set_uniform("projection_matrix", camera.get_projection_matrix()); + m_vbo_sphere.set_color(ColorRGBA::WHITE()); #else glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES - -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_vbo_sphere.set_color(ColorRGBA::WHITE()); -#else m_vbo_sphere.set_color(-1, ColorRGBA::WHITE()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL - m_vbo_sphere.render(); -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES + m_vbo_sphere.render(); #if ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); +#else + glsafe(::glPopMatrix()); #endif // ENABLE_LEGACY_OPENGL_REMOVAL } #endif // ENABLE_RENDER_SELECTION_CENTER @@ -1772,12 +1767,12 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glEnable(GL_DEPTH_TEST)); -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Transform3d base_matrix = Geometry::assemble_transform(get_bounding_box().center()); Transform3d orient_matrix = Transform3d::Identity(); #else glsafe(::glPushMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WORLD_COORDINATE const Vec3d center = get_bounding_box().center(); @@ -1785,28 +1780,28 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) #endif // ENABLE_WORLD_COORDINATE if (!boost::starts_with(sidebar_field, "layer")) { -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL shader->set_uniform("emission_factor", 0.05f); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if !ENABLE_GL_SHADERS_ATTRIBUTES && !ENABLE_WORLD_COORDINATE +#endif // ENABLE_LEGACY_OPENGL_REMOVAL +#if !ENABLE_LEGACY_OPENGL_REMOVAL&& !ENABLE_WORLD_COORDINATE const Vec3d& center = get_bounding_box().center(); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES && !ENABLE_WORLD_COORDINATE +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL&& !ENABLE_WORLD_COORDINATE #if ENABLE_WORLD_COORDINATE if (is_single_full_instance() && !wxGetApp().obj_manipul()->is_world_coordinates()) { #else if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates()) { #endif // ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES && !ENABLE_WORLD_COORDINATE +#if !ENABLE_LEGACY_OPENGL_REMOVAL&& !ENABLE_WORLD_COORDINATE glsafe(::glTranslated(center.x(), center.y(), center.z())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES && !ENABLE_WORLD_COORDINATE +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL&& !ENABLE_WORLD_COORDINATE #if ENABLE_WORLD_COORDINATE orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); axes_center = (*m_volumes)[*m_list.begin()]->get_instance_offset(); #else if (!boost::starts_with(sidebar_field, "position")) { -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL Transform3d orient_matrix = Transform3d::Identity(); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL if (boost::starts_with(sidebar_field, "scale")) orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); else if (boost::starts_with(sidebar_field, "rotation")) { @@ -1820,10 +1815,10 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) orient_matrix.rotate(Eigen::AngleAxisd(rotation.z(), Vec3d::UnitZ())); } } -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glMultMatrixd(orient_matrix.data())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES - } +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL + } #endif // ENABLE_WORLD_COORDINATE } #if ENABLE_WORLD_COORDINATE @@ -1831,9 +1826,9 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) #else else if (is_single_volume() || is_single_modifier()) { #endif // ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES && !ENABLE_WORLD_COORDINATE +#if !ENABLE_LEGACY_OPENGL_REMOVAL&& !ENABLE_WORLD_COORDINATE glsafe(::glTranslated(center.x(), center.y(), center.z())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES && !ENABLE_WORLD_COORDINATE +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL&& !ENABLE_WORLD_COORDINATE #if ENABLE_WORLD_COORDINATE if (!wxGetApp().obj_manipul()->is_world_coordinates()) { if (wxGetApp().obj_manipul()->is_local_coordinates()) { @@ -1847,20 +1842,22 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) } } #else -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); #else + glsafe(::glTranslated(center.x(), center.y(), center.z())); Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (!boost::starts_with(sidebar_field, "position")) orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true); -#if !ENABLE_GL_SHADERS_ATTRIBUTES + +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glMultMatrixd(orient_matrix.data())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE } else { -#if ENABLE_GL_SHADERS_ATTRIBUTES || ENABLE_WORLD_COORDINATE +#if ENABLE_LEGACY_OPENGL_REMOVAL|| ENABLE_WORLD_COORDINATE if (requires_local_axes()) #if ENABLE_WORLD_COORDINATE orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation_matrix(); @@ -1873,7 +1870,7 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) const Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true); glsafe(::glMultMatrixd(orient_matrix.data())); } -#endif // ENABLE_GL_SHADERS_ATTRIBUTES || ENABLE_WORLD_COORDINATE +#endif // ENABLE_LEGACY_OPENGL_REMOVAL|| ENABLE_WORLD_COORDINATE } } @@ -1885,15 +1882,15 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) #if ENABLE_WORLD_COORDINATE if (!boost::starts_with(sidebar_field, "layer")) { shader->set_uniform("emission_factor", 0.1f); -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushMatrix()); glsafe(::glTranslated(center.x(), center.y(), center.z())); glsafe(::glMultMatrixd(orient_matrix.data())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL } #endif // ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL if (boost::starts_with(sidebar_field, "position")) render_sidebar_position_hints(sidebar_field, *shader, base_matrix * orient_matrix); else if (boost::starts_with(sidebar_field, "rotation")) @@ -1930,17 +1927,17 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field) glsafe(::glPopMatrix()); } #endif // ENABLE_WORLD_COORDINATE -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL #if ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE #if !ENABLE_LEGACY_OPENGL_REMOVAL if (!boost::starts_with(sidebar_field, "layer")) -#endif // !ENABLE_LEGACY_OPENGL_REMOVAL +#endif // ENABLE_LEGACY_OPENGL_REMOVAL shader->stop_using(); } @@ -2519,21 +2516,26 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con glsafe(::glEnable(GL_DEPTH_TEST)); - glsafe(::glLineWidth(2.0f * m_scale_factor)); +#if ENABLE_GL_CORE_PROFILE + if (!OpenGLManager::get_gl_info().is_core_profile()) + glsafe(::glLineWidth(2.0f * m_scale_factor)); + GLShaderProgram* shader = OpenGLManager::get_gl_info().is_core_profile() ? wxGetApp().get_shader("dashed_thick_lines") : wxGetApp().get_shader("flat"); +#else + glsafe(::glLineWidth(2.0f * m_scale_factor)); GLShaderProgram* shader = wxGetApp().get_shader("flat"); +#endif // ENABLE_GL_CORE_PROFILE if (shader == nullptr) return; #if ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPushMatrix()); glsafe(::glMultMatrixd(trafo.data())); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE shader->start_using(); -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); #if ENABLE_WORLD_COORDINATE shader->set_uniform("view_model_matrix", camera.get_view_matrix() * trafo); @@ -2541,15 +2543,20 @@ void Selection::render_bounding_box(const BoundingBoxf3 & box, float* color) con shader->set_uniform("view_model_matrix", camera.get_view_matrix()); #endif // ENABLE_WORLD_COORDINATE shader->set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_GL_CORE_PROFILE + const std::array& viewport = camera.get_viewport(); + shader->set_uniform("viewport_size", Vec2d(double(viewport[2]), double(viewport[3]))); + shader->set_uniform("width", 1.5f); + shader->set_uniform("gap_size", 0.0f); +#endif // ENABLE_GL_CORE_PROFILE m_box.set_color(to_rgba(color)); m_box.render(); shader->stop_using(); #if ENABLE_WORLD_COORDINATE -#if !ENABLE_GL_SHADERS_ATTRIBUTES +#if !ENABLE_LEGACY_OPENGL_REMOVAL glsafe(::glPopMatrix()); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES +#endif // !ENABLE_LEGACY_OPENGL_REMOVAL #endif // ENABLE_WORLD_COORDINATE #else ::glBegin(GL_LINES); @@ -2595,46 +2602,36 @@ static ColorRGBA get_color(Axis axis) return AXES_COLOR[axis]; } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Selection::render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) #else void Selection::render_sidebar_position_hints(const std::string& sidebar_field) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d view_matrix = camera.get_view_matrix() * matrix; + const Transform3d& view_matrix = camera.get_view_matrix(); shader.set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (boost::ends_with(sidebar_field, "x")) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d view_model_matrix = view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()); - shader.set_uniform("view_model_matrix", view_model_matrix); - shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + const Transform3d model_matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ()); + shader.set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader.set_uniform("view_normal_matrix", view_normal_matrix); m_arrow.set_color(get_color(X)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "y")) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - shader.set_uniform("view_model_matrix", view_matrix); - shader.set_uniform("normal_matrix", (Matrix3d)view_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + shader.set_uniform("view_model_matrix", view_matrix * matrix); + shader.set_uniform("view_normal_matrix", (Matrix3d)Matrix3d::Identity()); m_arrow.set_color(get_color(Y)); m_arrow.render(); } else if (boost::ends_with(sidebar_field, "z")) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - const Transform3d view_model_matrix = view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX()); - shader.set_uniform("view_model_matrix", view_model_matrix); - shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else - glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + const Transform3d model_matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX()); + shader.set_uniform("view_model_matrix", view_matrix * model_matrix); + const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader.set_uniform("view_normal_matrix", view_normal_matrix); m_arrow.set_color(get_color(Z)); m_arrow.render(); } @@ -2656,65 +2653,40 @@ void Selection::render_sidebar_position_hints(const std::string& sidebar_field) #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) #else void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { #if ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES - auto render_sidebar_rotation_hint = [this](GLShaderProgram& shader, const Transform3d& matrix) { - Transform3d view_model_matrix = matrix; - shader.set_uniform("view_model_matrix", view_model_matrix); - shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + auto render_sidebar_rotation_hint = [this](GLShaderProgram& shader, const Transform3d& view_matrix, const Transform3d& model_matrix) { + shader.set_uniform("view_model_matrix", view_matrix * model_matrix); + Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader.set_uniform("view_normal_matrix", view_normal_matrix); m_curved_arrow.render(); - view_model_matrix = matrix * Geometry::assemble_transform(Vec3d::Zero(), PI * Vec3d::UnitZ()); - shader.set_uniform("view_model_matrix", view_model_matrix); - shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); + const Transform3d matrix = model_matrix * Geometry::assemble_transform(Vec3d::Zero(), PI * Vec3d::UnitZ()); + shader.set_uniform("view_model_matrix", view_matrix * matrix); + view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader.set_uniform("view_normal_matrix", view_normal_matrix); m_curved_arrow.render(); }; const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d view_matrix = camera.get_view_matrix() * matrix; + const Transform3d& view_matrix = camera.get_view_matrix(); shader.set_uniform("projection_matrix", camera.get_projection_matrix()); -#else - auto render_sidebar_rotation_hint = [this]() { - m_curved_arrow.render(); - glsafe(::glRotated(180.0, 0.0, 0.0, 1.0)); - m_curved_arrow.render(); - }; -#endif // ENABLE_GL_SHADERS_ATTRIBUTES if (boost::ends_with(sidebar_field, "x")) { -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glRotated(90.0, 0.0, 1.0, 0.0)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES m_curved_arrow.set_color(get_color(X)); -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_sidebar_rotation_hint(shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY())); -#else - render_sidebar_rotation_hint(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + render_sidebar_rotation_hint(shader, view_matrix, matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitY())); } else if (boost::ends_with(sidebar_field, "y")) { -#if !ENABLE_GL_SHADERS_ATTRIBUTES - glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0)); -#endif // !ENABLE_GL_SHADERS_ATTRIBUTES m_curved_arrow.set_color(get_color(Y)); -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_sidebar_rotation_hint(shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX())); -#else - render_sidebar_rotation_hint(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + render_sidebar_rotation_hint(shader, view_matrix, matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitX())); } else if (boost::ends_with(sidebar_field, "z")) { m_curved_arrow.set_color(get_color(Z)); -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_sidebar_rotation_hint(shader, view_matrix); -#else - render_sidebar_rotation_hint(); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES + render_sidebar_rotation_hint(shader, view_matrix, matrix); } #else auto render_sidebar_rotation_hint = [this]() { @@ -2740,11 +2712,11 @@ void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) #endif // ENABLE_LEGACY_OPENGL_REMOVAL } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Selection::render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix) #else void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { #if ENABLE_WORLD_COORDINATE const bool uniform_scale = wxGetApp().obj_manipul()->get_uniform_scaling(); @@ -2752,85 +2724,80 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) const bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling(); #endif // ENABLE_WORLD_COORDINATE -#if ENABLE_GL_SHADERS_ATTRIBUTES - auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis, GLShaderProgram& shader, const Transform3d& matrix) { +#if ENABLE_LEGACY_OPENGL_REMOVAL + auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis, GLShaderProgram& shader, const Transform3d& view_matrix, const Transform3d& model_matrix) { + m_arrow.set_color(uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); + Transform3d matrix = model_matrix * Geometry::assemble_transform(5.0 * Vec3d::UnitY()); + shader.set_uniform("view_model_matrix", view_matrix * matrix); + Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader.set_uniform("view_normal_matrix", view_normal_matrix); #else auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) { -#endif // ENABLE_GL_SHADERS_ATTRIBUTES -#if ENABLE_LEGACY_OPENGL_REMOVAL - m_arrow.set_color(uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); -#else m_arrow.set_color(-1, uniform_scale ? UNIFORM_SCALE_COLOR : get_color(axis)); -#endif // ENABLE_LEGACY_OPENGL_REMOVAL - -#if ENABLE_GL_SHADERS_ATTRIBUTES - Transform3d view_model_matrix = matrix * Geometry::assemble_transform(5.0 * Vec3d::UnitY()); - shader.set_uniform("view_model_matrix", view_model_matrix); - shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); -#else GLShaderProgram* shader = wxGetApp().get_current_shader(); if (shader != nullptr) shader->set_uniform("emission_factor", 0.0f); glsafe(::glTranslated(0.0, 5.0, 0.0)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.render(); -#if ENABLE_GL_SHADERS_ATTRIBUTES - view_model_matrix = matrix * Geometry::assemble_transform(-5.0 * Vec3d::UnitY(), PI * Vec3d::UnitZ()); - shader.set_uniform("view_model_matrix", view_model_matrix); - shader.set_uniform("normal_matrix", (Matrix3d)view_model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose()); +#if ENABLE_LEGACY_OPENGL_REMOVAL + matrix = model_matrix * Geometry::assemble_transform(-5.0 * Vec3d::UnitY(), PI * Vec3d::UnitZ()); + shader.set_uniform("view_model_matrix", view_matrix * matrix); + view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); + shader.set_uniform("view_normal_matrix", view_normal_matrix); #else glsafe(::glTranslated(0.0, -10.0, 0.0)); glsafe(::glRotated(180.0, 0.0, 0.0, 1.0)); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL m_arrow.render(); }; -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL const Camera& camera = wxGetApp().plater()->get_camera(); - const Transform3d view_matrix = camera.get_view_matrix() * matrix; + const Transform3d& view_matrix = camera.get_view_matrix(); shader.set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL if (boost::ends_with(sidebar_field, "x") || uniform_scale) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_sidebar_scale_hint(X, shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ())); +#if ENABLE_LEGACY_OPENGL_REMOVAL + render_sidebar_scale_hint(X, shader, view_matrix, matrix * Geometry::assemble_transform(Vec3d::Zero(), -0.5 * PI * Vec3d::UnitZ())); #else glsafe(::glPushMatrix()); glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0)); render_sidebar_scale_hint(X); glsafe(::glPopMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } if (boost::ends_with(sidebar_field, "y") || uniform_scale) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_sidebar_scale_hint(Y, shader, view_matrix); +#if ENABLE_LEGACY_OPENGL_REMOVAL + render_sidebar_scale_hint(Y, shader, view_matrix, matrix); #else glsafe(::glPushMatrix()); render_sidebar_scale_hint(Y); glsafe(::glPopMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } if (boost::ends_with(sidebar_field, "z") || uniform_scale) { -#if ENABLE_GL_SHADERS_ATTRIBUTES - render_sidebar_scale_hint(Z, shader, view_matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX())); +#if ENABLE_LEGACY_OPENGL_REMOVAL + render_sidebar_scale_hint(Z, shader, view_matrix, matrix * Geometry::assemble_transform(Vec3d::Zero(), 0.5 * PI * Vec3d::UnitX())); #else glsafe(::glPushMatrix()); glsafe(::glRotated(90.0, 1.0, 0.0, 0.0)); render_sidebar_scale_hint(Z); glsafe(::glPopMatrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL } } -#if ENABLE_GL_SHADERS_ATTRIBUTES +#if ENABLE_LEGACY_OPENGL_REMOVAL void Selection::render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader) #else void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL { static const float Margin = 10.0f; @@ -2928,11 +2895,9 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) m_planes.models[1].init_from(std::move(init_data)); } -#if ENABLE_GL_SHADERS_ATTRIBUTES const Camera& camera = wxGetApp().plater()->get_camera(); shader.set_uniform("view_model_matrix", camera.get_view_matrix()); shader.set_uniform("projection_matrix", camera.get_projection_matrix()); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES m_planes.models[0].set_color((camera_on_top && type == 1) || (!camera_on_top && type == 2) ? SOLID_PLANE_COLOR : TRANSPARENT_PLANE_COLOR); m_planes.models[0].render(); @@ -3023,7 +2988,6 @@ void Selection::synchronize_unselected_instances(SyncRotationType sync_rotation_ const Geometry::Transformation& curr_inst_trafo_i = volume_i->get_instance_transformation(); const Vec3d curr_inst_rotation_i = curr_inst_trafo_i.get_rotation(); const Vec3d& curr_inst_scaling_factor_i = curr_inst_trafo_i.get_scaling_factor(); - const Vec3d& curr_inst_mirror_i = curr_inst_trafo_i.get_mirror(); const Vec3d old_inst_rotation_i = m_cache.volumes_data[i].get_instance_transform().get_rotation(); #else const Vec3d& rotation = volume_i->get_instance_rotation(); @@ -3096,7 +3060,7 @@ void Selection::synchronize_unselected_instances(SyncRotationType sync_rotation_ #if ENABLE_WORLD_COORDINATE volume_j->set_instance_transformation(Geometry::assemble_transform(new_inst_offset_j, new_inst_rotation_j, - curr_inst_scaling_factor_i, curr_inst_mirror_i)); + curr_inst_scaling_factor_i)); #else volume_j->set_instance_scaling_factor(scaling_factor); volume_j->set_instance_mirror(mirror); diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp index 85cf9461f7..a518d6017e 100644 --- a/src/slic3r/GUI/Selection.hpp +++ b/src/slic3r/GUI/Selection.hpp @@ -467,21 +467,20 @@ private: #else void render_bounding_box(const BoundingBoxf3& box, const ColorRGB& color); #endif // ENABLE_WORLD_COORDINATE -#else void render_selected_volumes() const; void render_bounding_box(const BoundingBoxf3& box, float* color) const; -#endif // ENABLE_LEGACY_OPENGL_REMOVAL -#if ENABLE_GL_SHADERS_ATTRIBUTES void render_sidebar_position_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_rotation_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_scale_hints(const std::string& sidebar_field, GLShaderProgram& shader, const Transform3d& matrix); void render_sidebar_layers_hints(const std::string& sidebar_field, GLShaderProgram& shader); #else + void render_selected_volumes() const; + void render_bounding_box(const BoundingBoxf3& box, float* color) const; void render_sidebar_position_hints(const std::string& sidebar_field); void render_sidebar_rotation_hints(const std::string& sidebar_field); void render_sidebar_scale_hints(const std::string& sidebar_field); void render_sidebar_layers_hints(const std::string& sidebar_field); -#endif // ENABLE_GL_SHADERS_ATTRIBUTES +#endif // ENABLE_LEGACY_OPENGL_REMOVAL public: enum class SyncRotationType { diff --git a/src/slic3r/GUI/SendSystemInfoDialog.cpp b/src/slic3r/GUI/SendSystemInfoDialog.cpp index 03a38acbf1..298b3242d5 100644 --- a/src/slic3r/GUI/SendSystemInfoDialog.cpp +++ b/src/slic3r/GUI/SendSystemInfoDialog.cpp @@ -55,8 +55,10 @@ static const std::string SEND_SYSTEM_INFO_DOMAIN = "prusa3d.com"; static const std::string SEND_SYSTEM_INFO_URL = "https://files." + SEND_SYSTEM_INFO_DOMAIN + "/wp-json/v1/ps"; +#if !ENABLE_GL_CORE_PROFILE // Declaration of a free function defined in OpenGLManager.cpp: std::string gl_get_string_safe(GLenum param, const std::string& default_value); +#endif // !ENABLE_GL_CORE_PROFILE // A dialog with the information text and buttons send/dont send/ask later. @@ -432,7 +434,7 @@ static std::string generate_system_info_json() pt::ptree hw_node; { - hw_node.put("ArchName", wxPlatformInfo::Get().GetArchName()); + hw_node.put("ArchName", wxPlatformInfo::Get().GetBitnessName()); size_t num = std::round(Slic3r::total_physical_memory()/107374100.); hw_node.put("RAM_GiB", std::to_string(num / 10) + "." + std::to_string(num % 10)); } @@ -507,9 +509,13 @@ static std::string generate_system_info_json() opengl_node.put("Vendor", OpenGLManager::get_gl_info().get_vendor()); opengl_node.put("Renderer", OpenGLManager::get_gl_info().get_renderer()); // Generate list of OpenGL extensions: +#if ENABLE_GL_CORE_PROFILE + std::vector extensions_list = OpenGLManager::get_gl_info().get_extensions_list(); +#else std::string extensions_str = gl_get_string_safe(GL_EXTENSIONS, ""); std::vector extensions_list; boost::split(extensions_list, extensions_str, boost::is_any_of(" "), boost::token_compress_off); +#endif // ENABLE_GL_CORE_PROFILE std::sort(extensions_list.begin(), extensions_list.end()); pt::ptree extensions_node; for (const std::string& s : extensions_list) { diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp index 53e7d637d1..a29c3e9773 100644 --- a/src/slic3r/GUI/SysInfoDialog.cpp +++ b/src/slic3r/GUI/SysInfoDialog.cpp @@ -50,7 +50,7 @@ std::string get_main_info(bool format_as_html) out << line_end; out << b_start << "Operating System: " << b_end << wxPlatformInfo::Get().GetOperatingSystemFamilyName() << line_end; - out << b_start << "System Architecture: " << b_end << wxPlatformInfo::Get().GetArchName() << line_end; + out << b_start << "System Architecture: " << b_end << wxPlatformInfo::Get().GetBitnessName() << line_end; out << b_start << #if defined _WIN32 "Windows Version: " @@ -102,8 +102,10 @@ SysInfoDialog::SysInfoDialog() main_sizer->Add(hsizer, 1, wxEXPAND | wxALL, 10); // logo - m_logo_bmp = ScalableBitmap(this, wxGetApp().logo_name(), 192); - m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bmp.bmp()); + //m_logo_bmp = ScalableBitmap(this, wxGetApp().logo_name(), 192); + //m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bmp.bmp()); + m_logo = new wxStaticBitmap(this, wxID_ANY, *get_bmp_bundle(wxGetApp().logo_name(), 192)); + hsizer->Add(m_logo, 0, wxALIGN_CENTER_VERTICAL); wxBoxSizer* vsizer = new wxBoxSizer(wxVERTICAL); @@ -194,8 +196,8 @@ SysInfoDialog::SysInfoDialog() void SysInfoDialog::on_dpi_changed(const wxRect &suggested_rect) { - m_logo_bmp.msw_rescale(); - m_logo->SetBitmap(m_logo_bmp.bmp()); + //m_logo_bmp.msw_rescale(); + //m_logo->SetBitmap(m_logo_bmp.bmp()); wxFont font = get_default_font(this); const int fs = font.GetPointSize() - 1; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 142f86a539..8d3f78401f 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -155,10 +155,8 @@ void Tab::create_preset_tab() add_scaled_button(panel, &m_btn_edit_ph_printer, "cog"); m_show_incompatible_presets = false; - add_scaled_bitmap(this, m_bmp_show_incompatible_presets, "flag_red"); - add_scaled_bitmap(this, m_bmp_hide_incompatible_presets, "flag_green"); - add_scaled_button(panel, &m_btn_hide_incompatible_presets, m_bmp_hide_incompatible_presets.name()); + add_scaled_button(panel, &m_btn_hide_incompatible_presets, "flag_green"); m_btn_compare_preset->SetToolTip(_L("Compare this preset with some another")); // TRN "Save current Settings" @@ -207,7 +205,7 @@ void Tab::create_preset_tab() #endif m_mode_sizer = new ModeSizer(panel, int (0.5*em_unit(this))); - const float scale_factor = /*wxGetApp().*/em_unit(this)*0.1;// GetContentScaleFactor(); + const float scale_factor = em_unit(this)*0.1;// GetContentScaleFactor(); m_hsizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(m_hsizer, 0, wxEXPAND | wxBOTTOM, 3); m_hsizer->Add(m_presets_choice, 0, wxLEFT | wxRIGHT | wxTOP | wxALIGN_CENTER_VERTICAL, 3); @@ -254,11 +252,8 @@ void Tab::create_preset_tab() m_treectrl = new wxTreeCtrl(panel, wxID_ANY, wxDefaultPosition, wxSize(20 * m_em_unit, -1), wxTR_NO_BUTTONS | wxTR_HIDE_ROOT | wxTR_SINGLE | wxTR_NO_LINES | wxBORDER_SUNKEN | wxWANTS_CHARS); m_left_sizer->Add(m_treectrl, 1, wxEXPAND); - const int img_sz = int(16 * scale_factor + 0.5f); - m_icons = new wxImageList(img_sz, img_sz, true, 1); - // Index of the last icon inserted into $self->{icons}. + // Index of the last icon inserted into m_treectrl m_icon_count = -1; - m_treectrl->AssignImageList(m_icons); m_treectrl->AddRoot("root"); m_treectrl->SetIndent(0); wxGetApp().UpdateDarkUI(m_treectrl); @@ -321,6 +316,14 @@ void Tab::create_preset_tab() // Initialize the DynamicPrintConfig by default keys/values. build(); + if (!m_scaled_icons_list.empty()) { + // update icons for tree_ctrl + wxVector img_bundles; + for (const ScalableBitmap& bmp : m_scaled_icons_list) + img_bundles.push_back(bmp.bmp()); + m_treectrl->SetImages(img_bundles); + } + // ys_FIXME: Following should not be needed, the function will be called later // (update_mode->update_visibility->rebuild_page_tree). This does not work, during the // second call of rebuild_page_tree m_treectrl->GetFirstVisibleItem(); returns zero @@ -336,7 +339,7 @@ void Tab::add_scaled_button(wxWindow* parent, const wxString& label/* = wxEmptyString*/, long style /*= wxBU_EXACTFIT | wxNO_BORDER*/) { - *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, style, true); + *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, style); m_scaled_buttons.push_back(*btn); } @@ -366,7 +369,6 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str if (icon_idx == -1) { // Add a new icon to the icon list. m_scaled_icons_list.push_back(ScalableBitmap(this, icon)); - m_icons->Add(m_scaled_icons_list.back().bmp()); icon_idx = ++m_icon_count; m_icon_index[icon] = icon_idx; } @@ -591,12 +593,32 @@ void Tab::update_changed_ui() const bool deep_compare = (m_type == Slic3r::Preset::TYPE_PRINTER || m_type == Slic3r::Preset::TYPE_SLA_MATERIAL); auto dirty_options = m_presets->current_dirty_options(deep_compare); auto nonsys_options = m_presets->current_different_from_parent_options(deep_compare); - if (m_type == Preset::TYPE_PRINTER && static_cast(this)->m_printer_technology == ptFFF) { - TabPrinter* tab = static_cast(this); - if (tab->m_initial_extruders_count != tab->m_extruders_count) - dirty_options.emplace_back("extruders_count"); - if (tab->m_sys_extruders_count != tab->m_extruders_count) - nonsys_options.emplace_back("extruders_count"); + if (m_type == Preset::TYPE_PRINTER) { + { + auto check_bed_custom_options = [](std::vector& keys) { + bool was_deleted = false; + for (std::vector::iterator it = keys.begin(); it != keys.end(); ) { + if (*it == "bed_custom_texture" || *it == "bed_custom_model") { + it = keys.erase(it); + was_deleted = true; + } + else + ++it; + } + if (was_deleted && std::find(keys.begin(), keys.end(), "bed_shape") == keys.end()) + keys.emplace_back("bed_shape"); + }; + check_bed_custom_options(dirty_options); + check_bed_custom_options(nonsys_options); + } + + if (static_cast(this)->m_printer_technology == ptFFF) { + TabPrinter* tab = static_cast(this); + if (tab->m_initial_extruders_count != tab->m_extruders_count) + dirty_options.emplace_back("extruders_count"); + if (tab->m_sys_extruders_count != tab->m_extruders_count) + nonsys_options.emplace_back("extruders_count"); + } } for (auto& it : m_options_list) @@ -656,16 +678,6 @@ void TabPrinter::init_options_list() m_options_list.emplace("extruders_count", m_opt_status_value); } -void TabPrinter::msw_rescale() -{ - Tab::msw_rescale(); - - if (m_reset_to_filament_color) - m_reset_to_filament_color->msw_rescale(); - - Layout(); -} - void TabSLAMaterial::init_options_list() { if (!m_options_list.empty()) @@ -772,8 +784,11 @@ void Tab::update_changed_tree_ui() void Tab::update_undo_buttons() { - m_undo_btn-> SetBitmap_(m_is_modified_values ? m_bmp_value_revert: m_bmp_white_bullet); - m_undo_to_sys_btn-> SetBitmap_(m_is_nonsys_values ? *m_bmp_non_system : m_bmp_value_lock); + m_undo_btn-> SetBitmap_(m_is_modified_values ? m_bmp_value_revert.name(): m_bmp_white_bullet.name()); + m_undo_to_sys_btn-> SetBitmap_(m_is_nonsys_values ? m_bmp_non_system->name() : m_bmp_value_lock.name()); + + //m_undo_btn-> SetBitmap_(m_is_modified_values ? m_bmp_value_revert: m_bmp_white_bullet); + //m_undo_to_sys_btn-> SetBitmap_(m_is_nonsys_values ? *m_bmp_non_system : m_bmp_value_lock); m_undo_btn->SetToolTip(m_is_modified_values ? m_ttg_value_revert : m_ttg_white_bullet); m_undo_to_sys_btn->SetToolTip(m_is_nonsys_values ? *m_ttg_non_system : m_ttg_value_lock); @@ -821,19 +836,11 @@ void Tab::on_roll_back_value(const bool to_sys /*= true*/) if (m_type != Preset::TYPE_PRINTER && (m_options_list["compatible_printers"] & os) == 0) { to_sys ? group->back_to_sys_value("compatible_printers") : group->back_to_initial_value("compatible_printers"); load_key_value("compatible_printers", true/*some value*/, true); - - bool is_empty = m_config->option("compatible_printers")->values.empty(); - m_compatible_printers.checkbox->SetValue(is_empty); - is_empty ? m_compatible_printers.btn->Disable() : m_compatible_printers.btn->Enable(); } // "compatible_prints" option exists only in Filament Settimgs and Materials Tabs if ((m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL) && (m_options_list["compatible_prints"] & os) == 0) { to_sys ? group->back_to_sys_value("compatible_prints") : group->back_to_initial_value("compatible_prints"); load_key_value("compatible_prints", true/*some value*/, true); - - bool is_empty = m_config->option("compatible_prints")->values.empty(); - m_compatible_prints.checkbox->SetValue(is_empty); - is_empty ? m_compatible_prints.btn->Disable() : m_compatible_prints.btn->Enable(); } } for (const auto &kvp : group->opt_map()) { @@ -921,31 +928,9 @@ void Tab::msw_rescale() { m_em_unit = em_unit(m_parent); - if (m_mode_sizer) - m_mode_sizer->msw_rescale(); m_presets_choice->msw_rescale(); - m_treectrl->SetMinSize(wxSize(20 * m_em_unit, -1)); - // rescale buttons and cached bitmaps - for (const auto btn : m_scaled_buttons) - btn->msw_rescale(); - for (const auto bmp : m_scaled_bitmaps) - bmp->msw_rescale(); - - if (m_detach_preset_btn) - m_detach_preset_btn->msw_rescale(); - - // rescale icons for tree_ctrl - for (ScalableBitmap& bmp : m_scaled_icons_list) - bmp.msw_rescale(); - // recreate and set new ImageList for tree_ctrl - m_icons->RemoveAll(); - m_icons = new wxImageList(m_scaled_icons_list.front().bmp().GetWidth(), m_scaled_icons_list.front().bmp().GetHeight()); - for (ScalableBitmap& bmp : m_scaled_icons_list) - m_icons->Add(bmp.bmp()); - m_treectrl->AssignImageList(m_icons); - // rescale options_groups if (m_active_page) m_active_page->msw_rescale(); @@ -959,28 +944,28 @@ void Tab::sys_color_changed() // update buttons and cached bitmaps for (const auto btn : m_scaled_buttons) - btn->msw_rescale(); + btn->sys_color_changed(); for (const auto bmp : m_scaled_bitmaps) - bmp->msw_rescale(); + bmp->sys_color_changed(); if (m_detach_preset_btn) - m_detach_preset_btn->msw_rescale(); + m_detach_preset_btn->sys_color_changed(); + + update_show_hide_incompatible_button(); // update icons for tree_ctrl - for (ScalableBitmap& bmp : m_scaled_icons_list) - bmp.msw_rescale(); - // recreate and set new ImageList for tree_ctrl - m_icons->RemoveAll(); - m_icons = new wxImageList(m_scaled_icons_list.front().bmp().GetWidth(), m_scaled_icons_list.front().bmp().GetHeight()); - for (ScalableBitmap& bmp : m_scaled_icons_list) - m_icons->Add(bmp.bmp()); - m_treectrl->AssignImageList(m_icons); + wxVector img_bundles; + for (ScalableBitmap& bmp : m_scaled_icons_list) { + bmp.sys_color_changed(); + img_bundles.push_back(bmp.bmp()); + } + m_treectrl->SetImages(img_bundles); // Colors for ui "decoration" update_label_colours(); #ifdef _WIN32 wxWindowUpdateLocker noUpdates(this); if (m_mode_sizer) - m_mode_sizer->msw_rescale(); + m_mode_sizer->sys_color_changed(); wxGetApp().UpdateDarkUI(this); wxGetApp().UpdateDarkUI(m_treectrl); #endif @@ -991,6 +976,7 @@ void Tab::sys_color_changed() m_active_page->sys_color_changed(); Layout(); + Refresh(); } Field* Tab::get_field(const t_config_option_key& opt_key, int opt_index/* = -1*/) const @@ -1081,6 +1067,11 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) return; } + if (opt_key == "compatible_prints") + this->compatible_widget_reload(m_compatible_prints); + if (opt_key == "compatible_printers") + this->compatible_widget_reload(m_compatible_printers); + const bool is_fff = supports_printer_technology(ptFFF); ConfigOptionsGroup* og_freq_chng_params = wxGetApp().sidebar().og_freq_chng_params(is_fff); if (opt_key == "fill_density" || opt_key == "pad_enable") @@ -1254,7 +1245,7 @@ void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup) auto detach_preset_btn = [this](wxWindow* parent) { m_detach_preset_btn = new ScalableButton(parent, wxID_ANY, "lock_open_sys", _L("Detach from system preset"), - wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); + wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); ScalableButton* btn = m_detach_preset_btn; btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); @@ -1630,8 +1621,6 @@ void TabPrint::build() optgroup->append_single_option_line("clip_multipart_objects"); optgroup = page->new_optgroup(L("Arachne perimeter generator")); - optgroup->append_single_option_line("wall_add_middle_threshold"); - optgroup->append_single_option_line("wall_split_middle_threshold"); optgroup->append_single_option_line("wall_transition_angle"); optgroup->append_single_option_line("wall_transition_filter_deviation"); optgroup->append_single_option_line("wall_transition_length"); @@ -1678,14 +1667,14 @@ void TabPrint::build() option.opt.height = 5;//50; optgroup->append_single_option_line(option); - page = add_options_page(L("Notes"), "note.png"); + page = add_options_page(L("Notes"), "note"); optgroup = page->new_optgroup(L("Notes"), 0); option = optgroup->get_option("notes"); option.opt.full_width = true; option.opt.height = 25;//250; optgroup->append_single_option_line(option); - page = add_options_page(L("Dependencies"), "wrench.png"); + page = add_options_page(L("Dependencies"), "wrench"); optgroup = page->new_optgroup(L("Profile dependencies")); create_line_with_widget(optgroup.get(), "compatible_printers", "", [this](wxWindow* parent) { @@ -1699,13 +1688,6 @@ void TabPrint::build() build_preset_description_line(optgroup.get()); } -// Reload current config (aka presets->edited_preset->config) into the UI fields. -void TabPrint::reload_config() -{ - this->compatible_widget_reload(m_compatible_printers); - Tab::reload_config(); -} - void TabPrint::update_description_lines() { Tab::update_description_lines(); @@ -1925,7 +1907,7 @@ void TabFilament::build() m_presets = &m_preset_bundle->filaments; load_initial_data(); - auto page = add_options_page(L("Filament"), "spool.png"); + auto page = add_options_page(L("Filament"), "spool"); auto optgroup = page->new_optgroup(L("Filament")); optgroup->append_single_option_line("filament_colour"); optgroup->append_single_option_line("filament_diameter"); @@ -2065,7 +2047,7 @@ void TabFilament::build() option.opt.height = gcode_field_height;// 150; optgroup->append_single_option_line(option); - page = add_options_page(L("Notes"), "note.png"); + page = add_options_page(L("Notes"), "note"); optgroup = page->new_optgroup(L("Notes"), 0); optgroup->label_width = 0; option = optgroup->get_option("filament_notes"); @@ -2073,7 +2055,7 @@ void TabFilament::build() option.opt.height = notes_field_height;// 250; optgroup->append_single_option_line(option); - page = add_options_page(L("Dependencies"), "wrench.png"); + page = add_options_page(L("Dependencies"), "wrench"); optgroup = page->new_optgroup(L("Profile dependencies")); create_line_with_widget(optgroup.get(), "compatible_printers", "", [this](wxWindow* parent) { return compatible_widget_create(parent, m_compatible_printers); @@ -2094,14 +2076,6 @@ void TabFilament::build() build_preset_description_line(optgroup.get()); } -// Reload current config (aka presets->edited_preset->config) into the UI fields. -void TabFilament::reload_config() -{ - this->compatible_widget_reload(m_compatible_printers); - this->compatible_widget_reload(m_compatible_prints); - Tab::reload_config(); -} - void TabFilament::update_volumetric_flow_preset_hints() { wxString text; @@ -2457,14 +2431,14 @@ void TabPrinter::build_fff() option.opt.height = gcode_field_height;//150; optgroup->append_single_option_line(option); - page = add_options_page(L("Notes"), "note.png"); + page = add_options_page(L("Notes"), "note"); optgroup = page->new_optgroup(L("Notes"), 0); option = optgroup->get_option("printer_notes"); option.opt.full_width = true; option.opt.height = notes_field_height;//250; optgroup->append_single_option_line(option); - page = add_options_page(L("Dependencies"), "wrench.png"); + page = add_options_page(L("Dependencies"), "wrench"); optgroup = page->new_optgroup(L("Profile dependencies")); build_preset_description_line(optgroup.get()); @@ -2535,14 +2509,14 @@ void TabPrinter::build_sla() const int notes_field_height = 25; // 250 - page = add_options_page(L("Notes"), "note.png"); + page = add_options_page(L("Notes"), "note"); optgroup = page->new_optgroup(L("Notes"), 0); option = optgroup->get_option("printer_notes"); option.opt.full_width = true; option.opt.height = notes_field_height;//250; optgroup->append_single_option_line(option); - page = add_options_page(L("Dependencies"), "wrench.png"); + page = add_options_page(L("Dependencies"), "wrench"); optgroup = page->new_optgroup(L("Profile dependencies")); build_preset_description_line(optgroup.get()); @@ -2800,7 +2774,7 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/) auto reset_to_filament_color = [this, extruder_idx](wxWindow* parent) { m_reset_to_filament_color = new ScalableButton(parent, wxID_ANY, "undo", _L("Reset to Filament Color"), - wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); + wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); ScalableButton* btn = m_reset_to_filament_color; btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); btn->SetSize(btn->GetBestSize()); @@ -3488,6 +3462,14 @@ void Tab::activate_selected_page(std::function throw_if_canceled) return; m_active_page->activate(m_mode, throw_if_canceled); + + if (m_active_page->title() == "Dependencies") { + if (m_compatible_printers.checkbox) + this->compatible_widget_reload(m_compatible_printers); + if (m_compatible_prints.checkbox) + this->compatible_widget_reload(m_compatible_prints); + } + update_changed_ui(); update_description_lines(); toggle_options(); @@ -3777,8 +3759,7 @@ void Tab::toggle_show_hide_incompatible() void Tab::update_show_hide_incompatible_button() { - m_btn_hide_incompatible_presets->SetBitmap_(m_show_incompatible_presets ? - m_bmp_show_incompatible_presets : m_bmp_hide_incompatible_presets); + m_btn_hide_incompatible_presets->SetBitmap(*get_bmp_bundle(m_show_incompatible_presets ? "flag_red" : "flag_green")); m_btn_hide_incompatible_presets->SetToolTip(m_show_incompatible_presets ? "Both compatible an incompatible presets are shown. Click to hide presets not compatible with the current printer." : "Only compatible presets are shown. Click to show both the presets compatible and not compatible with the current printer."); @@ -3827,7 +3808,7 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep deps.checkbox->SetFont(Slic3r::GUI::wxGetApp().normal_font()); wxGetApp().UpdateDarkUI(deps.checkbox, false, true); deps.btn = new ScalableButton(parent, wxID_ANY, "printer", from_u8((boost::format(" %s %s") % _utf8(L("Set")) % std::string(dots.ToUTF8())).str()), - wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); + wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); deps.btn->SetSize(deps.btn->GetBestSize()); @@ -4136,7 +4117,7 @@ bool SubstitutionManager::is_empty_substitutions() wxSizer* TabPrint::create_manage_substitution_widget(wxWindow* parent) { auto create_btn = [parent](ScalableButton** btn, const wxString& label, const std::string& icon_name) { - *btn = new ScalableButton(parent, wxID_ANY, icon_name, " " + label + " ", wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); + *btn = new ScalableButton(parent, wxID_ANY, icon_name, " " + label + " ", wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); (*btn)->SetFont(wxGetApp().normal_font()); (*btn)->SetSize((*btn)->GetBestSize()); }; @@ -4189,7 +4170,7 @@ wxSizer* TabPrint::create_substitutions_widget(wxWindow* parent) wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent) { ScalableButton* btn = new ScalableButton(parent, wxID_ANY, "printer", " " + _(L("Set")) + " " + dots, - wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true); + wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT); btn->SetFont(wxGetApp().normal_font()); btn->SetSize(btn->GetBestSize()); @@ -4583,7 +4564,7 @@ void TabSLAMaterial::build() optgroup->append_line(line); - page = add_options_page(L("Notes"), "note.png"); + page = add_options_page(L("Notes"), "note"); optgroup = page->new_optgroup(L("Notes"), 0); optgroup->label_width = 0; Option option = optgroup->get_option("material_notes"); @@ -4591,7 +4572,7 @@ void TabSLAMaterial::build() option.opt.height = 25;//250; optgroup->append_single_option_line(option); - page = add_options_page(L("Dependencies"), "wrench.png"); + page = add_options_page(L("Dependencies"), "wrench"); optgroup = page->new_optgroup(L("Profile dependencies")); create_line_with_widget(optgroup.get(), "compatible_printers", "", [this](wxWindow* parent) { @@ -4612,20 +4593,12 @@ void TabSLAMaterial::build() build_preset_description_line(optgroup.get()); - page = add_options_page(L("Material printing profile"), "note.png"); + page = add_options_page(L("Material printing profile"), "note"); optgroup = page->new_optgroup(L("Material printing profile")); option = optgroup->get_option("material_print_speed"); optgroup->append_single_option_line(option); } -// Reload current config (aka presets->edited_preset->config) into the UI fields. -void TabSLAMaterial::reload_config() -{ - this->compatible_widget_reload(m_compatible_printers); - this->compatible_widget_reload(m_compatible_prints); - Tab::reload_config(); -} - void TabSLAMaterial::toggle_options() { const Preset ¤t_printer = wxGetApp().preset_bundle->printers.get_edited_preset(); @@ -4664,6 +4637,7 @@ void TabSLAPrint::build() page = add_options_page(L("Supports"), "support"/*"sla_supports"*/); optgroup = page->new_optgroup(L("Supports")); optgroup->append_single_option_line("supports_enable"); + optgroup->append_single_option_line("support_tree_type"); optgroup = page->new_optgroup(L("Support head")); optgroup->append_single_option_line("support_head_front_diameter"); @@ -4677,8 +4651,7 @@ void TabSLAPrint::build() optgroup->append_single_option_line("support_pillar_connection_mode"); optgroup->append_single_option_line("support_buildplate_only"); - // TODO: This parameter is not used at the moment. - // optgroup->append_single_option_line("support_pillar_widening_factor"); + optgroup->append_single_option_line("support_pillar_widening_factor"); optgroup->append_single_option_line("support_base_diameter"); optgroup->append_single_option_line("support_base_height"); optgroup->append_single_option_line("support_base_safety_distance"); @@ -4752,13 +4725,6 @@ void TabSLAPrint::build() build_preset_description_line(optgroup.get()); } -// Reload current config (aka presets->edited_preset->config) into the UI fields. -void TabSLAPrint::reload_config() -{ - this->compatible_widget_reload(m_compatible_printers); - Tab::reload_config(); -} - void TabSLAPrint::update_description_lines() { Tab::update_description_lines(); diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index d6f6e01124..40ceb16824 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -174,7 +174,6 @@ protected: wxBoxSizer* m_hsizer; wxBoxSizer* m_left_sizer; wxTreeCtrl* m_treectrl; - wxImageList* m_icons; wxScrolledWindow* m_page_view {nullptr}; wxBoxSizer* m_page_sizer {nullptr}; @@ -203,10 +202,6 @@ protected: ScalableButton* m_undo_to_sys_btn; ScalableButton* m_question_btn; - // Cached bitmaps. - // A "flag" icon to be displayned next to the preset name in the Tab's combo box. - ScalableBitmap m_bmp_show_incompatible_presets; - ScalableBitmap m_bmp_hide_incompatible_presets; // Bitmaps to be shown on the "Revert to system" aka "Lock to system" button next to each input field. ScalableBitmap m_bmp_value_lock; ScalableBitmap m_bmp_value_unlock; @@ -413,7 +408,6 @@ public: ~TabPrint() {} void build() override; - void reload_config() override; void update_description_lines() override; void toggle_options() override; void update() override; @@ -447,7 +441,6 @@ public: ~TabFilament() {} void build() override; - void reload_config() override; void update_description_lines() override; void toggle_options() override; void update() override; @@ -505,7 +498,6 @@ public: void build_unregular_pages(bool from_initial_build = false); void on_preset_loaded() override; void init_options_list() override; - void msw_rescale() override; bool supports_printer_technology(const PrinterTechnology /* tech */) const override { return true; } wxSizer* create_bed_shape_widget(wxWindow* parent); @@ -521,7 +513,6 @@ public: ~TabSLAMaterial() {} void build() override; - void reload_config() override; void toggle_options() override; void update() override; void init_options_list() override; @@ -538,7 +529,6 @@ public: ogStaticText* m_support_object_elevation_description_line = nullptr; void build() override; - void reload_config() override; void update_description_lines() override; void toggle_options() override; void update() override; diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp index b6555585b0..e9b4976382 100644 --- a/src/slic3r/GUI/UnsavedChangesDialog.cpp +++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp @@ -115,29 +115,21 @@ wxIcon ModelNode::get_bitmap(const wxString& color) wxBitmap ModelNode::get_bitmap(const wxString& color) #endif // __linux__ { - /* It's supposed that standard size of an icon is 48px*16px for 100% scaled display. - * So set sizes for solid_colored icons used for filament preset - * and scale them in respect to em_unit value - */ - const double em = em_unit(m_parent_win); - const int icon_width = lround(6.4 * em); - const int icon_height = lround(1.6 * em); - - BitmapCache bmp_cache; - ColorRGB rgb; - decode_color(into_u8(color), rgb); - // there is no need to scale created solid bitmap + wxBitmap bmp = get_solid_bmp_bundle(64, 16, into_u8(color))->GetBitmapFor(m_parent_win); + if (!m_toggle) + bmp = bmp.ConvertToDisabled(); #ifndef __linux__ - return bmp_cache.mksolid(icon_width, icon_height, rgb, true); + return bmp; #else wxIcon icon; - icon.CopyFromBitmap(bmp_cache.mksolid(icon_width, icon_height, rgb, true)); + icon.CopyFromBitmap(bmp); return icon; #endif // __linux__ } // option node ModelNode::ModelNode(ModelNode* parent, const wxString& text, const wxString& old_value, const wxString& new_value) : + m_parent_win(parent->m_parent_win), m_parent(parent), m_old_color(old_value.StartsWith("#") ? old_value : ""), m_new_color(new_value.StartsWith("#") ? new_value : ""), @@ -202,18 +194,22 @@ void ModelNode::UpdateIcons() { // update icons for the colors, if any exists if (!m_old_color.IsEmpty()) - m_old_color_bmp = get_bitmap(m_toggle ? m_old_color : wxString::FromUTF8(grey.c_str())); + m_old_color_bmp = get_bitmap(m_old_color); if (!m_new_color.IsEmpty()) - m_new_color_bmp = get_bitmap(m_toggle ? m_new_color : wxString::FromUTF8(grey.c_str())); + m_new_color_bmp = get_bitmap(m_new_color); // update main icon, if any exists if (m_icon_name.empty()) return; + wxBitmap bmp = get_bmp_bundle(m_icon_name)->GetBitmapFor(m_parent_win); + if (!m_toggle) + bmp = bmp.ConvertToDisabled(); + #ifdef __linux__ - m_icon.CopyFromBitmap(create_scaled_bitmap(m_icon_name, m_parent_win, 16, !m_toggle)); + m_icon.CopyFromBitmap(bmp); #else - m_icon = create_scaled_bitmap(m_icon_name, m_parent_win, 16, !m_toggle); + m_icon = bmp; #endif //__linux__ } @@ -838,7 +834,7 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ auto add_btn = [this, buttons, btn_font, dependent_presets](ScalableButton** btn, int& btn_id, const std::string& icon_name, Action close_act, const wxString& label, bool process_enable = true) { - *btn = new ScalableButton(this, btn_id = NewControlId(), icon_name, label, wxDefaultSize, wxDefaultPosition, wxBORDER_DEFAULT, true, 24); + *btn = new ScalableButton(this, btn_id = NewControlId(), icon_name, label, wxDefaultSize, wxDefaultPosition, wxBORDER_DEFAULT, 24); buttons->Add(*btn, 1, wxLEFT, 5); (*btn)->SetFont(btn_font); @@ -876,7 +872,7 @@ void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_ if (ActionButtons::SAVE & m_buttons) add_btn(&m_save_btn, m_save_btn_id, "save", Action::Save, _L("Save")); - ScalableButton* cancel_btn = new ScalableButton(this, wxID_CANCEL, "cross", _L("Cancel"), wxDefaultSize, wxDefaultPosition, wxBORDER_DEFAULT, true, 24); + ScalableButton* cancel_btn = new ScalableButton(this, wxID_CANCEL, "cross", _L("Cancel"), wxDefaultSize, wxDefaultPosition, wxBORDER_DEFAULT, 24); buttons->Add(cancel_btn, 1, wxLEFT|wxRIGHT, 5); cancel_btn->SetFont(btn_font); cancel_btn->Bind(wxEVT_BUTTON, [this](wxEvent&) { this->EndModal(wxID_CANCEL); }); @@ -1310,8 +1306,6 @@ void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect) int em = em_unit(); msw_buttons_rescale(this, em, { wxID_CANCEL, m_save_btn_id, m_move_btn_id, m_continue_btn_id }); - for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } ) - if (btn) btn->msw_rescale(); const wxSize& size = wxSize(70 * em, 30 * em); SetMinSize(size); @@ -1325,7 +1319,7 @@ void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect) void UnsavedChangesDialog::on_sys_color_changed() { for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } ) - btn->msw_rescale(); + btn->sys_color_changed(); // msw_rescale updates just icons, so use it m_tree->Rescale(); @@ -1726,10 +1720,16 @@ void DiffPresetDialog::on_dpi_changed(const wxRect&) const wxSize& size = wxSize(80 * em, 30 * em); SetMinSize(size); + auto rescale = [em](PresetComboBox* pcb) { + pcb->msw_rescale(); + wxSize sz = wxSize(35 * em, -1); + pcb->SetMinSize(sz); + pcb->SetSize(sz); + }; + for (auto preset_combos : m_preset_combos) { - preset_combos.presets_left->msw_rescale(); - preset_combos.equal_bmp->msw_rescale(); - preset_combos.presets_right->msw_rescale(); + rescale(preset_combos.presets_left); + rescale(preset_combos.presets_right); } m_tree->Rescale(em); @@ -1747,9 +1747,9 @@ void DiffPresetDialog::on_sys_color_changed() #endif for (auto preset_combos : m_preset_combos) { - preset_combos.presets_left->msw_rescale(); - preset_combos.equal_bmp->msw_rescale(); - preset_combos.presets_right->msw_rescale(); + preset_combos.presets_left->sys_color_changed(); + preset_combos.equal_bmp->sys_color_changed(); + preset_combos.presets_right->sys_color_changed(); } // msw_rescale updates just icons, so use it m_tree->Rescale(); diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp index 8763985109..c397b4b397 100644 --- a/src/slic3r/GUI/wxExtensions.cpp +++ b/src/slic3r/GUI/wxExtensions.cpp @@ -16,6 +16,7 @@ #include "Plater.hpp" #include "../Utils/MacDarkMode.hpp" #include "BitmapComboBox.hpp" +#include "libslic3r/Utils.hpp" #include "OG_CustomCtrl.hpp" #include "libslic3r/Color.hpp" @@ -23,16 +24,15 @@ #ifndef __linux__ // msw_menuitem_bitmaps is used for MSW and OSX static std::map msw_menuitem_bitmaps; -#ifdef __WXMSW__ -void msw_rescale_menu(wxMenu* menu) +void sys_color_changed_menu(wxMenu* menu) { struct update_icons { static void run(wxMenuItem* item) { const auto it = msw_menuitem_bitmaps.find(item->GetId()); if (it != msw_menuitem_bitmaps.end()) { - const wxBitmap& item_icon = create_menu_bitmap(it->second); - if (item_icon.IsOk()) - item->SetBitmap(item_icon); + wxBitmapBundle* item_icon = get_bmp_bundle(it->second); + if (item_icon->IsOk()) + item->SetBitmap(*item_icon); } if (item->IsSubMenu()) for (wxMenuItem *sub_item : item->GetSubMenu()->GetMenuItems()) @@ -43,35 +43,24 @@ void msw_rescale_menu(wxMenu* menu) for (wxMenuItem *item : menu->GetMenuItems()) update_icons::run(item); } -#endif /* __WXMSW__ */ -#endif /* no __WXGTK__ */ +#endif /* no __linux__ */ void enable_menu_item(wxUpdateUIEvent& evt, std::function const cb_condition, wxMenuItem* item, wxWindow* win) { const bool enable = cb_condition(); evt.Enable(enable); - -#ifdef __WXOSX__ - const auto it = msw_menuitem_bitmaps.find(item->GetId()); - if (it != msw_menuitem_bitmaps.end()) - { - const wxBitmap& item_icon = create_scaled_bitmap(it->second, win, 16, !enable); - if (item_icon.IsOk()) - item->SetBitmap(item_icon); - } -#endif // __WXOSX__ } wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, const wxBitmap& icon, wxEvtHandler* event_handler, + std::function cb, wxBitmapBundle* icon, wxEvtHandler* event_handler, std::function const cb_condition, wxWindow* parent, int insert_pos/* = wxNOT_FOUND*/) { if (id == wxID_ANY) id = wxNewId(); auto *item = new wxMenuItem(menu, id, string, description); - if (icon.IsOk()) { - item->SetBitmap(icon); + if (icon && icon->IsOk()) { + item->SetBitmap(*icon); } if (insert_pos == wxNOT_FOUND) menu->Append(item); @@ -100,12 +89,12 @@ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const if (id == wxID_ANY) id = wxNewId(); - const wxBitmap& bmp = !icon.empty() ? create_menu_bitmap(icon) : wxNullBitmap; // FIXME: pass window ptr -//#ifdef __WXMSW__ -#ifndef __WXGTK__ - if (bmp.IsOk()) + wxBitmapBundle* bmp = icon.empty() ? nullptr : get_bmp_bundle(icon); + +#ifndef __linux__ + if (bmp && bmp->IsOk()) msw_menuitem_bitmaps[id] = icon; -#endif /* __WXMSW__ */ +#endif /* no __linux__ */ return append_menu_item(menu, id, string, description, cb, bmp, event_handler, cb_condition, parent, insert_pos); } @@ -118,11 +107,11 @@ wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxStrin wxMenuItem* item = new wxMenuItem(menu, id, string, description); if (!icon.empty()) { - item->SetBitmap(create_menu_bitmap(icon)); // FIXME: pass window ptr -//#ifdef __WXMSW__ -#ifndef __WXGTK__ + item->SetBitmap(*get_bmp_bundle(icon)); + +#ifndef __linux__ msw_menuitem_bitmaps[id] = icon; -#endif /* __WXMSW__ */ +#endif // no __linux__ } item->SetSubMenu(sub_menu); @@ -420,9 +409,53 @@ int mode_icon_px_size() #endif } -wxBitmap create_menu_bitmap(const std::string& bmp_name) +#ifdef __WXGTK2__ +static int scale() { - return create_scaled_bitmap(bmp_name, nullptr, 16, false, "", true); + return int(em_unit(nullptr) * 0.1f + 0.5f); +} +#endif // __WXGTK2__ + +wxBitmapBundle* get_bmp_bundle(const std::string& bmp_name_in, int px_cnt/* = 16*/) +{ +#ifdef __WXGTK2__ + px_cnt *= scale(); +#endif // __WXGTK2__ + + static Slic3r::GUI::BitmapCache cache; + + std::string bmp_name = bmp_name_in; + boost::replace_last(bmp_name, ".png", ""); + + // Try loading an SVG first, then PNG if SVG is not found: + wxBitmapBundle* bmp = cache.from_svg(bmp_name, px_cnt, px_cnt, Slic3r::GUI::wxGetApp().dark_mode()); + if (bmp == nullptr) { + bmp = cache.from_png(bmp_name, px_cnt, px_cnt); + if (!bmp) + // Neither SVG nor PNG has been found, raise error + throw Slic3r::RuntimeError("Could not load bitmap: " + bmp_name); + } + return bmp; +} + +wxBitmapBundle* get_empty_bmp_bundle(int width, int height) +{ + static Slic3r::GUI::BitmapCache cache; +#ifdef __WXGTK2__ + return cache.mkclear_bndl(width * scale(), height * scale()); +#else + return cache.mkclear_bndl(width, height); +#endif // __WXGTK2__ +} + +wxBitmapBundle* get_solid_bmp_bundle(int width, int height, const std::string& color ) +{ + static Slic3r::GUI::BitmapCache cache; +#ifdef __WXGTK2__ + return cache.mksolid_bndl(width * scale(), height * scale(), color, 1, Slic3r::GUI::wxGetApp().dark_mode()); +#else + return cache.mksolid_bndl(width, height, color, 1, Slic3r::GUI::wxGetApp().dark_mode()); +#endif // __WXGTK2__ } // win is used to get a correct em_unit value @@ -463,41 +496,17 @@ wxBitmap create_scaled_bitmap( const std::string& bmp_name_in, return *bmp; } -std::vector get_extruder_color_icons(bool thin_icon/* = false*/) +std::vector get_extruder_color_icons(bool thin_icon/* = false*/) { - static Slic3r::GUI::BitmapCache bmp_cache; - // Create the bitmap with color bars. - std::vector bmps; + std::vector bmps; std::vector colors = Slic3r::GUI::wxGetApp().plater()->get_extruder_colors_from_plater_config(); if (colors.empty()) return bmps; - /* It's supposed that standard size of an icon is 36px*16px for 100% scaled display. - * So set sizes for solid_colored icons used for filament preset - * and scale them in respect to em_unit value - */ - const double em = Slic3r::GUI::wxGetApp().em_unit(); - const int icon_width = lround((thin_icon ? 1.6 : 3.2) * em); - const int icon_height = lround(1.6 * em); - - bool dark_mode = Slic3r::GUI::wxGetApp().dark_mode(); - for (const std::string& color : colors) - { - std::string bitmap_key = color + "-h" + std::to_string(icon_height) + "-w" + std::to_string(icon_width); - - wxBitmap* bitmap = bmp_cache.find(bitmap_key); - if (bitmap == nullptr) { - // Paint the color icon. - Slic3r::ColorRGB rgb; - Slic3r::decode_color(color, rgb); - // there is no neede to scale created solid bitmap - bitmap = bmp_cache.insert(bitmap_key, bmp_cache.mksolid(icon_width, icon_height, rgb, true, 1, dark_mode)); - } - bmps.emplace_back(bitmap); - } + bmps.emplace_back(get_solid_bmp_bundle(thin_icon ? 16 : 32, 16, color)); return bmps; } @@ -510,7 +519,7 @@ void apply_extruder_selector(Slic3r::GUI::BitmapComboBox** ctrl, wxSize size/* = wxDefaultSize*/, bool use_thin_icon/* = false*/) { - std::vector icons = get_extruder_color_icons(use_thin_icon); + std::vector icons = get_extruder_color_icons(use_thin_icon); if (!*ctrl) { *ctrl = new Slic3r::GUI::BitmapComboBox(parent, wxID_ANY, wxEmptyString, pos, size, 0, nullptr, wxCB_READONLY); @@ -536,7 +545,7 @@ void apply_extruder_selector(Slic3r::GUI::BitmapComboBox** ctrl, int i = 0; wxString str = _(L("Extruder")); - for (wxBitmap* bmp : icons) { + for (wxBitmapBundle* bmp : icons) { if (i == 0) { if (!first_item.empty()) (*ctrl)->Append(_(first_item), *bmp); @@ -570,7 +579,7 @@ LockButton::LockButton( wxWindow *parent, Slic3r::GUI::wxGetApp().UpdateDarkUI(this); SetBitmap(m_bmp_lock_open.bmp()); SetBitmapDisabled(m_bmp_lock_open.bmp()); - SetBitmapHover(m_bmp_lock_closed_f.bmp()); + SetBitmapCurrent(m_bmp_lock_closed_f.bmp()); //button events Bind(wxEVT_BUTTON, &LockButton::OnButton, this); @@ -599,12 +608,14 @@ void LockButton::SetLock(bool lock) } } -void LockButton::msw_rescale() +void LockButton::sys_color_changed() { - m_bmp_lock_closed.msw_rescale(); - m_bmp_lock_closed_f.msw_rescale(); - m_bmp_lock_open.msw_rescale(); - m_bmp_lock_open_f.msw_rescale(); + Slic3r::GUI::wxGetApp().UpdateDarkUI(this); + + m_bmp_lock_closed.sys_color_changed(); + m_bmp_lock_closed_f.sys_color_changed(); + m_bmp_lock_open.sys_color_changed(); + m_bmp_lock_open_f.sys_color_changed(); update_button_bitmaps(); } @@ -612,7 +623,7 @@ void LockButton::msw_rescale() void LockButton::update_button_bitmaps() { SetBitmap(m_is_pushed ? m_bmp_lock_closed.bmp() : m_bmp_lock_open.bmp()); - SetBitmapHover(m_is_pushed ? m_bmp_lock_closed_f.bmp() : m_bmp_lock_open_f.bmp()); + SetBitmapCurrent(m_is_pushed ? m_bmp_lock_closed_f.bmp() : m_bmp_lock_open_f.bmp()); Refresh(); Update(); @@ -639,7 +650,7 @@ ModeButton::ModeButton( wxWindow* parent, const wxString& mode/* = wxEmptyString*/, const std::string& icon_name/* = ""*/, int px_cnt/* = 16*/) : - ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, icon_name, px_cnt), mode, wxBU_EXACTFIT) + ScalableButton(parent, wxID_ANY, icon_name, mode, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT, px_cnt) { Init(mode); } @@ -749,11 +760,10 @@ void ModeSizer::set_items_border(int border) item->SetBorder(border); } -void ModeSizer::msw_rescale() +void ModeSizer::sys_color_changed() { - this->SetHGap(std::lround(m_hgap_unscaled * em_unit(m_parent))); for (size_t m = 0; m < m_mode_btns.size(); m++) - m_mode_btns[m]->msw_rescale(); + m_mode_btns[m]->sys_color_changed(); } // ---------------------------------------------------------------------------- @@ -793,40 +803,13 @@ ScalableBitmap::ScalableBitmap( wxWindow *parent, m_parent(parent), m_icon_name(icon_name), m_px_cnt(px_cnt) { - m_bmp = create_scaled_bitmap(icon_name, parent, px_cnt, grayscale); + m_bmp = *get_bmp_bundle(icon_name, px_cnt); + m_bitmap = m_bmp.GetBitmapFor(m_parent); } -wxSize ScalableBitmap::GetBmpSize() const +void ScalableBitmap::sys_color_changed() { -#ifdef __APPLE__ - return m_bmp.GetScaledSize(); -#else - return m_bmp.GetSize(); -#endif -} - -int ScalableBitmap::GetBmpWidth() const -{ -#ifdef __APPLE__ - return m_bmp.GetScaledWidth(); -#else - return m_bmp.GetWidth(); -#endif -} - -int ScalableBitmap::GetBmpHeight() const -{ -#ifdef __APPLE__ - return m_bmp.GetScaledHeight(); -#else - return m_bmp.GetHeight(); -#endif -} - - -void ScalableBitmap::msw_rescale() -{ - m_bmp = create_scaled_bitmap(m_icon_name, m_parent, m_px_cnt, m_grayscale); + m_bmp = *get_bmp_bundle(m_icon_name, m_px_cnt); } // ---------------------------------------------------------------------------- @@ -840,11 +823,9 @@ ScalableButton::ScalableButton( wxWindow * parent, const wxSize& size /* = wxDefaultSize*/, const wxPoint& pos /* = wxDefaultPosition*/, long style /*= wxBU_EXACTFIT | wxNO_BORDER*/, - bool use_default_disabled_bitmap/* = false*/, int bmp_px_cnt/* = 16*/) : m_parent(parent), m_current_icon_name(icon_name), - m_use_default_disabled_bitmap (use_default_disabled_bitmap), m_px_cnt(bmp_px_cnt), m_has_border(!(style & wxNO_BORDER)) { @@ -852,9 +833,7 @@ ScalableButton::ScalableButton( wxWindow * parent, Slic3r::GUI::wxGetApp().UpdateDarkUI(this); if (!icon_name.empty()) { - SetBitmap(create_scaled_bitmap(icon_name, parent, m_px_cnt)); - if (m_use_default_disabled_bitmap) - SetBitmapDisabled(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt, true)); + SetBitmap(*get_bmp_bundle(icon_name, m_px_cnt)); if (!label.empty()) SetBitmapMargins(int(0.5* em_unit(parent)), 0); } @@ -896,13 +875,12 @@ bool ScalableButton::SetBitmap_(const std::string& bmp_name) if (m_current_icon_name.empty()) return false; - wxBitmap bmp = create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt); + wxBitmapBundle bmp = *get_bmp_bundle(m_current_icon_name, m_px_cnt); SetBitmap(bmp); SetBitmapCurrent(bmp); SetBitmapPressed(bmp); SetBitmapFocus(bmp); - if (m_use_default_disabled_bitmap) - SetBitmapDisabled(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt, true)); + SetBitmapDisabled(bmp); return true; } @@ -921,37 +899,21 @@ int ScalableButton::GetBitmapHeight() #endif } -void ScalableButton::UseDefaultBitmapDisabled() -{ - m_use_default_disabled_bitmap = true; - SetBitmapDisabled(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt, true)); -} - -void ScalableButton::msw_rescale() +void ScalableButton::sys_color_changed() { Slic3r::GUI::wxGetApp().UpdateDarkUI(this, m_has_border); - if (!m_current_icon_name.empty()) { - wxBitmap bmp = create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt); - SetBitmap(bmp); - SetBitmapCurrent(bmp); - SetBitmapPressed(bmp); - SetBitmapFocus(bmp); - if (!m_disabled_icon_name.empty()) - SetBitmapDisabled(create_scaled_bitmap(m_disabled_icon_name, m_parent, m_px_cnt)); - else if (m_use_default_disabled_bitmap) - SetBitmapDisabled(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt, true)); - } - - if (m_width > 0 || m_height>0) - { - const int em = em_unit(m_parent); - wxSize size(m_width * em, m_height * em); - SetMinSize(size); - } + wxBitmapBundle bmp = *get_bmp_bundle(m_current_icon_name, m_px_cnt); + SetBitmap(bmp); + SetBitmapCurrent(bmp); + SetBitmapPressed(bmp); + SetBitmapFocus(bmp); + if (!m_disabled_icon_name.empty()) + SetBitmapDisabled(*get_bmp_bundle(m_disabled_icon_name, m_px_cnt)); + if (!GetLabelText().IsEmpty()) + SetBitmapMargins(int(0.5 * em_unit(m_parent)), 0); } - // ---------------------------------------------------------------------------- // BlinkingBitmap // ---------------------------------------------------------------------------- @@ -962,13 +924,6 @@ BlinkingBitmap::BlinkingBitmap(wxWindow* parent, const std::string& icon_name) : bmp = ScalableBitmap(parent, icon_name); } -void BlinkingBitmap::msw_rescale() -{ - bmp.msw_rescale(); - this->SetSize(bmp.GetBmpSize()); - this->SetMinSize(bmp.GetBmpSize()); -} - void BlinkingBitmap::invalidate() { this->SetBitmap(wxNullBitmap); diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp index f3921919ee..db05af9eb1 100644 --- a/src/slic3r/GUI/wxExtensions.hpp +++ b/src/slic3r/GUI/wxExtensions.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -15,14 +16,14 @@ #include -#ifdef __WXMSW__ -void msw_rescale_menu(wxMenu* menu); -#else /* __WXMSW__ */ -inline void msw_rescale_menu(wxMenu* /* menu */) {} -#endif /* __WXMSW__ */ +#ifndef __linux__ +void sys_color_changed_menu(wxMenu* menu); +#else +inline void sys_color_changed_menu(wxMenu* /* menu */) {} +#endif // no __linux__ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description, - std::function cb, const wxBitmap& icon, wxEvtHandler* event_handler = nullptr, + std::function cb, wxBitmapBundle* icon, wxEvtHandler* event_handler = nullptr, std::function const cb_condition = []() { return true;}, wxWindow* parent = nullptr, int insert_pos = wxNOT_FOUND); wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description, std::function cb, const std::string& icon = "", wxEvtHandler* event_handler = nullptr, @@ -49,14 +50,16 @@ void msw_buttons_rescale(wxDialog* dlg, const int em_unit, const std::vector< int em_unit(wxWindow* win); int mode_icon_px_size(); -wxBitmap create_menu_bitmap(const std::string& bmp_name); +wxBitmapBundle* get_bmp_bundle(const std::string& bmp_name, int px_cnt = 16); +wxBitmapBundle* get_empty_bmp_bundle(int width, int height); +wxBitmapBundle* get_solid_bmp_bundle(int width, int height, const std::string& color); wxBitmap create_scaled_bitmap(const std::string& bmp_name, wxWindow *win = nullptr, const int px_cnt = 16, const bool grayscale = false, const std::string& new_color = std::string(), // color witch will used instead of orange const bool menu_bitmap = false); -std::vector get_extruder_color_icons(bool thin_icon = false); +std::vector get_extruder_color_icons(bool thin_icon = false); namespace Slic3r { namespace GUI { @@ -145,21 +148,28 @@ public: ~ScalableBitmap() {} - wxSize GetBmpSize() const; - int GetBmpWidth() const; - int GetBmpHeight() const; + void sys_color_changed(); - void msw_rescale(); + const wxBitmapBundle& bmp() const { return m_bmp; } + wxBitmap get_bitmap() { return m_bmp.GetBitmapFor(m_parent); } + wxWindow* parent() const { return m_parent;} + const std::string& name() const { return m_icon_name; } + int px_cnt() const { return m_px_cnt;} - const wxBitmap& bmp() const { return m_bmp; } - wxBitmap& bmp() { return m_bmp; } - const std::string& name() const{ return m_icon_name; } - - int px_cnt()const {return m_px_cnt;} + wxSize GetSize() const { +#ifdef __WIN32__ + return m_bmp.GetPreferredBitmapSizeFor(m_parent); +#else + return m_bmp.GetDefaultSize(); +#endif + } + int GetWidth() const { return GetSize().GetWidth(); } + int GetHeight() const { return GetSize().GetHeight(); } private: wxWindow* m_parent{ nullptr }; - wxBitmap m_bmp = wxBitmap(); + wxBitmapBundle m_bmp = wxBitmapBundle(); + wxBitmap m_bitmap = wxBitmap(); std::string m_icon_name = ""; int m_px_cnt {16}; bool m_grayscale {false}; @@ -189,7 +199,7 @@ public: void enable() { m_disabled = false; } void disable() { m_disabled = true; } - void msw_rescale(); + void sys_color_changed(); protected: void update_button_bitmaps(); @@ -221,7 +231,6 @@ public: const wxSize& size = wxDefaultSize, const wxPoint& pos = wxDefaultPosition, long style = wxBU_EXACTFIT | wxNO_BORDER, - bool use_default_disabled_bitmap = false, int bmp_px_cnt = 16); ScalableButton( @@ -237,9 +246,8 @@ public: bool SetBitmap_(const std::string& bmp_name); void SetBitmapDisabled_(const ScalableBitmap &bmp); int GetBitmapHeight(); - void UseDefaultBitmapDisabled(); - void msw_rescale(); + void sys_color_changed(); private: wxWindow* m_parent { nullptr }; @@ -248,8 +256,6 @@ private: int m_width {-1}; // should be multiplied to em_unit int m_height{-1}; // should be multiplied to em_unit - bool m_use_default_disabled_bitmap {false}; - // bitmap dimensions int m_px_cnt{ 16 }; bool m_has_border {false}; @@ -315,7 +321,7 @@ public: void set_items_flag(int flag); void set_items_border(int border); - void msw_rescale(); + void sys_color_changed(); const std::vector& get_btns() { return m_mode_btns; } private: @@ -363,12 +369,11 @@ public: ~BlinkingBitmap() {} - void msw_rescale(); void invalidate(); void activate(); void blink(); - const wxBitmap& get_bmp() const { return bmp.bmp(); } + const wxBitmapBundle& get_bmp() const { return bmp.bmp(); } private: ScalableBitmap bmp; diff --git a/src/slic3r/Utils/EmbossStyleManager.cpp b/src/slic3r/Utils/EmbossStyleManager.cpp index 297303f258..eecf7ac73a 100644 --- a/src/slic3r/Utils/EmbossStyleManager.cpp +++ b/src/slic3r/Utils/EmbossStyleManager.cpp @@ -379,11 +379,11 @@ float EmbossStyleManager::get_imgui_font_size(const FontProp &prop, ImFont *EmbossStyleManager::create_imgui_font(const std::string &text) { + // inspiration inside of ImGuiWrapper::init_font auto& ff = m_style_cache.font_file; if (!ff.has_value()) return nullptr; const Emboss::FontFile &font_file = *ff.font_file; - // TODO: Create glyph range ImFontGlyphRangesBuilder builder; builder.AddRanges(m_imgui_init_glyph_range); if (!text.empty()) @@ -427,7 +427,7 @@ ImFont *EmbossStyleManager::create_imgui_font(const std::string &text) unsigned char *pixels; int width, height; - m_style_cache.atlas.GetTexDataAsAlpha8(&pixels, &width, &height); + m_style_cache.atlas.GetTexDataAsRGBA32(&pixels, &width, &height); // Upload texture to graphics system GLint last_texture; @@ -442,8 +442,10 @@ ImFont *EmbossStyleManager::create_imgui_font(const std::string &text) glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); glsafe(::glPixelStorei(GL_UNPACK_ROW_LENGTH, 0)); - glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, pixels)); + if (OpenGLManager::are_compressed_textures_supported()) + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); + else + glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); // Store our identifier m_style_cache.atlas.TexID = (ImTextureID) (intptr_t) font_texture; diff --git a/src/slic3r/Utils/Profile.hpp b/src/slic3r/Utils/Profile.hpp deleted file mode 100644 index 5fb1e31167..0000000000 --- a/src/slic3r/Utils/Profile.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef slic3r_GUI_Profile_hpp_ -#define slic3r_GUI_Profile_hpp_ - -// Profiling support using the Shiny intrusive profiler -//#define SLIC3R_PROFILE_GUI -#if defined(SLIC3R_PROFILE) && defined(SLIC3R_PROFILE_GUI) - #include - #define SLIC3R_GUI_PROFILE_FUNC() PROFILE_FUNC() - #define SLIC3R_GUI_PROFILE_BLOCK(name) PROFILE_BLOCK(name) - #define SLIC3R_GUI_PROFILE_UPDATE() PROFILE_UPDATE() - #define SLIC3R_GUI_PROFILE_OUTPUT(x) PROFILE_OUTPUT(x) -#else - #define SLIC3R_GUI_PROFILE_FUNC() - #define SLIC3R_GUI_PROFILE_BLOCK(name) - #define SLIC3R_GUI_PROFILE_UPDATE() - #define SLIC3R_GUI_PROFILE_OUTPUT(x) -#endif - -#endif // slic3r_GUI_Profile_hpp_ diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 4afc121bd7..f3fe2aee5c 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(${_TEST_NAME}_tests test_3mf.cpp test_aabbindirect.cpp test_kdtreeindirect.cpp + test_arachne.cpp test_clipper_offset.cpp test_clipper_utils.cpp test_color.cpp @@ -22,6 +23,7 @@ add_executable(${_TEST_NAME}_tests test_meshboolean.cpp test_marchingsquares.cpp test_timeutils.cpp + test_utils.cpp test_voronoi.cpp test_optimizers.cpp test_png_io.cpp diff --git a/tests/libslic3r/test_arachne.cpp b/tests/libslic3r/test_arachne.cpp new file mode 100644 index 0000000000..e952695e98 --- /dev/null +++ b/tests/libslic3r/test_arachne.cpp @@ -0,0 +1,416 @@ +#include + +#include "libslic3r/Arachne/WallToolPaths.hpp" +#include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/SVG.hpp" +#include "libslic3r/Utils.hpp" + +using namespace Slic3r; +using namespace Slic3r::Arachne; + +//#define ARACHNE_DEBUG_OUT + +#ifdef ARACHNE_DEBUG_OUT +static void export_perimeters_to_svg(const std::string &path, const Polygons &contours, const std::vector &perimeters, const ExPolygons &infill_area) +{ + coordf_t stroke_width = scale_(0.03); + BoundingBox bbox = get_extents(contours); + bbox.offset(scale_(1.)); + ::Slic3r::SVG svg(path.c_str(), bbox); + + svg.draw(infill_area, "cyan"); + + for (const Arachne::VariableWidthLines &perimeter : perimeters) + for (const Arachne::ExtrusionLine &extrusion_line : perimeter) { + ThickPolyline thick_polyline = to_thick_polyline(extrusion_line); + svg.draw({thick_polyline}, "green", "blue", stroke_width); + } + + for (const Line &line : to_lines(contours)) + svg.draw(line, "red", stroke_width); +} +#endif + +TEST_CASE("Arachne - Closed ExtrusionLine", "[ArachneClosedExtrusionLine]") { + Polygon poly = { + Point(-40000000, 10000000), + Point(-62480000, 10000000), + Point(-62480000, -7410000), + Point(-58430000, -7330000), + Point(-58400000, -5420000), + Point(-58720000, -4710000), + Point(-58940000, -3870000), + Point(-59020000, -3000000), + }; + + Polygons polygons = {poly}; + coord_t spacing = 407079; + coord_t inset_count = 5; + + Arachne::WallToolPaths wallToolPaths(polygons, spacing, spacing, inset_count, 0, 0.2, PrintObjectConfig::defaults(), PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-closed-extrusion-line.svg"), polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif + + for (VariableWidthLines &perimeter : perimeters) + for (ExtrusionLine &el : perimeter) + if (el.is_closed) { + REQUIRE(el.junctions.front().p == el.junctions.back().p); + } +} + +// This test case was distilled from GitHub issue #8472. +// Where for wall_distribution_count == 3 sometime middle perimeter was missing. +TEST_CASE("Arachne - Missing perimeter - #8472", "[ArachneMissingPerimeter8472]") { + Polygon poly = { + Point(-9000000, 8054793), + Point( 7000000, 8054793), + Point( 7000000, 10211874), + Point(-8700000, 10211874), + Point(-9000000, 9824444) + }; + + Polygons polygons = {poly}; + coord_t spacing = 437079; + coord_t inset_count = 3; + + PrintObjectConfig print_object_config = PrintObjectConfig::defaults(); + print_object_config.wall_distribution_count.setInt(3); + + Arachne::WallToolPaths wallToolPaths(polygons, spacing, spacing, inset_count, 0, 0.2, print_object_config, PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-missing-perimeter-8472.svg"), polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif + + REQUIRE(perimeters.size() == 3); +} + +// This test case was distilled from GitHub issue #8593. +// Where on the symmetrical model, there were missing parts of extrusions in gear teeth based on model rotation. +TEST_CASE("Arachne - #8593 - Missing a part of the extrusion", "[ArachneMissingPartOfExtrusion8593]") { + const Polygon poly_orig = { + Point( 1800000, 28500000), + Point( 1100000, 30000000), + Point( 1000000, 30900000), + Point( 600000, 32300000), + Point( -600000, 32300000), + Point(-1000000, 30900000), + Point(-1100000, 30000000), + Point(-1800000, 29000000), + }; + + coord_t spacing = 377079; + coord_t inset_count = 3; + + PrintObjectConfig print_object_config = PrintObjectConfig::defaults(); + print_object_config.min_bead_width = ConfigOptionFloatOrPercent(0.315, false); + print_object_config.wall_transition_angle = ConfigOptionFloat(40.); + print_object_config.wall_transition_length = ConfigOptionFloatOrPercent(1., false); + + + // This behavior seems to be related to the rotation of the input polygon. + // There are specific angles in which this behavior is always triggered. + for (const double angle : {0., -PI / 2., -PI / 15.}) { + Polygon poly = poly_orig; + if (angle != 0.) + poly.rotate(angle); + + Polygons polygons = {poly}; + Arachne::WallToolPaths wall_tool_paths(polygons, spacing, spacing, inset_count, 0, 0.2, print_object_config, PrintConfig::defaults()); + wall_tool_paths.generate(); + std::vector perimeters = wall_tool_paths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + { + static int iRun = 0; + export_perimeters_to_svg(debug_out_path("arachne-missing-part-of-extrusion-8593-%d.svg", iRun++), polygons, perimeters, union_ex(wall_tool_paths.getInnerContour())); + } +#endif + } +} + +// This test case was distilled from GitHub issue #8573. +TEST_CASE("Arachne - #8573 - A gap in the perimeter - 1", "[ArachneGapInPerimeter8573_1]") { + const Polygon poly = { + Point(13960000, 500000), + Point(13920000, 1210000), + Point(13490000, 2270000), + Point(12960000, 3400000), + Point(12470000, 4320000), + Point(12160000, 4630000), + Point(12460000, 3780000), + Point(12700000, 2850000), + Point(12880000, 1910000), + Point(12950000, 1270000), + Point(13000000, 500000), + }; + + Polygons polygons = {poly}; + coord_t spacing = 407079; + coord_t inset_count = 2; + + PrintObjectConfig print_object_config = PrintObjectConfig::defaults(); +// print_object_config.wall_transition_angle = ConfigOptionFloat(20.); + + Arachne::WallToolPaths wallToolPaths(polygons, spacing, spacing, inset_count, 0, 0.2, print_object_config, PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-gap-in-perimeter-1-8573.svg"), polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif +} + +// This test case was distilled from GitHub issue #8444. +TEST_CASE("Arachne - #8444 - A gap in the perimeter - 2", "[ArachneGapInPerimeter8444_2]") { + const Polygon poly = { + Point(14413938, 3825902), + Point(16817613, 711749), + Point(19653030, 67154), + Point(20075592, 925370), + Point(20245428, 1339788), + Point(20493219, 2121894), + Point(20570295, 2486625), + Point(20616559, 2835232), + Point(20631964, 3166882), + Point(20591800, 3858877), + Point(19928267, 2153012), + Point(19723020, 1829802), + Point(19482017, 1612364), + Point(19344810, 1542433), + Point(19200249, 1500902), + Point(19047680, 1487200), + Point(18631073, 1520777), + Point(18377524, 1567627), + Point(18132517, 1641174), + Point(17896307, 1741360), + Point(17669042, 1868075), + Point(17449999, 2021790), + }; + + Polygons polygons = {poly}; + coord_t spacing = 594159; + coord_t inset_count = 2; + + PrintObjectConfig print_object_config = PrintObjectConfig::defaults(); + // print_object_config.wall_transition_angle = ConfigOptionFloat(20.); + + Arachne::WallToolPaths wallToolPaths(polygons, spacing, spacing, inset_count, 0, 0.4, print_object_config, PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-gap-in-perimeter-2-8444.svg"), polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif +} + +// This test case was distilled from GitHub issue #8528. +// There is a hole in the place where the number of perimeters is changing from 6 perimeters to 7 perimeters. +TEST_CASE("Arachne - #8528 - A hole when number of perimeters is changing", "[ArachneHoleOnPerimetersChange8528]") { + const Polygon poly = { + Point(-30000000, 27650000), + Point(-30000000, 33500000), + Point(-40000000, 33500000), + Point(-40500000, 33500000), + Point(-41100000, 33400000), + Point(-41600000, 33200000), + Point(-42100000, 32900000), + Point(-42600000, 32600000), + Point(-43000000, 32200000), + Point(-43300000, 31700000), + Point(-43600000, 31200000), + Point(-43800000, 30700000), + Point(-43900000, 30100000), + Point(-43900000, 29600000), + Point(-43957080, 25000000), + Point(-39042920, 25000000), + Point(-39042920, 27650000), + }; + + Polygons polygons = {poly}; + coord_t spacing = 814159; + coord_t inset_count = 5; + + PrintObjectConfig print_object_config = PrintObjectConfig::defaults(); + print_object_config.min_bead_width = ConfigOptionFloatOrPercent(0.68, false); + + // Changing min_bead_width to 0.66 seems that resolve this issue, at least in this case. + print_object_config.min_bead_width = ConfigOptionFloatOrPercent(0.66, false); + + Arachne::WallToolPaths wallToolPaths(polygons, spacing, spacing, inset_count, 0, 0.4, print_object_config, PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-hole-on-perimeters-change-8528.svg"), polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif +} + +// This test case was distilled from GitHub issue #8528. +// There is an inconsistency between layers in length of the single perimeters. +TEST_CASE("Arachne - #8555 - Inconsistent single perimeter", "[ArachneInconsistentSinglePerimeter8555]") { + const Polygon poly_0 = { + Point(5527411, -38490007), + Point(11118814, -36631169), + Point(13529600, -36167120), + Point(11300145, -36114514), + Point(10484024, -36113916), + Point(5037323, -37985945), + Point(4097054, -39978866) + }; + const Polygon poly_1 = { + Point(5566841, -38517205), + Point(11185208, -36649404), + Point(13462719, -36211009), + Point(11357290, -36161329), + Point(10583855, -36160763), + Point(5105952, -38043516), + Point(4222019, -39917031) + }; + const Polygon poly_2 = { + Point(5606269, -38544404), + Point(11251599, -36667638), + Point(13391666, -36255700), + Point(10683552, -36207653), + Point(5174580, -38101085), + Point(4346981, -39855197) + }; + const Polygon poly_3 = { + Point(5645699, -38571603), + Point(11317993, -36685873), + Point(13324786, -36299588), + Point(10783383, -36254499), + Point(5243209, -38158655), + Point(4471947, -39793362) + }; + const Polygon poly_4 = { + Point(5685128, -38598801), + Point(11384385, -36704108), + Point(13257907, -36343476), + Point(10883211, -36301345), + Point(5311836, -38216224), + Point(4596909, -39731528) + }; + const Polygon poly_5 = { + Point(5724558, -38626000), + Point(11450778, -36722343), + Point(13191026, -36387365), + Point(10983042, -36348191), + Point(5380466, -38273795), + Point(4721874, -39669693) + }; + + Polygons polygons = {poly_0, poly_1, poly_2, poly_3, poly_4, poly_5}; + coord_t spacing = 417809; + coord_t inset_count = 2; + + for (size_t poly_idx = 0; poly_idx < polygons.size(); ++poly_idx) { + Polygons input_polygons{polygons[poly_idx]}; + Arachne::WallToolPaths wallToolPaths(input_polygons, spacing, spacing, inset_count, 0, 0.15, PrintObjectConfig::defaults(), PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-inconsistent-single-perimeter-8555-%d.svg", poly_idx), input_polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif + } +} + +// This test case was distilled from GitHub issue #8633. +// Open perimeter extrusion is shorter on endpoints in comparison to closed perimeter. +TEST_CASE("Arachne - #8633 - Shorter open perimeter", "[ArachneShorterOpenPerimeter8633]") { + const Polygon poly_0 = { + Point(6507498, 4189461), + Point(6460382, 3601960), + Point(6390896, 3181097), + Point(6294072, 2765838), + Point(6170293, 2357794), + + Point(7090581, 2045388), + Point(7232821, 2514293), + Point(7344089, 2991501), + Point(7423910, 3474969), + Point(7471937, 3962592), + Point(7487443, 4436235), + Point(6515575, 4436235), + }; + + const Polygon poly_1 = { + Point(6507498, 4189461), + Point(6460382, 3601960), + Point(6390896, 3181097), + Point(6294072, 2765838), + Point(6170293, 2357794), + + Point(6917958, 1586830), + Point(7090552, 2045398), + + Point(7232821, 2514293), + Point(7344089, 2991501), + Point(7423910, 3474969), + Point(7471937, 3962592), + Point(7487443, 4436235), + Point(6515575, 4436235), + }; + + Polygons polygons = {poly_0, poly_1}; + coord_t spacing = 617809; + coord_t inset_count = 1; + + PrintObjectConfig print_object_config = PrintObjectConfig::defaults(); + print_object_config.min_bead_width = ConfigOptionFloatOrPercent(0.51, false); + print_object_config.min_feature_size = ConfigOptionFloatOrPercent(0.15, false); + print_object_config.wall_transition_length = ConfigOptionFloatOrPercent(0.6, false); + + for (size_t poly_idx = 0; poly_idx < polygons.size(); ++poly_idx) { + Polygons input_polygons{polygons[poly_idx]}; + Arachne::WallToolPaths wallToolPaths(input_polygons, spacing, spacing, inset_count, 0, 0.15, print_object_config, PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-shorter-open-perimeter-8633-%d.svg", poly_idx), input_polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif + } +} + +// This test case was distilled from GitHub issue #8597. +// There was just an issue with decrementing std::vector::begin() in a specific case. +TEST_CASE("Arachne - #8597 - removeSmallAreas", "[ArachneRemoveSmallAreas8597]") { + const Polygon poly_0 = { + Point(-38768167, -3636556), + Point(-38763631, -3617883), + Point(-38763925, -3617820), + Point(-38990169, -3919539), + Point(-38928506, -3919539), + }; + + const Polygon poly_1 = { + Point(-39521732, -4480560), + Point(-39383333, -4398498), + Point(-39119825, -3925307), + Point(-39165608, -3926212), + Point(-39302205, -3959445), + Point(-39578719, -4537002), + }; + + Polygons polygons = {poly_0, poly_1}; + coord_t spacing = 407079; + coord_t inset_count = 2; + + Arachne::WallToolPaths wallToolPaths(polygons, spacing, spacing, inset_count, 0, 0.2, PrintObjectConfig::defaults(), PrintConfig::defaults()); + wallToolPaths.generate(); + std::vector perimeters = wallToolPaths.getToolPaths(); + +#ifdef ARACHNE_DEBUG_OUT + export_perimeters_to_svg(debug_out_path("arachne-remove-small-areas-8597.svg"), polygons, perimeters, union_ex(wallToolPaths.getInnerContour())); +#endif + + REQUIRE(perimeters.size() == 1); +} diff --git a/tests/libslic3r/test_clipper_utils.cpp b/tests/libslic3r/test_clipper_utils.cpp index 048ebba107..a1230ac03e 100644 --- a/tests/libslic3r/test_clipper_utils.cpp +++ b/tests/libslic3r/test_clipper_utils.cpp @@ -294,7 +294,7 @@ SCENARIO("Various Clipper operations - t/clipper.t", "[ClipperUtils]") { WHEN("clipping a line") { auto line = Polyline::new_scale({ { 152.742,288.086671142818 }, { 152.742,34.166466971035 } }); - Polylines intersection = intersection_pl(line, Polygons{ circle_with_hole }); + Polylines intersection = intersection_pl(line, to_polygons(circle_with_hole)); THEN("clipped to two pieces") { REQUIRE(intersection.front().length() == Approx((Vec2d(152742000, 215178843) - Vec2d(152742000, 288086661)).norm())); REQUIRE(intersection[1].length() == Approx((Vec2d(152742000, 35166477) - Vec2d(152742000, 108087507)).norm())); diff --git a/tests/libslic3r/test_color.cpp b/tests/libslic3r/test_color.cpp index c74e5642db..632691669e 100644 --- a/tests/libslic3r/test_color.cpp +++ b/tests/libslic3r/test_color.cpp @@ -20,6 +20,7 @@ SCENARIO("Color encoding/decoding cycle", "[Color]") { } } +#if !ENABLE_RAYCAST_PICKING SCENARIO("Color picking encoding/decoding cycle", "[Color]") { GIVEN("Picking color") { const ColorRGB src_rgb(static_cast(255), static_cast(127), static_cast(63)); @@ -33,5 +34,6 @@ SCENARIO("Color picking encoding/decoding cycle", "[Color]") { } } } +#endif // !ENABLE_RAYCAST_PICKING diff --git a/tests/libslic3r/test_utils.cpp b/tests/libslic3r/test_utils.cpp new file mode 100644 index 0000000000..74d4094969 --- /dev/null +++ b/tests/libslic3r/test_utils.cpp @@ -0,0 +1,35 @@ +#include + +#include "libslic3r/libslic3r.h" + +SCENARIO("Test fast_round_up()") { + using namespace Slic3r; + + THEN("fast_round_up(1.5) is 2") { + REQUIRE(fast_round_up(1.5) == 2); + } + THEN("fast_round_up(1.499999999999999) is 1") { + REQUIRE(fast_round_up(1.499999999999999) == 1); + } + THEN("fast_round_up(0.5) is 1") { + REQUIRE(fast_round_up(0.5) == 1); + } + THEN("fast_round_up(0.49999999999999994) is 0") { + REQUIRE(fast_round_up(0.49999999999999994) == 0); + } + THEN("fast_round_up(-0.5) is 0") { + REQUIRE(fast_round_up(-0.5) == 0); + } + THEN("fast_round_up(-0.51) is -1") { + REQUIRE(fast_round_up(-0.51) == -1); + } + THEN("fast_round_up(-0.51) is -1") { + REQUIRE(fast_round_up(-0.51) == -1); + } + THEN("fast_round_up(-1.5) is -1") { + REQUIRE(fast_round_up(-1.5) == -1); + } + THEN("fast_round_up(-1.51) is -2") { + REQUIRE(fast_round_up(-1.51) == -2); + } +} diff --git a/tests/libslic3r/test_voronoi.cpp b/tests/libslic3r/test_voronoi.cpp index 7f25797f56..fb36541dde 100644 --- a/tests/libslic3r/test_voronoi.cpp +++ b/tests/libslic3r/test_voronoi.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "libslic3r/Geometry/VoronoiUtilsCgal.hpp" #include #include @@ -2202,3 +2203,34 @@ TEST_CASE("Intersecting Voronoi edges", "[Voronoi]") // REQUIRE(!has_intersecting_edges(poly, vd)); } + +// In this case resulting Voronoi diagram is not planar. This case was distilled from GH issue #8474. +// Also, in GH issue #8514, a non-planar Voronoi diagram is generated for several polygons. +// Rotating the input polygon will solve this issue. +TEST_CASE("Non-planar voronoi diagram", "[VoronoiNonPlanar]") +{ + Polygon poly { + { 5500000, -42000000}, + { 8000000, -17000000}, + { 8000000, 40000000}, + { 7500000, 40000000}, + { 7500000, -18000000}, + { 6000001, -18000000}, + { 6000000, 40000000}, + { 5500000, 40000000}, + }; + +// poly.rotate(PI / 6); + + REQUIRE(poly.area() > 0.); + REQUIRE(intersecting_edges({poly}).empty()); + + VD vd; + Lines lines = to_lines(poly); + construct_voronoi(lines.begin(), lines.end(), &vd); +#ifdef VORONOI_DEBUG_OUT + dump_voronoi_to_svg(debug_out_path("voronoi-non-planar-out.svg").c_str(), vd, Points(), lines); +#endif + +// REQUIRE(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(vd)); +} diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp index a5ed0d0291..8ea91d57a1 100644 --- a/tests/sla_print/sla_print_tests.cpp +++ b/tests/sla_print/sla_print_tests.cpp @@ -8,6 +8,7 @@ #include #include +#include namespace { @@ -156,37 +157,138 @@ TEST_CASE("DefaultSupports::FloorSupportsDoNotPierceModel", "[SLASupportGenerati test_support_model_collision(fname, supportcfg); } -//TEST_CASE("CleverSupports::ElevatedSupportGeometryIsValid", "[SLASupportGeneration][Clever]") { +//TEST_CASE("BranchingSupports::ElevatedSupportGeometryIsValid", "[SLASupportGeneration][Branching]") { // sla::SupportTreeConfig supportcfg; // supportcfg.object_elevation_mm = 10.; -// supportcfg.tree_type = sla::SupportTreeType::Clever; +// supportcfg.tree_type = sla::SupportTreeType::Branching; // for (auto fname : SUPPORT_TEST_MODELS) test_supports(fname, supportcfg); //} -//TEST_CASE("CleverSupports::FloorSupportGeometryIsValid", "[SLASupportGeneration][Clever]") { +//TEST_CASE("BranchingSupports::FloorSupportGeometryIsValid", "[SLASupportGeneration][Branching]") { // sla::SupportTreeConfig supportcfg; // supportcfg.object_elevation_mm = 0; -// supportcfg.tree_type = sla::SupportTreeType::Clever; +// supportcfg.tree_type = sla::SupportTreeType::Branching; // for (auto &fname: SUPPORT_TEST_MODELS) test_supports(fname, supportcfg); //} -TEST_CASE("CleverSupports::ElevatedSupportsDoNotPierceModel", "[SLASupportGeneration][Clever]") { +bool is_outside_support_cone(const Vec3f &supp, const Vec3f &pt, float angle) +{ + Vec3d D = (pt - supp).cast(); + double dot_sq = -D.z() * std::abs(-D.z()); + + return dot_sq < + D.squaredNorm() * std::cos(angle) * std::abs(std::cos(angle)); +} + +TEST_CASE("BranchingSupports::MergePointFinder", "[SLASupportGeneration][Branching]") { + SECTION("Identical points have the same merge point") { + Vec3f a{0.f, 0.f, 0.f}, b = a; + auto slope = float(PI / 4.); + + auto mergept = branchingtree::find_merge_pt(a, b, slope); + + REQUIRE(bool(mergept)); + REQUIRE((*mergept - b).norm() < EPSILON); + REQUIRE((*mergept - a).norm() < EPSILON); + } + + // ^ Z + // | a * + // | + // | b * <= mergept + SECTION("Points at different heights have the lower point as mergepoint") { + Vec3f a{0.f, 0.f, 0.f}, b = {0.f, 0.f, -1.f}; + auto slope = float(PI / 4.); + + auto mergept = branchingtree::find_merge_pt(a, b, slope); + + REQUIRE(bool(mergept)); + REQUIRE((*mergept - b).squaredNorm() < 2 * EPSILON); + } + + // -|---------> X + // a b + // * * + // * <= mergept + SECTION("Points at different X have mergept in the middle at lower Z") { + Vec3f a{0.f, 0.f, 0.f}, b = {1.f, 0.f, 0.f}; + auto slope = float(PI / 4.); + + auto mergept = branchingtree::find_merge_pt(a, b, slope); + + REQUIRE(bool(mergept)); + + // Distance of mergept should be equal from both input points + float D = std::abs((*mergept - b).squaredNorm() - (*mergept - a).squaredNorm()); + + REQUIRE(D < EPSILON); + REQUIRE(!is_outside_support_cone(a, *mergept, slope)); + REQUIRE(!is_outside_support_cone(b, *mergept, slope)); + } + + // -|---------> Y + // a b + // * * + // * <= mergept + SECTION("Points at different Y have mergept in the middle at lower Z") { + Vec3f a{0.f, 0.f, 0.f}, b = {0.f, 1.f, 0.f}; + auto slope = float(PI / 4.); + + auto mergept = branchingtree::find_merge_pt(a, b, slope); + + REQUIRE(bool(mergept)); + + // Distance of mergept should be equal from both input points + float D = std::abs((*mergept - b).squaredNorm() - (*mergept - a).squaredNorm()); + + REQUIRE(D < EPSILON); + REQUIRE(!is_outside_support_cone(a, *mergept, slope)); + REQUIRE(!is_outside_support_cone(b, *mergept, slope)); + } + + SECTION("Points separated by less than critical angle have the lower point as mergept") { + Vec3f a{-1.f, -1.f, -1.f}, b = {-1.5f, -1.5f, -2.f}; + auto slope = float(PI / 4.); + + auto mergept = branchingtree::find_merge_pt(a, b, slope); + + REQUIRE(bool(mergept)); + REQUIRE((*mergept - b).norm() < 2 * EPSILON); + } + + // -|----------------------------> Y + // a b + // * * <= mergept * + // + SECTION("Points at same height have mergepoint in the middle if critical angle is zero ") { + Vec3f a{-1.f, -1.f, -1.f}, b = {-1.5f, -1.5f, -1.f}; + auto slope = EPSILON; + + auto mergept = branchingtree::find_merge_pt(a, b, slope); + + REQUIRE(bool(mergept)); + Vec3f middle = (b + a) / 2.; + REQUIRE((*mergept - middle).norm() < 4 * EPSILON); + } +} + +TEST_CASE("BranchingSupports::ElevatedSupportsDoNotPierceModel", "[SLASupportGeneration][Branching]") { sla::SupportTreeConfig supportcfg; supportcfg.object_elevation_mm = 10.; - supportcfg.tree_type = sla::SupportTreeType::Clever; + supportcfg.tree_type = sla::SupportTreeType::Branching; for (auto fname : SUPPORT_TEST_MODELS) test_support_model_collision(fname, supportcfg); } -TEST_CASE("CleverSupports::FloorSupportsDoNotPierceModel", "[SLASupportGeneration][Clever]") { +TEST_CASE("BranchingSupports::FloorSupportsDoNotPierceModel", "[SLASupportGeneration][Branching]") { sla::SupportTreeConfig supportcfg; supportcfg.object_elevation_mm = 0; - supportcfg.tree_type = sla::SupportTreeType::Clever; + supportcfg.tree_type = sla::SupportTreeType::Branching; for (auto fname : SUPPORT_TEST_MODELS) test_support_model_collision(fname, supportcfg); diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp index 07f19300c5..737659eed9 100644 --- a/tests/sla_print/sla_test_utils.cpp +++ b/tests/sla_print/sla_test_utils.cpp @@ -2,57 +2,59 @@ #include "libslic3r/TriangleMeshSlicer.hpp" #include "libslic3r/SLA/AGGRaster.hpp" #include "libslic3r/SLA/DefaultSupportTree.hpp" +#include "libslic3r/SLA/BranchingTreeSLA.hpp" #include -void test_support_model_collision(const std::string &obj_filename, - const sla::SupportTreeConfig &input_supportcfg, - const sla::HollowingConfig &hollowingcfg, - const sla::DrainHoles &drainholes) +void test_support_model_collision( + const std::string &obj_filename, + const sla::SupportTreeConfig &input_supportcfg, + const sla::HollowingConfig &hollowingcfg, + const sla::DrainHoles &drainholes) { SupportByproducts byproducts; - + sla::SupportTreeConfig supportcfg = input_supportcfg; - + // Set head penetration to a small negative value which should ensure that // the supports will not touch the model body. supportcfg.head_penetration_mm = -0.2; - + test_supports(obj_filename, supportcfg, hollowingcfg, drainholes, byproducts); - + // Slice the support mesh given the slice grid of the model. std::vector support_slices = - sla::slice(byproducts.supporttree.retrieve_mesh(sla::MeshType::Support), - byproducts.supporttree.retrieve_mesh(sla::MeshType::Pad), + sla::slice(byproducts.suptree_builder.retrieve_mesh(sla::MeshType::Support), + byproducts.suptree_builder.retrieve_mesh(sla::MeshType::Pad), byproducts.slicegrid, CLOSING_RADIUS, {}); // The slices originate from the same slice grid so the numbers must match - + bool support_mesh_is_empty = - byproducts.supporttree.retrieve_mesh(sla::MeshType::Pad).empty() && - byproducts.supporttree.retrieve_mesh(sla::MeshType::Support).empty(); - + byproducts.suptree_builder.retrieve_mesh(sla::MeshType::Pad).empty() && + byproducts.suptree_builder.retrieve_mesh(sla::MeshType::Support).empty(); + if (support_mesh_is_empty) REQUIRE(support_slices.empty()); else REQUIRE(support_slices.size() == byproducts.model_slices.size()); - + bool notouch = true; for (size_t n = 0; notouch && n < support_slices.size(); ++n) { const ExPolygons &sup_slice = support_slices[n]; const ExPolygons &mod_slice = byproducts.model_slices[n]; - + Polygons intersections = intersection(sup_slice, mod_slice); - + double pinhead_r = scaled(input_supportcfg.head_front_radius_mm); // TODO:: make it strict without a threshold of PI * pihead_radius ^ 2 notouch = notouch && area(intersections) < PI * pinhead_r * pinhead_r; } - + if (!notouch) export_failed_case(support_slices, byproducts); - + REQUIRE(notouch); } @@ -79,7 +81,7 @@ void export_failed_case(const std::vector &support_slices, const Sup if (do_export_stl) { indexed_triangle_set its; - byproducts.supporttree.retrieve_full_mesh(its); + byproducts.suptree_builder.retrieve_full_mesh(its); TriangleMesh m{its}; m.merge(byproducts.input_mesh); m.WriteOBJFile((Catch::getResultCapture().getCurrentTestName() + "_" + @@ -95,49 +97,49 @@ void test_supports(const std::string &obj_filename, { using namespace Slic3r; TriangleMesh mesh = load_model(obj_filename); - + REQUIRE_FALSE(mesh.empty()); - + if (hollowingcfg.enabled) { sla::InteriorPtr interior = sla::generate_interior(mesh, hollowingcfg); REQUIRE(interior); mesh.merge(TriangleMesh{sla::get_mesh(*interior)}); } - + auto bb = mesh.bounding_box(); double zmin = bb.min.z(); double zmax = bb.max.z(); double gnd = zmin - supportcfg.object_elevation_mm; auto layer_h = 0.05f; - + out.slicegrid = grid(float(gnd), float(zmax), layer_h); out.model_slices = slice_mesh_ex(mesh.its, out.slicegrid, CLOSING_RADIUS); sla::cut_drainholes(out.model_slices, out.slicegrid, CLOSING_RADIUS, drainholes, []{}); - + // Create the special index-triangle mesh with spatial indexing which // is the input of the support point and support mesh generators AABBMesh emesh{mesh}; -#ifdef SLIC3R_HOLE_RAYCASTER - if (hollowingcfg.enabled) + #ifdef SLIC3R_HOLE_RAYCASTER + if (hollowingcfg.enabled) emesh.load_holes(drainholes); -#endif + #endif // TODO: do the cgal hole cutting... - + // Create the support point generator sla::SupportPointGenerator::Config autogencfg; autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm); sla::SupportPointGenerator point_gen{emesh, autogencfg, [] {}, [](int) {}}; - + point_gen.seed(0); // Make the test repeatable point_gen.execute(out.model_slices, out.slicegrid); - + // Get the calculated support points. std::vector support_points = point_gen.output(); - + int validityflags = ASSUME_NO_REPAIR; - + // If there is no elevation, support points shall be removed from the // bottom of the object. if (std::abs(supportcfg.object_elevation_mm) < EPSILON) { @@ -145,11 +147,11 @@ void test_supports(const std::string &obj_filename, } else { // Should be support points at least on the bottom of the model REQUIRE_FALSE(support_points.empty()); - + // Also the support mesh should not be empty. validityflags |= ASSUME_NO_EMPTY; } - + // Generate the actual support tree sla::SupportTreeBuilder treebuilder; sla::SupportableMesh sm{emesh, support_points, supportcfg}; @@ -160,29 +162,34 @@ void test_supports(const std::string &obj_filename, check_support_tree_integrity(treebuilder, supportcfg, sla::ground_level(sm)); break; } + case sla::SupportTreeType::Branching: { + create_branching_tree(treebuilder, sm); + // TODO: check_support_tree_integrity(treebuilder, supportcfg); + break; + } default:; } TriangleMesh output_mesh{treebuilder.retrieve_mesh(sla::MeshType::Support)}; - + check_validity(output_mesh, validityflags); - + // Quick check if the dimensions and placement of supports are correct auto obb = output_mesh.bounding_box(); - + double allowed_zmin = zmin - supportcfg.object_elevation_mm; - + if (std::abs(supportcfg.object_elevation_mm) < EPSILON) allowed_zmin = zmin - 2 * supportcfg.head_back_radius_mm; - + REQUIRE(obb.min.z() >= Approx(allowed_zmin)); REQUIRE(obb.max.z() <= Approx(zmax)); - + // Move out the support tree into the byproducts, we can examine it further // in various tests. - out.obj_fname = std::move(obj_filename); - out.supporttree = std::move(treebuilder); - out.input_mesh = std::move(mesh); + out.obj_fname = std::move(obj_filename); + out.suptree_builder = std::move(treebuilder); + out.input_mesh = std::move(mesh); } void check_support_tree_integrity(const sla::SupportTreeBuilder &stree, diff --git a/tests/sla_print/sla_test_utils.hpp b/tests/sla_print/sla_test_utils.hpp index c5943bd5c3..187a72d545 100644 --- a/tests/sla_print/sla_test_utils.hpp +++ b/tests/sla_print/sla_test_utils.hpp @@ -60,7 +60,7 @@ struct SupportByproducts std::string obj_fname; std::vector slicegrid; std::vector model_slices; - sla::SupportTreeBuilder supporttree; + sla::SupportTreeBuilder suptree_builder; TriangleMesh input_mesh; }; diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt index c2343b032c..efc07af312 100644 --- a/xs/CMakeLists.txt +++ b/xs/CMakeLists.txt @@ -182,6 +182,11 @@ if (MSVC) COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/GMP/gmp/lib/win${_bits}/libgmp-10.dll "${PERL_LOCAL_LIB_ARCH_DIR}/auto/Slic3r/XS/" COMMENT "Installing gmp runtime into the local-lib directory ..." VERBATIM) + + add_custom_command(TARGET XS POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/MPFR/mpfr/lib/win${_bits}/libmpfr-4.dll "${PERL_LOCAL_LIB_ARCH_DIR}/auto/Slic3r/XS/" + COMMENT "Installing mpfr runtime into the local-lib directory ..." + VERBATIM) endif() # Installation