diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9e1aef5e1..70b7ed567 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,7 +27,6 @@ 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)
@@ -328,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/OCCT/OCCT.cmake b/deps/OCCT/OCCT.cmake
index 9981ac15e..efb529a5a 100644
--- a/deps/OCCT/OCCT.cmake
+++ b/deps/OCCT/OCCT.cmake
@@ -3,6 +3,7 @@ prusaslicer_add_cmake_project(OCCT
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
@@ -20,3 +21,7 @@ prusaslicer_add_cmake_project(OCCT
-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 000000000..1b77eb1b2
--- /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/doc/Dependencies.md b/doc/Dependencies.md
index f37f45466..d8ced6318 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/icons/edit.svg b/resources/icons/edit.svg
new file mode 100644
index 000000000..3cc959b1e
--- /dev/null
+++ b/resources/icons/edit.svg
@@ -0,0 +1,4 @@
+
diff --git a/resources/localization/ja/PrusaSlicer.mo b/resources/localization/ja/PrusaSlicer.mo
index d6b1a975d..bca1e1cd0 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 2f1b1257e..0427cb3b1 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/zh_CN/PrusaSlicer.mo b/resources/localization/zh_CN/PrusaSlicer.mo
index a9b2a5e83..66c4a83ca 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 2453b584d..42b5540df 100644
--- a/resources/localization/zh_CN/PrusaSlicer_zh_CN.po
+++ b/resources/localization/zh_CN/PrusaSlicer_zh_CN.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-12 10:25+0200\n"
-"PO-Revision-Date: 2022-07-22 21:49+0800\n"
+"PO-Revision-Date: 2022-08-22 12:37+0800\n"
"Last-Translator: Bral@qq.com\n"
"Language-Team: \n"
"Language: zh_CN\n"
@@ -3291,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?"
@@ -13639,6 +13639,8 @@ msgid ""
"perimeters with variable extrusion width. This setting also affects the "
"Concentric infill."
msgstr ""
+"经典轮廓生成器产生具有恒定挤出宽度的轮廓,并且对于非常薄的区域使用间隙填充。 "
+"Arachne 引擎产生具有可变挤出宽度的轮廓。这个设置也会影响回环填充。"
#: src/libslic3r/PrintConfig.cpp:3074
msgid "Classic"
@@ -13659,6 +13661,8 @@ msgid ""
"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"
@@ -13721,6 +13725,9 @@ msgid ""
"a percentage (for example 25%), it will be computed based on the nozzle "
"diameter."
msgstr ""
+"薄型特征的最小厚度。比这个值薄的模型特征将不被打印,而比最小特征尺寸厚的特征"
+"将被加宽到最小轮廓的宽度。如果以百分比表示(例如 25%),它将根据喷嘴直径计"
+"算。"
#: src/libslic3r/PrintConfig.cpp:3140
msgid "Minimum perimeter width"
diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx
index 00db32f4f..471ca8c56 100644
--- a/resources/profiles/Creality.idx
+++ b/resources/profiles/Creality.idx
@@ -1,4 +1,5 @@
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
diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini
index 292b99d70..82c1c0bd6 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.2.0
+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%
@@ -41,6 +41,15 @@ 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
+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:ENDER3V2]
name = Creality Ender-3 V2
variants = 0.4; 0.3; 0.5; 0.6
@@ -77,6 +86,15 @@ 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; 0.3; 0.5; 0.6
@@ -531,11 +549,11 @@ support_material_spacing = 1
first_layer_height = 0.2
extrusion_width = 0.33
external_perimeter_extrusion_width = 0.31
-first_layer_extrusion_width = 0.33
+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.33
+top_infill_extrusion_width = 0.30
support_material_extrusion_width = 0.27
[print:*0.4nozzle*]
@@ -545,11 +563,11 @@ support_material_spacing = 1
first_layer_height = 0.2
extrusion_width = 0.44
external_perimeter_extrusion_width = 0.42
-first_layer_extrusion_width = 0.44
+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.44
+top_infill_extrusion_width = 0.40
support_material_extrusion_width = 0.36
[print:*0.5nozzle*]
@@ -559,11 +577,11 @@ 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.55
+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.55
+top_infill_extrusion_width = 0.50
support_material_extrusion_width = 0.45
[print:*0.6nozzle*]
@@ -573,11 +591,11 @@ 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.66
+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.66
+top_infill_extrusion_width = 0.60
support_material_extrusion_width = 0.54
@@ -1268,6 +1286,25 @@ 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
@@ -1312,7 +1349,7 @@ inherits = *ENDER3V2NEO*; *0.6nozzle*
[printer:*ENDER3S1*]
-inherits = *common*; *bowden*; *spriteextruder*; *pauseprint*
+inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint*
bed_shape = 5x0,215x0,215x220,5x220
max_print_height = 270
printer_model = ENDER3S1
@@ -1334,7 +1371,7 @@ inherits = *ENDER3S1*; *0.6nozzle*
[printer:*ENDER3S1PRO*]
-inherits = *common*; *bowden*; *spriteextruder*; *pauseprint*
+inherits = *common*; *fastabl*; *spriteextruder*; *pauseprint*
bed_shape = 5x0,215x0,215x220,5x220
max_print_height = 270
printer_model = ENDER3S1PRO
@@ -1355,6 +1392,26 @@ 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*
@@ -1669,7 +1726,7 @@ inherits = *CR10SMART*; *0.6nozzle*
[printer:*CR10SMARTPRO*]
-inherits = *common*; *bowdenlong*; *slowabl*; *spriteextruder*
+inherits = *common*; *slowabl*; *spriteextruder*
bed_shape = 5x5,295x5,295x295,5x295
max_print_height = 400
printer_model = CR10SMARTPRO
diff --git a/resources/profiles/Creality/ENDER3NEO_thumbnail.png b/resources/profiles/Creality/ENDER3NEO_thumbnail.png
new file mode 100644
index 000000000..809e186d5
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 000000000..ae7024f84
Binary files /dev/null and b/resources/profiles/Creality/ENDER3S1PLUS_thumbnail.png differ
diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx
index ce0505857..dae1399b2 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 1760743ea..17d8486c7 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 70770916c..ad3382435 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 61d6047ce..39cd17edc 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/sandboxes/aabb-evaluation/aabb-evaluation.cpp b/sandboxes/aabb-evaluation/aabb-evaluation.cpp
index 1019ecf28..c11af70e4 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 131a69b5a..50eccfc84 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -9,7 +9,6 @@ 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)
@@ -67,6 +66,7 @@ if (SLIC3R_GUI)
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 ()
diff --git a/src/Shiny/CMakeLists.txt b/src/Shiny/CMakeLists.txt
deleted file mode 100644
index abdb96a72..000000000
--- 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 a2905aef0..000000000
--- 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 54c632151..000000000
--- 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 d75d4f5bf..000000000
--- 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 79dfa4381..000000000
--- 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 6b2811851..000000000
--- 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 403e0e878..000000000
--- 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 9d777073b..000000000
--- 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 ee5fdb0de..000000000
--- 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 f00293252..000000000
--- 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 5e30a3306..000000000
--- 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 fbf6dc870..000000000
--- 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 62fdd4ba8..000000000
--- 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 c2c624d58..000000000
--- 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 81c1783db..000000000
--- 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 5a3044dbc..000000000
--- 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 4058e2285..000000000
--- 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 379703ee6..000000000
--- 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 fe6cd4a33..000000000
--- 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 99d90d927..000000000
--- 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 dde0d3624..000000000
--- 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 f62508820..3cb7cb6bb 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 84109398a..2ca643882 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/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp
index 3ea1d80e4..d3b7a3b85 100644
--- a/src/libslic3r/AppConfig.cpp
+++ b/src/libslic3r/AppConfig.cpp
@@ -184,6 +184,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/SkeletalTrapezoidation.cpp b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp
index d78ce06d1..04dede546 100644
--- a/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp
+++ b/src/libslic3r/Arachne/SkeletalTrapezoidation.cpp
@@ -451,8 +451,23 @@ SkeletalTrapezoidation::SkeletalTrapezoidation(const Polygons& polys, const Bead
constructFromPolygons(polys);
}
+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
@@ -471,7 +486,8 @@ static bool detect_missing_voronoi_vertex(const Geometry::VoronoiDiagram &vorono
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());
@@ -509,29 +525,36 @@ static bool has_missing_twin_edge(const SkeletalTrapezoidationGraph &graph)
inline static std::unordered_map try_to_fix_degenerated_voronoi_diagram_by_rotation(
Geometry::VoronoiDiagram &voronoi_diagram,
const Polygons &polys,
- Polygons &polys_copy,
+ Polygons &polys_rotated,
std::vector &segments,
const double fix_angle)
{
std::unordered_map vertex_mapping;
- for (Polygon &poly : polys_copy)
+ for (Polygon &poly : polys_rotated)
poly.rotate(fix_angle);
- assert(polys_copy.size() == polys.size());
+ assert(polys_rotated.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());
+ 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[poly_idx][point_idx], polys_copy[poly_idx][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_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);
+ 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;
@@ -591,10 +614,6 @@ void SkeletalTrapezoidation::constructFromPolygons(const Polygons& polys)
}
#endif
-#ifdef ARACHNE_DEBUG
- assert(Geometry::VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(voronoi_diagram));
-#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
@@ -715,6 +734,10 @@ process_voronoi_diagram:
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();
diff --git a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp
index a5734f478..75e4d5338 100644
--- a/src/libslic3r/Arachne/utils/ExtrusionLine.cpp
+++ b/src/libslic3r/Arachne/utils/ExtrusionLine.cpp
@@ -268,13 +268,13 @@ void extrusion_paths_append(ExtrusionPaths &dst, const ClipperLib_Z::Paths &extr
{
for (const ClipperLib_Z::Path &extrusion_path : extrusion_paths) {
ThickPolyline thick_polyline = Arachne::to_thick_polyline(extrusion_path);
- Slic3r::append(dst, thick_polyline_to_extrusion_paths(thick_polyline, role, flow, scaled(0.05), float(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), float(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 3da556b47..82bd79523 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 e736f98bc..aa4693643 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 6b06f8bab..1d6cd4ef1 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();
}
};
@@ -212,13 +214,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/Brim.cpp b/src/libslic3r/Brim.cpp
index f48d7ff0a..9ed56bea4 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 e47818835..f77bbaee8 100644
--- a/src/libslic3r/CMakeLists.txt
+++ b/src/libslic3r/CMakeLists.txt
@@ -258,6 +258,10 @@ set(SLIC3R_SOURCES
Technologies.hpp
Tesselate.cpp
Tesselate.hpp
+ TreeSupport.cpp
+ TreeSupport.hpp
+ TreeModelVolumes.cpp
+ TreeModelVolumes.hpp
TriangleMesh.cpp
TriangleMesh.hpp
TriangleMeshSlicer.cpp
@@ -461,10 +465,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 b2c5bd89e..d03cb5a70 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)
@@ -715,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 e585e3011..0388af9a3 100644
--- a/src/libslic3r/ClipperUtils.hpp
+++ b/src/libslic3r/ClipperUtils.hpp
@@ -420,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);
@@ -436,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);
@@ -458,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 b8c046ceb..151043a04 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 334b40431..c4a47b9a3 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 069c6e602..7e22127cd 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 7eccf2ec8..3e42c8670 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))); }
@@ -281,6 +278,19 @@ inline ExPolygons to_expolygons(Polygons &&polys)
return ex_polys;
}
+inline Points to_points(const ExPolygon &expoly)
+{
+ size_t cnt = expoly.contour.size();
+ for (const Polygon &hole : expoly.holes)
+ cnt += hole.size();
+ Points out;
+ out.reserve(cnt);
+ 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 aede1ad67..0591e8a26 100644
--- a/src/libslic3r/ExtrusionEntity.hpp
+++ b/src/libslic3r/ExtrusionEntity.hpp
@@ -179,6 +179,16 @@ 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) {}
+ ExtrusionEntity* clone() const override { return new ExtrusionPathOriented(*this); }
+ // Create a new object, initialize it with this object using the move semantics.
+ ExtrusionEntity* clone_move() override { return new ExtrusionPathOriented(std::move(*this)); }
+ 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 +340,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 49c186df6..8278db960 100644
--- a/src/libslic3r/Fill/Fill.cpp
+++ b/src/libslic3r/Fill/Fill.cpp
@@ -427,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 a8d5d20e2..b38c5c9f8 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/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp
index 17bdfafaf..69f530720 100644
--- a/src/libslic3r/Fill/FillConcentric.cpp
+++ b/src/libslic3r/Fill/FillConcentric.cpp
@@ -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 ba7461c5f..bb93d824b 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/TreeNode.cpp b/src/libslic3r/Fill/Lightning/TreeNode.cpp
index 982d47b10..801a46df4 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/STEP.cpp b/src/libslic3r/Format/STEP.cpp
index 00d692fc6..081726704 100644
--- a/src/libslic3r/Format/STEP.cpp
+++ b/src/libslic3r/Format/STEP.cpp
@@ -64,11 +64,11 @@ LoadStepFn get_load_step_fn()
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.dll: ") + fn_name
+ 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.dll:\n\n") + dlerror());
+ throw Slic3r::RuntimeError(std::string("Cannot load OCCTWrapper.so:\n\n") + dlerror());
}
#endif
}
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index 80aac2691..e44dfb742 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 && diff_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 e1341fa98..3868c87df 100644
--- a/src/libslic3r/GCode/GCodeProcessor.cpp
+++ b/src/libslic3r/GCode/GCodeProcessor.cpp
@@ -2683,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
@@ -2913,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())
diff --git a/src/libslic3r/GCode/PostProcessor.cpp b/src/libslic3r/GCode/PostProcessor.cpp
index ced74e3eb..de1807dbb 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 b173cb684..7135c0a5c 100644
--- a/src/libslic3r/GCode/PressureEqualizer.cpp
+++ b/src/libslic3r/GCode/PressureEqualizer.cpp
@@ -669,17 +669,32 @@ inline void PressureEqualizer::push_to_output(const char *text, const size_t len
output_buffer[output_buffer_length] = 0;
}
-inline bool PressureEqualizer::is_just_feedrate_provided(const GCodeLine &line)
+inline bool is_just_line_with_extrude_set_speed_tag(const std::string &line)
{
- return line.pos_provided[4] && !line.pos_provided[0] && !line.pos_provided[1] && !line.pos_provided[2] && !line.pos_provided[3];
+ 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) {
- const GCodeLine &prev_line = this->m_gcode_lines[line_idx - 1];
- if (prev_line.extrude_set_speed_tag && this->is_just_feedrate_provided(prev_line))
+ 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);
diff --git a/src/libslic3r/GCode/PressureEqualizer.hpp b/src/libslic3r/GCode/PressureEqualizer.hpp
index 068b01df4..d6b7f2a4f 100644
--- a/src/libslic3r/GCode/PressureEqualizer.hpp
+++ b/src/libslic3r/GCode/PressureEqualizer.hpp
@@ -193,8 +193,6 @@ private:
// Push a G-code line to the output.
void push_line_to_output(size_t line_idx, float new_feedrate, const char *comment);
- inline bool is_just_feedrate_provided(const GCodeLine &line);
-
public:
std::queue m_layer_results;
diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp
index 5e86e902a..88d73277c 100644
--- a/src/libslic3r/GCode/SeamPlacer.cpp
+++ b/src/libslic3r/GCode/SeamPlacer.cpp
@@ -455,6 +455,7 @@ void process_perimeter_polygon(const Polygon &orig_polygon, float z_coord, const
}
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,7 +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);
+ angle_arm_len);
result.perimeters.push_back( { });
Perimeter &perimeter = result.perimeters.back();
@@ -949,6 +950,10 @@ void pick_random_seam_point(const std::vector &perimeter_points,
};
std::vector viables;
+ const Vec3f pseudornd_seed = perimeter_points[viable_example_index].position;
+ float rand = std::abs(sin(pseudornd_seed.dot(Vec3f(12.9898f,78.233f, 133.3333f))) * 43758.5453f);
+ rand = rand - (int) rand;
+
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
@@ -976,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) {
@@ -997,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()) {
@@ -1017,8 +1018,8 @@ public:
tree = AABBTreeLines::build_aabb_tree_over_indexed_lines(lines);
}
- float distance_from_perimeter(const Point &point) const {
- Vec2d p = unscale(point);
+ 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);
@@ -1110,20 +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)
- + 0.5f * perimeter_point.perimeter.flow_width
+ 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)
- / (3.0f * perimeter_point.perimeter.flow_width);
- //NOTE disables the feature to place seams on slowly decreasing areas. Remove the following line to enable.
- perimeter_point.overhang = perimeter_point.overhang < 0.0f ? 0.0f : perimeter_point.overhang;
+ * po->layers()[layer_idx]->height;
+ perimeter_point.overhang =
+ perimeter_point.overhang < 0.0f ? 0.0f : perimeter_point.overhang;
}
if (should_compute_layer_embedding) { // search for embedded perimeter points (points hidden inside the print ,e.g. multimaterial join, best position for seam)
perimeter_point.embedded_distance = current_layer_distancer->distance_from_perimeter(point)
- + 0.5f * perimeter_point.perimeter.flow_width;
+ + 0.6f * perimeter_point.perimeter.flow_width;
}
}
@@ -1381,7 +1381,7 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl::
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) ? -1.0f : 1.0f;
+ 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;
@@ -1399,10 +1399,10 @@ void SeamPlacer::align_seam_points(const PrintObject *po, const SeamPlacerImpl::
// Perimeter structure of the point; also set flag aligned to true
for (size_t index = 0; index < seam_string.size(); ++index) {
const auto &pair = seam_string[index];
- float t = std::min(1.0f, std::abs(layers[pair.first].points[pair.second].local_ccw_angle)
- / SeamPlacer::sharp_angle_snapping_threshold);
+ 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.7f, t);
+ t = std::max(0.4f, t);
}
Vec3f current_pos = layers[pair.first].points[pair.second].position;
@@ -1533,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;
diff --git a/src/libslic3r/GCode/SeamPlacer.hpp b/src/libslic3r/GCode/SeamPlacer.hpp
index 2f67f6616..8d52fd79f 100644
--- a/src/libslic3r/GCode/SeamPlacer.hpp
+++ b/src/libslic3r/GCode/SeamPlacer.hpp
@@ -113,12 +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;
// 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 = 45.0f * float(PI) / 180.0f;
+ 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;
diff --git a/src/libslic3r/GCodeReader.cpp b/src/libslic3r/GCodeReader.cpp
index 44b0b89f6..cd6cedf51 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 c5279c0f5..c2caf5766 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 3070dbe42..13878e9ec 100644
--- a/src/libslic3r/Geometry.cpp
+++ b/src/libslic3r/Geometry.cpp
@@ -577,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/VoronoiUtilsCgal.cpp b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp
index caaf1ee9c..062a3b397 100644
--- a/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp
+++ b/src/libslic3r/Geometry/VoronoiUtilsCgal.cpp
@@ -3,6 +3,7 @@
#include
#include "libslic3r/Geometry/Voronoi.hpp"
+#include "libslic3r/Arachne/utils/VoronoiUtils.hpp"
#include "VoronoiUtilsCgal.hpp"
@@ -28,7 +29,8 @@ bool VoronoiUtilsCgal::is_voronoi_diagram_planar_intersection(const VD &voronoi_
if (edge.color() != 0)
continue;
- if (edge.is_finite() && edge.is_linear()) {
+ 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);
@@ -73,7 +75,8 @@ bool VoronoiUtilsCgal::is_voronoi_diagram_planar_angle(const VoronoiDiagram &vor
do {
// FIXME Lukas H.: Also process parabolic segments.
- if (edge->is_finite() && edge->is_linear())
+ 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();
diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp
index 21de030cd..e11c740e6 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 dfae5f188..1996a58b5 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/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp
index 830d48571..e61f9097d 100644
--- a/src/libslic3r/PerimeterGenerator.cpp
+++ b/src/libslic3r/PerimeterGenerator.cpp
@@ -21,12 +21,12 @@
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);
@@ -38,8 +38,8 @@ ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_poly
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 (!paths.empty())
- paths.back().polyline.points.back() = line.b; // Connect this tiny line to the last finished path.
+ 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;
@@ -103,40 +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 auto 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()) {
- for (auto it = std::next(paths.begin()); it != paths.end(); ++it) {
+ // 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 (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)));
- }
- }
- }
+ 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.
@@ -534,10 +532,35 @@ 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)));
+ }
}
}
diff --git a/src/libslic3r/PerimeterGenerator.hpp b/src/libslic3r/PerimeterGenerator.hpp
index 2e478e107..ecf09c593 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 e84ddc503..109c949cd 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 ee318d3ae..da558e438 100644
--- a/src/libslic3r/Point.hpp
+++ b/src/libslic3r/Point.hpp
@@ -142,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) {}
@@ -282,7 +282,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 09f1c393d..bf0abd4fa 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,35 @@ 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;
+}
+
+Polygon make_circle(double radius, double error)
+{
+ double angle = 2. * acos(1. - error / radius);
+ size_t num_segments = size_t(ceil(2. * M_PI / angle));
+ return make_circle_num_segments(radius, num_segments);
+}
+
+Polygon make_circle_num_segments(double radius, size_t num_segments)
+{
+ Polygon out;
+ out.points.reserve(num_segments);
+ double angle_inc = 2.0 * M_PI / num_segments;
+ for (size_t i = 0; i < num_segments; ++ i) {
+ const double angle = angle_inc * i;
+ out.points.emplace_back(coord_t(cos(angle) * radius), coord_t(sin(angle) * radius));
+ }
+ return out;
+}
+
}
diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp
index 77f3020be..12d457c37 100644
--- a/src/libslic3r/Polygon.hpp
+++ b/src/libslic3r/Polygon.hpp
@@ -250,6 +250,12 @@ 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);
+
+Polygon make_circle(double radius, double error);
+Polygon make_circle_num_segments(double radius, size_t num_segments);
+
} // Slic3r
// start Boost
diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp
index 5282f6c77..547664d4f 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 72cf59527..f740c874c 100644
--- a/src/libslic3r/Preset.cpp
+++ b/src/libslic3r/Preset.cpp
@@ -748,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) {
@@ -792,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.
@@ -1869,13 +1876,23 @@ bool PhysicalPrinterCollection::delete_preset_from_printers( const std::string&
return true;
}
+void PhysicalPrinterCollection::rename_preset_in_printers(const std::string& old_preset_name, const std::string& new_preset_name)
+{
+ for (PhysicalPrinter& printer : m_printers)
+ if (printer.delete_preset(old_preset_name)) {
+ printer.add_preset(new_preset_name);
+ printer.update_preset_names_in_config();
+ printer.save();
+ }
+}
+
// Get list of printers which have more than one preset and "preset_names" preset is one of them
-std::vector PhysicalPrinterCollection::get_printers_with_preset(const std::string& preset_name)
+std::vector PhysicalPrinterCollection::get_printers_with_preset(const std::string& preset_name, bool respect_only_preset /*= true*/)
{
std::vector printers;
for (auto printer : m_printers) {
- if (printer.preset_names.size() == 1)
+ if (!respect_only_preset && printer.preset_names.size() == 1)
continue;
if (printer.preset_names.find(preset_name) != printer.preset_names.end())
printers.emplace_back(printer.name);
diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp
index 58ab57cfd..1e2ab9e24 100644
--- a/src/libslic3r/Preset.hpp
+++ b/src/libslic3r/Preset.hpp
@@ -734,9 +734,9 @@ public:
// If there is last preset for the printer and first_check== false, then delete this printer
// returns true if all presets were deleted successfully.
bool delete_preset_from_printers(const std::string& preset_name);
-
+ void rename_preset_in_printers(const std::string& old_name, const std::string& new_name);
// Get list of printers which have more than one preset and "preset_names" preset is one of them
- std::vector get_printers_with_preset( const std::string &preset_name);
+ std::vector get_printers_with_preset( const std::string &preset_name, bool respect_only_preset = true);
// Get list of printers which has only "preset_names" preset
std::vector get_printers_with_only_preset( const std::string &preset_name);
diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp
index 2a5b14c7e..c3792779c 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 2a51a2855..efb92d3d3 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)
@@ -1050,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");
@@ -2776,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));
diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp
index f6bb1572b..5cc5cc59c 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 {
diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp
index c96e23fe0..71ec15e07 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"
@@ -28,8 +29,6 @@
#include
-#include
-
using namespace std::literals;
//! macro used to mark string used at localization,
@@ -689,12 +688,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.
@@ -1098,8 +1106,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
@@ -1210,8 +1216,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().
@@ -1261,7 +1265,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;
@@ -1286,88 +1289,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;
@@ -1494,62 +1491,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.
@@ -1559,12 +1560,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
@@ -1573,11 +1578,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
@@ -1611,14 +1615,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)
@@ -1795,7 +1798,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)
@@ -2187,8 +2197,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/Pad.cpp b/src/libslic3r/SLA/Pad.cpp
index b04c3f219..ec9e216f5 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/SVG.cpp b/src/libslic3r/SVG.cpp
index d68301e74..03c8823d3 100644
--- a/src/libslic3r/SVG.cpp
+++ b/src/libslic3r/SVG.cpp
@@ -88,10 +88,8 @@ void SVG::draw(const ExPolygon &expolygon, std::string fill, const float fill_op
this->fill = 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);
}
@@ -359,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/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp
index e2a1f0cf2..e8ee782f4 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