From 9d59cd66c4c5b07ff0cb35ca9710ee62dc7d6278 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 4 Jan 2024 06:50:11 +0800 Subject: [PATCH 01/18] Feature/update deps (#3445) * update deps * fix win build errors * fix mac build * update linux (cherry picked from commit 77b6225060fd1b6cbc32865b6397363befd2af1d) --- .github/workflows/build_deps.yml | 4 +- BuildLinux.sh | 2 +- CMakeLists.txt | 3 +- README.md | 5 +- deps/Boost/Boost.cmake | 216 +++-------------------------- deps/CMakeLists.txt | 1 - deps/MPFR/MPFR.cmake | 4 +- src/libslic3r/CutSurface.cpp | 2 +- src/libslic3r/Format/bbs_3mf.cpp | 13 +- src/libslic3r/MeshBoolean.cpp | 1 + src/libslic3r/Model.cpp | 3 +- src/libslic3r/Triangulation.cpp | 1 + src/libslic3r/Utils.hpp | 3 + src/libslic3r/utils.cpp | 18 +++ src/slic3r/GUI/MediaPlayCtrl.cpp | 3 +- src/slic3r/Utils/PresetUpdater.cpp | 15 +- 16 files changed, 67 insertions(+), 227 deletions(-) diff --git a/.github/workflows/build_deps.yml b/.github/workflows/build_deps.yml index d63a038ee79..2bf4701bd4c 100644 --- a/.github/workflows/build_deps.yml +++ b/.github/workflows/build_deps.yml @@ -70,7 +70,7 @@ jobs: if: inputs.os == 'macos-12' working-directory: ${{ github.workspace }} run: | - brew install cmake git gettext automake + brew install cmake git gettext automake texinfo brew list mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }} mkdir -p ${{ github.workspace }}/deps/build_${{ inputs.arch }}/OrcaSlicer_dep_${{ inputs.arch }} @@ -88,7 +88,7 @@ jobs: libwayland-dev libxkbcommon-dev wayland-protocols extra-cmake-modules pkgconf \ libglu1-mesa-dev libcairo2-dev libgtk-3-dev libsoup2.4-dev libwebkit2gtk-4.0-dev \ libgstreamer1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-base1.0-dev \ - gstreamer1.0-plugins-bad libosmesa6-dev wget sudo autoconf curl libunwind-dev + gstreamer1.0-plugins-bad libosmesa6-dev wget sudo autoconf curl libunwind-dev texinfo mkdir -p ${{ github.workspace }}/deps/build mkdir -p ${{ github.workspace }}/deps/build/destdir sudo ./BuildLinux.sh -ur diff --git a/BuildLinux.sh b/BuildLinux.sh index 05f9c2a255a..099cc0a8956 100755 --- a/BuildLinux.sh +++ b/BuildLinux.sh @@ -78,7 +78,7 @@ then fi # Addtional Dev packages for OrcaSlicer -export REQUIRED_DEV_PACKAGES="libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules" +export REQUIRED_DEV_PACKAGES="libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules texinfo" # libwebkit2gtk-4.1-dev ?? export DEV_PACKAGES_COUNT=$(echo ${REQUIRED_DEV_PACKAGES} | wc -w) if [ $(dpkg --get-selections | grep -E "$(echo ${REQUIRED_DEV_PACKAGES} | tr ' ' '|')" | wc -l) -lt ${DEV_PACKAGES_COUNT} ]; then diff --git a/CMakeLists.txt b/CMakeLists.txt index c530a9c3fb6..4640034c41d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,6 @@ if (APPLE) if (CMAKE_MACOSX_BUNDLE) set(CMAKE_INSTALL_RPATH @executable_path/../Frameworks) endif() - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE) SET(CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.softfever3d.orca-slicer") message(STATUS "Orca: IS_CROSS_COMPILE: ${IS_CROSS_COMPILE}") @@ -316,7 +315,7 @@ if(WIN32) add_definitions(-D_USE_MATH_DEFINES -D_WIN32 -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS) if(MSVC) # BOOST_ALL_NO_LIB: Avoid the automatic linking of Boost libraries on Windows. Rather rely on explicit linking. - add_definitions(-DBOOST_ALL_NO_LIB -DBOOST_USE_WINAPI_VERSION=0x601 -DBOOST_SYSTEM_USE_UTF8 ) + add_definitions(-DBOOST_ALL_NO_LIB -DBOOST_USE_WINAPI_VERSION=0x602 -DBOOST_SYSTEM_USE_UTF8 ) # Force the source code encoding to UTF-8. See OrcaSlicer GH pull request #5583 add_compile_options("$<$:/utf-8>") add_compile_options("$<$:/utf-8>") diff --git a/README.md b/README.md index 6ed0bd2d640..43d89c66f0d 100644 --- a/README.md +++ b/README.md @@ -65,11 +65,12 @@ Orca Slicer's logo is designed by community member Justin Levine(@freejstnalxndr - Run `build_release.bat` in `x64 Native Tools Command Prompt for VS 2019` - Mac 64-bit - - Tools needed: Xcode, Cmake, git, gettext, libtool, automake, autoconf + - Tools needed: Xcode, Cmake, git, gettext, libtool, automake, autoconf, texinfo + - You can install most of them by running `brew install cmake gettext libtool automake autoconf texinfo` - run `build_release_macos.sh` - Ubuntu - - Dependencies **Will be auto installed with the shell script**: `libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules libgtk2.0-dev libglew-dev libudev-dev libdbus-1-dev cmake git` + - Dependencies **Will be auto installed with the shell script**: `libmspack-dev libgstreamerd-3-dev libsecret-1-dev libwebkit2gtk-4.0-dev libosmesa6-dev libssl-dev libcurl4-openssl-dev eglexternalplatform-dev libudev-dev libdbus-1-dev extra-cmake-modules libgtk2.0-dev libglew-dev libudev-dev libdbus-1-dev cmake git texinfo` - run 'sudo ./BuildLinux.sh -u' - run './BuildLinux.sh -dsir' diff --git a/deps/Boost/Boost.cmake b/deps/Boost/Boost.cmake index 767ca563aa0..f3c23b77c75 100644 --- a/deps/Boost/Boost.cmake +++ b/deps/Boost/Boost.cmake @@ -1,203 +1,25 @@ -include(ExternalProject) -# Use boost 1.78 for Windows, to support VS2022 -if (WIN32) - set(_boost_url "https://github.com/SoftFever/OrcaSlicer_deps/releases/download/boost/boost_1_78_0.tar.gz") - set(_boost_hash 94CED8B72956591C4775AE2207A9763D3600B30D9D7446562C552F0A14A63BE7) - set(_bootstrap_cmd bootstrap.bat) - set(_build_cmd b2.exe) -else() - set(_boost_url "https://github.com/SoftFever/OrcaSlicer_deps/releases/download/boost/boost_1_75_0.tar.gz") - set(_boost_hash AEB26F80E80945E82EE93E5939BAEBDCA47B9DEE80A07D3144BE1E1A6A66DD6A) - set(_bootstrap_cmd ./bootstrap.sh) - set(_build_cmd ./b2) -endif() - -set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/common.jam ./tools/build/src/tools/common.jam) - -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - configure_file(${CMAKE_CURRENT_LIST_DIR}/user-config.jam boost-user-config.jam) - set(_boost_toolset gcc) - set(_patch_command ${_patch_command} && ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/boost-user-config.jam ./tools/build/src/tools/user-config.jam) -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - # https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html - if (MSVC_VERSION EQUAL 1800) - # 1800 = VS 12.0 (v120 toolset) - set(_boost_toolset "msvc-12.0") - elseif (MSVC_VERSION EQUAL 1900) - # 1900 = VS 14.0 (v140 toolset) - set(_boost_toolset "msvc-14.0") - elseif (MSVC_VERSION LESS 1920) - # 1910-1919 = VS 15.0 (v141 toolset) - set(_boost_toolset "msvc-14.1") - elseif (MSVC_VERSION LESS 1930) - # 1920-1929 = VS 16.0 (v142 toolset) - set(_boost_toolset "msvc-14.2") - elseif (MSVC_VERSION LESS 1940) - # 1930-1939 = VS 17.0 (v143 toolset) - set(_boost_toolset "msvc-14.3") - else () - message(FATAL_ERROR "Unsupported MSVC version") +set(_context_abi_line "") +set(_context_arch_line "") +if (APPLE AND CMAKE_OSX_ARCHITECTURES) + if (CMAKE_OSX_ARCHITECTURES MATCHES "x86") + set(_context_abi_line "-DBOOST_CONTEXT_ABI:STRING=sysv") + elseif (CMAKE_OSX_ARCHITECTURES MATCHES "arm") + set (_context_abi_line "-DBOOST_CONTEXT_ABI:STRING=aapcs") endif () -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - if (WIN32) - set(_boost_toolset "clang-win") - else() - set(_boost_toolset "clang") - endif() -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - set(_boost_toolset "intel") -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") - set(_boost_toolset "clang") -endif() - -message(STATUS "Deduced boost toolset: ${_boost_toolset} based on ${CMAKE_CXX_COMPILER_ID} compiler") - -set(_libs "") -foreach(_comp ${DEP_Boost_COMPONENTS}) - list(APPEND _libs "--with-${_comp}") -endforeach() - -if (BUILD_SHARED_LIBS) - set(_link shared) -else() - set(_link static) -endif() - -set(_bits "") -if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") - set(_bits 64) -elseif ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") - set(_bits 32) -endif () - -include(ProcessorCount) -ProcessorCount(NPROC) -file(TO_NATIVE_PATH ${DESTDIR}/usr/local/ _prefix) - - -set(_boost_variants "") -if(CMAKE_BUILD_TYPE) - list(APPEND CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE}) - list(REMOVE_DUPLICATES CMAKE_CONFIGURATION_TYPES) -endif() -list(FIND CMAKE_CONFIGURATION_TYPES "Release" _cfg_rel) -list(FIND CMAKE_CONFIGURATION_TYPES "RelWithDebInfo" _cfg_relwdeb) -list(FIND CMAKE_CONFIGURATION_TYPES "MinSizeRel" _cfg_minsizerel) -list(FIND CMAKE_CONFIGURATION_TYPES "Debug" _cfg_deb) - -if (_cfg_rel GREATER -1 OR _cfg_relwdeb GREATER -1 OR _cfg_minsizerel GREATER -1) - list(APPEND _boost_variants release) -endif() - -if (MSVC AND ${DEP_DEBUG} ) - list(APPEND _boost_variants debug) -endif() - -if (NOT _boost_variants) - set(_boost_variants release) -endif() - -if (IS_CROSS_COMPILE AND APPLE) - if (${CMAKE_OSX_ARCHITECTURES} MATCHES "arm") - message(STATUS "Compiling Boost for arm64.") - message(STATUS "Compiling Boost with toolset ${_boost_toolset}.") - message(STATUS "Compiling Boost with libs ${_libs}.") - message(STATUS "Compiling Boost with variant ${_boost_variants}.") - message(STATUS "Compiling Boost with _bootstrap_cmd ${_bootstrap_cmd}.") - message(STATUS "_boost_linkflags = ${_boost_linkflags}") - set(_arch_flags "-arch arm64") - set(_boost_linkflags "linkflags=${_arch_flags}") - message(STATUS "_cmake_args_osx_arch = '${_cmake_args_osx_arch}'") - elseif (${CMAKE_OSX_ARCHITECTURES} MATCHES "x86_64") - message(STATUS "Compiling Boost for x86_64.") - set(_arch_flags "-arch x86_64") - endif() - set(_boost_linkflags "linkflags=${_arch_flags}") + set(_context_arch_line "-DBOOST_CONTEXT_ARCHITECTURE:STRING=${CMAKE_OSX_ARCHITECTURES}") endif () -set(_boost_flags "") -if(APPLE) - set(_boost_flags - "cflags=-fPIC ${_arch_flags} -mmacosx-version-min=${DEP_OSX_TARGET};" - "cxxflags=-fPIC ${_arch_flags} -mmacosx-version-min=${DEP_OSX_TARGET};" - "mflags=-fPIC ${_arch_flags} -mmacosx-version-min=${DEP_OSX_TARGET};" - "mmflags=-fPIC ${_arch_flags} -mmacosx-version-min=${DEP_OSX_TARGET}") -elseif (UNIX) - set(_boost_flags "cflags=-fPIC;cxxflags=-fPIC") -endif() - -set(_build_cmd ${_build_cmd} - ${_boost_flags} - ${_boost_linkflags} - -j${NPROC} - ${_libs} - --layout=versioned - --debug-configuration - toolset=${_boost_toolset} - address-model=${_bits} - link=${_link} - threading=multi - boost.locale.icu=off - --disable-icu - ${_boost_variants} - stage) - -set(_install_cmd ${_build_cmd} --prefix=${_prefix} install) - -if (NOT IS_CROSS_COMPILE OR NOT APPLE OR BUILD_SHARED_LIBS) - message(STATUS "Standard boost build with bootstrap command '${_bootstrap_cmd}'") - message(STATUS "Standard boost build with patch command '${_patch_command}'") - message(STATUS "Standard boost build with build command '${_build_cmd}'") - message(STATUS "Standard boost build with install command '${_install_cmd}'") -ExternalProject_Add( - dep_Boost - URL ${_boost_url} - URL_HASH SHA256=${_boost_hash} - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Boost - CONFIGURE_COMMAND "${_bootstrap_cmd}" - PATCH_COMMAND ${_patch_command} - BUILD_COMMAND "${_build_cmd}" - BUILD_IN_SOURCE ON - INSTALL_COMMAND "${_install_cmd}" -) - -else() - -ExternalProject_Add( - dep_Boost - URL ${_boost_url} - URL_HASH SHA256=${_boost_hash} - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/Boost - CONFIGURE_COMMAND ./bootstrap.sh - --with-toolset=clang - --with-libraries=date_time,filesystem,iostreams,locale,log,regex,system,thread - "--prefix=${DESTDIR}/usr/local" -# PATCH_COMMAND ${_patch_command} - BUILD_COMMAND "${_build_cmd}" - BUILD_IN_SOURCE ON - INSTALL_COMMAND "${_install_cmd}" +orcaslicer_add_cmake_project(Boost + URL "https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.gz" + URL_HASH SHA256=4d27e9efed0f6f152dc28db6430b9d3dfb40c0345da7342eaa5a987dde57bd95 + LIST_SEPARATOR | + CMAKE_ARGS + -DBOOST_EXCLUDE_LIBRARIES:STRING=contract|fiber|numpy|stacktrace|wave|test + -DBOOST_LOCALE_ENABLE_ICU:BOOL=OFF # do not link to libicu, breaks compatibility between distros + -DBUILD_TESTING:BOOL=OFF + "${_context_abi_line}" + "${_context_arch_line}" ) -endif() -if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") - message(STATUS "Patch the boost::polygon library with a custom one.") - # Patch the boost::polygon library with a custom one. - ExternalProject_Add(dep_boost_polygon - EXCLUDE_FROM_ALL ON - # GIT_REPOSITORY "https://github.com/prusa3d/polygon" - # GIT_TAG prusaslicer_gmp - URL https://github.com/prusa3d/polygon/archive/refs/heads/prusaslicer_gmp.zip - URL_HASH SHA256=abeb9710f0a7069fb9b22181ae5c56f6066002f125db210e7ffb27032aed6824 - DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/boost_polygon - DEPENDS dep_Boost - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - ${_cmake_args_osx_arch} - INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory - "${CMAKE_CURRENT_BINARY_DIR}/dep_boost_polygon-prefix/src/dep_boost_polygon/include/boost/polygon" - "${DESTDIR}/usr/local/include/boost/polygon" - ) - # Only override boost::Polygon Voronoi implementation with Vojtech's GMP hacks on 64bit platforms. - list(APPEND _dep_list "dep_boost_polygon") -endif () \ No newline at end of file +set(DEP_Boost_DEPENDS ZLIB) \ No newline at end of file diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 8b693b28cc0..d8210f54460 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -172,7 +172,6 @@ if (MSVC) endif () elseif (APPLE) message("OS X SDK Path: ${CMAKE_OSX_SYSROOT}") - set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE) if (CMAKE_OSX_DEPLOYMENT_TARGET) set(DEP_OSX_TARGET "${CMAKE_OSX_DEPLOYMENT_TARGET}") message("OS X Deployment Target: ${DEP_OSX_TARGET}") diff --git a/deps/MPFR/MPFR.cmake b/deps/MPFR/MPFR.cmake index f8e95cc8085..30ceca90b39 100644 --- a/deps/MPFR/MPFR.cmake +++ b/deps/MPFR/MPFR.cmake @@ -26,8 +26,8 @@ else () endif () ExternalProject_Add(dep_MPFR - URL http://ftp.vim.org/ftp/gnu/mpfr/mpfr-3.1.6.tar.bz2 https://www.mpfr.org/mpfr-3.1.6/mpfr-3.1.6.tar.bz2 # mirrors are allowed - URL_HASH SHA256=cf4f4b2d80abb79e820e78c8077b6725bbbb4e8f41896783c899087be0e94068 + URL https://www.mpfr.org/mpfr-current/mpfr-4.2.1.tar.bz2 + URL_HASH SHA256=b9df93635b20e4089c29623b19420c4ac848a1b29df1cfd59f26cab0d2666aa0 DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/MPFR BUILD_IN_SOURCE ON CONFIGURE_COMMAND autoreconf -f -i && diff --git a/src/libslic3r/CutSurface.cpp b/src/libslic3r/CutSurface.cpp index b2cf3d96596..060bed62e11 100644 --- a/src/libslic3r/CutSurface.cpp +++ b/src/libslic3r/CutSurface.cpp @@ -28,7 +28,7 @@ using namespace Slic3r; #include "ExPolygonsIndex.hpp" - +#include #include #include #include diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 15aabd5f8a5..33bf5bee6b1 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -1290,9 +1289,9 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) model.set_backup_path(m_backup_path); try { if (boost::filesystem::exists(model.get_backup_path() + "/origin.txt")) - boost::filesystem::load_string_file(model.get_backup_path() + "/origin.txt", m_origin_file); + load_string_file(model.get_backup_path() + "/origin.txt", m_origin_file); } catch (...) {} - boost::filesystem::save_string_file( + save_string_file( model.get_backup_path() + "/lock.txt", boost::lexical_cast(get_current_pid())); } @@ -1305,7 +1304,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) file_version = *m_bambuslicer_generator_version; // save for restore if (result && m_load_aux && !m_load_restore) { - boost::filesystem::save_string_file(model.get_backup_path() + "/origin.txt", filename); + save_string_file(model.get_backup_path() + "/origin.txt", filename); } if (m_load_restore && !result) // not clear failed backup data for later analyze model.set_backup_path("detach"); @@ -5544,7 +5543,7 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) return false; } if (!(store_params.strategy & SaveStrategy::Silence)) - boost::filesystem::save_string_file(store_params.model->get_backup_path() + "/origin.txt", filename); + save_string_file(store_params.model->get_backup_path() + "/origin.txt", filename); } return result; } @@ -8287,7 +8286,7 @@ bool has_restore_data(std::string & path, std::string& origin) } if (boost::filesystem::exists(path + "/lock.txt")) { std::string pid; - boost::filesystem::load_string_file(path + "/lock.txt", pid); + load_string_file(path + "/lock.txt", pid); try { if (get_process_name(boost::lexical_cast(pid)) == get_process_name(0)) { @@ -8304,7 +8303,7 @@ bool has_restore_data(std::string & path, std::string& origin) return false; try { if (boost::filesystem::exists(path + "/origin.txt")) - boost::filesystem::load_string_file(path + "/origin.txt", origin); + load_string_file(path + "/origin.txt", origin); } catch (...) { } diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp index b05245d3969..1021fb7658c 100644 --- a/src/libslic3r/MeshBoolean.cpp +++ b/src/libslic3r/MeshBoolean.cpp @@ -5,6 +5,7 @@ #include "libslic3r/format.hpp" #undef PI +#include // Include igl first. It defines "L" macro which then clashes with our localization #include #undef L diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index a8aecf178a5..afb7ab85988 100644 --- a/src/libslic3r/Model.cpp +++ b/src/libslic3r/Model.cpp @@ -38,7 +38,6 @@ #include #include #include -#include #include #include @@ -873,7 +872,7 @@ std::string Model::get_backup_path() BOOST_LOG_TRIVIAL(info) << "create /Metadata in " << temp_path; boost::filesystem::create_directories(backup_path + "/Metadata"); BOOST_LOG_TRIVIAL(info) << "create /lock.txt in " << temp_path; - boost::filesystem::save_string_file(backup_path + "/lock.txt", + save_string_file(backup_path + "/lock.txt", boost::lexical_cast(get_current_pid())); } } catch (std::exception &ex) { diff --git a/src/libslic3r/Triangulation.cpp b/src/libslic3r/Triangulation.cpp index c75a531973c..72275a40944 100644 --- a/src/libslic3r/Triangulation.cpp +++ b/src/libslic3r/Triangulation.cpp @@ -4,6 +4,7 @@ ///|/ #include "Triangulation.hpp" #include "IntersectionPoints.hpp" +#include #include #include #include diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp index 2a261476c4f..eb1599baf05 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -650,6 +650,9 @@ inline std::string filter_characters(const std::string& str, const std::string& void copy_directory_recursively(const boost::filesystem::path &source, const boost::filesystem::path &target); +// Orca: Since 1.7.9 Boost deprecated save_string_file and load_string_file, copy and modified from boost 1.7.8 +void save_string_file(const boost::filesystem::path& p, const std::string& str); +void load_string_file(const boost::filesystem::path& p, std::string& str); } // namespace Slic3r diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 7f4adfe1683..387d3673850 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -1527,4 +1527,22 @@ void copy_directory_recursively(const boost::filesystem::path &source, const boo return; } +void save_string_file(const boost::filesystem::path& p, const std::string& str) +{ + boost::nowide::ofstream file; + file.exceptions(std::ios_base::failbit | std::ios_base::badbit); + file.open(p.generic_string(), std::ios_base::binary); + file.write(str.c_str(), str.size()); +} + +void load_string_file(const boost::filesystem::path& p, std::string& str) +{ + boost::nowide::ifstream file; + file.exceptions(std::ios_base::failbit | std::ios_base::badbit); + file.open(p.generic_string(), std::ios_base::binary); + std::size_t sz = static_cast(boost::filesystem::file_size(p)); + str.resize(sz, '\0'); + file.read(&str[0], sz); +} + }; // namespace Slic3r diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index eae8942bcb4..0d3e01b4bcb 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -8,7 +8,6 @@ #include "MsgDialog.hpp" #include "DownloadProgressDialog.hpp" -#include #include #undef pid_t #include @@ -596,7 +595,7 @@ bool MediaPlayCtrl::start_stream_service(bool *need_install) file_url2 = wxURI(file_url2).BuildURI(); try { std::string configs; - boost::filesystem::load_string_file(file_ff_cfg, configs); + load_string_file(file_ff_cfg, configs); std::vector configss; boost::algorithm::split(configss, configs, boost::algorithm::is_any_of("\r\n")); configss.erase(std::remove(configss.begin(), configss.end(), std::string()), configss.end()); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index a1efec715ce..98329c61583 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -819,9 +818,9 @@ void PresetUpdater::priv::sync_tooltip(std::string http_url, std::string languag fs::path cache_root = fs::path(data_dir()) / "resources/tooltip"; try { auto vf = cache_root / "common" / "version"; - if (fs::exists(vf)) fs::load_string_file(vf, common_version); + if (fs::exists(vf)) load_string_file(vf, common_version); vf = cache_root / language / "version"; - if (fs::exists(vf)) fs::load_string_file(vf, language_version); + if (fs::exists(vf)) load_string_file(vf, language_version); } catch (...) {} std::map resources { @@ -997,11 +996,11 @@ void PresetUpdater::priv::sync_printer_config(std::string http_url) auto cache_folder = data_dir_path / "ota" / "printers"; try { - boost::filesystem::load_string_file(config_folder / "version.txt", curr_version); + load_string_file(config_folder / "version.txt", curr_version); boost::algorithm::trim(curr_version); } catch (...) {} try { - boost::filesystem::load_string_file(cache_folder / "version.txt", cached_version); + load_string_file(cache_folder / "version.txt", cached_version); boost::algorithm::trim(cached_version); } catch (...) {} if (!cached_version.empty()) { @@ -1035,7 +1034,7 @@ void PresetUpdater::priv::sync_printer_config(std::string http_url) bool result = false; try { - boost::filesystem::load_string_file(cache_folder / "version.txt", cached_version); + load_string_file(cache_folder / "version.txt", cached_version); boost::algorithm::trim(cached_version); result = true; } catch (...) {} @@ -1154,11 +1153,11 @@ Updates PresetUpdater::priv::get_printer_config_updates(bool update) const std::string curr_version; std::string resc_version; try { - boost::filesystem::load_string_file(resc_folder / "version.txt", resc_version); + load_string_file(resc_folder / "version.txt", resc_version); boost::algorithm::trim(resc_version); } catch (...) {} try { - boost::filesystem::load_string_file(config_folder / "version.txt", curr_version); + load_string_file(config_folder / "version.txt", curr_version); boost::algorithm::trim(curr_version); } catch (...) {} From e713849fed7af2f8b8ecd877407949423c6e3d5b Mon Sep 17 00:00:00 2001 From: Noisyfox Date: Thu, 4 Jan 2024 19:28:19 +0800 Subject: [PATCH 02/18] QoL: Keyboard shortcuts updates & fixes (#3457) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Bring back the shortcut to zoom in & out * Update keyboard shortcut info * Update keyboard shortcut info * Different handling of shortcut 'T' for emboss text Cherry-picked from prusa3d/PrusaSlicer@58e3143ad8fee1069b01a4ebe85e07711331e5aa Co-authored-by: Filip Sykala - NTB T15p --------- Co-authored-by: Filip Sykala - NTB T15p (cherry picked from commit 002208fc8c952a6a4c132fa7977a7bbdbc7a348d) --- src/slic3r/GUI/GLCanvas3D.cpp | 8 ++++---- src/slic3r/GUI/Gizmos/GLGizmosManager.cpp | 23 ++++++++++++++++------- src/slic3r/GUI/KBShortcutsDialog.cpp | 3 +++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 078625ccfde..d67269be221 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -3221,8 +3221,8 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) // } // break; //} - //case 'I': - //case 'i': { _update_camera_zoom(1.0); break; } + case 'I': + case 'i': { _update_camera_zoom(1.0); break; } //case 'K': //case 'k': { wxGetApp().plater()->get_camera().select_next_type(); m_dirty = true; break; } //case 'L': @@ -3234,8 +3234,8 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) //} //break; //} - //case 'O': - //case 'o': { _update_camera_zoom(-1.0); break; } + case 'O': + case 'o': { _update_camera_zoom(-1.0); break; } //case 'Z': //case 'z': { // if (!m_selection.is_empty()) diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 7ab41bb4fa7..a30f87d31ed 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -388,15 +388,24 @@ bool GLGizmosManager::is_running() const bool GLGizmosManager::handle_shortcut(int key) { - if (!m_enabled || m_parent.get_selection().is_empty()) + if (!m_enabled) return false; - auto it = std::find_if(m_gizmos.begin(), m_gizmos.end(), - [key](const std::unique_ptr& gizmo) { - int gizmo_key = gizmo->get_shortcut_key(); - return gizmo->is_activable() - && ((gizmo_key == key - 64) || (gizmo_key == key - 96)); - }); + auto is_key = [pressed_key = key](int gizmo_key) { return (gizmo_key == pressed_key - 64) || (gizmo_key == pressed_key - 96); }; + // allowe open shortcut even when selection is empty + if (GLGizmoBase* gizmo_emboss = m_gizmos[Emboss].get(); + is_key(gizmo_emboss->get_shortcut_key())) { + dynamic_cast(gizmo_emboss)->on_shortcut_key(); + return true; + } + + if (m_parent.get_selection().is_empty()) + return false; + + auto is_gizmo = [is_key](const std::unique_ptr &gizmo) { + return gizmo->is_activable() && is_key(gizmo->get_shortcut_key()); + }; + auto it = std::find_if(m_gizmos.begin(), m_gizmos.end(), is_gizmo); if (it == m_gizmos.end()) return false; diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp index 3a85d704337..7ad3e36cacf 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.cpp +++ b/src/slic3r/GUI/KBShortcutsDialog.cpp @@ -258,6 +258,9 @@ void KBShortcutsDialog::fill_shortcuts() { "F", L("Gizmo Place face on bed") }, { "L", L("Gizmo SLA support points") }, { "P", L("Gizmo FDM paint-on seam") }, + { "T", L("Gizmo Text emboss / engrave")}, + { "I", L("Zoom in")}, + { "O", L("Zoom out")}, { "Tab", L("Switch between Prepare/Preview") }, }; From 71c9ae7b2a7d8d6e611d6084f4f14bd19fa5bd15 Mon Sep 17 00:00:00 2001 From: Heiko Liebscher Date: Sun, 31 Dec 2023 12:11:16 +0100 Subject: [PATCH 03/18] Fix de for 1.9 release (#3387) fix some typos and new msgids --- localization/i18n/de/OrcaSlicer_de.po | 100 ++++++++++++-------------- 1 file changed, 44 insertions(+), 56 deletions(-) diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index 81d080690e8..c34c388fdd4 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -491,44 +491,44 @@ msgstr "Fehlerhafte Verbinder gefunden" #, c-format, boost-format msgid "%1$d connector is out of cut contour" msgid_plural "%1$d connectors are out of cut contour" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1$d Verbinder ist außerhalb des Schnittkontur" +msgstr[1] "%1$d Verbinder sind außerhalb des Schnittkontur" #, c-format, boost-format msgid "%1$d connector is out of object" msgid_plural "%1$d connectors are out of object" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%1$d Verbinder ist außerhalb des Objekts" +msgstr[1] "%1$d Verbinder sind außerhalb des Objekts" msgid "Some connectors are overlapped" msgstr "Einige Verbinder überlappen sich" msgid "Select at least one object to keep after cutting." -msgstr "" +msgstr "Wählen Sie mindestens ein Objekt aus, das nach dem Schneiden erhalten bleiben soll." msgid "Cut plane is placed out of object" -msgstr "" +msgstr "Schnittfläche ist außerhalb des Objekts platziert" msgid "Cut plane with groove is invalid" -msgstr "" +msgstr "Schnittfläche mit Nut ist ungültig" msgid "Connector" msgstr "Verbinder" msgid "Cut by Plane" -msgstr "" +msgstr "Schnitt durch Ebene" msgid "non-manifold edges be caused by cut tool, do you want to fix it now?" -msgstr "" +msgstr "Nicht-manifold Kanten durch Schneidwerkzeug verursacht, möchten Sie es jetzt beheben?" msgid "Repairing model object" msgstr "Modellobjekt reparieren" msgid "Cut by line" -msgstr "" +msgstr "Schnitt durch Linie" msgid "Delete connector" -msgstr "" +msgstr "Verbinder löschen" msgid "Mesh name" msgstr "Netzname" @@ -4058,7 +4058,7 @@ msgstr "Volumen:" msgid "Size:" msgstr "Größe:" -#, c-format, boost-format +#, boost-format msgid "" "Conflicts of gcode paths have been found at layer %d, z = %.2lf mm. Please " "separate the conflicted objects farther (%s <-> %s)." @@ -4494,7 +4494,6 @@ msgstr "Durchflussrate" msgid "Pressure advance" msgstr "Pressure advance" -#, fuzzy msgid "Retraction test" msgstr "Rückzugslängen Test" @@ -6704,8 +6703,8 @@ msgstr "" msgid "" "Timelapse is not supported because Print sequence is set to \"By object\"." msgstr "" -"Zeitraffer wird nicht unterstützt, da die Druckreihenfolge auf \"Nach Objekt" -"\" eingestellt ist." +"Zeitraffer wird nicht unterstützt, da die Druckreihenfolge auf \"Nach " +"Objekt\" eingestellt ist." msgid "Errors" msgstr "Fehler" @@ -7038,13 +7037,13 @@ msgstr "Ignorieren" msgid "" "When recording timelapse without toolhead, it is recommended to add a " "\"Timelapse Wipe Tower\" \n" -"by right-click the empty position of build plate and choose \"Add Primitive" -"\"->\"Timelapse Wipe Tower\"." +"by right-click the empty position of build plate and choose \"Add " +"Primitive\"->\"Timelapse Wipe Tower\"." msgstr "" "Wenn Sie einen Zeitraffer ohne Werkzeugkopf aufnehmen, wird empfohlen, einen " "\"Timelapse Wischturm\" hinzuzufügen, indem Sie mit der rechten Maustaste " -"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"->" -"\"Timelapse Wischturm\" wählen." +"auf die leere Position der Bauplatte klicken und \"Primitiv hinzufügen\"-" +">\"Timelapse Wischturm\" wählen." msgid "Line width" msgstr "Breite der Linie" @@ -7301,11 +7300,9 @@ msgstr "Toolchange-Parameter bei Multi-Extruder-MM-Druckern" msgid "Printable space" msgstr "Druckbarer Raum" -#, fuzzy msgid "Cooling Fan" msgstr "Kühlung" -#, fuzzy msgid "Fan speed-up time" msgstr "Lüfter Beschleunigungszeit" @@ -8714,7 +8711,6 @@ msgstr "" "Passwort in die URL in folgendem Format eingegeben werden: https://username:" "password@Ihre-octopi-Adresse/" -#, fuzzy msgid "Device UI" msgstr "Gerät" @@ -10218,7 +10214,6 @@ msgstr "Bewegung" msgid "Travel speed of initial layer" msgstr "Bewegungsgeschwindigkeit der ersten Schicht" -#, fuzzy msgid "Number of slow layers" msgstr "Anzahl der lansamen Schichten" @@ -10243,19 +10238,18 @@ msgstr "Volle Lüfterdrehzahl ab Schicht" msgid "" "Fan speed will be ramped up linearly from zero at layer " -"\"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer" -"\". \"full_fan_speed_layer\" will be ignored if lower than " -"\"close_fan_the_first_x_layers\", in which case the fan will be running at " -"maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +"\"close_fan_the_first_x_layers\" to maximum at layer " +"\"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower " +"than \"close_fan_the_first_x_layers\", in which case the fan will be running " +"at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "" -"Die Lüftergeschwindigkeit wird linear von Null bei der Schicht" -"\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " +"Die Lüftergeschwindigkeit wird linear von Null bei der " +"Schicht\"close_fan_the_first_x_layers\" auf das Maximum bei der Schicht " "\"full_fan_speed_layer\" erhöht. \"full_fan_speed_layer\" wird ignoriert, " "wenn es niedriger ist als \"close_fan_the_first_x_layers\",in diesem Fall " "läuft der Lüfter bei Schicht \"close_fan_the_first_x_layers\"+ 1 mit maximal " "zulässiger Geschwindigkeit." -#, fuzzy msgid "Support interface fan speed" msgstr "Stützstruktur-Schnittstelle" @@ -10442,7 +10436,6 @@ msgstr "" "den Start-G-Code verschoben, wenn nur benutzerdefinierterStart-G-Code " "aktiviert ist. Verwende 0, um den Lüfter zu deaktivieren." -#, fuzzy msgid "Only overhangs" msgstr "Nur an Überhängen" @@ -10505,7 +10498,6 @@ msgstr "Mit welcher Art von G-Code ist der Drucker kompatibel" msgid "Klipper" msgstr "Klipper" -#, fuzzy msgid "Label objects" msgstr "Objekte beschriften" @@ -11407,7 +11399,6 @@ msgstr "" msgid "Role base wipe speed" msgstr "Rollenbasierte Wipe Geschwindigkeit" -#, fuzzy msgid "" "The wipe speed is determined by the speed of the current extrusion role.e.g. " "if a wipe action is executed immediately following an outer wall extrusion, " @@ -12945,7 +12936,7 @@ msgid "" "cause the result not exactly the same in each calibration. We are still " "investigating the root cause to do improvements with new updates." msgstr "" -"Bitte finden Sie die Details der Flussdynamik-Kalibrierung in unserem Wiki.\n" +"Sie finden die Details der Dynamischen-Kalibrierung in unserem Wiki.\n" "\n" "Normalerweise ist die Kalibrierung nicht erforderlich. Wenn Sie einen Einzel-" "Farb-/Materialdruck mit der Option \"Flussdynamik-Kalibrierung\" im " @@ -13438,11 +13429,9 @@ msgstr "" "Schritt >= 0\n" "Ende > Start + Schritt)" -#, fuzzy msgid "Start retraction length: " msgstr "Start Rückzugslänge" -#, fuzzy msgid "End retraction length: " msgstr "Ende Rückzugslänge" @@ -13468,7 +13457,6 @@ msgstr "" "Der Dateiname für den Upload endet nicht mit \"%s\". Möchten Sie den Vorgang " "fortsetzen?" -#, fuzzy msgid "Upload" msgstr "Hochladen" @@ -13724,8 +13712,8 @@ msgstr "" "Möchten Sie es überschreiben?" msgid "" -"We would rename the presets as \"Vendor Type Serial @printer you selected" -"\". \n" +"We would rename the presets as \"Vendor Type Serial @printer you " +"selected\". \n" "To add preset for more prinetrs, Please go to printer selection" msgstr "" "Wir würden die Voreinstellungen als \"Hersteller Typ Seriennummer @Drucker " @@ -14124,7 +14112,7 @@ msgid "For more information, please check out Wiki" msgstr "Für weitere Informationen besuchen Sie bitte Wiki" msgid "Collapse" -msgstr "Zusammenbruch" +msgstr "Zuklappen" msgid "Daily Tips" msgstr "Tägliche Tipps" @@ -14142,7 +14130,6 @@ msgstr "" "Kalibrierung nicht möglich: Möglicherweise, weil der eingestellte " "Kalibrierungswertebereich zu groß ist oder der Schritt zu klein ist" -#, fuzzy msgid "Physical Printer" msgstr "Drucker" @@ -14407,7 +14394,7 @@ msgid "" "Did you know that Orca Slicer offers a wide range of keyboard shortcuts and " "3D scene operations." msgstr "" -"Wie werden Tastenkombinationen verwendet\n" +"Tastenkombinationen verwenden\n" "Wussten Sie, dass Orca Slicer eine Vielzahl von Tastenkombinationen und 3D-" "Szenenoperationen bietet." @@ -14427,9 +14414,9 @@ msgid "" "Did you know that you can cut a model at any angle and position with the " "cutting tool?" msgstr "" -"Schnittwerkzeug\n" -"Wussten Sie, dass Sie mit dem Schnittwerkzeug ein Modell in jedem beliebigen " -"Winkel und jeder beliebigen Position zerschneiden können?" +"Schneidwerkzeug\n" +"Wussten Sie, dass Sie ein Modell mit dem Schneidwerkzeug in jedem Winkel und " +"an jeder Position schneiden können?" #: resources/data/hints.ini: [hint:Fix Model] msgid "" @@ -14447,7 +14434,8 @@ msgid "" "Did you know that you can generate a timelapse video during each print?" msgstr "" "Zeitraffer\n" -"Wussten Sie, dass Sie bei jedem Druck ein Zeitraffervideo erstellen können?" +"Wussten Sie, dass Sie während jedes Drucks ein Zeitraffervideo erstellen " +"können?" #: resources/data/hints.ini: [hint:Auto-Arrange] msgid "" @@ -14464,9 +14452,9 @@ msgid "" "Did you know that you can rotate objects to an optimal orientation for " "printing by a simple click?" msgstr "" -"Automatische Ausrichtung\n" -"Wussten Sie schon, dass Sie Objekte mit einem einfachen Klick in eine für " -"den Druck optimale Ausrichtung drehen können?" +"Automatisch ausrichten\n" +"Wussten Sie, dass Sie Objekte durch einen einfachen Klick in eine optimale " +"Druckausrichtung drehen können?" #: resources/data/hints.ini: [hint:Lay on Face] msgid "" @@ -14602,9 +14590,9 @@ msgid "" "Did you know that you can print a model even faster, by using the Adaptive " "Layer Height option? Check it out!" msgstr "" -"Beschleunigen Sie Ihren Druck mit adaptiven Schichthöhe\n" -"Wussten Sie, dass Sie ein Modell noch schneller drucken können, wenn Sie die " -"Option \"Adaptive Schichthöhe\" verwenden? Probiere es aus!" +"Beschleunigen Sie Ihren Druck mit adaptiver Schichthöhe\n" +"Wussten Sie, dass Sie ein Modell noch schneller drucken können, indem Sie " +"die Option Adaptive Schichthöhe verwenden? Probiere es aus!" #: resources/data/hints.ini: [hint:Support painting] msgid "" @@ -14637,10 +14625,10 @@ msgid "" "successfully? Higher temperature and lower speed are always recommended for " "the best results." msgstr "" -"Drucken von Silkfilamenten\n" -"Wussten Sie, dass Silkfilamente besondere Bedingungen erfordern, um " -"erfolgreich gedruckt zu werden? Eine höhere Temperatur und eine niedrigere " -"Geschwindigkeit werden immer empfohlen, um die besten Ergebnisse zu erzielen." +"Drucken von Seidenfilament\n" +"Wussten Sie, dass Seidenfilament besondere Überlegungen erfordert, um es " +"erfolgreich zu drucken? Höhere Temperaturen und niedrigere Geschwindigkeiten " +"werden immer für die besten Ergebnisse empfohlen." #: resources/data/hints.ini: [hint:Brim for better adhesion] msgid "" From 0e16ad4fbf64c09c0b749ee2a63f7e053dc6d0f8 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 4 Jan 2024 18:37:06 +0800 Subject: [PATCH 04/18] skip writting object info for BBL printers --- src/libslic3r/GCode.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 05e2b0c8adf..28655394a01 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -5870,7 +5870,8 @@ inline std::string polygon_to_string(const Polygon &polygon, Print *print, bool // this id is used to generate unique object id for each object. std::string GCode::set_object_info(Print *print) { const auto gflavor = print->config().gcode_flavor.value; - if (gflavor != gcfKlipper && gflavor != gcfMarlinLegacy && gflavor != gcfMarlinFirmware && gflavor != gcfRepRapFirmware) + if (print->is_BBL_printer() || + (gflavor != gcfKlipper && gflavor != gcfMarlinLegacy && gflavor != gcfMarlinFirmware && gflavor != gcfRepRapFirmware)) return ""; std::ostringstream gcode; size_t object_id = 0; From 67547d103702a1293507370d08d1bd87f053a9f4 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 4 Jan 2024 18:38:43 +0800 Subject: [PATCH 05/18] fix object exclusion regression on BBL printers --- src/slic3r/GUI/GLCanvas3D.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index d67269be221..ae48ff8eb31 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -2013,7 +2013,11 @@ void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams& thumbnail_params, const GLVolumeCollection& volumes, Camera::EType camera_type, bool use_top_view, bool for_picking) { - GLShaderProgram* shader = wxGetApp().get_shader("thumbnail"); + GLShaderProgram* shader = nullptr; + if (for_picking) + shader = wxGetApp().get_shader("flat"); + else + shader = wxGetApp().get_shader("thumbnail"); ModelObjectPtrs& model_objects = GUI::wxGetApp().model().objects; std::vector colors = ::get_extruders_colors(); switch (OpenGLManager::get_framebuffers_type()) @@ -5678,6 +5682,7 @@ void GLCanvas3D::render_thumbnail_internal(ThumbnailData& thumbnail_data, const //if (OpenGLManager::can_multisample()) // This flag is often ignored by NVIDIA drivers if rendering into a screen buffer. // glsafe(::glDisable(GL_MULTISAMPLE)); + shader->start_using(); glsafe(::glDisable(GL_BLEND)); @@ -5709,8 +5714,6 @@ void GLCanvas3D::render_thumbnail_internal(ThumbnailData& thumbnail_data, const const Transform3d model_matrix = vol->world_matrix(); shader->set_uniform("view_model_matrix", view_matrix * model_matrix); shader->set_uniform("projection_matrix", projection_matrix); - const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose(); - shader->set_uniform("view_normal_matrix", view_normal_matrix); vol->simple_render(shader, model_objects, extruder_colors); vol->is_active = is_active; } From 1fad2a76b38e68129c731159eb5df61bfefd1e4b Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 4 Jan 2024 18:38:53 +0800 Subject: [PATCH 06/18] update gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 764f60d71e8..d0795a4deb4 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ src/OrcaSlicer-doc/ **/process_full/ **/machine_full/ **/filament_full/ -/deps/DL_CACHE/ \ No newline at end of file +/deps/DL_CACHE/ +/deps/DL_CACHE From c4538ae0a47e295a3c28ba406c46e84c3bfb9be7 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 4 Jan 2024 19:30:07 +0800 Subject: [PATCH 07/18] Fixed crashes when send gcode to BBL printers --- src/slic3r/GUI/Jobs/SendJob.cpp | 40 ++++----------------------------- 1 file changed, 4 insertions(+), 36 deletions(-) diff --git a/src/slic3r/GUI/Jobs/SendJob.cpp b/src/slic3r/GUI/Jobs/SendJob.cpp index 8f8f683996f..f0369beb99b 100644 --- a/src/slic3r/GUI/Jobs/SendJob.cpp +++ b/src/slic3r/GUI/Jobs/SendJob.cpp @@ -114,47 +114,15 @@ void SendJob::process(Ctl &ctl) unsigned int http_code; std::string http_body; - - - - // local print access - params.dev_ip = m_dev_ip; - params.username = "bblp"; - params.password = m_access_code; - params.use_ssl_for_ftp = m_local_use_ssl_for_ftp; - params.use_ssl_for_mqtt = m_local_use_ssl_for_mqtt; - - // check access code and ip address - params.dev_id = m_dev_id; - params.project_name = "verify_job"; - params.filename = job_data._temp_path.string(); - params.connection_type = this->connection_type; - - result = m_agent->start_send_gcode_to_sdcard(params, nullptr, nullptr, nullptr); - if (result != 0) { - BOOST_LOG_TRIVIAL(error) << "access code is invalid"; - m_enter_ip_address_fun_fail(result); - m_job_finished = true; - return; + if (this->connection_type == "lan") { + msg = _u8L("Sending print job over LAN"); } - else if(m_is_check_mode && !m_check_and_continue){ - m_enter_ip_address_fun_success(); - m_job_finished = true; - return; + else { + msg = _u8L("Sending print job through cloud service"); } - - /* display info */ - msg = _u8L("Sending gcode file over LAN"); - /* if (this->connection_type == "lan") { - msg = _u8L("Sending gcode file over LAN"); - } - else { - msg = _u8L("Sending gcode file through cloud service"); - }*/ ctl.call_on_main_thread([this] { prepare(); }).wait(); ctl.update_status(0, msg); - int total_plate_num = m_plater->get_partplate_list().get_plate_count(); PartPlate* plate = m_plater->get_partplate_list().get_plate(job_data.plate_idx); From c02d2c4db3103a8bc836b7a4a045d45a94910ded Mon Sep 17 00:00:00 2001 From: SoftFever Date: Thu, 4 Jan 2024 23:12:36 +0800 Subject: [PATCH 08/18] Added an option to enable multiple bed type support for printers --- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 1 + src/libslic3r/PrintConfig.cpp | 6 +++++ src/libslic3r/PrintConfig.hpp | 1 + src/slic3r/GUI/Plater.cpp | 42 +++++++++++++++-------------------- src/slic3r/GUI/Tab.cpp | 17 +++++++------- 6 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 519b7ee0902..e638a96570c 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -878,7 +878,7 @@ static std::vector s_Preset_printer_options { "cooling_tube_retraction", "cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "purge_in_prime_tower", "enable_filament_ramming", "z_offset", - "disable_m73", "preferred_orientation", "emit_machine_limits_to_gcode" + "disable_m73", "preferred_orientation", "emit_machine_limits_to_gcode", "support_multi_bed_types" }; static std::vector s_Preset_sla_print_options { diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 25c46194800..c896b112cab 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -294,6 +294,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "enable_filament_ramming" || opt_key == "purge_in_prime_tower" || opt_key == "z_offset" + || opt_key == "support_multi_bed_types" ) { steps.emplace_back(psWipeTower); steps.emplace_back(psSkirtBrim); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index a8ed821aeaf..5efec684efe 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2355,6 +2355,12 @@ def = this->add("filament_loading_speed", coFloats); def->readonly = false; def->set_default_value(new ConfigOptionEnum(gcfMarlinLegacy)); + def = this->add("support_multi_bed_types", coBool); + def->label = L("Support multi bed types"); + def->tooltip = L("Enable this option if you want to use multiple bed types"); + def->mode = comSimple; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("gcode_label_objects", coBool); def->label = L("Label objects"); def->tooltip = L("Enable this to add comments into the G-Code labeling print moves with what object they belong to," diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 3fd07bf93ba..aa1c21ce4c2 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1051,6 +1051,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionFloats, filament_multitool_ramming_flow)) ((ConfigOptionBool, purge_in_prime_tower)) ((ConfigOptionBool, enable_filament_ramming)) + ((ConfigOptionBool, support_multi_bed_types)) ) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 9a929a1dd21..a67d09976e3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1132,6 +1132,7 @@ void Sidebar::update_all_preset_comboboxes() // Orca:: show device tab based on vendor type auto p_mainframe = wxGetApp().mainframe; p_mainframe->show_device(is_bbl_vendor); + auto cfg = preset_bundle.printers.get_edited_preset().config; if (is_bbl_vendor) { //only show connection button for not-BBL printer @@ -1140,32 +1141,9 @@ void Sidebar::update_all_preset_comboboxes() ams_btn->Show(); //update print button default value for bbl or third-party printer p_mainframe->set_print_button_to_default(MainFrame::PrintSelectType::ePrintPlate); - AppConfig* config = wxGetApp().app_config; - if (config && !config->get("curr_bed_type").empty()) { - int bed_type_idx = 0; - std::string str_bed_type = config->get("curr_bed_type"); - int bed_type_value = (int)btPC; - try { - bed_type_value = atoi(str_bed_type.c_str()); - } catch(...) {} - bed_type_idx = bed_type_value - 1; - m_bed_type_list->SelectAndNotify(bed_type_idx); - } else { - BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle); - m_bed_type_list->SelectAndNotify((int)bed_type - 1); - } - m_bed_type_list->Enable(); - auto str_bed_type = wxGetApp().app_config->get_printer_setting(wxGetApp().preset_bundle->printers.get_selected_preset_name(), "curr_bed_type"); - if(!str_bed_type.empty()){ - int bed_type_value = atoi(str_bed_type.c_str()); - if(bed_type_value == 0) - bed_type_value = 1; - m_bed_type_list->SelectAndNotify(bed_type_value - 1); - } } else { connection_btn->Show(); ams_btn->Hide(); - auto cfg = preset_bundle.printers.get_edited_preset().config; auto print_btn_type = MainFrame::PrintSelectType::eExportGcode; wxString url = cfg.opt_string("print_host_webui").empty() ? cfg.opt_string("print_host") : cfg.opt_string("print_host_webui"); if(!url.empty()) @@ -1182,7 +1160,23 @@ void Sidebar::update_all_preset_comboboxes() } p_mainframe->set_print_button_to_default(print_btn_type); - m_bed_type_list->SelectAndNotify(btPEI-1); + } + + if (is_bbl_vendor || cfg.opt_bool("support_multi_bed_types")) { + m_bed_type_list->Enable(); + auto str_bed_type = wxGetApp().app_config->get_printer_setting(wxGetApp().preset_bundle->printers.get_selected_preset_name(), + "curr_bed_type"); + if (!str_bed_type.empty()) { + int bed_type_value = atoi(str_bed_type.c_str()); + if (bed_type_value == 0) + bed_type_value = 1; + m_bed_type_list->SelectAndNotify(bed_type_value - 1); + } else { + BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle); + m_bed_type_list->SelectAndNotify((int) bed_type - 1); + } + } else { + m_bed_type_list->SelectAndNotify(btPEI - 1); m_bed_type_list->Disable(); } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 2e86ec44943..1eb72b26c60 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3029,6 +3029,7 @@ void TabFilament::build() line.append_option(optgroup->get_option("nozzle_temperature")); optgroup->append_line(line); + optgroup = page->new_optgroup(L("Bed temperature"), L"param_temperature"); line = { L("Cool plate"), L("Bed temperature when cool plate is installed. Value 0 means the filament does not support to print on the Cool Plate") }; line.append_option(optgroup->get_option("cool_plate_temp_initial_layer")); line.append_option(optgroup->get_option("cool_plate_temp")); @@ -3278,23 +3279,22 @@ void TabFilament::toggle_options() wxGetApp().preset_bundle->is_bbl_vendor(); } + auto cfg = m_preset_bundle->printers.get_edited_preset().config; if (m_active_page->title() == L("Cooling")) { bool has_enable_overhang_bridge_fan = m_config->opt_bool("enable_overhang_bridge_fan", 0); for (auto el : {"overhang_fan_speed", "overhang_fan_threshold"}) toggle_option(el, has_enable_overhang_bridge_fan); - toggle_option( - "additional_cooling_fan_speed", - m_preset_bundle->printers.get_edited_preset().config.option("auxiliary_fan")->value); + toggle_option("additional_cooling_fan_speed", cfg.opt_bool("auxiliary_fan")); } if (m_active_page->title() == L("Filament")) { bool pa = m_config->opt_bool("enable_pressure_advance", 0); toggle_option("pressure_advance", pa); - - toggle_line("cool_plate_temp_initial_layer", is_BBL_printer); - toggle_line("eng_plate_temp_initial_layer", is_BBL_printer); - toggle_line("textured_plate_temp_initial_layer", is_BBL_printer); + auto support_multi_bed_types = is_BBL_printer || cfg.opt_bool("support_multi_bed_types"); + toggle_line("cool_plate_temp_initial_layer", support_multi_bed_types ); + toggle_line("eng_plate_temp_initial_layer", support_multi_bed_types); + toggle_line("textured_plate_temp_initial_layer", support_multi_bed_types); } if (m_active_page->title() == L("Setting Overrides")) @@ -3407,6 +3407,7 @@ void TabPrinter::build_fff() optgroup->append_single_option_line(option); // optgroup->append_single_option_line("printable_area"); optgroup->append_single_option_line("printable_height"); + optgroup->append_single_option_line("support_multi_bed_types"); optgroup->append_single_option_line("nozzle_volume"); optgroup->append_single_option_line("best_object_pos"); optgroup->append_single_option_line("z_offset"); @@ -4058,7 +4059,7 @@ void TabPrinter::toggle_options() toggle_line(el, is_BBL_printer); // SoftFever: hide non-BBL settings - for (auto el : {"use_firmware_retraction", "use_relative_e_distances"}) + for (auto el : {"use_firmware_retraction", "use_relative_e_distances", "support_multi_bed_types"}) toggle_line(el, !is_BBL_printer); } From 61f8719c69a04a5f27e22b3f69dbd7333b6796fc Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 5 Jan 2024 07:57:09 +0800 Subject: [PATCH 09/18] Fixed an issue that some profiles has ironings enabled by default --- resources/profiles/Prusa/process/process_common_mk3.json | 2 +- .../profiles/Sovol/process/0.18mm Optimal @Sovol SV07.json | 2 +- .../profiles/Sovol/process/0.18mm Optimal @Sovol SV07Plus.json | 2 +- .../profiles/Sovol/process/0.20mm Standard @Sovol SV07.json | 2 +- .../profiles/Sovol/process/0.20mm Standard @Sovol SV07Plus.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/profiles/Prusa/process/process_common_mk3.json b/resources/profiles/Prusa/process/process_common_mk3.json index 6a8dc3a556a..1a9667aa49e 100644 --- a/resources/profiles/Prusa/process/process_common_mk3.json +++ b/resources/profiles/Prusa/process/process_common_mk3.json @@ -40,7 +40,7 @@ "ironing_flow": "15%", "ironing_spacing": "0.1", "ironing_speed": "15", - "ironing_type": "top", + "ironing_type": "no ironing", "is_custom_defined": "1", "max_travel_detour_distance": "0", "min_bead_width": "85%", diff --git a/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07.json b/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07.json index 80001fa8935..8e66ac39b72 100644 --- a/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07.json +++ b/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07.json @@ -44,7 +44,7 @@ "ironing_flow": "15%", "ironing_spacing": "0.25", "ironing_speed": "15", - "ironing_type": "top", + "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "[input_filename_base].gcode", "detect_overhang_wall": "1", diff --git a/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07Plus.json b/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07Plus.json index 3848c79601f..3ac69224670 100644 --- a/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07Plus.json +++ b/resources/profiles/Sovol/process/0.18mm Optimal @Sovol SV07Plus.json @@ -44,7 +44,7 @@ "ironing_flow": "15%", "ironing_spacing": "0.25", "ironing_speed": "15", - "ironing_type": "top", + "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "[input_filename_base].gcode", "detect_overhang_wall": "1", diff --git a/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07.json b/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07.json index b62a042aa35..db0e7d0d9c9 100644 --- a/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07.json +++ b/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07.json @@ -44,7 +44,7 @@ "ironing_flow": "15%", "ironing_spacing": "0.25", "ironing_speed": "15", - "ironing_type": "top", + "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "[input_filename_base].gcode", "detect_overhang_wall": "1", diff --git a/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07Plus.json b/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07Plus.json index 57c0dcf43f6..50eb1ca5a44 100644 --- a/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07Plus.json +++ b/resources/profiles/Sovol/process/0.20mm Standard @Sovol SV07Plus.json @@ -44,7 +44,7 @@ "ironing_flow": "15%", "ironing_spacing": "0.25", "ironing_speed": "15", - "ironing_type": "top", + "ironing_type": "no ironing", "reduce_infill_retraction": "1", "filename_format": "[input_filename_base].gcode", "detect_overhang_wall": "1", From 18b52fd7807da9001523b0f6d6a69d2c71c1d0dd Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 5 Jan 2024 07:58:39 +0800 Subject: [PATCH 10/18] bump version profile version to "01.09.00.02" --- resources/profiles/Anker.json | 2 +- resources/profiles/Anycubic.json | 2 +- resources/profiles/Artillery.json | 2 +- resources/profiles/BIQU.json | 2 +- resources/profiles/Comgrow.json | 2 +- resources/profiles/Creality.json | 2 +- resources/profiles/Custom.json | 2 +- resources/profiles/Elegoo.json | 2 +- resources/profiles/FLSun.json | 2 +- resources/profiles/Flashforge.json | 2 +- resources/profiles/FlyingBear.json | 2 +- resources/profiles/Folgertech.json | 2 +- resources/profiles/InfiMech.json | 2 +- resources/profiles/Kingroon.json | 2 +- resources/profiles/OrcaArena.json | 2 +- resources/profiles/Prusa.json | 2 +- resources/profiles/Qidi.json | 2 +- resources/profiles/Raise3D.json | 2 +- resources/profiles/Ratrig.json | 2 +- resources/profiles/SecKit.json | 2 +- resources/profiles/Snapmaker.json | 2 +- resources/profiles/Sovol.json | 2 +- resources/profiles/Tronxy.json | 2 +- resources/profiles/TwoTrees.json | 2 +- resources/profiles/UltiMaker.json | 2 +- resources/profiles/Vivedino.json | 2 +- resources/profiles/Voron.json | 2 +- resources/profiles/Voxelab.json | 2 +- resources/profiles/Vzbot.json | 2 +- resources/profiles/Wanhao.json | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/resources/profiles/Anker.json b/resources/profiles/Anker.json index 028b5085218..cd72312537d 100644 --- a/resources/profiles/Anker.json +++ b/resources/profiles/Anker.json @@ -1,6 +1,6 @@ { "name": "Anker", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Anker configurations", "machine_model_list": [ diff --git a/resources/profiles/Anycubic.json b/resources/profiles/Anycubic.json index e2a96b4aa9e..5ccd6eb1c94 100644 --- a/resources/profiles/Anycubic.json +++ b/resources/profiles/Anycubic.json @@ -1,6 +1,6 @@ { "name": "Anycubic", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Anycubic configurations", "machine_model_list": [ diff --git a/resources/profiles/Artillery.json b/resources/profiles/Artillery.json index 082cdafabff..9137b4399d2 100644 --- a/resources/profiles/Artillery.json +++ b/resources/profiles/Artillery.json @@ -1,6 +1,6 @@ { "name": "Artillery", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Artillery configurations", "machine_model_list": [ diff --git a/resources/profiles/BIQU.json b/resources/profiles/BIQU.json index 3ca0e02e4e1..36ff6551323 100644 --- a/resources/profiles/BIQU.json +++ b/resources/profiles/BIQU.json @@ -1,6 +1,6 @@ { "name": "BIQU", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "BIQU configurations", "machine_model_list": [ diff --git a/resources/profiles/Comgrow.json b/resources/profiles/Comgrow.json index b442fdd26bf..1d87301e2a0 100644 --- a/resources/profiles/Comgrow.json +++ b/resources/profiles/Comgrow.json @@ -1,6 +1,6 @@ { "name": "Comgrow", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Comgrow configurations", "machine_model_list": [ diff --git a/resources/profiles/Creality.json b/resources/profiles/Creality.json index 2d923b8e0c2..f1f07ef0863 100644 --- a/resources/profiles/Creality.json +++ b/resources/profiles/Creality.json @@ -1,6 +1,6 @@ { "name": "Creality", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Creality configurations", "machine_model_list": [ diff --git a/resources/profiles/Custom.json b/resources/profiles/Custom.json index 359ccee16c0..5ed0f41eff5 100644 --- a/resources/profiles/Custom.json +++ b/resources/profiles/Custom.json @@ -1,6 +1,6 @@ { "name": "Custom Printer", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "My configurations", "machine_model_list": [ diff --git a/resources/profiles/Elegoo.json b/resources/profiles/Elegoo.json index 99655e321cd..b68b31c0123 100644 --- a/resources/profiles/Elegoo.json +++ b/resources/profiles/Elegoo.json @@ -1,6 +1,6 @@ { "name": "Elegoo", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Elegoo configurations", "machine_model_list": [ diff --git a/resources/profiles/FLSun.json b/resources/profiles/FLSun.json index 0edbaa970c6..cbd31b5b6a5 100644 --- a/resources/profiles/FLSun.json +++ b/resources/profiles/FLSun.json @@ -1,6 +1,6 @@ { "name": "FLSun", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "FLSun configurations", "machine_model_list": [ diff --git a/resources/profiles/Flashforge.json b/resources/profiles/Flashforge.json index 1f59d171237..06eea33427b 100644 --- a/resources/profiles/Flashforge.json +++ b/resources/profiles/Flashforge.json @@ -1,7 +1,7 @@ { "name": "Flashforge", "url": "", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Flashforge configurations", "machine_model_list": [ diff --git a/resources/profiles/FlyingBear.json b/resources/profiles/FlyingBear.json index 80137fac57d..20ae89128a6 100644 --- a/resources/profiles/FlyingBear.json +++ b/resources/profiles/FlyingBear.json @@ -1,6 +1,6 @@ { "name": "FlyingBear", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "1", "description": "FlyingBear configurations", "machine_model_list": [ diff --git a/resources/profiles/Folgertech.json b/resources/profiles/Folgertech.json index fc5281c992b..fc62fba82ce 100644 --- a/resources/profiles/Folgertech.json +++ b/resources/profiles/Folgertech.json @@ -1,6 +1,6 @@ { "name": "Folgertech", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Folgertech configurations", "machine_model_list": [ diff --git a/resources/profiles/InfiMech.json b/resources/profiles/InfiMech.json index 1d292cc030a..cbcf12e5223 100644 --- a/resources/profiles/InfiMech.json +++ b/resources/profiles/InfiMech.json @@ -1,6 +1,6 @@ { "name": "InfiMech", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "1", "description": "InfiMech configurations", "machine_model_list": [ diff --git a/resources/profiles/Kingroon.json b/resources/profiles/Kingroon.json index 32e023c2f6f..c37b707d60f 100644 --- a/resources/profiles/Kingroon.json +++ b/resources/profiles/Kingroon.json @@ -1,7 +1,7 @@ { "name": "Kingroon", "url": "https://kingroon.com/", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Kingroon configuration files", "machine_model_list": [ diff --git a/resources/profiles/OrcaArena.json b/resources/profiles/OrcaArena.json index 4cbac7f8a7e..de974a78559 100644 --- a/resources/profiles/OrcaArena.json +++ b/resources/profiles/OrcaArena.json @@ -1,7 +1,7 @@ { "name": "Orca Arena Printer", "url": "", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Orca Arena configuration files", "machine_model_list": [ diff --git a/resources/profiles/Prusa.json b/resources/profiles/Prusa.json index 7919d2433e3..3fd38c0cd2a 100644 --- a/resources/profiles/Prusa.json +++ b/resources/profiles/Prusa.json @@ -1,6 +1,6 @@ { "name": "Prusa", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Prusa configurations", "machine_model_list": [ diff --git a/resources/profiles/Qidi.json b/resources/profiles/Qidi.json index 05264265952..b7b0b94cbaf 100644 --- a/resources/profiles/Qidi.json +++ b/resources/profiles/Qidi.json @@ -1,6 +1,6 @@ { "name": "Qidi", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Qidi configurations", "machine_model_list": [ diff --git a/resources/profiles/Raise3D.json b/resources/profiles/Raise3D.json index cf4535bd5a9..d16c180c322 100644 --- a/resources/profiles/Raise3D.json +++ b/resources/profiles/Raise3D.json @@ -1,7 +1,7 @@ { "name": "Raise3D", "url": "", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Raise3D configurations", "machine_model_list": [ diff --git a/resources/profiles/Ratrig.json b/resources/profiles/Ratrig.json index 79705929ba0..c39580d6aca 100644 --- a/resources/profiles/Ratrig.json +++ b/resources/profiles/Ratrig.json @@ -1,6 +1,6 @@ { "name": "RatRig", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "RatRig configurations", "machine_model_list": [ diff --git a/resources/profiles/SecKit.json b/resources/profiles/SecKit.json index 27d78bf2fbb..857646dc680 100644 --- a/resources/profiles/SecKit.json +++ b/resources/profiles/SecKit.json @@ -1,6 +1,6 @@ { "name": "SecKit", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "SecKit configurations", "machine_model_list": [ diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index a20485239e0..c1aa026c768 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,6 +1,6 @@ { "name": "Snapmaker", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Snapmaker configurations", "machine_model_list": [ diff --git a/resources/profiles/Sovol.json b/resources/profiles/Sovol.json index 221842e02f0..7cca4553dad 100644 --- a/resources/profiles/Sovol.json +++ b/resources/profiles/Sovol.json @@ -1,7 +1,7 @@ { "name": "Sovol", "url": "", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Sovol configurations", "machine_model_list": [ diff --git a/resources/profiles/Tronxy.json b/resources/profiles/Tronxy.json index 07af85d84a5..7e1a139119d 100644 --- a/resources/profiles/Tronxy.json +++ b/resources/profiles/Tronxy.json @@ -1,6 +1,6 @@ { "name": "Tronxy", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Tronxy configurations", "machine_model_list": [ diff --git a/resources/profiles/TwoTrees.json b/resources/profiles/TwoTrees.json index 127caac3ff1..46fa8dcdfaf 100644 --- a/resources/profiles/TwoTrees.json +++ b/resources/profiles/TwoTrees.json @@ -1,6 +1,6 @@ { "name": "TwoTrees", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "1", "description": "TwoTrees configurations", "machine_model_list": [ diff --git a/resources/profiles/UltiMaker.json b/resources/profiles/UltiMaker.json index 883f29f616b..ab034327a27 100644 --- a/resources/profiles/UltiMaker.json +++ b/resources/profiles/UltiMaker.json @@ -1,7 +1,7 @@ { "name": "UltiMaker", "url": "", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "UltiMaker configurations", "machine_model_list": [ diff --git a/resources/profiles/Vivedino.json b/resources/profiles/Vivedino.json index 4f303dd814c..9c209973a86 100644 --- a/resources/profiles/Vivedino.json +++ b/resources/profiles/Vivedino.json @@ -1,6 +1,6 @@ { "name": "Vivedino", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Vivedino configurations", "machine_model_list": [ diff --git a/resources/profiles/Voron.json b/resources/profiles/Voron.json index 00f6fb22ee2..d3451cb4e60 100644 --- a/resources/profiles/Voron.json +++ b/resources/profiles/Voron.json @@ -1,6 +1,6 @@ { "name": "Voron", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Voron configurations", "machine_model_list": [ diff --git a/resources/profiles/Voxelab.json b/resources/profiles/Voxelab.json index dd5163f1391..42809a73aec 100644 --- a/resources/profiles/Voxelab.json +++ b/resources/profiles/Voxelab.json @@ -1,7 +1,7 @@ { "name": "Voxelab", "url": "", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Voxelab configurations", "machine_model_list": [ diff --git a/resources/profiles/Vzbot.json b/resources/profiles/Vzbot.json index 5a0d2fb79a3..3a2fcd6bdfd 100644 --- a/resources/profiles/Vzbot.json +++ b/resources/profiles/Vzbot.json @@ -1,6 +1,6 @@ { "name": "Vzbot", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Vzbot configurations", "machine_model_list": [ diff --git a/resources/profiles/Wanhao.json b/resources/profiles/Wanhao.json index 622b293b65d..d5e887c4030 100644 --- a/resources/profiles/Wanhao.json +++ b/resources/profiles/Wanhao.json @@ -1,6 +1,6 @@ { "name": "Wanhao", - "version": "01.09.00.01", + "version": "01.09.00.02", "force_update": "0", "description": "Wanhao configurations", "machine_model_list": [ From 793a753cfcf8eb4dd4f79ef60f7f059f91675e7a Mon Sep 17 00:00:00 2001 From: SoftFever Date: Sat, 6 Jan 2024 10:13:34 +0800 Subject: [PATCH 11/18] Fixed an issue that Orca project can't be loaded in dev branch --- src/slic3r/GUI/Plater.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index a67d09976e3..b8bfc15ead6 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -19,6 +19,7 @@ ///|/ #include "Plater.hpp" #include "libslic3r/Config.hpp" +#include "libslic3r_version.h" #include #include @@ -3486,7 +3487,7 @@ std::vector Plater::priv::load_files(const std::vector& input_ load_type = static_cast(std::stoi(import_project_action)); // BBS: version check - Semver app_version = *(Semver::parse(SLIC3R_VERSION)); + Semver app_version = *(Semver::parse(SoftFever_VERSION)); if (en_3mf_file_type == En3mfType::From_Prusa) { // do not reset the model config load_config = false; From 67de85ba43003fb71808c1a6d2e20963f82219f1 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Sat, 6 Jan 2024 11:21:46 +0800 Subject: [PATCH 12/18] Fix an issue when loading older 3mf project --- src/libslic3r/Format/bbs_3mf.cpp | 22 +++---- src/slic3r/GUI/Plater.cpp | 108 ++++++++++++++++--------------- 2 files changed, 66 insertions(+), 64 deletions(-) diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 33bf5bee6b1..84ec7a4faed 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -1716,18 +1716,18 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) project->project_country_code = m_contry_code; } - //BBS: version check + // Orca: skip version check bool dont_load_config = !m_load_config; - if (m_bambuslicer_generator_version) { - Semver app_version = *(Semver::parse(SoftFever_VERSION)); - Semver file_version = *m_bambuslicer_generator_version; - if (file_version.maj() != app_version.maj()) - dont_load_config = true; - } - else { - m_bambuslicer_generator_version = Semver::parse("0.0.0.0"); - dont_load_config = true; - } + // if (m_bambuslicer_generator_version) { + // Semver app_version = *(Semver::parse(SoftFever_VERSION)); + // Semver file_version = *m_bambuslicer_generator_version; + // if (file_version.maj() != app_version.maj()) + // dont_load_config = true; + // } + // else { + // m_bambuslicer_generator_version = Semver::parse("0.0.0.0"); + // dont_load_config = true; + // } // we then loop again the entries to read other files stored in the archive for (mz_uint i = 0; i < num_entries; ++i) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b8bfc15ead6..8fb1b92f10d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -3494,62 +3494,64 @@ std::vector Plater::priv::load_files(const std::vector& input_ if(load_type != LoadType::LoadGeometry) show_info(q, _L("The 3mf is not supported by OrcaSlicer, load geometry data only."), _L("Load 3mf")); } - else if (load_config && (file_version.maj() != app_version.maj())) { - // version mismatch, only load geometries - load_config = false; - if (!load_model) { - // only load config case, return directly - show_info(q, _L("The Config can not be loaded."), _L("Load 3mf")); - q->skip_thumbnail_invalid = false; - return empty_result; - } - load_old_project = true; - // select view to 3D - q->select_view_3D("3D"); - // select plate 0 as default - q->select_plate(0); - if (load_type != LoadType::LoadGeometry) { - if (en_3mf_file_type == En3mfType::From_BBS) - show_info(q, _L("The 3mf is generated by old Orca Slicer, load geometry data only."), _L("Load 3mf")); - else - show_info(q, _L("The 3mf is not supported by OrcaSlicer, load geometry data only."), _L("Load 3mf")); - } - for (ModelObject *model_object : model.objects) { - model_object->config.reset(); - // Is there any modifier or advanced config data? - for (ModelVolume *model_volume : model_object->volumes) model_volume->config.reset(); - } - } - // else if (load_config && (file_version > app_version)) { - // if (config_substitutions.unrecogized_keys.size() > 0) { - // wxString text = wxString::Format(_L("The 3mf's version %s is newer than %s's version %s, Found following keys unrecognized:"), - // file_version.to_string(), std::string(SLIC3R_APP_FULL_NAME), app_version.to_string()); - // text += "\n"; - // bool first = true; - // // std::string context = into_u8(text); - // wxString context = text; - // for (auto &key : config_substitutions.unrecogized_keys) { - // context += " -"; - // context += key; - // context += ";\n"; - // first = false; - // } - // wxString append = _L("You'd better upgrade your software.\n"); - // context += "\n\n"; - // // context += into_u8(append); - // context += append; - // show_info(q, context, _L("Newer 3mf version")); + // else if (load_config && (file_version.maj() != app_version.maj())) { + // // version mismatch, only load geometries + // load_config = false; + // if (!load_model) { + // // only load config case, return directly + // show_info(q, _L("The Config can not be loaded."), _L("Load 3mf")); + // q->skip_thumbnail_invalid = false; + // return empty_result; // } - // else { - // //if the minor version is not matched - // if (file_version.min() != app_version.min()) { - // wxString text = wxString::Format(_L("The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your software."), - // file_version.to_string(), std::string(SLIC3R_APP_FULL_NAME), app_version.to_string()); - // text += "\n"; - // show_info(q, text, _L("Newer 3mf version")); - // } + // load_old_project = true; + // // select view to 3D + // q->select_view_3D("3D"); + // // select plate 0 as default + // q->select_plate(0); + // if (load_type != LoadType::LoadGeometry) { + // if (en_3mf_file_type == En3mfType::From_BBS) + // show_info(q, _L("The 3mf is generated by old Orca Slicer, load geometry data only."), _L("Load 3mf")); + // else + // show_info(q, _L("The 3mf is not supported by OrcaSlicer, load geometry data only."), _L("Load 3mf")); + // } + // for (ModelObject *model_object : model.objects) { + // model_object->config.reset(); + // // Is there any modifier or advanced config data? + // for (ModelVolume *model_volume : model_object->volumes) model_volume->config.reset(); // } // } + else if (load_config && (file_version > app_version)) { + if (config_substitutions.unrecogized_keys.size() > 0) { + wxString text = wxString::Format(_L("The 3mf's version %s is newer than %s's version %s, Found following keys unrecognized:"), + file_version.to_string(), std::string(SLIC3R_APP_FULL_NAME), app_version.to_string()); + text += "\n"; + bool first = true; + // std::string context = into_u8(text); + wxString context = text; + // if (wxGetApp().app_config->get("user_mode") == "develop") { + // for (auto &key : config_substitutions.unrecogized_keys) { + // context += " -"; + // context += key; + // context += ";\n"; + // first = false; + // } + // } + wxString append = _L("You'd better upgrade your software.\n"); + context += "\n\n"; + // context += into_u8(append); + context += append; + show_info(q, context, _L("Newer 3mf version")); + } + else { + //if the minor version is not matched + if (file_version.min() != app_version.min()) { + wxString text = wxString::Format(_L("The 3mf's version %s is newer than %s's version %s, Suggest to upgrade your software."), + file_version.to_string(), std::string(SLIC3R_APP_FULL_NAME), app_version.to_string()); + text += "\n"; + show_info(q, text, _L("Newer 3mf version")); + } + } + } else if (!load_config) { // reset config except color for (ModelObject *model_object : model.objects) { From 5aae123cbb6fd7a00f77c06726954065127b2aba Mon Sep 17 00:00:00 2001 From: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com> Date: Sat, 6 Jan 2024 05:44:33 +0000 Subject: [PATCH 13/18] Bug: Corrected monotonic lines not respecting user infill / wall overlap setting (#3388) Bug: Correct monotonic lines not respecting user infill / wall overlap setting Co-authored-by: SoftFever --- src/libslic3r/Fill/FillRectilinear.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index 7a3816e7925..c97de62aa39 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -3113,10 +3113,15 @@ void FillMonotonicLineWGapFill::fill_surface_extrusion(const Surface* surface, c params2.dont_adjust = true; //BBS: always use no overlap expolygons to avoid overflow in top surface - for (const ExPolygon &rectilinear_area : this->no_overlap_expolygons) { - rectilinear_surface.expolygon = rectilinear_area; - fill_surface_by_lines(&rectilinear_surface, params2, polylines_rectilinear); - } + //for (const ExPolygon &rectilinear_area : this->no_overlap_expolygons) { + // rectilinear_surface.expolygon = rectilinear_area; + // fill_surface_by_lines(&rectilinear_surface, params2, polylines_rectilinear); + //} + + // Orca: The above causes pockmarks in top layer surfaces with a properly calibrated printer with PA and EM tuned. + // Revert implementation to the prusa slicer approach that respects the infill/wall overlap setting + // while retaining the gap fill logic below. The user can adjust the overlap calue to reduce overflow if needed. + fill_surface_by_lines(surface, params2, polylines_rectilinear); ExPolygons unextruded_areas; Flow new_flow = params.flow; if (!polylines_rectilinear.empty()) { From 40a980f5d844f58c623183df46992a7f863f2db4 Mon Sep 17 00:00:00 2001 From: Ocraftyone Date: Sat, 6 Jan 2024 00:46:53 -0500 Subject: [PATCH 14/18] CICD: Fail on no cache hit (#3429) --- .github/workflows/build_orca.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index a2e1a546147..1e8962d80ea 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -26,6 +26,13 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - name: load cached deps + uses: actions/cache@v3 + with: + path: ${{ inputs.cache-path }} + key: ${{ inputs.cache-key }} + fail-on-cache-miss: true + - name: Get the version and date on Ubuntu and macOS if: inputs.os != 'windows-latest' run: | @@ -65,12 +72,6 @@ jobs: echo "date=$date" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8 echo "date: ${{ env.date }} version: ${{ env.ver }}" shell: pwsh - - - name: load cached deps - uses: actions/cache@v3 - with: - path: ${{ inputs.cache-path }} - key: ${{ inputs.cache-key }} # Mac - name: Install tools mac From 7e59e99841030456d11ed2fbc51b263511de5669 Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 6 Jan 2024 06:47:34 +0100 Subject: [PATCH 15/18] M600 for Neptune 3 series (and removed from Neptune X) (#3432) --- .../Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json | 2 +- .../Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json | 2 +- .../Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json | 2 +- .../profiles/Elegoo/machine/Elegoo Neptune X 0.4 nozzle.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json index 3765a26ab3a..16968b30c96 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Max 0.4 nozzle.json @@ -101,7 +101,7 @@ "0" ], "single_extruder_multi_material": "1", - "change_filament_gcode": "", + "change_filament_gcode": "M600", "machine_pause_gcode": "M0", "default_filament_profile": [ "Elegoo Generic PLA" diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json index 57c50344de4..68294176f04 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Plus 0.4 nozzle.json @@ -101,7 +101,7 @@ "0" ], "single_extruder_multi_material": "1", - "change_filament_gcode": "", + "change_filament_gcode": "M600", "machine_pause_gcode": "M0", "default_filament_profile": [ "Elegoo Generic PLA" diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json index d658345c857..d9dd624190f 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune 3 Pro 0.4 nozzle.json @@ -101,7 +101,7 @@ "0" ], "single_extruder_multi_material": "1", - "change_filament_gcode": "", + "change_filament_gcode": "M600", "machine_pause_gcode": "M0", "default_filament_profile": [ "Elegoo Generic PLA" diff --git a/resources/profiles/Elegoo/machine/Elegoo Neptune X 0.4 nozzle.json b/resources/profiles/Elegoo/machine/Elegoo Neptune X 0.4 nozzle.json index e1280f65a90..8f108f68651 100644 --- a/resources/profiles/Elegoo/machine/Elegoo Neptune X 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/Elegoo Neptune X 0.4 nozzle.json @@ -101,7 +101,7 @@ "40" ], "single_extruder_multi_material": "1", - "change_filament_gcode": "PAUSE", + "change_filament_gcode": "", "machine_pause_gcode": "M0", "default_filament_profile": [ "Elegoo Generic PLA" From 8de98fc229ea1951440c4be642bb0539a65847b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olcay=20=C3=96REN?= <33813227+olcayoren@users.noreply.github.com> Date: Sat, 6 Jan 2024 10:13:42 +0300 Subject: [PATCH 16/18] Update OrcaSlicer_tr.po - TURKISH translation update (#3484) * Update OrcaSlicer_tr.po - TURKISH translation update * Update OrcaSlicer_tr.po - TURKISH translation update * elegoo_neptune4pro_buildplate_texture.png updated * Update OrcaSlicer_tr.po - TURKISH translation update * Update OrcaSlicer_tr.po - TURKISH translation update --------- Co-authored-by: SoftFever --- localization/i18n/tr/OrcaSlicer_tr.po | 8 ++++---- .../elegoo_neptune4pro_buildplate_texture.png | Bin 42069 -> 195740 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index 8715f26784e..03b806ec36e 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: OrcaSlicer\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-12-29 22:55+0800\n" -"PO-Revision-Date: 2024-01-01 00:01+0300\n" +"PO-Revision-Date: 2024-01-05 21:10+0300\n" "Last-Translator: Olcay ÖREN\n" "Language-Team: Türkçe\n" "Language: tr_TR\n" @@ -1278,7 +1278,7 @@ msgid "Select point" msgstr "Nokta seç" msgid "Delete" -msgstr "Delete" +msgstr "Sil" msgid "Restart selection" msgstr "Seçimi sıfırla" @@ -11041,7 +11041,7 @@ msgid "Slope" msgstr "Eğim" msgid "Spiral" -msgstr "Sarmal" +msgstr "Spiral" msgid "Only lift Z above" msgstr "Z'yi sadece şu değerin üstündeki durumlarda kaldır" @@ -11293,7 +11293,7 @@ msgid "Speed of internal solid infill, not the top and bottom surface" msgstr "Üst ve alt yüzeyin değil, iç katı dolgunun hızı" msgid "Spiral vase" -msgstr "Sarmal vazo" +msgstr "Spiral vazo" msgid "" "Spiralize smooths out the z moves of the outer contour. And turns a solid " diff --git a/resources/profiles/Elegoo/elegoo_neptune4pro_buildplate_texture.png b/resources/profiles/Elegoo/elegoo_neptune4pro_buildplate_texture.png index 50a9d989c69efc7a350af117b4f44e6ef5db4969..394dbe113adabafeffde97aac075c3e821d56308 100644 GIT binary patch literal 195740 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 literal 42069 zcmeI4c~n!^xA>tbv?|ip0g+L?fK(w20)hlYMZC)3K*SWoAcTkzf?)_@Rw}f0!W$Hj zNyRb9AV?6xpi+U$kT@}hfJy)b5;RC6gyDCw1?}tmzV+7nt=~WWg|$$^Irr?dKYO2j z_Sxqye%tG0uefOSA{iMOMR3=S{W3C(+GS)GJAEsU{N`He%Vrswg zhz4Fhq$7BPaAFYBE+b=Q6CUK{?T-)9I)W$o1)|rEFss*U`T3yNx|%u~ItFdWANAW6 zLB=15aB}gE@b|XxS!-jx$ST|t8Gwin@zM$>1_TCMhNIVh9@i52dG^<+wOXIMg!rS^ z9&+5PwVg!9Ynd9D8W^s%UZiD3_VKmczhmcL4L-36|Nr`yl!@gKgZaC5B4Ve1%>#L0<~tx^g2Qc4MDG6i?nOa z&5Rf{KX_p9U)m!aP~l!dC?f+y)YqMZj*>!1!AD8|;gR{~e>~{pJuf6ElpOGR{yyF) zd;p$^4-5%L`WyXC5I)@Ri_U+W)@;i^h7a-c{SVz|TmI1I z9AX!Sfcwh`|LqgOF4Q1AYCk@h6iW8S+l3)|t^3Rlk!HD_jQ0w`??ArMYmE(!P4o>n z>l+)o7@1p|ZnE5Dy1~%c&~U!9Bgx0lm-^p!HnTJ~LONT1-5YTyAFmLv|4sjS16j`Y z{&P}@EB}u(`tr_Uq=&7Ms2_f0lm$S&oR1KL?$)t|dtH zBH&&9d_seek|sp#dRlt?dHv z1QJQh2_F;^8i?20q=kUg+7{{;;1d*p7)i?oA084)##^Cg7jS^zUjjaVnv-CK`kQ#G z&;D(>%P%;DM5cZc5OV{}kmYe%8u=_xP`z81=O}bJMdz z{X>C2wf`!dAKl`VaS%ky(Es z^a68_obC6CHp}cj*e*D5=+KVe4*pd2ZRfW-yOy8ab>>xWSw_l^U2l$4)*ji=F28(- zs>iA6g`JC9PhMGnvi(@z(Ht@>ZR^QYtnUD)N3euh{Ob1`EoZPDa%p$*J8Eounuaq9 zCel_{gs-}S+2DNi^sT~cn>>~i(m&hSGmihIHxHWwXxx0JLv zvL(4_ebi4~e)S7ak<`&y1Imds>NL6iSG(=6jx85y@7e7B_*g^zw~dV-2+ubhdu`3y zGgvbGG5HU(4=Ww6{qo%#?~Hxh7QDsp>X*TNe5SvlfhV5qcP`vmMsKq8U$yZ9aLVr1 z?G5{JwAAl$v+exu%V*$LmV8>8LE1JNpTDZ1fVYyO{p0(HZxoB4hA5Vdj%Te9SyUyqmq)d% z7#7$jW{5XV%Frqa6UsIE_mHjiyP#dzU>O;Mb+g~H;Wuo;WMs5tz#Xq zaY@q!f^TQ{Zt0hlfRuogfRuogfRuogfRuogfRuogfRuogfRw<$nm}AfyxeRtKt^k( zZRcK$^h-)WNjH6;9;&wgLqBPglz^0glz^0glz^0glz^0glz^0glz^0glz^1Lzk|Rj^ycqpYXLIC zSmJ_zhe}c{qy(e{qy(e{qy(e{qy(e{qy(e{qy(e{qy+x|Ay5*#p!k3BF2H{RvO@G~ z>*u;a{Y=RZF8`^Q^!HK%QUX!}QUX!}QUX!}QUX!}QUX!}QUX!}QUd=P0`1a2B=E1X zrBo3q0Vx3~0Vx3~0Vx3~0Vx3~0Vx3~0V#ohF9G@r6RZD=cLDw*7_Slc_|V)T%eYwO zM5gkBvfs(Hm<-#IcD%T-e4XdZdM4h% z_wt3`ozAX^e}iAX!w~iTqHnWmN|lE)UWX(Ed$5Z|-2B;cvPy5HbS-$Ub_S%yn$%m?zl zwf!Q4pdJTdDv$`2k)SDPay>i-T4(cmYYZnn^H+D6e#4l1u&}nIaz;=QyDGu$7JZ?> zkyEEb-33k2)GqQ)ff`x7hd?B0ay8kxKQBF+dy&UDbE38YpvFRDs@38=uT}ZjpV#F& zaF)@m*21zX1Jl=lI$i2kD4I5WG19k++8s1HPTEC|ghq76eIT~>I2O{>8GmlL#0DF_ zZt+XeuYgT9ZyG$eha3iZn{=m3bg-p4DGg|GpCg!Gzd1Ksr_6U%g1@eQ23N;(@n3U( zNPjN60;I5Tb!Xg}CMO;-G#el6JD#Fg^Zp~3IV4Pp!7khot?L4Bi^}#=bDgsARSCH|4@C4<(S4x$0`D!L8#vjCdeMX~)7=%Z z2byspZ->}RYJ#5aX!H1;F#u3~A#W%n`GZBd_+=eXW&*d-4yW_VfmqWeH7UB*i8!sl z&GJ3alg>P+g2t~(h~+#}F69d}HZQ5U+^AAgY1!M)LO*M%F|<0?k;uTM93L9!0J~Fp z?>Cy)gi&h0@6Cmx%wY8z!>-CdMhVZt>NksT=~De`AHH?*>dZXu22pgW2OzgZuLr>i zs~L2Dj7og1ri1YM8I$yygfmy)r}$QQjI2uVD$VX4t}qp!R{9HGT#4huuyI)qprBL} z)VQDxYqTIBMY)j3bcQ^dR=u~xI@C7V3 zxQBNR@Nf`{yjFGF*vk@ol6ZEYlT#5}&2%`9NsH3;)*3&b;PnY^8XGn`xNWuioWMgJ zOD{8J4yG^?OQNw58=xM96ny(mS+!|fSi@yt{;|ky97*%x7lD3}dpT{uxK}Olkv+bz zIhrO1WnADrXJ{Ua{8&q@Tig|`Vw3|?W}(y_4Vof;25ZAmzxk@R6;@HvB>%1kYBdbn~>1P z8`MZ^NpW^d;gx~b?V^gZ(;X_RrLFD|FHJ>q=s;L2kxQluG3q+eVBdxMR#p`*s_#Ji-sFKUD%^i z=4Q+Bj@O@Y=7bWnJ4H7ET_64_e{;%FsI(;dL)R$)?j9N&cb|k>TwQ@HW>=t(l5HbV(`~9Yd8Zrmh#%7a@vP(AZ(a!g+VIq@yb^|TL%2q!Yj;2jwIVsJ@!#T^0q~PfGoPIC1 zHi?gIw7SpN1E;k|0}9>s5&*WJWPn(@dO|bdbuQSQb$w56K%a#fEa6xO2(}$Gk#(B` zdkEM6?O8s$Che{vQ8S5m61c^}H8w4E5(*gAMQ3U{tu5h5NUieBD8tISx3+hSNg%q) z6joQQHg79_+XWPKw4O#nyFY}|zj5v2P%F5$)oy2}2?-{p z<@#hLbJzMH3fE{!&3Ve}=<0M{nTq*u20zofGI<0r2IAEM=D@fuG!igbN~2kA?mgJH zou-!LgS%85E_@FRluUIY8`jS+*ASI<2@^pL=4}&(l`-s0i?V?SXc^{9YFrr;Z$x;N zk<-1#fnr?gFRPJ`wTvFMgx8gvaBeUyY8`xH@omJ>n9w8%N;mGNc{GKe&u{$H6y*XX z>RK50q9dx$aB{>ATHukCJm>WaBsfBo2q;{#10IK?{f=O5QS1q{yk0 z{vJJ|YYaCJ)_%Nm*B__#J~QkIea_=h?TLWI02~ z1h6`(7)}*YV12XI?;D0vCiA?V|CW#?Ro&=E6^sx{-K#gJ77Jd3#DZgyZQn#3<-~ey zZI+Z&9*u6D{K-|8lWF|uZl@@7md2uXLDD(SE>foFLATDQqU=uVnBOWZ82mO%;-OCh zhDZ7X)>S^Kw9@;rrMWndQIKBL&;K~eW6a#U;%+t;+#Yu9(;I`sVpSp=_a?)=OO%Uq zNUbDRw~1652NmXo9x8HLRyY;Ni60Q)Rc4i*?(2$n$a}FM0NHL3r6pzG_20jd&6sLo z*c+6kgc6-I3U4txt8VaXbn=6H7&GX7XWb^EIEkTfx&ud}?RflP!osmJU5>@fM}|$u zZ$r2i(RYoP*}kD!FGUA%UA1pda|G4HRde#=wBPPf4PYilxri1NALEFdxOFcr9Umew zNOI^p1NH8sZMA0URNjiGoLijyo+lcul&(z?tdqyKl)hk3JIzUc_|vRu&BL~6>Qxp{qnvX2>9) zZ5e2QKKg^{h)=Be-KrvPOVB7IBC0Qp6?2%A&ImqBG4Nl>c_At?@a-MB7%Y~blfQ8* zv5>2`tcgxUA?|gjMV>=ECaGYQIvVCUww9v(1yyEkqF0Qb?%y=3IzdG*|L`vh z4<=naeeHI=V@lB3Uj=InEZo1Zu{-qR$u&mbB_%D8<2gZaQ-#Dn^wMTg2-_hxH@AFZ z)Z&&?M0svjk6Sf;utC$gQc*_6q);0s`lA1kFVbtMm%M(9RWh{G)mFinbzS6Tg8j#W zeKEK+9uIKMBe!gTDy-nC+`(c@Xw9bncLHx(R9$^NkbRdvl1I-~=+6f+++%ODbkS7$Q1|<5Tb2%4jHKiXc`Vlj1;*zZggMVXz=ON<&s~pJq74@0*`kBeq&Sg z0ZMgAn;(Zjnb}L}F??SUTg9vnM*H??a;NetNvgkyYYE~v4`%Mn@Wc9%hdHgU4MtJ~ z)_0f%s!>_2cYiKt2L9&S71W1kWKydw^S-r>eBKWGggNQ?X^57+%8wlqSJeB(=+8v5_9Rf z(4;S<9>2C!hq{-ddH=By1sHDxVlVQjm@$@ZUDi#pt_7Ob_VQZ=9V(eZQb{gNVz46S zCLxo0B6H6Z1JSu3TZIPcV=_6RVmVq@%-*gipu6RIe>#1TT^>o$S;#SIlYHV%y#SZ0 zE~j`y+3Lw98r?~}A3zPO^&^o`)B(tO( z-Tv}l(0i=0^9kMEo$RBd;Q`R<O>SNF8dzPSzxnhFDC(GJHxcS0d3HbkP&*ezANsm*qu>8U)BG5XXJv70FUt|^ z#$a-$uTMQ56s)6l`R(merd1r@+gg5yuB>elySM8SP;If^KX7B^B_}8H)Wi0+rAAIs?&3z50^-%n#qa17Ht|I(xxG+;YVueqXpM|giPnQzwpg)d zvWY8wFc|E%G8CpO`0A^XqULZ1?A!uH`L%8j(8`$(nYvbXv{i12=&Z_t2SfA;B{{O$ zX^GF_lo2$t^sd|;6MX=(Rgz2cm>$;a{ktpldKv8+&$(_2czv~n^ZA=uP9Avf^4RyP z^_P%UeM?|ABrCsVJ^V*{7g;2~axpF2MWZ(r zd>qmyO67e57IC8kpk9S1(Vlx*8*v%D)8IMPq|n2ZSZB->H|}oPK8(kppct~U@{Tb_ zbt)`O*jKplFB+aEmg`|kbHuOsis)9k;S<%#l@*cfh`2{FN4C~BgVXq}EZ^fPfbNop zh{-D%X?N&KVPbolmG9QB*PsUEb9E78k2M7Q^RLKaOVyL^B~{F)oHDuh9)$&e63MEx z8Q>BI1#(QuCqY#(1+{<8`y{}ANqvWfmbd$4^OX#JQ1FbKxU?Z%6*HC(m@oZ(OZZ;a z<9mTs4Mtnr1P>Bc*BCXz%4>iNw7VI6fy_BJrVE-ig>>L{gw#f4WK;eB^i_xPlcRCf;iyo?K z&OKDPdg0w>+ecw%uodnr^E@N{pgr<#_f;7IfcHa-bBm($5vG;a~eGKH7$tNSjahxkIlAUw+P7)ac0HH z?1vqSydN4Vmw8Gi&*+^9+#}o|NA7=eTamFYD|WHp%kSpad)!$cS7-wP{fDtZE}hz? zv$^0&50?28?IiE;9Xe`cz>(t1w`(SXOFg`iXtE9#0Sb9W195=ZQTUsw^QKq>2XZJh z#chi6KR+bMzC%w}@M(6S*l5FR;@ADKD;YHTz5w~`J>=FacSlx#j>P2vQj;V;JI@!algH;V1=a?z zoUuSGB*^z|R8#%Reb%=JE}co`eUi1X4-@ahjNOpMf)ITos`ZoAupkmZ&d=(QTIt6z z9I}(VBeMa80^)N(Vo1Q?I=I=YK}|rJBgN(_-AO&!+}ZjPuK}=Ete;>2O3p%-EVej^ z4d^ay=)_=1tCCB;!h);^L@vphyt{Qe+!ZOcQQI%;uD(rYIg_WeV!F8`Ct>f9`Lh{{ z9mGm)>+mj@uyY4%WwF6I^l1hY)sT9U?*&%HzO&+5X^|??>t+)a#96Vs6q>$l^PU1d zM2NX=hxPg)CR6f@Eq18yfr`3#3JhD)V5tX}BHnF2qLF+6%u41xwWSW-WL6u%ISM;t zd^}tK7N~MOnHGnUikvN$15LiXa`(>AY>Ft}cn*h|NjjdsPr9FYCo? z&`CA9#GpJ9sgVK}NB8nrfX(Lh{%iEUly-9W6>`;Bj=~SN*o!=7dE`MiFL4VBzkiX2 zSFAfqb9KltKs`cx^y91z|1s7A`d}@fy!6Z@3s6!| zHDAGvt_EzfI;`2wPDTEETNyyL`Fj7sa>-ThR9a=lgg?|}_4cV7G){RxUVlZI4X zz2v-+ir%>s)W!B+?*xd4eMoSa4w?McjaEUHTfQp$A}3fQ zgv3j;`kc5^7X($3S6!y>1O#nr#Pn2|r5Rj&u$+jQiq^sNE-ZBvO1RMoTEKe{1{=QqJ@4|#aHV#F>p2Ow<)sdoUVi>INp2>SwtZ_u8puU~|2oxfv zOdHfd71JY?cLQA7S%cB&;W}fr`_qucpuW*U4^EdS2vP)9dmwWi>eJeKdBczHDFEYDz{rRoo)9ijdMog7 z6#9cpv9IY!Dt??o;=WixAEbfSo5KIl2Q{8?vquEXrL1m$ZZvx~e>YN@d7W^YHYs@3 zbn3?ZO@_?fT6vD+O}h1E9{<3vRgsX*9$}%LPr+^G`CUkb`FyJIYU@M7yNh(m?!c`~;%Jgs&-jMC(3k*OfzJPW!sq&g&`UF4% z$pw0U^rRvuh|s>}Mas~Z{XhNLC4n`0Hh*2jXxtLmD(BF#0Xl57xftp)hgF#pS9!w7 zv;D_Epdc%~;0I-4=E}N=bKnltR}r8#T`Ii1D5Ztllg%T7?#Vtk9uMas8{>Cr%ZtRk z1EABM=l-kT_v8XSX*@^nRM(@9$on57!uLSSOfq}Q2n6BkxqL-t+CFJn1k{(eow?oVJ2IaY@;iZx-%tQ?o>|Y`ShnuNva@*NQr&GEO1Xu zV=`xonC3N!vI(Q`k8>2wlCzfQRXwOpZKP#v^31?~3cy5%k_x)G=vS#*pu_2~Su-vz zU`JQU$0@hzO7GIf=Cpu|T~!}@RB4A(coTpJi)UmN{7#bFeYSEk2Gtyl#o$Vhc#18+ zDm?03C1ekjg`ZU^4myCr6{5`F3bGx95-i8;dGzrEIs>9uL)Vs7+gFiVxh3 z-#wZNfM~R?G;;u5!vw2kVn`Ga18ZOPswSdjbz|r85hFp_z^aE3PA9${r zS4KUm!{&^UsgSN~i^@=V)2XZT%l~15@oi7$1#}_Z`hKaahD%}QDfhl1_x>T)^}@*A zn5iefzxH0lP;Ifmgcd|s?xWajflt%aHpN`OsFVqMN&2Jmo^sQYqm>%kb~8qg9C~C1 zmP@L@?lhht$5{MK|H*`UTE>7}U?{d=G{y@;Dn96yolJ=>vN*|!p_l!-kVB6UBANgtycpZO9KWg_$F)21|tFS+K!%(%S!Xp17~eu?K= zy!%;*Y$lDTkUO|67k7`Izeji(aBk}VsUr-@g{a3cIHMu2l_$O$NOGNCmC8#7VxcD+ zjAFFm#YkFCrXRD%AlIGF$o+V2@7+Wvp%UnHhrU=O+KDMKf&IX&EV#GqZJ?8o4zO?2 z`NbN(`__L+t_s=oK{|cn9l+jGv_AIS^zQ&06bcdZ{a&hVVF4>6r~KvoT|)b`WPh8g z0(1ADI;ym3j*QcXcUBp|G~_NB6HRTc+4$p^O;$$ahNO0Iaq$OpL=leyx=qHIRxY;F zM{<>p?Ac|-S%gJlI@A~px`b}f)ssZ;bjRG9eGMUYwHbHvfezeDAIwAw9Cs73o4z(A zh?#PS61AzZI_dW2kQ3P*(hdBD%s1A!%+to6(SMxD^MEF!FqJ+oM=`idJR2P4q-G8 zvEyA^*xD9Gu&POq9VZiHIS5BV0S-f8g=aZ>58a(BqRGgJVB2DiIK_gZrQCb;^0n}W za!DoVv|Bg?3at3O`B!L%vv}`7Rz7|4t&ohGa!C@s+-vuEE}ecpMEru*wGP&sO;L#i zQ+A*wtV^o^;5z!?HLT)(%m77fLaQ*NZTqwsQZve>hP?m{b_@5UW!&21YsJ2qGauq) zR2x%#XEiyuRUJwzo4gM&yvrlAn(># zY=)Z_F~I$pHtq30p7$v;C3c`jHm@B>#23Ng=;7UDZwLj9ABJeTgN;KW!x;S)S8b|7 zsCWu;(H(i`EbA!#lqu&1RQs2vL)jQznBOaHO(q{&eNV z>B{GA<~ki!gCXghO8^Io3awN+j6qJW&jr)ZfF6i<0@SG3#J*j`KL@zZ-uw;FqBg-Q zm=bsPX}3j;;2ZRq9Og_U;`U|8X#tw_gqS)OhP}UE&*a^7(1<^;i@bGVhZ$?N9Y27< zIKM?on8;P+ zxT95a1BgxIIbVulpkWM>dAf|$FV{ya2~v6W0A-i(G+3nz^NsbiM{<#!)4TvA2SNx_ zU0QHx$8$4W|1Vz!(udY>1xU6Pg}lb32ap=C)2NM!G7Q3gM%7O+fi@Y4!4*%_=1b9Y zDTnlbDFG<~DFG<~DFG<~DS`h71SYFRui|FM-C94>rZ`_R`hOtlUpM64h1*VJL;<3o RMrKt5?VNVxZ}U9)e*pXSQ@;QJ From cb9792e1d9c65dbaf8ed7598088812ee84d6ac5a Mon Sep 17 00:00:00 2001 From: Thomas Date: Sat, 6 Jan 2024 08:14:55 +0100 Subject: [PATCH 17/18] Added i3 printer_structure to Creality printers (#3460) --- .../profiles/Creality/machine/Creality CR-10 Max 0.4 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-10 V2 0.4 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 Max 0.2 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 Max 0.4 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 Max 0.6 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 Max 0.8 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 SE 0.2 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 SE 0.4 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 SE 0.6 nozzle.json | 1 + .../profiles/Creality/machine/Creality CR-6 SE 0.8 nozzle.json | 1 + .../profiles/Creality/machine/Creality Ender-3 0.4 nozzle.json | 1 + .../Creality/machine/Creality Ender-3 S1 0.4 nozzle.json | 1 + .../Creality/machine/Creality Ender-3 S1 Pro 0.4 nozzle.json | 1 + .../Creality/machine/Creality Ender-3 V2 0.4 nozzle.json | 1 + 14 files changed, 14 insertions(+) diff --git a/resources/profiles/Creality/machine/Creality CR-10 Max 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality CR-10 Max 0.4 nozzle.json index 83463b045d3..b1fb9bf6d8f 100644 --- a/resources/profiles/Creality/machine/Creality CR-10 Max 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-10 Max 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-10 Max", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-10 V2 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality CR-10 V2 0.4 nozzle.json index 8d042e902cb..85e5ff86482 100644 --- a/resources/profiles/Creality/machine/Creality CR-10 V2 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-10 V2 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-10 V2", + "printer_structure": "i3", "default_print_profile": "0.20mm Standard @Creality CR10V2", "nozzle_diameter": [ "0.4" diff --git a/resources/profiles/Creality/machine/Creality CR-6 Max 0.2 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 Max 0.2 nozzle.json index 7bde170ec2b..9d435517cab 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 Max 0.2 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 Max 0.2 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 Max", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-6 Max 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 Max 0.4 nozzle.json index 595cc850dca..c726a9b575e 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 Max 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 Max 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 Max", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-6 Max 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 Max 0.6 nozzle.json index b6e78a8c15d..5d701153318 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 Max 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 Max 0.6 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 Max", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-6 Max 0.8 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 Max 0.8 nozzle.json index 7f3e5abea93..ec443723503 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 Max 0.8 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 Max 0.8 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 Max", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-6 SE 0.2 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 SE 0.2 nozzle.json index 8ec3f2a59e2..735a4d49995 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 SE 0.2 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 SE 0.2 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 SE", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-6 SE 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 SE 0.4 nozzle.json index 26724ec65a7..cb835d9f09a 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 SE 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 SE 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 SE", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-6 SE 0.6 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 SE 0.6 nozzle.json index cddea61f756..dd8888c0b7b 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 SE 0.6 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 SE 0.6 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 SE", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality CR-6 SE 0.8 nozzle.json b/resources/profiles/Creality/machine/Creality CR-6 SE 0.8 nozzle.json index 2e8cc26c4a2..ef2aa087afd 100644 --- a/resources/profiles/Creality/machine/Creality CR-6 SE 0.8 nozzle.json +++ b/resources/profiles/Creality/machine/Creality CR-6 SE 0.8 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality CR-6 SE", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], diff --git a/resources/profiles/Creality/machine/Creality Ender-3 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality Ender-3 0.4 nozzle.json index 9e625999cce..b412fbaf6fa 100644 --- a/resources/profiles/Creality/machine/Creality Ender-3 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality Ender-3 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality Ender-3", + "printer_structure": "i3", "default_print_profile": "0.20mm Standard @Creality Ender3", "thumbnails": [""], "nozzle_diameter": [ diff --git a/resources/profiles/Creality/machine/Creality Ender-3 S1 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality Ender-3 S1 0.4 nozzle.json index eb73fdd825a..695d7d6fec2 100644 --- a/resources/profiles/Creality/machine/Creality Ender-3 S1 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality Ender-3 S1 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality Ender-3 S1", + "printer_structure": "i3", "default_print_profile": "0.20mm Standard @Creality Ender3S1", "nozzle_diameter": [ "0.4" diff --git a/resources/profiles/Creality/machine/Creality Ender-3 S1 Pro 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality Ender-3 S1 Pro 0.4 nozzle.json index b1206d1273b..d6a3a5ff25f 100644 --- a/resources/profiles/Creality/machine/Creality Ender-3 S1 Pro 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality Ender-3 S1 Pro 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality Ender-3 S1 Pro", + "printer_structure": "i3", "default_print_profile": "0.20mm Standard @Creality Ender3S1Pro", "nozzle_diameter": [ "0.4" diff --git a/resources/profiles/Creality/machine/Creality Ender-3 V2 0.4 nozzle.json b/resources/profiles/Creality/machine/Creality Ender-3 V2 0.4 nozzle.json index e36e3bf6f99..43049f4db60 100644 --- a/resources/profiles/Creality/machine/Creality Ender-3 V2 0.4 nozzle.json +++ b/resources/profiles/Creality/machine/Creality Ender-3 V2 0.4 nozzle.json @@ -6,6 +6,7 @@ "instantiation": "true", "inherits": "fdm_creality_common", "printer_model": "Creality Ender-3 V2", + "printer_structure": "i3", "default_filament_profile": [ "Creality Generic PLA" ], From 1067fc2649fd32f06273bb7a0dff43d60d4286be Mon Sep 17 00:00:00 2001 From: Hukete <100949318+Hukete@users.noreply.github.com> Date: Sat, 6 Jan 2024 15:15:49 +0800 Subject: [PATCH 18/18] Update the some profiles (#3470) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 10-25 Add TPU-95A HF * 1030 Adding Introduction of Chamber Temperature Control Macros(M191) to Notes * 1102 Add ABS-GF10 profile, Remove a extra "s" from the "0.36mm Standard @Qidi XPlus3 0.6 nozzle.json" file * 1106 Add the PA value to some genetic filament profiles * Add new filaments profiles Add new filaments profiles * 1 1 * Add two new filaments Add two new filaments * Optimized 0.2mm nozzle profiles Optimized 0.2 mm nozzle QIDI Generic ABS/PETG/PLA profiles * disable prime tower disable prime tower and independent_support_layer_height, Improve some part of the surface when supported * Fix the name issue Fix the name issue --- resources/profiles/Qidi.json | 48 +++++++++++++++++ ... Generic ABS @Qidi X-Max 3 0.2 nozzle.json | 27 ++++++++++ ...Generic ABS @Qidi X-Plus 3 0.2 nozzle.json | 27 ++++++++++ ...eneric ABS @Qidi X-Smart 3 0.2 nozzle.json | 27 ++++++++++ .../Qidi/filament/Qidi Generic ABS.json | 5 +- ... Generic ASA @Qidi X-Max 3 0.2 nozzle.json | 27 ++++++++++ ...Generic ASA @Qidi X-Plus 3 0.2 nozzle.json | 27 ++++++++++ ...eneric ASA @Qidi X-Smart 3 0.2 nozzle.json | 27 ++++++++++ .../Qidi/filament/Qidi Generic ASA.json | 5 +- ...Generic PETG @Qidi X-Max 3 0.2 nozzle.json | 51 +++++++++++++++++++ ...eneric PETG @Qidi X-Plus 3 0.2 nozzle.json | 51 +++++++++++++++++++ ...neric PETG @Qidi X-Smart 3 0.2 nozzle.json | 51 +++++++++++++++++++ .../Qidi/filament/Qidi Generic PETG.json | 5 +- ... Generic PLA @Qidi X-Max 3 0.2 nozzle.json | 27 ++++++++++ ...Generic PLA @Qidi X-Plus 3 0.2 nozzle.json | 27 ++++++++++ ...eneric PLA @Qidi X-Smart 3 0.2 nozzle.json | 27 ++++++++++ .../Qidi/filament/Qidi Generic PLA Silk.json | 5 +- .../Qidi/filament/Qidi Generic PLA.json | 5 +- .../process/fdm_process_qidi_x3_common.json | 3 +- 19 files changed, 451 insertions(+), 21 deletions(-) create mode 100644 resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Max 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Plus 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Smart 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Max 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Plus 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Smart 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Max 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Plus 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Smart 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Max 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Plus 3 0.2 nozzle.json create mode 100644 resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle.json diff --git a/resources/profiles/Qidi.json b/resources/profiles/Qidi.json index b7b0b94cbaf..622ce93dd43 100644 --- a/resources/profiles/Qidi.json +++ b/resources/profiles/Qidi.json @@ -464,10 +464,34 @@ "name": "Qidi Generic ABS", "sub_path": "filament/Qidi Generic ABS.json" }, + { + "name": "Qidi Generic ABS @Qidi X-Max 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic ABS @Qidi X-Max 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic ABS @Qidi X-Plus 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic ABS @Qidi X-Plus 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic ABS @Qidi X-Smart 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic ABS @Qidi X-Smart 3 0.2 nozzle.json" + }, { "name": "Qidi Generic ASA", "sub_path": "filament/Qidi Generic ASA.json" }, + { + "name": "Qidi Generic ASA @Qidi X-Max 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic ASA @Qidi X-Max 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic ASA @Qidi X-Plus 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic ASA @Qidi X-Plus 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic ASA @Qidi X-Smart 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic ASA @Qidi X-Smart 3 0.2 nozzle.json" + }, { "name": "Qidi Generic PA", "sub_path": "filament/Qidi Generic PA.json" @@ -483,6 +507,18 @@ { "name": "Qidi Generic PETG", "sub_path": "filament/Qidi Generic PETG.json" + }, + { + "name": "Qidi Generic PETG @Qidi X-Smart 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic PETG @Qidi X-Smart 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic PETG @Qidi X-Plus 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic PETG @Qidi X-Plus 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic PETG @Qidi XMax3 0.2 nozzle", + "sub_path": "filament/Qidi Generic PETG @Qidi X-Max 3 0.2 nozzle.json" }, { "name": "Qidi Generic PETG-CF", @@ -495,6 +531,18 @@ { "name": "Qidi Generic PLA", "sub_path": "filament/Qidi Generic PLA.json" + }, + { + "name": "Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic PLA @Qidi X-Plus 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic PLA @Qidi X-Plus 3 0.2 nozzle.json" + }, + { + "name": "Qidi Generic PLA @Qidi X-Max 3 0.2 nozzle", + "sub_path": "filament/Qidi Generic PLA @Qidi X-Max 3 0.2 nozzle.json" }, { "name": "Qidi Generic PLA-CF", diff --git a/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Max 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Max 3 0.2 nozzle.json new file mode 100644 index 00000000000..32292c6fe7e --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Max 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "setting_id": "GFSA04", + "name": "Qidi Generic ABS @Qidi X-Max 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_abs", + "filament_flow_ratio": [ + "0.926" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.021" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >90)||(bed_temperature_initial_layer[current_extruder] >90)}M106 P3 S0\n{elsif(bed_temperature[current_extruder] >70)||(bed_temperature_initial_layer[current_extruder] >70)}M106 P3 S153\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{endif}" + ], + "compatible_printers": [ + "Qidi X-Max 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Plus 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Plus 3 0.2 nozzle.json new file mode 100644 index 00000000000..cdd8044ae43 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Plus 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "setting_id": "GFSA04", + "name": "Qidi Generic ABS @Qidi X-Plus 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_abs", + "filament_flow_ratio": [ + "0.926" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.021" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >90)||(bed_temperature_initial_layer[current_extruder] >90)}M106 P3 S0\n{elsif(bed_temperature[current_extruder] >70)||(bed_temperature_initial_layer[current_extruder] >70)}M106 P3 S153\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{endif}" + ], + "compatible_printers": [ + "Qidi X-Plus 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Smart 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Smart 3 0.2 nozzle.json new file mode 100644 index 00000000000..39fa925715b --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic ABS @Qidi X-Smart 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "setting_id": "GFSA04", + "name": "Qidi Generic ABS @Qidi X-Smart 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_abs", + "filament_flow_ratio": [ + "0.926" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.021" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >90)||(bed_temperature_initial_layer[current_extruder] >90)}M106 P3 S0\n{elsif(bed_temperature[current_extruder] >70)||(bed_temperature_initial_layer[current_extruder] >70)}M106 P3 S153\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{endif}" + ], + "compatible_printers": [ + "Qidi X-Smart 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic ABS.json b/resources/profiles/Qidi/filament/Qidi Generic ABS.json index 654d2100394..e3c944e8250 100644 --- a/resources/profiles/Qidi/filament/Qidi Generic ABS.json +++ b/resources/profiles/Qidi/filament/Qidi Generic ABS.json @@ -35,9 +35,6 @@ "Qidi X-CF Pro 0.8 nozzle", "Qidi X-Smart 3 0.8 nozzle", "Qidi X-Plus 3 0.8 nozzle", - "Qidi X-Max 3 0.8 nozzle", - "Qidi X-Smart 3 0.2 nozzle", - "Qidi X-Plus 3 0.2 nozzle", - "Qidi X-Max 3 0.2 nozzle" + "Qidi X-Max 3 0.8 nozzle" ] } diff --git a/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Max 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Max 3 0.2 nozzle.json new file mode 100644 index 00000000000..0f60692f69b --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Max 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "setting_id": "GFSA04", + "name": "Qidi Generic ASA @Qidi X-Max 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_abs", + "filament_flow_ratio": [ + "0.926" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.021" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >90)||(bed_temperature_initial_layer[current_extruder] >90)}M106 P3 S0\n{elsif(bed_temperature[current_extruder] >70)||(bed_temperature_initial_layer[current_extruder] >70)}M106 P3 S153\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{endif}" + ], + "compatible_printers": [ + "Qidi X-Max 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Plus 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Plus 3 0.2 nozzle.json new file mode 100644 index 00000000000..d32e2c80c82 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Plus 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "setting_id": "GFSA04", + "name": "Qidi Generic ASA @Qidi X-Plus 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_abs", + "filament_flow_ratio": [ + "0.926" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.021" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >90)||(bed_temperature_initial_layer[current_extruder] >90)}M106 P3 S0\n{elsif(bed_temperature[current_extruder] >70)||(bed_temperature_initial_layer[current_extruder] >70)}M106 P3 S153\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{endif}" + ], + "compatible_printers": [ + "Qidi X-Plus 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Smart 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Smart 3 0.2 nozzle.json new file mode 100644 index 00000000000..2e754bdb4be --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic ASA @Qidi X-Smart 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFB99", + "setting_id": "GFSA04", + "name": "Qidi Generic ASA @Qidi X-Smart 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_abs", + "filament_flow_ratio": [ + "0.926" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.021" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "filament_start_gcode": [ + "; filament start gcode\n{if (bed_temperature[current_extruder] >90)||(bed_temperature_initial_layer[current_extruder] >90)}M106 P3 S0\n{elsif(bed_temperature[current_extruder] >70)||(bed_temperature_initial_layer[current_extruder] >70)}M106 P3 S153\n{elsif(bed_temperature[current_extruder] >35)||(bed_temperature_initial_layer[current_extruder] >35)}M106 P3 S255\n{endif}" + ], + "compatible_printers": [ + "Qidi X-Smart 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic ASA.json b/resources/profiles/Qidi/filament/Qidi Generic ASA.json index 087a82c5f38..eab6cf1e009 100644 --- a/resources/profiles/Qidi/filament/Qidi Generic ASA.json +++ b/resources/profiles/Qidi/filament/Qidi Generic ASA.json @@ -44,9 +44,6 @@ "Qidi X-CF Pro 0.8 nozzle", "Qidi X-Smart 3 0.8 nozzle", "Qidi X-Plus 3 0.8 nozzle", - "Qidi X-Max 3 0.8 nozzle", - "Qidi X-Smart 3 0.2 nozzle", - "Qidi X-Plus 3 0.2 nozzle", - "Qidi X-Max 3 0.2 nozzle" + "Qidi X-Max 3 0.8 nozzle" ] } diff --git a/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Max 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Max 3 0.2 nozzle.json new file mode 100644 index 00000000000..55acc65308b --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Max 3 0.2 nozzle.json @@ -0,0 +1,51 @@ +{ + "type": "filament", + "filament_id": "GFG99", + "setting_id": "GFSG99", + "name": "Qidi Generic PETG @Qidi X-Max 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pet", + "reduce_fan_stop_start_freq": [ + "1" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "fan_cooling_layer_time": [ + "30" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "25%" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "8" + ], + "filament_flow_ratio": [ + "0.95" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.05" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "compatible_printers": [ + "Qidi X-Max 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Plus 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Plus 3 0.2 nozzle.json new file mode 100644 index 00000000000..bd7a5d17bd7 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Plus 3 0.2 nozzle.json @@ -0,0 +1,51 @@ +{ + "type": "filament", + "filament_id": "GFG99", + "setting_id": "GFSG99", + "name": "Qidi Generic PETG @Qidi X-Plus 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pet", + "reduce_fan_stop_start_freq": [ + "1" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "fan_cooling_layer_time": [ + "30" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "25%" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "8" + ], + "filament_flow_ratio": [ + "0.95" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.05" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "compatible_printers": [ + "Qidi X-Plus 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Smart 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Smart 3 0.2 nozzle.json new file mode 100644 index 00000000000..88e7d4a18f0 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PETG @Qidi X-Smart 3 0.2 nozzle.json @@ -0,0 +1,51 @@ +{ + "type": "filament", + "filament_id": "GFG99", + "setting_id": "GFSG99", + "name": "Qidi Generic PETG @Qidi X-Smart 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pet", + "reduce_fan_stop_start_freq": [ + "1" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "fan_cooling_layer_time": [ + "30" + ], + "overhang_fan_speed": [ + "90" + ], + "overhang_fan_threshold": [ + "25%" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "10" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "8" + ], + "filament_flow_ratio": [ + "0.95" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.05" + ], + "filament_max_volumetric_speed": [ + "1" + ], + "compatible_printers": [ + "Qidi X-Smart 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PETG.json b/resources/profiles/Qidi/filament/Qidi Generic PETG.json index 321112ec933..31f0e2acc59 100644 --- a/resources/profiles/Qidi/filament/Qidi Generic PETG.json +++ b/resources/profiles/Qidi/filament/Qidi Generic PETG.json @@ -62,9 +62,6 @@ "Qidi X-CF Pro 0.8 nozzle", "Qidi X-Smart 3 0.8 nozzle", "Qidi X-Plus 3 0.8 nozzle", - "Qidi X-Max 3 0.8 nozzle", - "Qidi X-Smart 3 0.2 nozzle", - "Qidi X-Plus 3 0.2 nozzle", - "Qidi X-Max 3 0.2 nozzle" + "Qidi X-Max 3 0.8 nozzle" ] } diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Max 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Max 3 0.2 nozzle.json new file mode 100644 index 00000000000..eac3229bdec --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Max 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "setting_id": "GFSL99", + "name": "Qidi Generic PLA @Qidi X-Max 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_flow_ratio": [ + "0.98" + ], + "slow_down_layer_time": [ + "5" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.031" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "compatible_printers": [ + "Qidi X-Max 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Plus 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Plus 3 0.2 nozzle.json new file mode 100644 index 00000000000..0c73db382a5 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Plus 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "setting_id": "GFSL99", + "name": "Qidi Generic PLA @Qidi X-Plus 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_flow_ratio": [ + "0.98" + ], + "slow_down_layer_time": [ + "5" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.031" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "compatible_printers": [ + "Qidi X-Plus 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle.json b/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle.json new file mode 100644 index 00000000000..21c563ab660 --- /dev/null +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "filament_id": "GFL99", + "setting_id": "GFSL99", + "name": "Qidi Generic PLA @Qidi X-Smart 3 0.2 nozzle", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_flow_ratio": [ + "0.98" + ], + "slow_down_layer_time": [ + "5" + ], + "enable_pressure_advance": [ + "1" + ], + "pressure_advance": [ + "0.031" + ], + "filament_max_volumetric_speed": [ + "2" + ], + "compatible_printers": [ + "Qidi X-Smart 3 0.2 nozzle" + ] +} diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA Silk.json b/resources/profiles/Qidi/filament/Qidi Generic PLA Silk.json index 06785f9d5d1..bdff3342b86 100644 --- a/resources/profiles/Qidi/filament/Qidi Generic PLA Silk.json +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA Silk.json @@ -35,9 +35,6 @@ "Qidi X-CF Pro 0.8 nozzle", "Qidi X-Smart 3 0.8 nozzle", "Qidi X-Plus 3 0.8 nozzle", - "Qidi X-Max 3 0.8 nozzle", - "Qidi X-Smart 3 0.2 nozzle", - "Qidi X-Plus 3 0.2 nozzle", - "Qidi X-Max 3 0.2 nozzle" + "Qidi X-Max 3 0.8 nozzle" ] } \ No newline at end of file diff --git a/resources/profiles/Qidi/filament/Qidi Generic PLA.json b/resources/profiles/Qidi/filament/Qidi Generic PLA.json index 7c31a1e2fc1..10d42509d67 100644 --- a/resources/profiles/Qidi/filament/Qidi Generic PLA.json +++ b/resources/profiles/Qidi/filament/Qidi Generic PLA.json @@ -38,9 +38,6 @@ "Qidi X-CF Pro 0.8 nozzle", "Qidi X-Smart 3 0.8 nozzle", "Qidi X-Plus 3 0.8 nozzle", - "Qidi X-Max 3 0.8 nozzle", - "Qidi X-Smart 3 0.2 nozzle", - "Qidi X-Plus 3 0.2 nozzle", - "Qidi X-Max 3 0.2 nozzle" + "Qidi X-Max 3 0.8 nozzle" ] } diff --git a/resources/profiles/Qidi/process/fdm_process_qidi_x3_common.json b/resources/profiles/Qidi/process/fdm_process_qidi_x3_common.json index d706d7012e2..935568f4c63 100644 --- a/resources/profiles/Qidi/process/fdm_process_qidi_x3_common.json +++ b/resources/profiles/Qidi/process/fdm_process_qidi_x3_common.json @@ -103,7 +103,8 @@ "top_shell_layers": "4", "top_shell_thickness": "0.8", "travel_speed": "500", - "enable_prime_tower": "1", + "enable_prime_tower": "0", + "independent_support_layer_height": "0", "wipe_tower_no_sparse_layers": "0", "prime_tower_width": "35", "xy_hole_compensation": "0",