diff --git a/.doxygen b/.doxygen index fb8ae5f045..d557f6ba85 100644 --- a/.doxygen +++ b/.doxygen @@ -48,7 +48,7 @@ PROJECT_NAME = OrcaSlicer # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.6.3 +PROJECT_NUMBER = latest # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -68,7 +68,7 @@ PROJECT_LOGO = ./resources/images/OrcaSlicer_32px.png # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = ../ +OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format @@ -1059,7 +1059,11 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_PATTERNS = */deps/* +EXCLUDE_PATTERNS = */build/* +EXCLUDE_PATTERNS = */deps_src/* + + # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -1286,7 +1290,7 @@ GENERATE_HTML = YES # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_OUTPUT = OrcaSlicer_Dev_Document +HTML_OUTPUT = internal_docs # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). @@ -1565,7 +1569,7 @@ TOC_EXPAND = NO # protocol see https://www.sitemaps.org # This tag requires that the tag GENERATE_HTML is set to YES. -SITEMAP_URL = +SITEMAP_URL = internals.orcaslicer.com # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that diff --git a/.github/workflows/build_all.yml b/.github/workflows/build_all.yml index 2257133d40..41d489d4d8 100644 --- a/.github/workflows/build_all.yml +++ b/.github/workflows/build_all.yml @@ -93,7 +93,7 @@ jobs: - name: Apt-Install Dependencies uses: ./.github/actions/apt-install-deps - name: Restore Test Artifact - uses: actions/download-artifact@v6 + uses: actions/download-artifact@v7 with: name: ${{ github.sha }}-tests - uses: lukka/get-cmake@latest @@ -105,7 +105,7 @@ jobs: tar -xvf build_tests.tar scripts/run_unit_tests.sh - name: Upload Test Logs - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 if: ${{ failure() }} with: name: unit-test-logs @@ -169,7 +169,7 @@ jobs: arch: ${{ matrix.variant.arch }} upload-artifact: false - name: Upload artifacts Flatpak - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak path: '/__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak' diff --git a/.github/workflows/build_check_cache.yml b/.github/workflows/build_check_cache.yml index 00b5f71ecd..fee5a6e955 100644 --- a/.github/workflows/build_check_cache.yml +++ b/.github/workflows/build_check_cache.yml @@ -41,7 +41,7 @@ jobs: - name: load cache id: cache_deps - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ steps.set_outputs.outputs.cache-path }} key: ${{ steps.set_outputs.outputs.cache-key }} diff --git a/.github/workflows/build_deps.yml b/.github/workflows/build_deps.yml index b255b6abf7..6cec66f24b 100644 --- a/.github/workflows/build_deps.yml +++ b/.github/workflows/build_deps.yml @@ -39,7 +39,7 @@ jobs: lfs: 'true' - name: load cached deps - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ inputs.cache-path }} key: ${{ inputs.cache-key }} @@ -105,14 +105,14 @@ jobs: # Upload Artifacts # - name: Upload Mac ${{ inputs.arch }} artifacts # if: inputs.os == 'macos-14' - # uses: actions/upload-artifact@v5 + # uses: actions/upload-artifact@v6 # with: # name: OrcaSlicer_dep_mac_${{ env.date }} # path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.tar.gz - name: Upload Windows artifacts if: inputs.os == 'windows-latest' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_dep_win64_${{ env.date }} path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.zip @@ -121,7 +121,7 @@ jobs: if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }} env: ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }} - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_dep_ubuntu_${{ env.ubuntu-ver }}_${{ env.date }} path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep_ubuntu_*.tar.gz diff --git a/.github/workflows/build_orca.yml b/.github/workflows/build_orca.yml index aef491f006..131766e49e 100644 --- a/.github/workflows/build_orca.yml +++ b/.github/workflows/build_orca.yml @@ -31,7 +31,7 @@ jobs: lfs: 'true' - name: load cached deps - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ${{ inputs.cache-path }} key: ${{ inputs.cache-key }} @@ -181,14 +181,14 @@ jobs: - name: Upload artifacts mac if: inputs.os == 'macos-14' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_Mac_universal_${{ env.ver }} path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg - name: Upload OrcaSlicer_profile_validator DMG mac if: inputs.os == 'macos-14' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_profile_validator_Mac_universal_DMG_${{ env.ver }} path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg @@ -255,28 +255,28 @@ jobs: - name: Upload artifacts Win zip if: inputs.os == 'windows-latest' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_Windows_${{ env.ver }}_portable path: ${{ github.workspace }}/build/OrcaSlicer - name: Upload artifacts Win installer if: inputs.os == 'windows-latest' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_Windows_${{ env.ver }} path: ${{ github.workspace }}/build/OrcaSlicer*.exe - name: Upload artifacts Win PDB if: inputs.os == 'windows-latest' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: PDB path: ${{ github.workspace }}/build/src/Release/Debug_PDB_${{ env.ver }}_for_developers_only.7z - name: Upload OrcaSlicer_profile_validator Win if: inputs.os == 'windows-latest' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_profile_validator_Windows_${{ env.ver }} path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe @@ -336,7 +336,7 @@ jobs: # and doesn't preserve file permissions - name: Upload Test Artifact if: inputs.os == 'ubuntu-24.04' - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: ${{ github.sha }}-tests overwrite: true @@ -358,7 +358,7 @@ jobs: env: ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }} ubuntu-ver-str: ${{ (inputs.os == 'ubuntu-24.04' && '_Ubuntu2404') || '' }} - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }} path: './build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage' @@ -367,7 +367,7 @@ jobs: if: ${{ ! env.ACT && inputs.os == 'ubuntu-20.04' || inputs.os == 'ubuntu-24.04' }} env: ubuntu-ver: ${{ (inputs.os == 'ubuntu-20.04' && '2004') || (inputs.os == 'ubuntu-24.04' && '2404') || '' }} - uses: actions/upload-artifact@v5 + uses: actions/upload-artifact@v6 with: name: OrcaSlicer_profile_validator_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }} path: './build/src/Release/OrcaSlicer_profile_validator' diff --git a/.github/workflows/doxygen-docs.yml b/.github/workflows/doxygen-docs.yml new file mode 100644 index 0000000000..f30c3e0d0e --- /dev/null +++ b/.github/workflows/doxygen-docs.yml @@ -0,0 +1,78 @@ +name: Generate Doxygen Documentation + +on: + schedule: + - cron: '0 0 * * 1' # Every Monday at midnight UTC + workflow_dispatch: # Manual trigger + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + build-and-deploy: + name: Build and Deploy Docs + runs-on: ubuntu-latest + timeout-minutes: 60 + # Only run on main branch of the main repository + if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' + permissions: + contents: read + steps: + - uses: thejerrybao/setup-swap-space@v1 + with: + swap-space-path: /swapfile + swap-size-gb: 8 + remove-existing-swap-files: true + + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Install Doxygen and Graphviz + run: | + set -euo pipefail + sudo apt-get update + sudo apt-get install -y doxygen graphviz + + - name: Generate documentation + run: | + set -euo pipefail + # Override DOT_NUM_THREADS to avoid parallel dot race condition bug + sed -i 's/^DOT_NUM_THREADS.*/DOT_NUM_THREADS = 1/' .doxygen + doxygen .doxygen + # Verify documentation was generated + if [ ! -f "internal_docs/index.html" ]; then + echo "Error: Documentation generation failed - index.html not found" + exit 1 + fi + - name: Install Rclone + run: | + set -euo pipefail + sudo -v + curl -fsSL https://rclone.org/install.sh | sudo bash + + - name: optimize + run: | + set -euo pipefail + rm -f internal_docs/Nodes.xml internal_docs/Tokens.xml + find internal_docs -name "*.map" -type f -delete || true + find internal_docs -name "*.md5" -type f -delete || true + + - name: upload + # We configure rclone dynamically using environment variables + run: | + set -euo pipefail + # Remove existing config if it exists to avoid conflicts + rclone config delete cloudflare 2>/dev/null || true + rclone config create cloudflare s3 \ + provider Cloudflare \ + access_key_id ${{ secrets.R2_ACCESS_KEY_ID }} \ + secret_access_key ${{ secrets.R2_SECRET_ACCESS_KEY }} \ + endpoint ${{ secrets.R2_ENDPOINT }} + + rclone sync internal_docs/ cloudflare:orcaslicer-internals \ + --progress \ + --transfers 512 \ + --checkers 512 + + echo "Documentation upload completed successfully" \ No newline at end of file diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml index 336636bbcc..d5fe5a35d2 100644 --- a/.github/workflows/shellcheck.yml +++ b/.github/workflows/shellcheck.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Cache shellcheck download id: cache-shellcheck-v0_11 - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/shellcheck key: ${{ runner.os }}-shellcheck-v0_11 diff --git a/.gitignore b/.gitignore index 09abcc8dee..5b369a47fe 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ deps_src/build/ test.js /.cache/ .clangd +internal_docs/ diff --git a/CMakeLists.txt b/CMakeLists.txt index 162763621c..041c7b17cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,7 @@ +if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "4.0") + set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE) +endif() + cmake_minimum_required(VERSION 3.13) # Verify that your CMake version is exactly 3.5 series or higher on windows @@ -571,6 +575,7 @@ endif() if(POLICY CMP0167) cmake_policy(SET CMP0167 NEW) endif() +set(Boost_NO_SYSTEM_PATHS TRUE) find_package(Boost 1.83.0 REQUIRED COMPONENTS system filesystem thread log log_setup locale regex chrono atomic date_time iostreams program_options nowide) add_library(boost_libs INTERFACE) @@ -688,6 +693,10 @@ find_package(PNG REQUIRED) set(OpenGL_GL_PREFERENCE "LEGACY") find_package(OpenGL REQUIRED) +if(APPLE AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + set(OPENGL_LIBRARIES "-framework OpenGL" CACHE STRING "OpenGL framework" FORCE) +endif() + set(GLEW_ROOT "${CMAKE_PREFIX_PATH}") message("GLEW_ROOT: ${GLEW_ROOT}") # Find glew or use bundled version diff --git a/README.md b/README.md index 59fb76034b..afd418ea0a 100644 --- a/README.md +++ b/README.md @@ -44,19 +44,19 @@ If you come across any of these in search results, please report them as # Main features -- **[Advanced Calibration Tools](https://github.com/OrcaSlicer/OrcaSlicer/wiki/Calibration)** +- **[Advanced Calibration Tools](https://www.orcaslicer.com/wiki/Calibration)** Comprehensive suite: temperature towers, flow rate, retraction & more for optimal performance. -- **[Precise Wall](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_precision#precise-wall) and [Seam Control](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_seam)** +- **[Precise Wall](https://www.orcaslicer.com/wiki/quality_settings_precision#precise-wall) and [Seam Control](https://www.orcaslicer.com/wiki/quality_settings_seam)** Adjust outer wall spacing and apply scarf seams to enhance print accuracy. -- **[Sandwich Mode](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_wall_and_surfaces#innerouterinner) and [Polyholes](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_precision#polyholes) Support** - Use varied infill [patterns](https://github.com/OrcaSlicer/OrcaSlicer/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity. -- **[Overhang](https://github.com/OrcaSlicer/OrcaSlicer/wiki/quality_settings_overhangs) and [Support Optimization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#support-settings)** +- **[Sandwich Mode](https://www.orcaslicer.com/wiki/quality_settings_wall_and_surfaces#innerouterinner) and [Polyholes](https://www.orcaslicer.com/wiki/quality_settings_precision#polyholes) Support** + Use varied infill [patterns](https://www.orcaslicer.com/wiki/strength_settings_patterns) and accurate hole shapes for improved clarity. +- **[Overhang](https://www.orcaslicer.com/wiki/quality_settings_overhangs) and [Support Optimization](https://www.orcaslicer.com/wiki#support-settings)** Modify geometry for printable overhangs with precise support placement. -- **[Granular Controls and Customization](https://github.com/OrcaSlicer/OrcaSlicer/wiki#process-settings)** +- **[Granular Controls and Customization](https://www.orcaslicer.com/wiki#process-settings)** Fine-tune print speed, layer height, pressure, and temperature with precision. - **Network Printer Support** Seamless integration with Klipper, PrusaLink, and OctoPrint for remote control. -- **[Mouse Ear Brims](https://github.com/OrcaSlicer/OrcaSlicer/wiki/others_settings_brim) & [Adaptive Bed Mesh](https://github.com/OrcaSlicer/OrcaSlicer/wiki/printer_basic_information_adaptive_bed_mesh)** +- **[Mouse Ear Brims](https://www.orcaslicer.com/wiki/others_settings_brim) & [Adaptive Bed Mesh](https://www.orcaslicer.com/wiki/printer_basic_information_adaptive_bed_mesh)** Automatic brims and adaptive mesh calibration ensure consistent adhesion. - **User-Friendly Interface** Intuitive drag-and-drop design with pre-made profiles for popular printers. @@ -68,10 +68,10 @@ If you come across any of these in search results, please report them as # Wiki -The [wiki](https://github.com/OrcaSlicer/OrcaSlicer/wiki) aims to provide a detailed explanation of the slicer settings, including how to maximize their use and how to calibrate and set up your printer. +The [wiki](https://www.orcaslicer.com/wiki) aims to provide a detailed explanation of the slicer settings, including how to maximize their use and how to calibrate and set up your printer. -- **[Access the wiki here](https://github.com/OrcaSlicer/OrcaSlicer/wiki)** -- **[Contribute to the wiki](https://github.com/OrcaSlicer/OrcaSlicer/wiki/How-to-wiki)** +- **[Access the wiki here](https://www.orcaslicer.com/wiki)** +- **[Contribute to the wiki](https://www.orcaslicer.com/wiki/How-to-wiki)** # Download @@ -144,7 +144,7 @@ winget install --id=SoftFever.OrcaSlicer -e # How to Compile -All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://github.com/OrcaSlicer/OrcaSlicer/wiki/How-to-build) page. +All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://www.orcaslicer.com/wiki/How-to-build) page. Please refer to the wiki to ensure you're following the latest and most accurate steps for your platform. diff --git a/build_release_macos.sh b/build_release_macos.sh index e42490f1bd..1999c62b92 100755 --- a/build_release_macos.sh +++ b/build_release_macos.sh @@ -3,7 +3,7 @@ set -e set -o pipefail -while getopts ":dpa:snt:xbc:1h" opt; do +while getopts ":dpa:snt:xbc:1Th" opt; do case "${opt}" in d ) export BUILD_TARGET="deps" @@ -37,6 +37,9 @@ while getopts ":dpa:snt:xbc:1h" opt; do 1 ) export CMAKE_BUILD_PARALLEL_LEVEL=1 ;; + T ) + export BUILD_TESTS="1" + ;; h ) echo "Usage: ./build_release_macos.sh [-d]" echo " -d: Build deps only" echo " -a: Set ARCHITECTURE (arm64 or x86_64 or universal)" @@ -47,6 +50,7 @@ while getopts ":dpa:snt:xbc:1h" opt; do echo " -b: Build without reconfiguring CMake" echo " -c: Set CMake build configuration, default is Release" echo " -1: Use single job for building" + echo " -T: Build and run tests" exit 0 ;; * ) @@ -85,6 +89,15 @@ if [ -z "$OSX_DEPLOYMENT_TARGET" ]; then export OSX_DEPLOYMENT_TARGET="11.3" fi +CMAKE_VERSION=$(cmake --version | head -1 | sed 's/[^0-9]*\([0-9]*\).*/\1/') +if [ "$CMAKE_VERSION" -ge 4 ] 2>/dev/null; then + export CMAKE_POLICY_VERSION_MINIMUM=3.5 + export CMAKE_POLICY_COMPAT="-DCMAKE_POLICY_VERSION_MINIMUM=3.5" + echo "Detected CMake 4.x, adding compatibility flag (env + cmake arg)" +else + export CMAKE_POLICY_COMPAT="" +fi + echo "Build params:" echo " - ARCH: $ARCH" echo " - BUILD_CONFIG: $BUILD_CONFIG" @@ -133,7 +146,8 @@ function build_deps() { -G "${DEPS_CMAKE_GENERATOR}" \ -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ -DCMAKE_OSX_ARCHITECTURES:STRING="${_ARCH}" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" + -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" \ + ${CMAKE_POLICY_COMPAT} fi cmake --build . --config "$BUILD_CONFIG" --target deps ) @@ -170,13 +184,24 @@ function build_slicer() { -G "${SLICER_CMAKE_GENERATOR}" \ -DORCA_TOOLS=ON \ ${ORCA_UPDATER_SIG_KEY:+-DORCA_UPDATER_SIG_KEY="$ORCA_UPDATER_SIG_KEY"} \ + ${BUILD_TESTS:+-DBUILD_TESTS=ON} \ -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" \ -DCMAKE_OSX_ARCHITECTURES="${_ARCH}" \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" + -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" \ + ${CMAKE_POLICY_COMPAT} fi cmake --build . --config "$BUILD_CONFIG" --target "$SLICER_BUILD_TARGET" ) + if [ "1." == "$BUILD_TESTS". ]; then + echo "Running tests for $_ARCH..." + ( + set -x + cd "$PROJECT_BUILD_DIR" + ctest --build-config "$BUILD_CONFIG" --output-on-failure + ) + fi + echo "Verify localization with gettext..." ( cd "$PROJECT_DIR" diff --git a/cmake/modules/FindGLEW.cmake b/cmake/modules/FindGLEW.cmake index 56661ffd33..5dd7b24df1 100644 --- a/cmake/modules/FindGLEW.cmake +++ b/cmake/modules/FindGLEW.cmake @@ -223,8 +223,13 @@ if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS) PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") if(APPLE) - set_target_properties(GLEW::glew - PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + set_target_properties(GLEW::glew + PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL") + else() + set_target_properties(GLEW::glew + PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + endif() endif() if(GLEW_SHARED_LIBRARY_RELEASE) @@ -258,8 +263,13 @@ elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS) set_target_properties(GLEW::glew_s PROPERTIES INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) if(APPLE) - set_target_properties(GLEW::glew_s - PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + set_target_properties(GLEW::glew_s + PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL") + else() + set_target_properties(GLEW::glew_s + PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + endif() endif() if(GLEW_STATIC_LIBRARY_RELEASE) @@ -292,8 +302,13 @@ if(NOT TARGET GLEW::GLEW) PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") if(APPLE) - set_target_properties(GLEW::GLEW - PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + set_target_properties(GLEW::GLEW + PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL") + else() + set_target_properties(GLEW::GLEW + PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + endif() endif() if(TARGET GLEW::glew) diff --git a/deps/CGAL/0001-clang19.patch b/deps/CGAL/0001-clang19.patch deleted file mode 100644 index 92a0293735..0000000000 --- a/deps/CGAL/0001-clang19.patch +++ /dev/null @@ -1,59 +0,0 @@ ---- a/BGL/include/CGAL/boost/graph/iterator.h 2022-10-07 19:04:41 UTC -+++ b/BGL/include/CGAL/boost/graph/iterator.h -@@ -213,18 +213,7 @@ class Halfedge_around_source_iterator { (public) - {} - - #ifndef DOXYGEN_RUNNING -- // design patter: "safe bool" -- // will be replaced by explicit operator bool with C++11 -- typedef void (Halfedge_around_source_iterator::*bool_type)() const; - -- void this_type_does_not_support_comparisons() const {} -- -- operator bool_type() const -- { -- return (! (this->base() == nullptr)) ? -- &Halfedge_around_source_iterator::this_type_does_not_support_comparisons : 0; -- } -- - bool operator==( const Self& i) const { - CGAL_assertion( anchor == anchor); - return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding); -@@ -313,18 +302,7 @@ class Halfedge_around_target_iterator { (public) - {} - - #ifndef DOXYGEN_RUNNING -- // design patter: "safe bool" -- // will be replaced by explicit operator bool with C++11 -- typedef void (Halfedge_around_target_iterator::*bool_type)() const; - -- void this_type_does_not_support_comparisons() const {} -- -- operator bool_type() const -- { -- return (! (this->base() == nullptr)) ? -- &Halfedge_around_target_iterator::this_type_does_not_support_comparisons : 0; -- } -- - bool operator==( const Self& i) const { - CGAL_assertion( anchor == anchor); - return ( g == i.g) && ( pos == i.pos) && ( winding == i.winding); -@@ -411,18 +389,6 @@ class Halfedge_around_face_iterator { (public) - const value_type& operator * ( ) const { return pos; } - pointer operator -> ( ) { return &pos; } - const value_type* operator -> ( ) const { return &pos; } -- -- // design patter: "safe bool" -- // will be replaced by explicit operator bool with C++11 -- typedef void (Halfedge_around_face_iterator::*bool_type)() const; -- -- void this_type_does_not_support_comparisons() const {} -- -- operator bool_type() const -- { -- return (! (this->base() == nullptr)) ? -- &Halfedge_around_face_iterator::this_type_does_not_support_comparisons : 0; -- } - - bool operator==( const Self& i) const { - CGAL_assertion( anchor == anchor); diff --git a/deps/CGAL/CGAL.cmake b/deps/CGAL/CGAL.cmake index 73eee6701b..ec77e0ebae 100644 --- a/deps/CGAL/CGAL.cmake +++ b/deps/CGAL/CGAL.cmake @@ -5,11 +5,10 @@ endif () orcaslicer_add_cmake_project( CGAL # GIT_REPOSITORY https://github.com/CGAL/cgal.git - # GIT_TAG bec70a6d52d8aacb0b3d82a7b4edc3caa899184b # releases/CGAL-5.0 + # GIT_TAG 3654f780ae0c64675cabaef0e5ddaf904c48b4b7 # releases/CGAL-5.6.3 # For whatever reason, this keeps downloading forever (repeats downloads if finished) - URL https://github.com/CGAL/cgal/archive/refs/tags/v5.4.zip - URL_HASH SHA256=d7605e0a5a5ca17da7547592f6f6e4a59430a0bc861948974254d0de43eab4c0 - PATCH_COMMAND git apply ${CGAL_DIRECTORY_FLAG} --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-clang19.patch + URL https://github.com/CGAL/cgal/releases/download/v5.6.3/CGAL-5.6.3.zip + URL_HASH SHA256=5d577acb4a9918ccb960491482da7a3838f8d363aff47e14d703f19fd84733d4 DEPENDS dep_Boost dep_GMP dep_MPFR ) diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 13f3945d0c..92e36d0cad 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -1,3 +1,7 @@ +if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "4.0") + set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE) +endif() + # # This CMake project downloads, configures and builds OrcaSlicer dependencies on Unix and Windows. # @@ -177,6 +181,7 @@ if (NOT IS_CROSS_COMPILE OR NOT APPLE) DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname} ${_gen} CMAKE_ARGS + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR} -DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules -DCMAKE_PREFIX_PATH:STRING=${DESTDIR} @@ -221,6 +226,7 @@ else() DOWNLOAD_DIR ${DEP_DOWNLOAD_DIR}/${projectname} ${_gen} CMAKE_ARGS + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR} -DCMAKE_PREFIX_PATH:STRING=${DESTDIR} -DBUILD_SHARED_LIBS:BOOL=OFF diff --git a/deps/Qhull/Qhull.cmake b/deps/Qhull/Qhull.cmake index 9376700428..97667021c0 100644 --- a/deps/Qhull/Qhull.cmake +++ b/deps/Qhull/Qhull.cmake @@ -1,11 +1,11 @@ include(GNUInstallDirs) orcaslicer_add_cmake_project(Qhull - URL "https://github.com/qhull/qhull/archive/v8.0.1.zip" - URL_HASH SHA256=5287f5edd6a0372588f5d6640799086a4033d89d19711023ef8229dd9301d69b + URL "https://github.com/qhull/qhull/archive/v8.0.2.zip" + URL_HASH SHA256=a378e9a39e718e289102c20d45632f873bfdc58a7a5f924246ea4b176e185f1e CMAKE_ARGS -DINCLUDE_INSTALL_DIR=${CMAKE_INSTALL_INCLUDEDIR} ) if (MSVC) add_debug_dep(dep_Qhull) -endif () \ No newline at end of file +endif () diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake index e45979fb42..3a52d14198 100644 --- a/deps/wxWidgets/wxWidgets.cmake +++ b/deps/wxWidgets/wxWidgets.cmake @@ -24,6 +24,14 @@ else () set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF") endif () +set(_wx_opengl_override "") +if(APPLE AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + set(_wx_opengl_override + -DOPENGL_gl_LIBRARY="-framework OpenGL" + -DOPENGL_glu_LIBRARY="-framework OpenGL" + ) +endif() + orcaslicer_add_cmake_project( wxWidgets GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets" @@ -31,6 +39,7 @@ orcaslicer_add_cmake_project( DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG} ${_wx_flatpak_patch} CMAKE_ARGS + ${_wx_opengl_override} -DwxBUILD_PRECOMP=ON ${_wx_toolkit} "-DCMAKE_DEBUG_POSTFIX:STRING=${_wx_debug_postfix}" diff --git a/deps_src/CMakeLists.txt b/deps_src/CMakeLists.txt index 5c4e62b99f..390cffad30 100644 --- a/deps_src/CMakeLists.txt +++ b/deps_src/CMakeLists.txt @@ -10,13 +10,13 @@ add_subdirectory(earcut) add_subdirectory(fast_float) add_subdirectory(nanosvg) add_subdirectory(nlohmann) -add_subdirectory(spline) # Header-only spline library add_subdirectory(stb_dxt) # Header-only STB DXT compression library # Static libraries add_subdirectory(Shiny) add_subdirectory(admesh) add_subdirectory(clipper) +add_subdirectory(clipper2) add_subdirectory(expat) add_subdirectory(glu-libtess) add_subdirectory(hidapi) diff --git a/deps_src/README_CMAKE_INTERFACES.md b/deps_src/README_CMAKE_INTERFACES.md index 78a806fc0b..6ab88c63af 100644 --- a/deps_src/README_CMAKE_INTERFACES.md +++ b/deps_src/README_CMAKE_INTERFACES.md @@ -24,18 +24,7 @@ target_link_libraries(your_target PRIVATE semver::semver) target_link_libraries(your_target PRIVATE hints) ``` -### 3. **spline** (Interface Library) -- **Type**: Interface library (header-only) -- **Target**: `spline` or `spline::spline` -- **Headers**: `spline.h` -- **Usage**: -```cmake -target_link_libraries(your_target PRIVATE spline) -# or -target_link_libraries(your_target PRIVATE spline::spline) -``` - -### 4. **stb_dxt** (Interface Library) +### 3. **stb_dxt** (Interface Library) - **Type**: Interface library (header-only) - **Target**: `stb_dxt` or `stb_dxt::stb_dxt` - **Headers**: `stb_dxt.h` @@ -53,10 +42,9 @@ target_link_libraries(your_target PRIVATE stb_dxt::stb_dxt) 1. **In your CMakeLists.txt**, simply link the library: ```cmake add_executable(my_app main.cpp) -target_link_libraries(my_app - PRIVATE +target_link_libraries(my_app + PRIVATE semver::semver # For version parsing - spline::spline # For spline interpolation stb_dxt::stb_dxt # For DXT texture compression hints # For hints functionality ) @@ -67,9 +55,6 @@ target_link_libraries(my_app // For semver #include -// For spline -#include - // For stb_dxt #include @@ -100,7 +85,6 @@ target_link_libraries(mycomponent PUBLIC semver::semver # Version handling is part of public API PRIVATE - spline::spline # Used internally for interpolation stb_dxt::stb_dxt # Used internally for texture compression ) diff --git a/src/clipper2/CMakeLists.txt b/deps_src/clipper2/CMakeLists.txt similarity index 100% rename from src/clipper2/CMakeLists.txt rename to deps_src/clipper2/CMakeLists.txt diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.core.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.core.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.core.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.core.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.engine.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.engine.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.engine.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.engine.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.export.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.export.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.export.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.export.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.minkowski.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.minkowski.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.minkowski.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.minkowski.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.offset.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.offset.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.offset.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.offset.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.rectclip.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.rectclip.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.rectclip.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.rectclip.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper.version.h b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.version.h similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper.version.h rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper.version.h diff --git a/src/clipper2/Clipper2Lib/include/clipper2/clipper2_z.hpp b/deps_src/clipper2/Clipper2Lib/include/clipper2/clipper2_z.hpp similarity index 100% rename from src/clipper2/Clipper2Lib/include/clipper2/clipper2_z.hpp rename to deps_src/clipper2/Clipper2Lib/include/clipper2/clipper2_z.hpp diff --git a/src/clipper2/Clipper2Lib/src/clipper.engine.cpp b/deps_src/clipper2/Clipper2Lib/src/clipper.engine.cpp similarity index 100% rename from src/clipper2/Clipper2Lib/src/clipper.engine.cpp rename to deps_src/clipper2/Clipper2Lib/src/clipper.engine.cpp diff --git a/src/clipper2/Clipper2Lib/src/clipper.offset.cpp b/deps_src/clipper2/Clipper2Lib/src/clipper.offset.cpp similarity index 100% rename from src/clipper2/Clipper2Lib/src/clipper.offset.cpp rename to deps_src/clipper2/Clipper2Lib/src/clipper.offset.cpp diff --git a/src/clipper2/Clipper2Lib/src/clipper.rectclip.cpp b/deps_src/clipper2/Clipper2Lib/src/clipper.rectclip.cpp similarity index 100% rename from src/clipper2/Clipper2Lib/src/clipper.rectclip.cpp rename to deps_src/clipper2/Clipper2Lib/src/clipper.rectclip.cpp diff --git a/src/clipper2/Clipper2Lib/src/clipper2_z.cpp b/deps_src/clipper2/Clipper2Lib/src/clipper2_z.cpp similarity index 100% rename from src/clipper2/Clipper2Lib/src/clipper2_z.cpp rename to deps_src/clipper2/Clipper2Lib/src/clipper2_z.cpp diff --git a/deps_src/spline/CMakeLists.txt b/deps_src/spline/CMakeLists.txt deleted file mode 100644 index ee6d5c9cb3..0000000000 --- a/deps_src/spline/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -cmake_minimum_required(VERSION 3.13) -project(spline) - -# Create interface library for spline (header-only library) -add_library(spline INTERFACE) - -# Set include directories for the interface library -target_include_directories(spline SYSTEM - INTERFACE - $ - $ -) - -# Add compile features -target_compile_features(spline INTERFACE cxx_std_11) - -# Create an alias for consistent naming -add_library(spline::spline ALIAS spline) - -# Install headers if needed -install(FILES - spline.h - DESTINATION include/spline -) - -# Install the interface library -install(TARGETS spline - EXPORT splineTargets - INCLUDES DESTINATION include -) - -# Export the targets -install(EXPORT splineTargets - FILE splineTargets.cmake - NAMESPACE spline:: - DESTINATION lib/cmake/spline -) diff --git a/deps_src/spline/spline.h b/deps_src/spline/spline.h deleted file mode 100644 index 4b1ddd6134..0000000000 --- a/deps_src/spline/spline.h +++ /dev/null @@ -1,944 +0,0 @@ -/* - * spline.h - * - * simple cubic spline interpolation library without external - * dependencies - * - * --------------------------------------------------------------------- - * Copyright (C) 2011, 2014, 2016, 2021 Tino Kluge (ttk448 at gmail.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * --------------------------------------------------------------------- - * - */ - - -#ifndef TK_SPLINE_H -#define TK_SPLINE_H - -#include -#include -#include -#include -#include -#ifdef HAVE_SSTREAM -#include -#include -#endif // HAVE_SSTREAM - -// not ideal but disable unused-function warnings -// (we get them because we have implementations in the header file, -// and this is because we want to be able to quickly separate them -// into a cpp file if necessary) -#if !defined(_MSC_VER) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-function" -#endif - -namespace tk -{ - -// spline interpolation -class spline -{ -public: - // spline types - enum spline_type { - linear = 10, // linear interpolation - cspline = 30, // cubic splines (classical C^2) - cspline_hermite = 31 // cubic hermite splines (local, only C^1) - }; - - // boundary condition type for the spline end-points - enum bd_type { - first_deriv = 1, - second_deriv = 2, - not_a_knot = 3 - }; - -protected: - std::vector m_x,m_y; // x,y coordinates of points - // interpolation parameters - // f(x) = a_i + b_i*(x-x_i) + c_i*(x-x_i)^2 + d_i*(x-x_i)^3 - // where a_i = y_i, or else it won't go through grid points - std::vector m_b,m_c,m_d; // spline coefficients - double m_c0; // for left extrapolation - spline_type m_type; - bd_type m_left, m_right; - double m_left_value, m_right_value; - bool m_made_monotonic; - void set_coeffs_from_b(); // calculate c_i, d_i from b_i - size_t find_closest(double x) const; // closest idx so that m_x[idx]<=x - -public: - // default constructor: set boundary condition to be zero curvature - // at both ends, i.e. natural splines - spline(): m_type(cspline), - m_left(second_deriv), m_right(second_deriv), - m_left_value(0.0), m_right_value(0.0), m_made_monotonic(false) - { - ; - } - spline(const std::vector& X, const std::vector& Y, - spline_type type = cspline, - bool make_monotonic = false, - bd_type left = second_deriv, double left_value = 0.0, - bd_type right = second_deriv, double right_value = 0.0 - ): - m_type(type), - m_left(left), m_right(right), - m_left_value(left_value), m_right_value(right_value), - m_made_monotonic(false) // false correct here: make_monotonic() sets it - { - this->set_points(X,Y,m_type); - if(make_monotonic) { - this->make_monotonic(); - } - } - - - // modify boundary conditions: if called it must be before set_points() - void set_boundary(bd_type left, double left_value, - bd_type right, double right_value); - - // set all data points (cubic_spline=false means linear interpolation) - void set_points(const std::vector& x, - const std::vector& y, - spline_type type=cspline); - - // adjust coefficients so that the spline becomes piecewise monotonic - // where possible - // this is done by adjusting slopes at grid points by a non-negative - // factor and this will break C^2 - // this can also break boundary conditions if adjustments need to - // be made at the boundary points - // returns false if no adjustments have been made, true otherwise - bool make_monotonic(); - - // evaluates the spline at point x - double operator() (double x) const; - double deriv(int order, double x) const; - - // solves for all x so that: spline(x) = y - std::vector solve(double y, bool ignore_extrapolation=true) const; - - // returns the input data points - std::vector get_x() const { return m_x; } - std::vector get_y() const { return m_y; } - double get_x_min() const { assert(!m_x.empty()); return m_x.front(); } - double get_x_max() const { assert(!m_x.empty()); return m_x.back(); } - -#ifdef HAVE_SSTREAM - // spline info string, i.e. spline type, boundary conditions etc. - std::string info() const; -#endif // HAVE_SSTREAM - -}; - - - -namespace internal -{ - -// band matrix solver -class band_matrix -{ -private: - std::vector< std::vector > m_upper; // upper band - std::vector< std::vector > m_lower; // lower band -public: - band_matrix() {}; // constructor - band_matrix(int dim, int n_u, int n_l); // constructor - ~band_matrix() {}; // destructor - void resize(int dim, int n_u, int n_l); // init with dim,n_u,n_l - int dim() const; // matrix dimension - int num_upper() const - { - return (int)m_upper.size()-1; - } - int num_lower() const - { - return (int)m_lower.size()-1; - } - // access operator - double & operator () (int i, int j); // write - double operator () (int i, int j) const; // read - // we can store an additional diagonal (in m_lower) - double& saved_diag(int i); - double saved_diag(int i) const; - void lu_decompose(); - std::vector r_solve(const std::vector& b) const; - std::vector l_solve(const std::vector& b) const; - std::vector lu_solve(const std::vector& b, - bool is_lu_decomposed=false); - -}; - -double get_eps(); - -std::vector solve_cubic(double a, double b, double c, double d, - int newton_iter=0); - -} // namespace internal - - - - -// --------------------------------------------------------------------- -// implementation part, which could be separated into a cpp file -// --------------------------------------------------------------------- - -// spline implementation -// ----------------------- - -void spline::set_boundary(spline::bd_type left, double left_value, - spline::bd_type right, double right_value) -{ - assert(m_x.size()==0); // set_points() must not have happened yet - m_left=left; - m_right=right; - m_left_value=left_value; - m_right_value=right_value; -} - - -void spline::set_coeffs_from_b() -{ - assert(m_x.size()==m_y.size()); - assert(m_x.size()==m_b.size()); - assert(m_x.size()>2); - size_t n=m_b.size(); - if(m_c.size()!=n) - m_c.resize(n); - if(m_d.size()!=n) - m_d.resize(n); - - for(size_t i=0; i& x, - const std::vector& y, - spline_type type) -{ - assert(x.size()==y.size()); - assert(x.size()>=3); - // not-a-knot with 3 points has many solutions - if(m_left==not_a_knot || m_right==not_a_knot) - assert(x.size()>=4); - m_type=type; - m_made_monotonic=false; - m_x=x; - m_y=y; - int n = (int) x.size(); - // check strict monotonicity of input vector x - for(int i=0; i rhs(n); - for(int i=1; i2); - bool modified = false; - const int n=(int)m_x.size(); - // make sure: input data monotonic increasing --> b_i>=0 - // input data monotonic decreasing --> b_i<=0 - for(int i=0; i=m_y[i]) && (m_y[i]>=m_y[ip1]) && m_b[i]>0.0) ) { - modified=true; - m_b[i]=0.0; - } - } - // if input data is monotonic (b[i], b[i+1], avg have all the same sign) - // ensure a sufficient criteria for monotonicity is satisfied: - // sqrt(b[i]^2+b[i+1]^2) <= 3 |avg|, with avg=(y[i+1]-y[i])/h, - for(int i=0; i=0.0 && m_b[i+1]>=0.0 && avg>0.0) || - (m_b[i]<=0.0 && m_b[i+1]<=0.0 && avg<0.0) ) { - // input data is monotonic - double r = sqrt(m_b[i]*m_b[i]+m_b[i+1]*m_b[i+1])/std::fabs(avg); - if(r>3.0) { - // sufficient criteria for monotonicity: r<=3 - // adjust b[i] and b[i+1] - modified=true; - m_b[i] *= (3.0/r); - m_b[i+1] *= (3.0/r); - } - } - } - - if(modified==true) { - set_coeffs_from_b(); - m_made_monotonic=true; - } - - return modified; -} - -// return the closest idx so that m_x[idx] <= x (return 0 if x::const_iterator it; - it=std::upper_bound(m_x.begin(),m_x.end(),x); // *it > x - size_t idx = std::max( int(it-m_x.begin())-1, 0); // m_x[idx] <= x - return idx; -} - -double spline::operator() (double x) const -{ - // polynomial evaluation using Horner's scheme - // TODO: consider more numerically accurate algorithms, e.g.: - // - Clenshaw - // - Even-Odd method by A.C.R. Newbery - // - Compensated Horner Scheme - size_t n=m_x.size(); - size_t idx=find_closest(x); - - double h=x-m_x[idx]; - double interpol; - if(xm_x[n-1]) { - // extrapolation to the right - interpol=(m_c[n-1]*h + m_b[n-1])*h + m_y[n-1]; - } else { - // interpolation - interpol=((m_d[idx]*h + m_c[idx])*h + m_b[idx])*h + m_y[idx]; - } - return interpol; -} - -double spline::deriv(int order, double x) const -{ - assert(order>0); - size_t n=m_x.size(); - size_t idx = find_closest(x); - - double h=x-m_x[idx]; - double interpol; - if(xm_x[n-1]) { - // extrapolation to the right - switch(order) { - case 1: - interpol=2.0*m_c[n-1]*h + m_b[n-1]; - break; - case 2: - interpol=2.0*m_c[n-1]; - break; - default: - interpol=0.0; - break; - } - } else { - // interpolation - switch(order) { - case 1: - interpol=(3.0*m_d[idx]*h + 2.0*m_c[idx])*h + m_b[idx]; - break; - case 2: - interpol=6.0*m_d[idx]*h + 2.0*m_c[idx]; - break; - case 3: - interpol=6.0*m_d[idx]; - break; - default: - interpol=0.0; - break; - } - } - return interpol; -} - -std::vector spline::solve(double y, bool ignore_extrapolation) const -{ - std::vector x; // roots for the entire spline - std::vector root; // roots for each piecewise cubic - const size_t n=m_x.size(); - - // left extrapolation - if(ignore_extrapolation==false) { - root = internal::solve_cubic(m_y[0]-y,m_b[0],m_c0,0.0,1); - for(size_t j=0; j0) ? (m_x[i]-m_x[i-1]) : 0.0; - double eps = internal::get_eps()*512.0*std::min(h,1.0); - if( (-eps<=root[j]) && (root[j]0 && x.back()+eps > new_root) { - x.back()=new_root; // avoid spurious duplicate roots - } else { - x.push_back(new_root); - } - } - } - } - - // right extrapolation - if(ignore_extrapolation==false) { - root = internal::solve_cubic(m_y[n-1]-y,m_b[n-1],m_c[n-1],0.0,1); - for(size_t j=0; j0); - assert(n_u>=0); - assert(n_l>=0); - m_upper.resize(n_u+1); - m_lower.resize(n_l+1); - for(size_t i=0; i0) { - return (int)m_upper[0].size(); - } else { - return 0; - } -} - - -// defines the new operator (), so that we can access the elements -// by A(i,j), index going from i=0,...,dim()-1 -double & band_matrix::operator () (int i, int j) -{ - int k=j-i; // what band is the entry - assert( (i>=0) && (i=0) && (j diagonal, k<0 lower left part, k>0 upper right part - if(k>=0) return m_upper[k][i]; - else return m_lower[-k][i]; -} -double band_matrix::operator () (int i, int j) const -{ - int k=j-i; // what band is the entry - assert( (i>=0) && (i=0) && (j diagonal, k<0 lower left part, k>0 upper right part - if(k>=0) return m_upper[k][i]; - else return m_lower[-k][i]; -} -// second diag (used in LU decomposition), saved in m_lower -double band_matrix::saved_diag(int i) const -{ - assert( (i>=0) && (i=0) && (idim(); i++) { - assert(this->operator()(i,i)!=0.0); - this->saved_diag(i)=1.0/this->operator()(i,i); - j_min=std::max(0,i-this->num_lower()); - j_max=std::min(this->dim()-1,i+this->num_upper()); - for(int j=j_min; j<=j_max; j++) { - this->operator()(i,j) *= this->saved_diag(i); - } - this->operator()(i,i)=1.0; // prevents rounding errors - } - - // Gauss LR-Decomposition - for(int k=0; kdim(); k++) { - i_max=std::min(this->dim()-1,k+this->num_lower()); // num_lower not a mistake! - for(int i=k+1; i<=i_max; i++) { - assert(this->operator()(k,k)!=0.0); - x=-this->operator()(i,k)/this->operator()(k,k); - this->operator()(i,k)=-x; // assembly part of L - j_max=std::min(this->dim()-1,k+this->num_upper()); - for(int j=k+1; j<=j_max; j++) { - // assembly part of R - this->operator()(i,j)=this->operator()(i,j)+x*this->operator()(k,j); - } - } - } -} -// solves Ly=b -std::vector band_matrix::l_solve(const std::vector& b) const -{ - assert( this->dim()==(int)b.size() ); - std::vector x(this->dim()); - int j_start; - double sum; - for(int i=0; idim(); i++) { - sum=0; - j_start=std::max(0,i-this->num_lower()); - for(int j=j_start; joperator()(i,j)*x[j]; - x[i]=(b[i]*this->saved_diag(i)) - sum; - } - return x; -} -// solves Rx=y -std::vector band_matrix::r_solve(const std::vector& b) const -{ - assert( this->dim()==(int)b.size() ); - std::vector x(this->dim()); - int j_stop; - double sum; - for(int i=this->dim()-1; i>=0; i--) { - sum=0; - j_stop=std::min(this->dim()-1,i+this->num_upper()); - for(int j=i+1; j<=j_stop; j++) sum += this->operator()(i,j)*x[j]; - x[i]=( b[i] - sum ) / this->operator()(i,i); - } - return x; -} - -std::vector band_matrix::lu_solve(const std::vector& b, - bool is_lu_decomposed) -{ - assert( this->dim()==(int)b.size() ); - std::vector x,y; - if(is_lu_decomposed==false) { - this->lu_decompose(); - } - y=this->l_solve(b); - x=this->r_solve(y); - return x; -} - -// machine precision of a double, i.e. the successor of 1 is 1+eps -double get_eps() -{ - //return std::numeric_limits::epsilon(); // __DBL_EPSILON__ - return 2.2204460492503131e-16; // 2^-52 -} - -// solutions for a + b*x = 0 -std::vector solve_linear(double a, double b) -{ - std::vector x; // roots - if(b==0.0) { - if(a==0.0) { - // 0*x = 0 - x.resize(1); - x[0] = 0.0; // any x solves it but we need to pick one - return x; - } else { - // 0*x + ... = 0, no solution - return x; - } - } else { - x.resize(1); - x[0] = -a/b; - return x; - } -} - -// solutions for a + b*x + c*x^2 = 0 -std::vector solve_quadratic(double a, double b, double c, - int newton_iter=0) -{ - if(c==0.0) { - return solve_linear(a,b); - } - // rescale so that we solve x^2 + 2p x + q = (x+p)^2 + q - p^2 = 0 - double p=0.5*b/c; - double q=a/c; - double discr = p*p-q; - const double eps=0.5*internal::get_eps(); - double discr_err = (6.0*(p*p)+3.0*fabs(q)+fabs(discr))*eps; - - std::vector x; // roots - if(fabs(discr)<=discr_err) { - // discriminant is zero --> one root - x.resize(1); - x[0] = -p; - } else if(discr<0) { - // no root - } else { - // two roots - x.resize(2); - x[0] = -p - sqrt(discr); - x[1] = -p + sqrt(discr); - } - - // improve solution via newton steps - for(size_t i=0; i1e-8) { - x[i] -= f/f1; - } - } - } - - return x; -} - -// solutions for the cubic equation: a + b*x +c*x^2 + d*x^3 = 0 -// this is a naive implementation of the analytic solution without -// optimisation for speed or numerical accuracy -// newton_iter: number of newton iterations to improve analytical solution -// see also -// gsl: gsl_poly_solve_cubic() in solve_cubic.c -// octave: roots.m - via eigenvalues of the Frobenius companion matrix -std::vector solve_cubic(double a, double b, double c, double d, - int newton_iter) -{ - if(d==0.0) { - return solve_quadratic(a,b,c,newton_iter); - } - - // convert to normalised form: a + bx + cx^2 + x^3 = 0 - if(d!=1.0) { - a/=d; - b/=d; - c/=d; - } - - // convert to depressed cubic: z^3 - 3pz - 2q = 0 - // via substitution: z = x + c/3 - std::vector z; // roots of the depressed cubic - double p = -(1.0/3.0)*b + (1.0/9.0)*(c*c); - double r = 2.0*(c*c)-9.0*b; - double q = -0.5*a - (1.0/54.0)*(c*r); - double discr=p*p*p-q*q; // discriminant - // calculating numerical round-off errors with assumptions: - // - each operation is precise but each intermediate result x - // when stored has max error of x*eps - // - only multiplication with a power of 2 introduces no new error - // - a,b,c,d and some fractions (e.g. 1/3) have rounding errors eps - // - p_err << |p|, q_err << |q|, ... (this is violated in rare cases) - // would be more elegant to use boost::numeric::interval - const double eps = internal::get_eps(); - double p_err = eps*((3.0/3.0)*fabs(b)+(4.0/9.0)*(c*c)+fabs(p)); - double r_err = eps*(6.0*(c*c)+18.0*fabs(b)+fabs(r)); - double q_err = 0.5*fabs(a)*eps + (1.0/54.0)*fabs(c)*(r_err+fabs(r)*3.0*eps) - + fabs(q)*eps; - double discr_err = (p*p) * (3.0*p_err + fabs(p)*2.0*eps) - + fabs(q) * (2.0*q_err + fabs(q)*eps) + fabs(discr)*eps; - - // depending on the discriminant we get different solutions - if(fabs(discr)<=discr_err) { - // discriminant zero: one or two real roots - if(fabs(p)<=p_err) { - // p and q are zero: single root - z.resize(1); - z[0] = 0.0; // triple root - } else { - z.resize(2); - z[0] = 2.0*q/p; // single root - z[1] = -0.5*z[0]; // double root - } - } else if(discr>0) { - // three real roots: via trigonometric solution - z.resize(3); - double ac = (1.0/3.0) * acos( q/(p*sqrt(p)) ); - double sq = 2.0*sqrt(p); - z[0] = sq * cos(ac); - z[1] = sq * cos(ac-2.0*M_PI/3.0); - z[2] = sq * cos(ac-4.0*M_PI/3.0); - } else if (discr<0.0) { - // single real root: via Cardano's fromula - z.resize(1); - double sgnq = (q >= 0 ? 1 : -1); - double basis = fabs(q) + sqrt(-discr); - double C = sgnq * pow(basis, 1.0/3.0); // c++11 has std::cbrt() - z[0] = C + p/C; - } - for(size_t i=0; i1e-8) { - z[i] -= f/f1; - } - } - } - // ensure if a=0 we get exactly x=0 as root - // TODO: remove this fudge - if(a==0.0) { - assert(z.size()>0); // cubic should always have at least one root - double xmin=fabs(z[0]); - size_t imin=0; - for(size_t i=1; ifabs(z[i])) { - xmin=fabs(z[i]); - imin=i; - } - } - z[imin]=0.0; // replace the smallest absolute value with 0 - } - std::sort(z.begin(), z.end()); - return z; -} - - -} // namespace internal - - -} // namespace tk - - -#if !defined(_MSC_VER) -#pragma GCC diagnostic pop -#endif - -#endif /* TK_SPLINE_H */ diff --git a/localization/i18n/OrcaSlicer.pot b/localization/i18n/OrcaSlicer.pot index accaf4ea66..4901a6b7a5 100644 --- a/localization/i18n/OrcaSlicer.pot +++ b/localization/i18n/OrcaSlicer.pot @@ -11108,6 +11108,19 @@ msgid "" "easily." msgstr "" +msgid "Brim follows compensated outline" +msgstr "" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" + msgid "Brim ears" msgstr "" diff --git a/localization/i18n/ca/OrcaSlicer_ca.po b/localization/i18n/ca/OrcaSlicer_ca.po index cfb35a2480..d29d05b06b 100644 --- a/localization/i18n/ca/OrcaSlicer_ca.po +++ b/localization/i18n/ca/OrcaSlicer_ca.po @@ -12177,6 +12177,26 @@ msgstr "" "Un espai entre la línia de la Vora d'Adherència més interna i l'objecte pot " "fer que la Vora d'Adherència s'elimini més fàcilment" +msgid "Brim follows compensated outline" +msgstr "Vora d'Adherència segueix un esquema compensat" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Quan està activat, vora d'adherència s'alinea amb la geometria del perímetre de la primera capa " +"després d'aplicar la compensació del peu d'elefant.\n" +"Aquesta opció està pensada per als casos en què la compensació del peu d'elefant " +"altera significativament la petjada de la primera capa.\n" +"\n" +"Si la vostra configuració actual ja funciona bé, activar-la pot ser innecessari i " +"pot fer que el vora d'adherència es fusioni amb les capes superiors." + msgid "Brim ears" msgstr "Orelles de la Vora d'Adherència" diff --git a/localization/i18n/cs/OrcaSlicer_cs.po b/localization/i18n/cs/OrcaSlicer_cs.po index 9cc4976536..933c3b3504 100644 --- a/localization/i18n/cs/OrcaSlicer_cs.po +++ b/localization/i18n/cs/OrcaSlicer_cs.po @@ -11730,6 +11730,26 @@ msgid "" msgstr "" "Mezera mezi nejvnitřnějším límcem a předmětem může usnadnit odstranění límce" +msgid "Brim follows compensated outline" +msgstr "Límec sleduje kompenzovaný obrys" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Když je povoleno, límec je zarovnán s obvodovou geometrií první vrstvy " +"po použití kompenzace sloní nohy.\n" +"Tato možnost je určena pro případy, kdy je kompenzace sloní nohy " +"výrazně mění stopu první vrstvy.\n" +"\n" +"Pokud vaše aktuální nastavení již funguje dobře, jeho povolení může být zbytečné a " +"může způsobit spojení límec s horními vrstvami." + msgid "Brim ears" msgstr "Uši límce" diff --git a/localization/i18n/de/OrcaSlicer_de.po b/localization/i18n/de/OrcaSlicer_de.po index f0a0be35b4..15b84734a4 100644 --- a/localization/i18n/de/OrcaSlicer_de.po +++ b/localization/i18n/de/OrcaSlicer_de.po @@ -12766,6 +12766,26 @@ msgstr "" "Eine Lücke zwischen der innersten Randlinie und dem Objekt kann das Abnehmen " "des Randes erleichtern" +msgid "Brim follows compensated outline" +msgstr "Umrandung folgt einem kompensierten Umriss" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Wenn diese Option aktiviert ist, wird umrandung an der Umfangsgeometrie der ersten Ebene ausgerichtet " +"nach Anwendung der Elefantenfußkompensation.\n" +"Diese Option ist für Fälle gedacht, in denen eine Elefantenfuß-Entschädigung vorliegt " +"verändert den Footprint der ersten Schicht erheblich.\n" +"\n" +"Wenn Ihr aktuelles Setup bereits gut funktioniert, kann es unnötig sein, es zu aktivieren " +"kann dazu führen, dass der umrandung mit den oberen Schichten verschmilzt." + msgid "Brim ears" msgstr "Brim Ohren" diff --git a/localization/i18n/en/OrcaSlicer_en.po b/localization/i18n/en/OrcaSlicer_en.po index 647f62ee13..02b4dd6c18 100644 --- a/localization/i18n/en/OrcaSlicer_en.po +++ b/localization/i18n/en/OrcaSlicer_en.po @@ -11327,6 +11327,26 @@ msgstr "" "This creates a gap between the innermost brim line and the object and can " "make the brim easier to remove." +msgid "Brim follows compensated outline" +msgstr "Brim follows compensated outline" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." + msgid "Brim ears" msgstr "" diff --git a/localization/i18n/es/OrcaSlicer_es.po b/localization/i18n/es/OrcaSlicer_es.po index 85079d85fe..19c81d480d 100644 --- a/localization/i18n/es/OrcaSlicer_es.po +++ b/localization/i18n/es/OrcaSlicer_es.po @@ -12147,6 +12147,26 @@ msgstr "" "Un hueco entre la línea más interna del borde de adherencia y el objeto " "puede hacer que el borde de adherencia se retire más fácilmente" +msgid "Brim follows compensated outline" +msgstr "Borde de adherencia sigue el esquema compensado" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Cuando está habilitado, el borde de adherencia está alineado con la geometría del perímetro de la primera capa " +"después de aplicar la compensación de pata de elefante.\n" +"Esta opción está destinada a casos en los que la Compensación por pata de elefante " +"altera significativamente la huella de la primera capa.\n" +"\n" +"Si su configuración actual ya funciona bien, habilitarla puede ser innecesario y " +"puede hacer que el borde de adherencia se fusione con las capas superiores." + msgid "Brim ears" msgstr "Orejas de borde" diff --git a/localization/i18n/fr/OrcaSlicer_fr.po b/localization/i18n/fr/OrcaSlicer_fr.po index 1dd903bc10..5a80f34757 100644 --- a/localization/i18n/fr/OrcaSlicer_fr.po +++ b/localization/i18n/fr/OrcaSlicer_fr.po @@ -12298,6 +12298,26 @@ msgstr "" "Un espace entre la ligne de bord la plus interne et l'objet peut faciliter " "le retrait du bord" +msgid "Brim follows compensated outline" +msgstr "Bordure suit le contour compensé" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Lorsqu'il est activé, le bordure est aligné avec la géométrie du périmètre de la première couche " +"après l'application de la compensation du pied d'éléphant.\n" +"Cette option est destinée aux cas où la compensation du pied d'éléphant " +"modifie considérablement l’empreinte de la première couche.\n" +"\n" +"Si votre configuration actuelle fonctionne déjà bien, son activation peut être inutile et " +"peut provoquer la fusion du bordure avec les couches supérieures." + msgid "Brim ears" msgstr "Bordures à oreilles" diff --git a/localization/i18n/hu/OrcaSlicer_hu.po b/localization/i18n/hu/OrcaSlicer_hu.po index ddd70907ba..ba898f64ac 100644 --- a/localization/i18n/hu/OrcaSlicer_hu.po +++ b/localization/i18n/hu/OrcaSlicer_hu.po @@ -11603,6 +11603,26 @@ msgstr "" "A legbelső peremvonal és a tárgy közötti rés, ami megkönnyítheti a perem " "eltávolítását" +msgid "Brim follows compensated outline" +msgstr "A Perem a kompenzált körvonalat követi" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Ha engedélyezve van, a perem igazodik az első réteg kerületi geometriájához " +"az elefánttalp-kompenzáció alkalmazása után.\n" +"Ez az opció arra az esetre szolgál, amikor az elefánttalp-kompenzáció " +"jelentősen megváltoztatja az első réteg alapterületét.\n" +"\n" +"Ha a jelenlegi beállítás már jól működik, előfordulhat, hogy az engedélyezése felesleges és " +"a perem összeolvadását okozhatja a felső rétegekkel." + msgid "Brim ears" msgstr "Karimás fülek" diff --git a/localization/i18n/it/OrcaSlicer_it.po b/localization/i18n/it/OrcaSlicer_it.po index 43ee2d09c0..222467d02a 100644 --- a/localization/i18n/it/OrcaSlicer_it.po +++ b/localization/i18n/it/OrcaSlicer_it.po @@ -12234,6 +12234,26 @@ msgstr "" "Crea uno spazio tra la linea più interna della tesa e l'oggetto per rendere " "più facile la rimozione della tesa." +msgid "Brim follows compensated outline" +msgstr "Tesa segue il contorno compensato" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Quando abilitato, tesa è allineato con la geometria perimetrale del primo strato " +"dopo l'applicazione della compensazione del piede di elefante.\n" +"Questa opzione è prevista per i casi in cui è prevista la compensazione del piede di elefante " +"altera significativamente l'impronta del primo strato.\n" +"\n" +"Se la tua configurazione attuale funziona già bene, abilitarla potrebbe non essere necessaria e " +"può causare la fusione del tesa con gli strati superiori." + msgid "Brim ears" msgstr "Tesa ad orecchio" diff --git a/localization/i18n/ja/OrcaSlicer_ja.po b/localization/i18n/ja/OrcaSlicer_ja.po index 120ccae558..3258a45800 100644 --- a/localization/i18n/ja/OrcaSlicer_ja.po +++ b/localization/i18n/ja/OrcaSlicer_ja.po @@ -11394,6 +11394,26 @@ msgstr "" "ブリムを取り外しやすくする為、一番内側のブリムラインをモデルと少し距離を設け" "ます。" +msgid "Brim follows compensated outline" +msgstr "ブリム は補正されたアウトラインに従います" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"有効にすると、ブリム は最初の層の周囲ジオメトリと位置合わせされます。 " +"エレファント・フット・コンペンセーション適用後。\n" +"このオプションは、象の足の補正が必要な場合を対象としています。 " +"最初の層のフットプリントを大幅に変更します。\n" +"\n" +"現在の設定がすでにうまく機能している場合は、それを有効にする必要はないかもしれません。 " +"ブリム が上位層と融合する可能性があります。" + msgid "Brim ears" msgstr "" diff --git a/localization/i18n/ko/OrcaSlicer_ko.po b/localization/i18n/ko/OrcaSlicer_ko.po index fbc550e415..cf3d9dea71 100644 --- a/localization/i18n/ko/OrcaSlicer_ko.po +++ b/localization/i18n/ko/OrcaSlicer_ko.po @@ -11817,6 +11817,26 @@ msgstr "" "가장 안쪽 브림 라인과 객체 사이에 간격을 주어 쉽게 브림을 제거 할 수 있게 합" "니다" +msgid "Brim follows compensated outline" +msgstr "브림는 보상된 아웃라인을 따릅니다." + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"활성화되면 브림은 첫 번째 레이어 주변 형상과 정렬됩니다 " +"코끼리 발 보정이 적용된 후.\n" +"이 옵션은 코끼리 발 보상이 적용되는 경우를 위한 것입니다 " +"첫 번째 레이어 공간을 크게 변경합니다.\n" +"\n" +"현재 설정이 이미 잘 작동하는 경우 활성화할 필요가 없으며 " +"브림이 상위 레이어와 융합될 수 있습니다." + msgid "Brim ears" msgstr "브림 귀" diff --git a/localization/i18n/lt/OrcaSlicer_lt.po b/localization/i18n/lt/OrcaSlicer_lt.po index 052250e63f..ec9f6ce417 100644 --- a/localization/i18n/lt/OrcaSlicer_lt.po +++ b/localization/i18n/lt/OrcaSlicer_lt.po @@ -12183,6 +12183,26 @@ msgstr "" "Sukuriamas tarpas tarp vidinės krašto linijos ir objekto, todėl galima " "lengviau jį atskirti." +msgid "Brim follows compensated outline" +msgstr "Kraštas atitinka kompensuotą kontūrą" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Kai įjungta, kraštas yra sulygiuotas su pirmojo sluoksnio perimetro geometrija " +"pritaikius dramblio pėdos kompensaciją.\n" +"Ši parinktis skirta tais atvejais, kai kompensuojama dramblio pėda " +"žymiai pakeičia pirmojo sluoksnio pėdsaką.\n" +"\n" +"Jei dabartinė sąranka jau veikia gerai, jos įjungti gali nebūti ir " +"gali sukelti kraštas susiliejimą su viršutiniais sluoksniais." + msgid "Brim ears" msgstr "Krašto \"ausys\"" diff --git a/localization/i18n/nl/OrcaSlicer_nl.po b/localization/i18n/nl/OrcaSlicer_nl.po index 2f1c24f60d..923ea51aec 100644 --- a/localization/i18n/nl/OrcaSlicer_nl.po +++ b/localization/i18n/nl/OrcaSlicer_nl.po @@ -11751,6 +11751,26 @@ msgstr "" "Dit creëert ruimte tussen de binnenste brimlijn en het object en zorgt " "ervoor dat het object eenvoudiger van het printbed kan worden verwijderd." +msgid "Brim follows compensated outline" +msgstr "Rand volgt de gecompenseerde omtrek" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Indien ingeschakeld, wordt de rand uitgelijnd met de omtrekgeometrie van de eerste laag " +"nadat olifantenvoetcompensatie is toegepast.\n" +"Deze optie is bedoeld voor gevallen waarin sprake is van olifantenvoetcompensatie " +"verandert de voetafdruk van de eerste laag aanzienlijk.\n" +"\n" +"Als uw huidige configuratie al goed werkt, kan het inschakelen hiervan niet nodig zijn " +"kan ervoor zorgen dat de rand samensmelt met de bovenste lagen." + msgid "Brim ears" msgstr "Rand oren" diff --git a/localization/i18n/pl/OrcaSlicer_pl.po b/localization/i18n/pl/OrcaSlicer_pl.po index 81afc09e9b..5c2896d962 100644 --- a/localization/i18n/pl/OrcaSlicer_pl.po +++ b/localization/i18n/pl/OrcaSlicer_pl.po @@ -12130,6 +12130,26 @@ msgstr "" "Szczelina między najbardziej wewnętrzną linią brimu a obiektem może ułatwić " "usunięcie brimu" +msgid "Brim follows compensated outline" +msgstr "Brim podąża za skompensowanym konturem" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Po włączeniu brim jest wyrównany z geometrią obwodu pierwszej warstwy " +"po zastosowaniu Kompensacji Stopy Słonia.\n" +"Ta opcja jest przeznaczona dla przypadków, w których występuje kompensacja stopy słonia " +"znacząco zmienia ślad pierwszej warstwy.\n" +"\n" +"Jeśli Twoja bieżąca konfiguracja już działa dobrze, włączenie jej może być niepotrzebne i " +"może spowodować stopienie brim z górnymi warstwami." + msgid "Brim ears" msgstr "Uszy brim" diff --git a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po index 73fcdb50ea..cffab32de6 100644 --- a/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po +++ b/localization/i18n/pt_BR/OrcaSlicer_pt_BR.po @@ -12555,6 +12555,26 @@ msgstr "" "Um espaço entre a linha mais interna da borda e o objeto pode facilitar a " "remoção da borda." +msgid "Brim follows compensated outline" +msgstr "Borda segue contorno compensado" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Quando ativado, o borda fica alinhado com a geometria do perímetro da primeira camada " +"após a aplicação da Compensação da Pé de Elefante.\n" +"Esta opção destina-se aos casos em que a Compensação da Pé de Elefante " +"altera significativamente a pegada da primeira camada.\n" +"\n" +"Se a sua configuração atual já funciona bem, ativá-la pode ser desnecessário e " +"pode fazer com que o borda se funda com as camadas superiores." + msgid "Brim ears" msgstr "Orelhas da borda" diff --git a/localization/i18n/ru/OrcaSlicer_ru.po b/localization/i18n/ru/OrcaSlicer_ru.po index d9ff700c16..4364ce8306 100644 --- a/localization/i18n/ru/OrcaSlicer_ru.po +++ b/localization/i18n/ru/OrcaSlicer_ru.po @@ -12291,6 +12291,26 @@ msgid "" "easily." msgstr "Смещение каймы от печатаемой модели, может облегчить её удаление." +msgid "Brim follows compensated outline" +msgstr "Кайма соответствует компенсированному контуру" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Если этот параметр включен, кайма выравнивается по геометрии периметра первого слоя " +"после применения компенсации «слоновьей стопы».\n" +"Эта опция предназначена для случаев, когда «Компенсация слоновой стопы» " +"существенно изменяет след первого слоя.\n" +"\n" +"Если ваша текущая настройка уже работает хорошо, ее включение может быть ненужным и " +"может привести к слиянию кайма с верхними слоями." + msgid "Brim ears" msgstr "Ушки каймы" diff --git a/localization/i18n/sv/OrcaSlicer_sv.po b/localization/i18n/sv/OrcaSlicer_sv.po index 04c2d4d565..ab1944d79e 100644 --- a/localization/i18n/sv/OrcaSlicer_sv.po +++ b/localization/i18n/sv/OrcaSlicer_sv.po @@ -11574,6 +11574,26 @@ msgstr "" "Mellanrum mellan innersta brim linjen och objektet kan underlätta vid " "borttagande av brim" +msgid "Brim follows compensated outline" +msgstr "Brim följer kompenserad disposition" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"När den är aktiverad, är brim justerad med det första lagrets omkretsgeometri " +"efter att elefantfotskompensation tillämpas.\n" +"Detta alternativ är avsett för fall där elefantfotskompensation " +"förändrar det första skiktets fotavtryck avsevärt.\n" +"\n" +"Om din nuvarande inställning redan fungerar bra kan det vara onödigt att aktivera det och " +"kan få brim att smälta samman med de övre lagren." + msgid "Brim ears" msgstr "Brätte öron" diff --git a/localization/i18n/tr/OrcaSlicer_tr.po b/localization/i18n/tr/OrcaSlicer_tr.po index a817dd919e..b10eacfc6e 100644 --- a/localization/i18n/tr/OrcaSlicer_tr.po +++ b/localization/i18n/tr/OrcaSlicer_tr.po @@ -12097,6 +12097,26 @@ msgstr "" "En içteki kenar çizgisi ile nesne arasındaki boşluk, kenarlığın daha kolay " "çıkarılmasını sağlayabilir." +msgid "Brim follows compensated outline" +msgstr "Kenar telafi edilen taslağı takip ediyor" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Etkinleştirildiğinde, kenar birinci katmanın çevre geometrisiyle hizalanır " +"Fil Ayağı Telafisi uygulandıktan sonra.\n" +"Bu seçenek Fil Ayağı Telafisinin geçerli olmadığı durumlar için tasarlanmıştır " +"ilk katmanın ayak izini önemli ölçüde değiştirir.\n" +"\n" +"Mevcut kurulumunuz zaten iyi çalışıyorsa, bunu etkinleştirmek gereksiz olabilir ve " +"kenar'in üst katmanlarla kaynaşmasına neden olabilir." + msgid "Brim ears" msgstr "Kenar kulakları" diff --git a/localization/i18n/uk/OrcaSlicer_uk.po b/localization/i18n/uk/OrcaSlicer_uk.po index 05482e66d1..296efbe5bd 100644 --- a/localization/i18n/uk/OrcaSlicer_uk.po +++ b/localization/i18n/uk/OrcaSlicer_uk.po @@ -12138,6 +12138,26 @@ msgstr "" "Зазор між першою внутрішньою лінією кайми та об'єктом може сприяти легшому " "відокремленню кайми" +msgid "Brim follows compensated outline" +msgstr "Кайма має компенсований контур" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Якщо ввімкнено, кайма вирівнюється з геометрією периметра першого рівня " +"після застосування Elephant Foot Compensation.\n" +"Ця опція призначена для випадків компенсації слонячої стопи " +"значно змінює поверхню першого шару.\n" +"\n" +"Якщо ваші поточні налаштування вже працюють добре, увімкнення їх може бути непотрібним " +"може призвести до злиття кайма з верхніми шарами." + msgid "Brim ears" msgstr "Вушка кайми" diff --git a/localization/i18n/vi/OrcaSlicer_vi.po b/localization/i18n/vi/OrcaSlicer_vi.po index f14576ceed..5017bc246f 100644 --- a/localization/i18n/vi/OrcaSlicer_vi.po +++ b/localization/i18n/vi/OrcaSlicer_vi.po @@ -11926,6 +11926,26 @@ msgstr "" "Khoảng cách giữa đường brim trong cùng và đối tượng có thể làm cho brim dễ " "dàng tháo hơn." +msgid "Brim follows compensated outline" +msgstr "Brim tuân theo phác thảo được bù đắp" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"Khi được bật, brim sẽ được căn chỉnh theo hình học chu vi lớp đầu tiên " +"sau khi áp dụng Bồi thường bàn chân voi.\n" +"Tùy chọn này dành cho các trường hợp Bồi thường chân voi " +"làm thay đổi đáng kể dấu chân lớp đầu tiên.\n" +"\n" +"Nếu thiết lập hiện tại của bạn đã hoạt động tốt, việc bật nó có thể không cần thiết và " +"có thể khiến brim kết hợp với các lớp trên." + msgid "Brim ears" msgstr "Tai brim" diff --git a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po index 952bd49555..8cad4e58a5 100644 --- a/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po +++ b/localization/i18n/zh_CN/OrcaSlicer_zh_CN.po @@ -2490,7 +2490,7 @@ msgid "Plate" msgstr "盘" msgid "Brim" -msgstr "Brim" +msgstr "边缘" msgid "Object/Part Setting" msgstr "对象/零件设置" @@ -11493,6 +11493,26 @@ msgid "" "easily." msgstr "在brim和模型之间设置间隙,能够让brim更容易剥离" +msgid "Brim follows compensated outline" +msgstr "边缘 遵循补偿轮廓" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"启用后,边缘 与第一层周边几何体对齐 " +"应用象脚补偿后。\n" +"此选项适用于象脚补偿的情况 " +"显着改变第一层足迹。\n" +"\n" +"如果您当前的设置已经运行良好,则可能没有必要启用它,并且 " +"可以导致 边缘 与上层融合。" + msgid "Brim ears" msgstr "圆盘" diff --git a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po index 01c3669856..51d89cca21 100644 --- a/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po +++ b/localization/i18n/zh_TW/OrcaSlicer_zh_TW.po @@ -2493,7 +2493,7 @@ msgid "Plate" msgstr "列印板" msgid "Brim" -msgstr "Brim" +msgstr "邊緣" msgid "Object/Part Setting" msgstr "物件/零件 設定" @@ -11560,6 +11560,26 @@ msgid "" "easily." msgstr "在 Brim 和模型之間設定間隙,能夠讓 Brim 更容易拆除" +msgid "Brim follows compensated outline" +msgstr "邊緣 遵循補償輪廓" + +msgid "" +"When enabled, the brim is aligned with the first-layer perimeter geometry " +"after Elephant Foot Compensation is applied.\n" +"This option is intended for cases where Elephant Foot Compensation " +"significantly alters the first-layer footprint.\n" +"\n" +"If your current setup already works well, enabling it may be unnecessary and " +"can cause the brim to fuse with upper layers." +msgstr "" +"啟用後,邊緣 與第一層周邊幾何體對齊 " +"應用像腳補償後。\n" +"此選項適用於像腳補償的情況 " +"顯著改變第一層足跡。\n" +"\n" +"如果您當前的設置已經運行良好,則可能沒有必要啟用它,並且 " +"可以導致 邊緣 與上層融合。" + msgid "Brim ears" msgstr "耳狀 Brim" diff --git a/resources/images/axis_toggle.svg b/resources/images/axis_toggle.svg deleted file mode 100644 index 679c34e5ca..0000000000 --- a/resources/images/axis_toggle.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - diff --git a/resources/images/axis_toggle_dark.svg b/resources/images/axis_toggle_dark.svg deleted file mode 100644 index 08c52a8398..0000000000 --- a/resources/images/axis_toggle_dark.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - diff --git a/resources/images/axis_toggle_hover.svg b/resources/images/axis_toggle_hover.svg deleted file mode 100644 index 1d462ffb1d..0000000000 --- a/resources/images/axis_toggle_hover.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - diff --git a/resources/images/axis_toggle_hover_dark.svg b/resources/images/axis_toggle_hover_dark.svg deleted file mode 100644 index 14f9bd2767..0000000000 --- a/resources/images/axis_toggle_hover_dark.svg +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - diff --git a/resources/images/canvas_menu.svg b/resources/images/canvas_menu.svg new file mode 100644 index 0000000000..b94a4952f0 --- /dev/null +++ b/resources/images/canvas_menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/canvas_menu_dark.svg b/resources/images/canvas_menu_dark.svg new file mode 100644 index 0000000000..6578d79a9c --- /dev/null +++ b/resources/images/canvas_menu_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/canvas_menu_dark_hover.svg b/resources/images/canvas_menu_dark_hover.svg new file mode 100644 index 0000000000..e71a5c9787 --- /dev/null +++ b/resources/images/canvas_menu_dark_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/canvas_menu_hover.svg b/resources/images/canvas_menu_hover.svg new file mode 100644 index 0000000000..83fbddee17 --- /dev/null +++ b/resources/images/canvas_menu_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/canvas_zoom.svg b/resources/images/canvas_zoom.svg new file mode 100644 index 0000000000..5448cd7cee --- /dev/null +++ b/resources/images/canvas_zoom.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/canvas_zoom_dark.svg b/resources/images/canvas_zoom_dark.svg new file mode 100644 index 0000000000..9e598f8cba --- /dev/null +++ b/resources/images/canvas_zoom_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/canvas_zoom_dark_hover.svg b/resources/images/canvas_zoom_dark_hover.svg new file mode 100644 index 0000000000..6d7e4e5fcb --- /dev/null +++ b/resources/images/canvas_zoom_dark_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/canvas_zoom_hover.svg b/resources/images/canvas_zoom_hover.svg new file mode 100644 index 0000000000..53f272d28d --- /dev/null +++ b/resources/images/canvas_zoom_hover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/param_zig-zag.svg b/resources/images/param_zig-zag.svg deleted file mode 100644 index 0c062058bc..0000000000 --- a/resources/images/param_zig-zag.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/resources/profiles/Anycubic/machine/Anycubic Kobra S1 0.4 nozzle.json b/resources/profiles/Anycubic/machine/Anycubic Kobra S1 0.4 nozzle.json index 3ea31a77ae..2c42cc077b 100644 --- a/resources/profiles/Anycubic/machine/Anycubic Kobra S1 0.4 nozzle.json +++ b/resources/profiles/Anycubic/machine/Anycubic Kobra S1 0.4 nozzle.json @@ -41,7 +41,7 @@ "before_layer_change_gcode": "; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm", "best_object_pos": "0.5,0.5", "change_extrusion_role_gcode": "", - "change_filament_gcode": "", + "change_filament_gcode": "; FLUSH_START\n;;; M400 P0\nT[next_extruder] ; change extruder\n; 1\n;;; G90\n;;; G1 Z{toolchange_z+2} F480\n;;; G1 X261 Y25 F12000\n;;; G1 Y1 F600\n;;; M400 P2730\n;;; G1 Y25 F3000\n;;; M400 P76250\n;;; M400 P35780\n; 2.1\n;;; G90\n;;; G1 Z{toolchange_z+2} F480\n;;; G1 X47 Y230 F12000\n;;; M400 P0\n; 2.2\n;;; G1 X47 Y276 F600\n;;; G1 X47 Y230 F12000\n;;; G1 X47 Y276 F600\n;;; G1 X47 Y230 F12000\n; 3.1\n;;; G1 F36000\n;;; G1 Y250\n;;; G1 F8000\n;;; G1 X81\n;;; G1 Y273\n; 3.2\n;;; G1 F8000\n;;; G1 X96\n;;; G1 X81\n;;; G1 F8000\n;;; G1 X96\n;;; G1 X81\n;;; G1 F8000\n;;; G1 X96\n;;; G1 X81\n;;; G1 X96\n;;; G1 X81\n;;; G1 X96\n;;; G1 X81\n;;; G1 X96\n;;; G1 X81\n; 3.3\n;;; G1 X72\n;;; G1 X77\n;;; G1 Z{toolchange_z}\n;;; M400 P0\n; FLUSH_END", "cooling_tube_length": "0", "cooling_tube_retraction": "0", "deretraction_speed": [ @@ -228,4 +228,4 @@ "Slope Lift" ], "z_offset": "0" -} \ No newline at end of file +} diff --git a/resources/profiles/BBL.json b/resources/profiles/BBL.json index 9425300cb4..fdc096c888 100644 --- a/resources/profiles/BBL.json +++ b/resources/profiles/BBL.json @@ -1405,6 +1405,10 @@ "name": "Generic PLA-CF @base", "sub_path": "filament/Generic PLA-CF @base.json" }, + { + "name": "Numakers PLA+ @base", + "sub_path": "filament/Numakers/Numakers PLA+ @base.json" + }, { "name": "Overture Matte PLA @base", "sub_path": "filament/Overture/Overture Matte PLA @base.json" @@ -1458,12 +1462,12 @@ "sub_path": "filament/Polymaker/Panchroma PLA Neon @base.json" }, { - "name": "Panchroma PLA Silk @base", - "sub_path": "filament/Polymaker/Panchroma PLA Silk @base.json" + "name": "Panchroma PLA Satin @base", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @base.json" }, { - "name": "Panchroma PLA Stain @base", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @base.json" + "name": "Panchroma PLA Silk @base", + "sub_path": "filament/Polymaker/Panchroma PLA Silk @base.json" }, { "name": "Panchroma PLA Starlight @base", @@ -5101,6 +5105,42 @@ "name": "Generic PLA-CF @BBL P2S", "sub_path": "filament/Generic PLA-CF @BBL P2S.json" }, + { + "name": "Numakers PLA+ @BBL A1", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1.json" + }, + { + "name": "Numakers PLA+ @BBL A1 0.2 nozzle", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1 0.2 nozzle.json" + }, + { + "name": "Numakers PLA+ @BBL A1M", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M.json" + }, + { + "name": "Numakers PLA+ @BBL A1M 0.2 nozzle", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M 0.2 nozzle.json" + }, + { + "name": "Numakers PLA+ @BBL P1P", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P.json" + }, + { + "name": "Numakers PLA+ @BBL P1P 0.2 nozzle", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P 0.2 nozzle.json" + }, + { + "name": "Numakers PLA+ @BBL X1", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL X1.json" + }, + { + "name": "Numakers PLA+ @BBL X1C", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C.json" + }, + { + "name": "Numakers PLA+ @BBL X1C 0.2 nozzle", + "sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C 0.2 nozzle.json" + }, { "name": "Overture Matte PLA @BBL A1", "sub_path": "filament/Overture/Overture Matte PLA @BBL A1.json" @@ -5641,6 +5681,46 @@ "name": "Panchroma PLA Neon @BBL X1C 0.2 nozzle", "sub_path": "filament/Polymaker/Panchroma PLA Neon @BBL X1C 0.2 nozzle.json" }, + { + "name": "Panchroma PLA Satin @BBL A1", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1.json" + }, + { + "name": "Panchroma PLA Satin @BBL A1 0.2 nozzle", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1 0.2 nozzle.json" + }, + { + "name": "Panchroma PLA Satin @BBL A1M", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1M.json" + }, + { + "name": "Panchroma PLA Satin @BBL A1M 0.2 nozzle", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL A1M 0.2 nozzle.json" + }, + { + "name": "Panchroma PLA Satin @BBL P1P", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL P1P.json" + }, + { + "name": "Panchroma PLA Satin @BBL P1P 0.2 nozzle", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL P1P 0.2 nozzle.json" + }, + { + "name": "Panchroma PLA Satin @BBL X1", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1.json" + }, + { + "name": "Panchroma PLA Satin @BBL X1 0.2 nozzle", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1 0.2 nozzle.json" + }, + { + "name": "Panchroma PLA Satin @BBL X1C", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1C.json" + }, + { + "name": "Panchroma PLA Satin @BBL X1C 0.2 nozzle", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @BBL X1C 0.2 nozzle.json" + }, { "name": "Panchroma PLA Silk @BBL A1", "sub_path": "filament/Polymaker/Panchroma PLA Silk @BBL A1.json" @@ -5677,46 +5757,6 @@ "name": "Panchroma PLA Silk @BBL X1C", "sub_path": "filament/Polymaker/Panchroma PLA Silk @BBL X1C.json" }, - { - "name": "Panchroma PLA Stain @BBL A1", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1.json" - }, - { - "name": "Panchroma PLA Stain @BBL A1 0.2 nozzle", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1 0.2 nozzle.json" - }, - { - "name": "Panchroma PLA Stain @BBL A1M", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1M.json" - }, - { - "name": "Panchroma PLA Stain @BBL A1M 0.2 nozzle", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL A1M 0.2 nozzle.json" - }, - { - "name": "Panchroma PLA Stain @BBL P1P", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL P1P.json" - }, - { - "name": "Panchroma PLA Stain @BBL P1P 0.2 nozzle", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL P1P 0.2 nozzle.json" - }, - { - "name": "Panchroma PLA Stain @BBL X1", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1.json" - }, - { - "name": "Panchroma PLA Stain @BBL X1 0.2 nozzle", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1 0.2 nozzle.json" - }, - { - "name": "Panchroma PLA Stain @BBL X1C", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1C.json" - }, - { - "name": "Panchroma PLA Stain @BBL X1C 0.2 nozzle", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @BBL X1C 0.2 nozzle.json" - }, { "name": "Panchroma PLA Starlight @BBL A1", "sub_path": "filament/Polymaker/Panchroma PLA Starlight @BBL A1.json" @@ -7661,46 +7701,6 @@ "name": "Overture TPU @BBL X1C 0.2 nozzle", "sub_path": "filament/Overture/Overture TPU @BBL X1C 0.2 nozzle.json" }, - { - "name": "Numakers PLA+ @base", - "sub_path": "filament/Numakers/Numakers PLA+ @base.json" - }, - { - "name": "Numakers PLA+ @BBL A1", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1.json" - }, - { - "name": "Numakers PLA+ @BBL A1 0.2 nozzle", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1 0.2 nozzle.json" - }, - { - "name": "Numakers PLA+ @BBL A1M", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M.json" - }, - { - "name": "Numakers PLA+ @BBL A1M 0.2 nozzle", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL A1M 0.2 nozzle.json" - }, - { - "name": "Numakers PLA+ @BBL P1P", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P.json" - }, - { - "name": "Numakers PLA+ @BBL P1P 0.2 nozzle", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL P1P 0.2 nozzle.json" - }, - { - "name": "Numakers PLA+ @BBL X1", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL X1.json" - }, - { - "name": "Numakers PLA+ @BBL X1C", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C.json" - }, - { - "name": "Numakers PLA+ @BBL X1C 0.2 nozzle", - "sub_path": "filament/Numakers/Numakers PLA+ @BBL X1C 0.2 nozzle.json" - }, { "name": "fdm_filament_dual_common", "sub_path": "filament/fdm_filament_dual_common.json" diff --git a/resources/profiles/BBL/Bambu Lab P2S_cover.png b/resources/profiles/BBL/Bambu Lab P2S_cover.png index febba125ee..30982b863a 100644 Binary files a/resources/profiles/BBL/Bambu Lab P2S_cover.png and b/resources/profiles/BBL/Bambu Lab P2S_cover.png differ diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1 0.2 nozzle.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1 0.2 nozzle.json similarity index 74% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1 0.2 nozzle.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1 0.2 nozzle.json index 1db86a72e8..886b3217cc 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1 0.2 nozzle.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1 0.2 nozzle.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL A1 0.2 nozzle", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL A1 0.2 nozzle", + "renamed_from": "Panchroma PLA Stain @BBL A1 0.2 nozzle", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_01", "instantiation": "true", @@ -26,4 +27,4 @@ "slow_down_layer_time": [ "5" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1.json similarity index 79% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1.json index 6f573a8f19..93520a1eda 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL A1", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL A1", + "renamed_from": "Panchroma PLA Stain @BBL A1", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_00", "instantiation": "true", @@ -28,4 +29,4 @@ "slow_down_layer_time": [ "5" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1M 0.2 nozzle.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1M 0.2 nozzle.json similarity index 74% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1M 0.2 nozzle.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1M 0.2 nozzle.json index 7510aa9ebf..b6689b1ee8 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1M 0.2 nozzle.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1M 0.2 nozzle.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL A1M 0.2 nozzle", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL A1M 0.2 nozzle", + "renamed_from": "Panchroma PLA Stain @BBL A1M 0.2 nozzle", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_03", "instantiation": "true", @@ -26,4 +27,4 @@ "slow_down_layer_time": [ "5" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1M.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1M.json similarity index 79% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1M.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1M.json index 620a76ffe4..800a4bb8bc 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL A1M.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL A1M.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL A1M", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL A1M", + "renamed_from": "Panchroma PLA Stain @BBL A1M", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_02", "instantiation": "true", @@ -28,4 +29,4 @@ "slow_down_layer_time": [ "5" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL P1P 0.2 nozzle.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL P1P 0.2 nozzle.json similarity index 74% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL P1P 0.2 nozzle.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL P1P 0.2 nozzle.json index 00cf4852a1..e6b2d27440 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL P1P 0.2 nozzle.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL P1P 0.2 nozzle.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL P1P 0.2 nozzle", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL P1P 0.2 nozzle", + "renamed_from": "Panchroma PLA Stain @BBL P1P 0.2 nozzle", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_05", "instantiation": "true", @@ -26,4 +27,4 @@ "slow_down_layer_time": [ "15" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL P1P.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL P1P.json similarity index 79% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL P1P.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL P1P.json index 88678c3159..7e9c805c63 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL P1P.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL P1P.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL P1P", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL P1P", + "renamed_from": "Panchroma PLA Stain @BBL P1P", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_04", "instantiation": "true", @@ -28,4 +29,4 @@ "slow_down_layer_time": [ "15" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1 0.2 nozzle.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1 0.2 nozzle.json similarity index 74% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1 0.2 nozzle.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1 0.2 nozzle.json index 435a9c991a..3a07dcb602 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1 0.2 nozzle.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1 0.2 nozzle.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL X1 0.2 nozzle", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL X1 0.2 nozzle", + "renamed_from": "Panchroma PLA Stain @BBL X1 0.2 nozzle", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_07", "instantiation": "true", @@ -26,4 +27,4 @@ "slow_down_layer_time": [ "15" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1.json similarity index 79% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1.json index e5d9bfdf3a..be4651c5f4 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL X1", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL X1", + "renamed_from": "Panchroma PLA Stain @BBL X1", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_06", "instantiation": "true", @@ -28,4 +29,4 @@ "slow_down_layer_time": [ "15" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1C 0.2 nozzle.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1C 0.2 nozzle.json similarity index 77% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1C 0.2 nozzle.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1C 0.2 nozzle.json index d4f02ff39a..0254f8e61e 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1C 0.2 nozzle.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1C 0.2 nozzle.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL X1C 0.2 nozzle", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL X1C 0.2 nozzle", + "renamed_from": "Panchroma PLA Stain @BBL X1C 0.2 nozzle", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_09", "instantiation": "true", @@ -28,4 +29,4 @@ "slow_down_layer_time": [ "15" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1C.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1C.json similarity index 84% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1C.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1C.json index 1d50deee52..0449da66b0 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @BBL X1C.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @BBL X1C.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @BBL X1C", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @BBL X1C", + "renamed_from": "Panchroma PLA Stain @BBL X1C", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "GFSPM005_08", "instantiation": "true", @@ -34,4 +35,4 @@ "slow_down_layer_time": [ "15" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @base.json b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @base.json similarity index 88% rename from resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @base.json rename to resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @base.json index b2cb2b8cf3..26d3344d4b 100644 --- a/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Stain @base.json +++ b/resources/profiles/BBL/filament/Polymaker/Panchroma PLA Satin @base.json @@ -1,6 +1,7 @@ { "type": "filament", - "name": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @base", + "renamed_from": "Panchroma PLA Stain @base", "inherits": "fdm_filament_pla", "from": "system", "filament_id": "GFPM005", @@ -38,4 +39,4 @@ "temperature_vitrification": [ "59" ] -} \ No newline at end of file +} diff --git a/resources/profiles/BBL/machine/fdm_machine_common.json b/resources/profiles/BBL/machine/fdm_machine_common.json index 0073ac6a8a..566d3960ed 100644 --- a/resources/profiles/BBL/machine/fdm_machine_common.json +++ b/resources/profiles/BBL/machine/fdm_machine_common.json @@ -136,7 +136,7 @@ "60" ], "scan_first_layer": "0", - "enable_power_loss_recovery": "1", + "enable_power_loss_recovery": "printer_configuration", "silent_mode": "0", "single_extruder_multi_material": "1", "support_air_filtration": "0", diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json index b7c03f3f96..b7605cb457 100644 --- a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3 Plus.json @@ -11,6 +11,9 @@ "nozzle_diameter": [ "0.4" ], + "nozzle_volume": [ + "156" + ], "retract_before_wipe": [ "0%" ], @@ -132,7 +135,7 @@ "0" ], "parking_pos_retraction": [ - "25" + "0" ], "retract_when_changing_layer": [ "0" @@ -141,7 +144,10 @@ "0" ], "high_current_on_filament_swap": [ - "1" + "0" + ], + "enable_filament_ramming": [ + "0" ], "z_hop_types": "Spiral Lift" -} \ No newline at end of file +} diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json index 7dabbd7f08..391b37301d 100644 --- a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle - Ender-3 V3.json @@ -11,6 +11,9 @@ "nozzle_diameter": [ "0.4" ], + "nozzle_volume": [ + "156" + ], "retract_before_wipe": [ "0%" ], @@ -132,7 +135,7 @@ "0" ], "parking_pos_retraction": [ - "25" + "0" ], "retract_when_changing_layer": [ "0" @@ -141,7 +144,10 @@ "0" ], "high_current_on_filament_swap": [ - "1" + "0" + ], + "enable_filament_ramming": [ + "0" ], "z_hop_types": "Spiral Lift" -} \ No newline at end of file +} diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json index 518acb39cd..b33d7e5a5c 100644 --- a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle fast.json @@ -11,6 +11,9 @@ "nozzle_diameter": [ "0.4" ], + "nozzle_volume": [ + "156" + ], "retract_before_wipe": [ "0%" ], @@ -132,7 +135,7 @@ "0" ], "parking_pos_retraction": [ - "25" + "0" ], "retract_when_changing_layer": [ "0" @@ -141,7 +144,10 @@ "0" ], "high_current_on_filament_swap": [ - "1" + "0" + ], + "enable_filament_ramming": [ + "0" ], "z_hop_types": "Spiral Lift" -} \ No newline at end of file +} diff --git a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json index 8a49ec2f87..3ee7b4e79b 100644 --- a/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json +++ b/resources/profiles/Co Print/machine/Co Print ChromaSet 0.4 nozzle.json @@ -10,6 +10,9 @@ "printer_variant": "0.4", "nozzle_diameter": [ "0.4" + ], + "nozzle_volume": [ + "156" ], "retract_before_wipe": [ "0%" @@ -132,7 +135,7 @@ "0" ], "parking_pos_retraction": [ - "25" + "0" ], "retract_when_changing_layer": [ "0" @@ -141,7 +144,10 @@ "0" ], "high_current_on_filament_swap": [ - "1" + "0" + ], + "enable_filament_ramming": [ + "0" ], "z_hop_types": "Spiral Lift" -} \ No newline at end of file +} diff --git a/resources/profiles/Cubicon.json b/resources/profiles/Cubicon.json index 7f7f0ab195..c1e7531397 100644 --- a/resources/profiles/Cubicon.json +++ b/resources/profiles/Cubicon.json @@ -7,10 +7,14 @@ { "name": "Cubicon xCeler-I", "sub_path": "machine/Cubicon xCeler-I.json" + }, + { + "name": "Cubicon xCeler-Plus", + "sub_path": "machine/Cubicon xCeler-Plus.json" } ], "process_list": [ - { + { "name": "fdm_process_common", "sub_path": "process/fdm_process_common.json" }, @@ -19,88 +23,171 @@ "sub_path": "process/fdm_process_common_klipper.json" }, { - "name": "cubicon common @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "process/cubicon common @Cubicon xCeler-I 0.4 nozzle.json" + "name": "process template @base", + "sub_path": "process/process template @base.json" }, { - "name": "process template @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "process/process template @Cubicon xCeler-I 0.4 nozzle.json" + "name": "cubicon common @base", + "sub_path": "process/cubicon common @base.json" }, { "name": "cubicon default @Cubicon xCeler-I 0.4 nozzle", "sub_path": "process/cubicon default @Cubicon xCeler-I 0.4 nozzle.json" - } + }, + { + "name": "cubicon default @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "process/cubicon default @Cubicon xCeler-Plus 0.4 nozzle.json" + } ], "filament_list": [ - { + { "name": "fdm_filament_common", "sub_path": "filament/fdm_filament_common.json" }, - { - "name": "fdm_filament_abs", - "sub_path": "filament/fdm_filament_abs.json" - }, - { - "name": "fdm_filament_pa", - "sub_path": "filament/fdm_filament_pa.json" - }, - { - "name": "fdm_filament_pc", - "sub_path": "filament/fdm_filament_pc.json" - }, - { - "name": "fdm_filament_pet", - "sub_path": "filament/fdm_filament_pet.json" - }, - { + { "name": "fdm_filament_pla", "sub_path": "filament/fdm_filament_pla.json" }, - { - "name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json" + { + "name": "fdm_filament_abs", + "sub_path": "filament/fdm_filament_abs.json" }, - { - "name": "Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json" + { + "name": "fdm_filament_pc", + "sub_path": "filament/fdm_filament_pc.json" }, - { - "name": "Cubicon PC @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json" + { + "name": "fdm_filament_pet", + "sub_path": "filament/fdm_filament_pet.json" }, + { + "name": "fdm_filament_pa", + "sub_path": "filament/fdm_filament_pa.json" + }, { - "name": "Cubicon PETG @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json" + "name": "Cubicon PLA @base", + "sub_path": "filament/Cubicon PLA @base.json" }, { "name": "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle", "sub_path": "filament/Cubicon PLA @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + { + "name": "Cubicon PLA+ @base", + "sub_path": "filament/Cubicon PLA+ @base.json" + }, + { + "name": "Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle", + "sub_path": "filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + + { + "name": "Cubicon PLAi21 @base", + "sub_path": "filament/Cubicon PLAi21 @base.json" + }, + { + "name": "Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle", + "sub_path": "filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + { + "name": "Cubicon ABS @base", + "sub_path": "filament/Cubicon ABS @base.json" + }, + { + "name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle", + "sub_path": "filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + { + "name": "Cubicon ABSk @base", + "sub_path": "filament/Cubicon ABSk @base.json" + }, + { + "name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle", + "sub_path": "filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + { + "name": "Cubicon ABS-A100 @base", + "sub_path": "filament/Cubicon ABS-A100 @base.json" }, { "name": "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle", "sub_path": "filament/Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + { + "name": "Cubicon PETG @base", + "sub_path": "filament/Cubicon PETG @base.json" }, { - "name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json" + "name": "Cubicon PETG @Cubicon xCeler-I 0.4 nozzle", + "sub_path": "filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + + { + "name": "Cubicon PC @base", + "sub_path": "filament/Cubicon PC @base.json" }, { - "name": "Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json" + "name": "Cubicon PC @Cubicon xCeler-I 0.4 nozzle", + "sub_path": "filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle.json" + }, + + { + "name": "Cubicon PA-CF @base", + "sub_path": "filament/Cubicon PA-CF @base.json" }, { - "name": "Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle", - "sub_path": "filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json" + "name": "Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle", + "sub_path": "filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json" + }, + { + "name": "Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "filament/Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle.json" } ], "machine_list": [ - { + { "name": "fdm_machine_common", "sub_path": "machine/fdm_machine_common.json" }, { "name": "Cubicon xCeler-I 0.4 nozzle", "sub_path": "machine/Cubicon xCeler-I 0.4 nozzle.json" - } + }, + { + "name": "Cubicon xCeler-Plus 0.4 nozzle", + "sub_path": "machine/Cubicon xCeler-Plus 0.4 nozzle.json" + } ] } \ No newline at end of file diff --git a/resources/profiles/Cubicon/Cubicon xCeler-I_cover.png b/resources/profiles/Cubicon/Cubicon xCeler-I_cover.png index d563958139..869c09f040 100644 Binary files a/resources/profiles/Cubicon/Cubicon xCeler-I_cover.png and b/resources/profiles/Cubicon/Cubicon xCeler-I_cover.png differ diff --git a/resources/profiles/Cubicon/Cubicon xCeler-Plus_cover.png b/resources/profiles/Cubicon/Cubicon xCeler-Plus_cover.png new file mode 100644 index 0000000000..039818b219 Binary files /dev/null and b/resources/profiles/Cubicon/Cubicon xCeler-Plus_cover.png differ diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json index 504774ebde..e94c140f14 100644 --- a/resources/profiles/Cubicon/filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon ABS @Cubicon xCeler-I 0.4 nozzle.json @@ -1,71 +1,13 @@ { "type": "filament", - "name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle", - "inherits": "fdm_filament_abs", - "filament_id": "P510cfb0", - "instantiation": "true", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "ABS" - ], - "filament_vendor": [ - "Cubicon" - ], - "hot_plate_temp": [ - "115" - ], - "hot_plate_temp_initial_layer": [ - "115" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "30" - ], - "filament_density": [ - "1.24" - ], - "filament_flow_ratio": [ - "0.99" - ], - "filament_max_volumetric_speed": [ - "25" - ], - "nozzle_temperature_initial_layer": [ - "240" - ], - "fan_max_speed": [ - "80" - ], - "fan_min_speed": [ - "70" - ], - "slow_down_min_speed": [ - "30" - ], - "slow_down_layer_time": [ - "3" - ], - "nozzle_temperature": [ - "245" - ], - "temperature_vitrification": [ - "78" - ], - "nozzle_temperature_range_low": [ - "220" - ], - "nozzle_temperature_range_high": [ - "260" - ], - "additional_cooling_fan_speed": [ - "0" - ] -} \ No newline at end of file + + "inherits": "Cubicon ABS @base", + "name": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle", + "filament_settings_id": ["Cubicon ABS @Cubicon xCeler-I 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..9cddacd80f --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "inherits": "Cubicon ABS @base", + "name": "Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle", + "filament_settings_id": ["Cubicon ABS @Cubicon xCeler-Plus 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS @base.json b/resources/profiles/Cubicon/filament/Cubicon ABS @base.json new file mode 100644 index 0000000000..6e5cddd5cc --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon ABS @base.json @@ -0,0 +1,73 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "default_filament_colour": "", + + "filament_id": "P510cfb0", + + "name": "Cubicon ABS @base", + "filament_settings_id": ["Cubicon ABS @base"], + "filament_vendor": ["Cubicon"], + "inherits": "fdm_filament_abs", + "filament_type": ["ABS"], + "is_custom_defined": "0", + + "hot_plate_temp": [ + "115" + ], + "hot_plate_temp_initial_layer": [ + "115" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "30" + ], + "filament_density": [ + "1.24" + ], + "filament_flow_ratio": [ + "0.99" + ], + "filament_max_volumetric_speed": [ + "23" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "70" + ], + "slow_down_min_speed": [ + "30" + ], + "slow_down_layer_time": [ + "3" + ], + "nozzle_temperature": [ + "245" + ], + "temperature_vitrification": [ + "78" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature_range_high": [ + "260" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle.json index 036d5c0d3e..2192a5554d 100644 --- a/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle.json @@ -1,71 +1,13 @@ { "type": "filament", - "name": "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle", - "inherits": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle", - "filament_id": "P510cfb1", - "instantiation": "true", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "ABS" - ], - "filament_vendor": [ - "Cubicon" - ], - "hot_plate_temp": [ - "100" - ], - "hot_plate_temp_initial_layer": [ - "100" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "30" - ], - "filament_density": [ - "1.24" - ], - "filament_flow_ratio": [ - "0.99" - ], - "filament_max_volumetric_speed": [ - "25" - ], - "nozzle_temperature_initial_layer": [ - "225" - ], - "fan_max_speed": [ - "80" - ], - "fan_min_speed": [ - "70" - ], - "slow_down_min_speed": [ - "30" - ], - "slow_down_layer_time": [ - "3" - ], - "nozzle_temperature": [ - "230" - ], - "temperature_vitrification": [ - "78" - ], - "nozzle_temperature_range_low": [ - "220" - ], - "nozzle_temperature_range_high": [ - "240" - ], - "additional_cooling_fan_speed": [ - "0" - ] -} \ No newline at end of file + + "inherits": "Cubicon ABS-A100 @base", + "name": "Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle", + "filament_settings_id": ["Cubicon ABS-A100 @Cubicon xCeler-I 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..7d36014099 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "inherits": "Cubicon ABS-A100 @base", + "name": "Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle", + "filament_settings_id": ["Cubicon ABS-A100 @Cubicon xCeler-Plus 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @base.json b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @base.json new file mode 100644 index 0000000000..9d797c70ee --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon ABS-A100 @base.json @@ -0,0 +1,74 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + "default_filament_colour": "", + "filament_id": "P510cfb1", + "filament_settings_id": [ + "Cubicon ABS-A100 @base" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Cubicon" + ], + "inherits": "Cubicon ABS @base", + "is_custom_defined": "0", + "name": "Cubicon ABS-A100 @base", + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "30" + ], + "filament_density": [ + "1.24" + ], + "filament_flow_ratio": [ + "0.99" + ], + "filament_max_volumetric_speed": [ + "23" + ], + "nozzle_temperature_initial_layer": [ + "225" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "70" + ], + "slow_down_min_speed": [ + "30" + ], + "slow_down_layer_time": [ + "3" + ], + "nozzle_temperature": [ + "230" + ], + "temperature_vitrification": [ + "78" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json index 55a64368b6..0526a82ae1 100644 --- a/resources/profiles/Cubicon/filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle.json @@ -1,71 +1,13 @@ { "type": "filament", - "name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle", - "inherits": "Cubicon ABS @Cubicon xCeler-I 0.4 nozzle", - "filament_id": "P510cfb2", - "instantiation": "true", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "ABS" - ], - "filament_vendor": [ - "Cubicon" - ], - "hot_plate_temp": [ - "115" - ], - "hot_plate_temp_initial_layer": [ - "115" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "30" - ], - "filament_density": [ - "1.24" - ], - "filament_flow_ratio": [ - "0.99" - ], - "filament_max_volumetric_speed": [ - "25" - ], - "nozzle_temperature_initial_layer": [ - "240" - ], - "fan_max_speed": [ - "80" - ], - "fan_min_speed": [ - "70" - ], - "slow_down_min_speed": [ - "30" - ], - "slow_down_layer_time": [ - "3" - ], - "nozzle_temperature": [ - "240" - ], - "temperature_vitrification": [ - "85" - ], - "nozzle_temperature_range_low": [ - "220" - ], - "nozzle_temperature_range_high": [ - "240" - ], - "additional_cooling_fan_speed": [ - "0" - ] -} \ No newline at end of file + + "inherits": "Cubicon ABSk @base", + "name": "Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle", + "filament_settings_id": ["Cubicon ABSk @Cubicon xCeler-I 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..ab4f5fdac6 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "inherits": "Cubicon ABSk @base", + "name": "Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle", + "filament_settings_id": ["Cubicon ABSk @Cubicon xCeler-Plus 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon ABSk @base.json b/resources/profiles/Cubicon/filament/Cubicon ABSk @base.json new file mode 100644 index 0000000000..90d884388b --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon ABSk @base.json @@ -0,0 +1,74 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + "default_filament_colour": "", + "filament_id": "P510cfb2", + "filament_settings_id": [ + "Cubicon ABSk @base" + ], + "filament_type": [ + "ABS" + ], + "filament_vendor": [ + "Cubicon" + ], + "inherits": "Cubicon ABS @base", + "is_custom_defined": "0", + "name": "Cubicon ABSk @base", + "hot_plate_temp": [ + "115" + ], + "hot_plate_temp_initial_layer": [ + "115" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "30" + ], + "filament_density": [ + "1.24" + ], + "filament_flow_ratio": [ + "0.99" + ], + "filament_max_volumetric_speed": [ + "23" + ], + "nozzle_temperature_initial_layer": [ + "240" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "70" + ], + "slow_down_min_speed": [ + "30" + ], + "slow_down_layer_time": [ + "3" + ], + "nozzle_temperature": [ + "240" + ], + "temperature_vitrification": [ + "85" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json index 70b81652c1..89b9fedd35 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle.json @@ -1,71 +1,13 @@ { "type": "filament", - "name": "Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle", - "inherits": "fdm_filament_pa", - "filament_id": "P510cfd0", - "instantiation": "true", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "PA" - ], - "filament_vendor": [ - "Cubicon" - ], - "hot_plate_temp": [ - "100" - ], - "hot_plate_temp_initial_layer": [ - "100" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "5" - ], - "filament_density": [ - "1.24" - ], - "filament_flow_ratio": [ - "0.99" - ], - "filament_max_volumetric_speed": [ - "11" - ], - "nozzle_temperature_initial_layer": [ - "265" - ], - "fan_max_speed": [ - "50" - ], - "fan_min_speed": [ - "50" - ], - "slow_down_min_speed": [ - "20" - ], - "slow_down_layer_time": [ - "2" - ], - "nozzle_temperature": [ - "270" - ], - "temperature_vitrification": [ - "108" - ], - "nozzle_temperature_range_low": [ - "260" - ], - "nozzle_temperature_range_high": [ - "280" - ], - "additional_cooling_fan_speed": [ - "0" - ] -} \ No newline at end of file + + "inherits": "Cubicon PA-CF @base", + "name": "Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle", + "filament_settings_id": ["Cubicon PA-CF @Cubicon xCeler-I 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..4ab18c24c6 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "inherits": "Cubicon PA-CF @base", + "name": "Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle", + "filament_settings_id": ["Cubicon PA-CF @Cubicon xCeler-Plus 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PA-CF @base.json b/resources/profiles/Cubicon/filament/Cubicon PA-CF @base.json new file mode 100644 index 0000000000..d8c89c7d11 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PA-CF @base.json @@ -0,0 +1,82 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "default_filament_colour": "", + + "filament_id": "P510cfd0", + + "filament_settings_id": [ + "Cubicon PA-CF @base" + ], + + "filament_type": [ + "PA" + ], + + "filament_vendor": [ + "Cubicon" + ], + + "inherits": "fdm_filament_pa", + + "is_custom_defined": "0", + "name": "Cubicon PA-CF @base", + "hot_plate_temp": [ + "100" + ], + "hot_plate_temp_initial_layer": [ + "100" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "5" + ], + "filament_density": [ + "1.24" + ], + "filament_flow_ratio": [ + "0.99" + ], + "filament_max_volumetric_speed": [ + "10" + ], + "nozzle_temperature_initial_layer": [ + "265" + ], + "fan_max_speed": [ + "50" + ], + "fan_min_speed": [ + "50" + ], + "slow_down_min_speed": [ + "20" + ], + "slow_down_layer_time": [ + "2" + ], + "nozzle_temperature": [ + "270" + ], + "temperature_vitrification": [ + "108" + ], + "nozzle_temperature_range_low": [ + "260" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json index 849d03a2fd..2c7620fd08 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon PC @Cubicon xCeler-I 0.4 nozzle.json @@ -1,20 +1,13 @@ { "type": "filament", - "name": "Cubicon PC @Cubicon xCeler-I 0.4 nozzle", - "inherits": "fdm_filament_pc", - "filament_id": "P510cfd0", - "instantiation": "true", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon PC @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "PC" - ], - "filament_vendor": [ - "Cubicon" - ] -} \ No newline at end of file + + "inherits": "Cubicon PC @base", + "name": "Cubicon PC @Cubicon xCeler-I 0.4 nozzle", + "filament_settings_id": ["Cubicon PC @Cubicon xCeler-I 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..0b7e15ded2 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "inherits": "Cubicon PC @base", + "name": "Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle", + "filament_settings_id": ["Cubicon PC @Cubicon xCeler-Plus 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PC @base.json b/resources/profiles/Cubicon/filament/Cubicon PC @base.json new file mode 100644 index 0000000000..dcde4c64de --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PC @base.json @@ -0,0 +1,32 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "default_filament_colour": "", + + "filament_id": "P510cfd0", + + "filament_settings_id": [ + "Cubicon PC @base" + ], + + "filament_type": [ + "PC" + ], + + "filament_vendor": [ + "Cubicon" + ], + + "inherits": "fdm_filament_pc", + + "is_custom_defined": "0", + "name": "Cubicon PC @base" + +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json index c0b1c577e9..a156c688e5 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon PETG @Cubicon xCeler-I 0.4 nozzle.json @@ -1,71 +1,13 @@ { "type": "filament", - "name": "Cubicon PETG @Cubicon xCeler-I 0.4 nozzle", - "inherits": "fdm_filament_pet", - "filament_id": "P510cfc0", - "instantiation": "true", + "instantiation": "true", + "version": "1.0.0.0", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon PETG @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "PETG" - ], - "filament_vendor": [ - "Cubicon" - ], - "hot_plate_temp": [ - "80" - ], - "hot_plate_temp_initial_layer": [ - "80" - ], - "close_fan_the_first_x_layers": [ - "3" - ], - "fan_cooling_layer_time": [ - "30" - ], - "filament_density": [ - "1.24" - ], - "filament_flow_ratio": [ - "0.99" - ], - "filament_max_volumetric_speed": [ - "8" - ], - "nozzle_temperature_initial_layer": [ - "235" - ], - "fan_max_speed": [ - "90" - ], - "fan_min_speed": [ - "80" - ], - "slow_down_min_speed": [ - "30" - ], - "slow_down_layer_time": [ - "8" - ], - "nozzle_temperature": [ - "240" - ], - "temperature_vitrification": [ - "70" - ], - "nozzle_temperature_range_low": [ - "230" - ], - "nozzle_temperature_range_high": [ - "250" - ], - "additional_cooling_fan_speed": [ - "0" - ] -} \ No newline at end of file + + "inherits": "Cubicon PETG @base", + "name": "Cubicon PETG @Cubicon xCeler-I 0.4 nozzle", + "filament_settings_id": ["Cubicon PETG @Cubicon xCeler-I 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..d49607abaa --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "inherits": "Cubicon PETG @base", + "name": "Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle", + "filament_settings_id": ["Cubicon PETG @Cubicon xCeler-Plus 0.4 nozzle"] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PETG @base.json b/resources/profiles/Cubicon/filament/Cubicon PETG @base.json new file mode 100644 index 0000000000..b686ff907f --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PETG @base.json @@ -0,0 +1,82 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "default_filament_colour": "", + + "filament_id": "P510cfc0", + + "filament_settings_id": [ + "Cubicon PETG @base" + ], + + "filament_type": [ + "PETG" + ], + + "filament_vendor": [ + "Cubicon" + ], + + "inherits": "fdm_filament_pet", + + "is_custom_defined": "0", + "name": "Cubicon PETG @base", + "hot_plate_temp": [ + "80" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "fan_cooling_layer_time": [ + "30" + ], + "filament_density": [ + "1.24" + ], + "filament_flow_ratio": [ + "0.99" + ], + "filament_max_volumetric_speed": [ + "8" + ], + "nozzle_temperature_initial_layer": [ + "235" + ], + "fan_max_speed": [ + "90" + ], + "fan_min_speed": [ + "80" + ], + "slow_down_min_speed": [ + "30" + ], + "slow_down_layer_time": [ + "8" + ], + "nozzle_temperature": [ + "240" + ], + "temperature_vitrification": [ + "70" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "nozzle_temperature_range_high": [ + "250" + ], + "additional_cooling_fan_speed": [ + "0" + ] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PLA @Cubicon xCeler-I 0.4 nozzle.json index 8436718948..667ebbfd1e 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PLA @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon PLA @Cubicon xCeler-I 0.4 nozzle.json @@ -1,62 +1,12 @@ { "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "from": "system", "name": "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle", - "inherits": "fdm_filament_pla", - "filament_id": "P510cfa0", - "instantiation": "true", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "PLA" - ], - "filament_vendor": [ - "Cubicon" - ], - "filament_flow_ratio": [ - "0.99" - ], - "filament_max_volumetric_speed": [ - "24.5" - ], - "slow_down_layer_time": [ - "3" - ], - "slow_down_min_speed": [ - "50" - ], - "temperature_vitrification": [ - "60" - ], - "hot_plate_temp": [ - "60" - ], - "hot_plate_temp_initial_layer": [ - "60" - ], - "nozzle_temperature": [ - "210" - ], - "nozzle_temperature_initial_layer": [ - "205" - ], - "fan_max_speed": [ - "80" - ], - "fan_min_speed": [ - "100" - ], - "nozzle_temperature_range_low": [ - "190" - ], - "nozzle_temperature_range_high": [ - "230" - ], - "additional_cooling_fan_speed": [ - "80" - ] -} \ No newline at end of file + "inherits": "Cubicon PLA @base" +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..4951caf644 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,12 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "from": "system", + "name": "Cubicon PLA @Cubicon xCeler-Plus 0.4 nozzle", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + "inherits": "Cubicon PLA @base" +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA @base.json b/resources/profiles/Cubicon/filament/Cubicon PLA @base.json new file mode 100644 index 0000000000..20875d851c --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PLA @base.json @@ -0,0 +1,68 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "from": "system", + "name": "Cubicon PLA @base", + + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "default_filament_colour": "", + "filament_id": "P510cfa0", + "filament_settings_id": [ + "CBC_MTC_0" + ], + "filament_type": [ + "PLA" + ], + "filament_vendor": [ + "Cubicon" + ], + "inherits": "fdm_filament_pla", + "is_custom_defined": "0", + "filament_flow_ratio": [ + "0.99" + ], + "filament_max_volumetric_speed": [ + "23" + ], + "slow_down_layer_time": [ + "3" + ], + "slow_down_min_speed": [ + "50" + ], + "temperature_vitrification": [ + "60" + ], + "hot_plate_temp": [ + "60" + ], + "hot_plate_temp_initial_layer": [ + "60" + ], + "nozzle_temperature": [ + "210" + ], + "nozzle_temperature_initial_layer": [ + "205" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "100" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "additional_cooling_fan_speed": [ + "80" + ] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json index e8c6118e17..370fb6b520 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle.json @@ -1,26 +1,12 @@ { "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "from": "system", "name": "Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle", - "inherits": "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle", - "filament_id": "P510cfa1", - "instantiation": "true", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon PLA+ @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "PLA" - ], - "filament_vendor": [ - "Cubicon" - ], - "temperature_vitrification": [ - "52" - ], - "nozzle_temperature_range_high": [ - "220" - ] -} \ No newline at end of file + "inherits": "Cubicon PLA+ @base" +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..1891392db0 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,12 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "from": "system", + "name": "Cubicon PLA+ @Cubicon xCeler-Plus 0.4 nozzle", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + "inherits": "Cubicon PLA+ @base" +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLA+ @base.json b/resources/profiles/Cubicon/filament/Cubicon PLA+ @base.json new file mode 100644 index 0000000000..3ad71b3370 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PLA+ @base.json @@ -0,0 +1,37 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "default_filament_colour": [""], + + "filament_id": "P510cfa1", + + "filament_settings_id": [ + "Cubicon PLA+ @base" + ], + + "filament_type": [ + "PLA" + ], + + "filament_vendor": [ + "Cubicon" + ], + + "inherits": "Cubicon PLA @base", + + "is_custom_defined": "0", + "name": "Cubicon PLA+ @base", + "temperature_vitrification": [ + "52" + ], + "nozzle_temperature_range_high": [ + "220" + ] +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json index da20c5c9d2..c87e99b0ec 100644 --- a/resources/profiles/Cubicon/filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/filament/Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle.json @@ -1,23 +1,12 @@ { "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "from": "system", "name": "Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle", - "inherits": "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle", - "filament_id": "P510cfa2", - "instantiation": "true", + "compatible_printers": [ "Cubicon xCeler-I 0.4 nozzle" ], - "default_filament_colour": "", - "filament_settings_id": [ - "Cubicon PLAi21 @Cubicon xCeler-I 0.4 nozzle" - ], - "filament_type": [ - "PLA" - ], - "filament_vendor": [ - "Cubicon" - ], - "temperature_vitrification": [ - "45" - ] -} \ No newline at end of file + "inherits": "Cubicon PLAi21 @base" +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/filament/Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..c4dc718209 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,12 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + "from": "system", + "name": "Cubicon PLAi21 @Cubicon xCeler-Plus 0.4 nozzle", + + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ], + "inherits": "Cubicon PLAi21 @base" +} diff --git a/resources/profiles/Cubicon/filament/Cubicon PLAi21 @base.json b/resources/profiles/Cubicon/filament/Cubicon PLAi21 @base.json new file mode 100644 index 0000000000..bbede501e8 --- /dev/null +++ b/resources/profiles/Cubicon/filament/Cubicon PLAi21 @base.json @@ -0,0 +1,35 @@ +{ + "type": "filament", + "instantiation": "true", + "version": "1.0.0.0", + + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" + ], + + "default_filament_colour": "", + + "filament_id": "P510cfa2", + + "filament_settings_id": [ + "Cubicon PLAi21 @base" + ], + + "filament_type": [ + "PLA" + ], + + "filament_vendor": [ + "Cubicon" + ], + + "inherits": "Cubicon PLA @base", + + "is_custom_defined": "0", + "name": "Cubicon PLAi21 @base", + "temperature_vitrification": [ + "45" + ] + +} diff --git a/resources/profiles/Cubicon/machine/Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/machine/Cubicon xCeler-I 0.4 nozzle.json index f8f90404b1..07f79da301 100644 --- a/resources/profiles/Cubicon/machine/Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/machine/Cubicon xCeler-I 0.4 nozzle.json @@ -2,7 +2,7 @@ "type": "machine", "name": "Cubicon xCeler-I 0.4 nozzle", "inherits": "fdm_machine_common", - "from": "User", + "from": "system", "instantiation": "true", "adaptive_bed_mesh_margin": "0", "auxiliary_fan": "1", @@ -22,9 +22,9 @@ "cooling_tube_length": "0", "cooling_tube_retraction": "0", "default_filament_profile": [ - "Cubicon PLA @base" + "Cubicon PLA @Cubicon xCeler-I" ], - "default_print_profile": "0.08mm Extra Fine @Creality K1 (0.4 nozzle)", + "default_print_profile": "cubicon default @base", "deretraction_speed": [ "30" ], diff --git a/resources/profiles/Cubicon/machine/Cubicon xCeler-I.json b/resources/profiles/Cubicon/machine/Cubicon xCeler-I.json index b8df593e7d..1b68282f3d 100644 --- a/resources/profiles/Cubicon/machine/Cubicon xCeler-I.json +++ b/resources/profiles/Cubicon/machine/Cubicon xCeler-I.json @@ -4,7 +4,7 @@ "nozzle_diameter": "0.4", "bed_model": "", "bed_texture": "Cubicon xCeler-I_bed_texture.svg", - "family": "Cuibicon", + "family": "Cubicon", "machine_tech": "FFF", - "default_materials": "Cubicon PLA @Cubicon xCeler-I 0.4 nozzle" + "default_materials": "Cubicon PLA @Cubicon xCeler-I" } \ No newline at end of file diff --git a/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..8d9bc54aa5 --- /dev/null +++ b/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,248 @@ +{ + "type": "machine", + "instantiation": "true", + "adaptive_bed_mesh_margin": "0", + "auxiliary_fan": "1", + "bbl_use_printhost": "0", + "bed_custom_model": "", + "bed_custom_texture": "", + "bed_exclude_area": [ + "0x0" + ], + "bed_mesh_max": "99999,99999", + "bed_mesh_min": "-99999,-99999", + "bed_mesh_probe_distance": "50,50", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n", + "best_object_pos": "0.5,0.5", + "change_extrusion_role_gcode": "", + "change_filament_gcode": "", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "default_filament_profile": [ + "Cubicon PLA @Cubicon xCeler-Plus" + ], + "default_print_profile": "cubicon default @base", + "deretraction_speed": [ + "30" + ], + "disable_m73": "0", + "emit_machine_limits_to_gcode": "1", + "enable_filament_ramming": "0", + "enable_long_retraction_when_cut": "0", + "extra_loading_move": "0", + "extruder_clearance_height_to_lid": "140", + "extruder_clearance_height_to_rod": "36", + "extruder_clearance_radius": "65", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "from": "system", + "gcode_flavor": "klipper", + "head_wrap_detect_zone": [], + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "inherits": "fdm_machine_common", + "is_custom_defined": "0", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "long_retractions_when_cut": [ + "0" + ], + "machine_end_gcode": "END_PRINT", + "machine_load_filament_time": "0", + "machine_max_acceleration_e": [ + "500", + "5000" + ], + "machine_max_acceleration_extruding": [ + "5000", + "20000" + ], + "machine_max_acceleration_x": [ + "13000", + "20000" + ], + "machine_max_acceleration_y": [ + "13000", + "20000" + ], + "machine_max_acceleration_z": [ + "250", + "500" + ], + "machine_max_speed_z": [ + "25", + "12" + ], + + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "13000", + "13000" + ], + + "machine_max_jerk_e": [ + "20", + "20" + ], + "machine_max_jerk_x": [ + "20", + "20" + ], + "machine_max_jerk_y": [ + "20", + "20" + ], + "machine_max_jerk_z": [ + "20", + "20" + ], + "machine_max_junction_deviation": [ + "0", + "0" + ], + "machine_max_speed_e": [ + "50", + "50" + ], + "machine_max_speed_x": [ + "500", + "500" + ], + "machine_max_speed_y": [ + "500", + "500" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "START_PRINT EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TEMP=[bed_temperature_initial_layer_single]", + "machine_tool_change_time": "0", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.3" + ], + "min_layer_height": [ + "0.1" + ], + "name": "Cubicon xCeler-Plus 0.4 nozzle", + "nozzle_diameter": [ + "0.4" + ], + "nozzle_height": "4", + "nozzle_hrc": "0", + "nozzle_type": "brass", + "nozzle_volume": "0", + "parking_pos_retraction": "0", + "pellet_modded_printer": "0", + "preferred_orientation": "0", + "print_host": "", + "print_host_webui": "", + "printable_area": [ + "0x0", + "310x0", + "310x310", + "0x310" + ], + "printable_height": "310", + "printer_model": "Cubicon xCeler-Plus", + "printer_notes": "", + "printer_settings_id": "Cubicon xCeler-Plus 0.4 nozzle", + "printer_structure": "undefine", + "printer_technology": "FFF", + "printer_variant": "0.4", + "printhost_apikey": "", + "printhost_authorization_type": "key", + "printhost_cafile": "", + "printhost_password": "", + "printhost_port": "", + "printhost_ssl_ignore_revoke": "0", + "printhost_user": "", + "printing_by_object_gcode": "", + "purge_in_prime_tower": "0", + "retract_before_wipe": [ + "0%" + ], + "retract_length_toolchange": [ + "1" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_on_top_layer": [ + "0" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "0" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "0.8" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "30" + ], + "scan_first_layer": "0", + "silent_mode": "0", + "single_extruder_multi_material": "1", + "support_air_filtration": "0", + "support_chamber_temp_control": "0", + "support_multi_bed_types": "0", + "template_custom_gcode": "", + "thumbnails": "48x48/PNG, 300x300/PNG", + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "travel_slope": [ + "3" + ], + "upward_compatible_machine": [], + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "version": "2.1.1.0", + "wipe": [ + "0" + ], + "wipe_distance": [ + "2" + ], + "z_hop": [ + "0.2" + ], + "z_hop_types": [ + "Normal Lift" + ], + "z_offset": "0" +} diff --git a/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus.json b/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus.json new file mode 100644 index 0000000000..466e159452 --- /dev/null +++ b/resources/profiles/Cubicon/machine/Cubicon xCeler-Plus.json @@ -0,0 +1,10 @@ +{ + "type": "machine_model", + "name": "Cubicon xCeler-Plus", + "nozzle_diameter": "0.4", + "bed_model": "", + "bed_texture": "Cubicon xCeler-I_bed_texture.svg", + "family": "Cubicon", + "machine_tech": "FFF", + "default_materials": "Cubicon PLA @Cubicon xCeler-Plus" +} diff --git a/resources/profiles/Cubicon/process/cubicon common @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/process/cubicon common @base.json similarity index 93% rename from resources/profiles/Cubicon/process/cubicon common @Cubicon xCeler-I 0.4 nozzle.json rename to resources/profiles/Cubicon/process/cubicon common @base.json index 3c6334275f..ad746aaef3 100644 --- a/resources/profiles/Cubicon/process/cubicon common @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/process/cubicon common @base.json @@ -1,12 +1,14 @@ { - "type": "process", - "name": "cubicon common @Cubicon xCeler-I 0.4 nozzle", - "inherits": "fdm_process_common_klipper", - "instantiation": "false", + "version": "1.0.0.0", + "instantiation": "false", "compatible_printers": [ - "Cubicon xCeler-I 0.4 nozzle" + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" ], - "print_settings_id": "cubicon common @Cubicon xCeler-I 0.4 nozzle", + "inherits": "fdm_process_common_klipper", + "name": "cubicon common @base", + "print_settings_id": "cubicon common @base", + "accel_to_decel_enable": "1", "accel_to_decel_factor": "100", "bridge_angle": "0", @@ -81,6 +83,7 @@ "top_solid_infill_flow_ratio": "0.9", "travel_speed": "500", "support_threshold_angle": "15", + "type": "process", "wall_loops": "2", "thick_bridges": "0", "extra_perimeters_on_overhangs": "1", @@ -107,9 +110,10 @@ "slowdown_for_curled_perimeters": "0", "bridge_speed": "50", "internal_bridge_speed": "150%", + "is_custom_defined": "0", "overhang_1_4_speed": "0", "overhang_2_4_speed": "50", "overhang_3_4_speed": "30", "overhang_4_4_speed": "10", "independent_support_layer_height": "1" -} \ No newline at end of file +} diff --git a/resources/profiles/Cubicon/process/cubicon default @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/process/cubicon default @Cubicon xCeler-I 0.4 nozzle.json index dd1f422a16..a496d82598 100644 --- a/resources/profiles/Cubicon/process/cubicon default @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/process/cubicon default @Cubicon xCeler-I 0.4 nozzle.json @@ -1,7 +1,11 @@ { + "version": "1.0.0.0", "type": "process", - "name": "cubicon default @Cubicon xCeler-I 0.4 nozzle", - "inherits": "cubicon common @Cubicon xCeler-I 0.4 nozzle", "instantiation": "true", - "print_settings_id": "cubicon default @Cubicon xCeler-I 0.4 nozzle" -} \ No newline at end of file + "inherits": "cubicon common @base", + "name": "cubicon default @Cubicon xCeler-I 0.4 nozzle", + "print_settings_id": "cubicon default @Cubicon xCeler-I 0.4 nozzle", + "compatible_printers": [ + "Cubicon xCeler-I 0.4 nozzle" + ] +} diff --git a/resources/profiles/Cubicon/process/cubicon default @Cubicon xCeler-Plus 0.4 nozzle.json b/resources/profiles/Cubicon/process/cubicon default @Cubicon xCeler-Plus 0.4 nozzle.json new file mode 100644 index 0000000000..6be1261923 --- /dev/null +++ b/resources/profiles/Cubicon/process/cubicon default @Cubicon xCeler-Plus 0.4 nozzle.json @@ -0,0 +1,11 @@ +{ + "version": "1.0.0.0", + "type": "process", + "instantiation": "true", + "inherits": "cubicon common @base", + "name": "cubicon default @Cubicon xCeler-Plus 0.4 nozzle", + "print_settings_id": "cubicon default @Cubicon xCeler-Plus 0.4 nozzle", + "compatible_printers": [ + "Cubicon xCeler-Plus 0.4 nozzle" + ] +} diff --git a/resources/profiles/Cubicon/process/process template @Cubicon xCeler-I 0.4 nozzle.json b/resources/profiles/Cubicon/process/process template @base.json similarity index 97% rename from resources/profiles/Cubicon/process/process template @Cubicon xCeler-I 0.4 nozzle.json rename to resources/profiles/Cubicon/process/process template @base.json index 5046b8b8f4..3d076f7895 100644 --- a/resources/profiles/Cubicon/process/process template @Cubicon xCeler-I 0.4 nozzle.json +++ b/resources/profiles/Cubicon/process/process template @base.json @@ -1,9 +1,5 @@ { - "type": "process", - "name": "process template @Cubicon xCeler-I 0.4 nozzle", - "inherits": "fdm_process_common_klipper", - "from": "User", - "instantiation": "false", + "instantiation": "false", "accel_to_decel_enable": "1", "accel_to_decel_factor": "50%", "alternate_extra_wall": "0", @@ -24,7 +20,8 @@ "brim_width": "5", "calib_flowrate_topinfill_special_order": "0", "compatible_printers": [ - "Cubicon xCeler-I 0.4 nozzle" + "Cubicon xCeler-I 0.4 nozzle", + "Cubicon xCeler-Plus 0.4 nozzle" ], "compatible_printers_condition": "", "counterbore_hole_bridging": "none", @@ -53,6 +50,7 @@ "flush_into_infill": "0", "flush_into_objects": "0", "flush_into_support": "1", + "from": "User", "fuzzy_skin": "none", "fuzzy_skin_first_layer": "0", "fuzzy_skin_noise_type": "classic", @@ -77,6 +75,7 @@ "infill_direction": "45", "infill_jerk": "20", "infill_wall_overlap": "15%", + "inherits": "fdm_process_common_klipper", "initial_layer_acceleration": "1000", "initial_layer_infill_speed": "200", "initial_layer_jerk": "20", @@ -104,13 +103,14 @@ "internal_solid_infill_line_width": "0.42", "internal_solid_infill_pattern": "zig-zag", "internal_solid_infill_speed": "250", - "ironing_angle": "0", + "ironing_angle": "-1", "ironing_flow": "10%", "ironing_inset": "0", "ironing_pattern": "zig-zag", "ironing_spacing": "0.15", "ironing_speed": "30", "ironing_type": "no ironing", + "is_custom_defined": "0", "is_infill_first": "0", "lattice_angle_1": "-45", "lattice_angle_2": "45", @@ -131,6 +131,7 @@ "minimum_sparse_infill_area": "15", "mmu_segmented_region_interlocking_depth": "0", "mmu_segmented_region_max_width": "0", + "name": "process template @base", "notes": "", "only_one_wall_first_layer": "0", "only_one_wall_top": "1", @@ -158,7 +159,7 @@ "print_flow_ratio": "1", "print_order": "default", "print_sequence": "by layer", - "print_settings_id": "process template @Cubicon xCeler-I 0.4 nozzle", + "print_settings_id": "process template @base", "raft_contact_distance": "0.1", "raft_expansion": "1.5", "raft_first_layer_density": "100%", @@ -281,6 +282,7 @@ "tree_support_tip_diameter": "0.8", "tree_support_top_rate": "30%", "tree_support_wall_count": "0", + "version": "1.7.0.2", "wall_direction": "auto", "wall_distribution_count": "1", "wall_filament": "1", @@ -315,4 +317,4 @@ ], "xy_contour_compensation": "0", "xy_hole_compensation": "0" -} \ No newline at end of file +} diff --git a/resources/profiles/Geeetech/Geeetech A10 M_cover.png b/resources/profiles/Geeetech/Geeetech A10 M_cover.png index 537e84e105..c33288671f 100644 Binary files a/resources/profiles/Geeetech/Geeetech A10 M_cover.png and b/resources/profiles/Geeetech/Geeetech A10 M_cover.png differ diff --git a/resources/profiles/Ginger Additive/ginger G1_cover.png b/resources/profiles/Ginger Additive/Ginger G1_cover.png similarity index 100% rename from resources/profiles/Ginger Additive/ginger G1_cover.png rename to resources/profiles/Ginger Additive/Ginger G1_cover.png diff --git a/resources/profiles/M3D.json b/resources/profiles/M3D.json new file mode 100644 index 0000000000..6b77a142df --- /dev/null +++ b/resources/profiles/M3D.json @@ -0,0 +1,37 @@ +{ + "name": "M3D", + "version": "1.0.0", + "force_update": "0", + "description": "Configuration for M3D printers", + "machine_model_list": [ + { + "name": "M3D Enabler D8500 MM Model", + "sub_path": "machine/M3D Enabler D8500 MM Model.json" + } + ], + "machine_list": [ + { + "name": "fdm_machine_common", + "sub_path": "machine/fdm_machine_common.json" + }, + { + "name": "M3D Enabler D8500 MM", + "sub_path": "machine/M3D Enabler D8500 MM.json" + } + ], + "process_list": [ + { + "name": "fdm_process_common", + "sub_path": "process/fdm_process_common.json" + }, + { + "name": "0.15mm MM @D8500", + "sub_path": "process/0.15mm MM @D8500.json" + }, + { + "name": "0.20mm MM @D8500", + "sub_path": "process/0.20mm MM @D8500.json" + } + ], + "filament_list": [] +} \ No newline at end of file diff --git a/resources/profiles/M3D/M3D Enabler D8500 MM Model_cover.png b/resources/profiles/M3D/M3D Enabler D8500 MM Model_cover.png new file mode 100644 index 0000000000..50020d51b7 Binary files /dev/null and b/resources/profiles/M3D/M3D Enabler D8500 MM Model_cover.png differ diff --git a/resources/profiles/M3D/machine/M3D Enabler D8500 MM Model.json b/resources/profiles/M3D/machine/M3D Enabler D8500 MM Model.json new file mode 100644 index 0000000000..1e8c6e9b89 --- /dev/null +++ b/resources/profiles/M3D/machine/M3D Enabler D8500 MM Model.json @@ -0,0 +1,12 @@ +{ + "type": "machine_model", + "name": "M3D Enabler D8500 MM Model", + "model_id": "M3D_D8500_MM", + "family": "M3D", + "machine_tech": "FFF", + "nozzle_diameter": "0.4", + "bed_model": "model/M3D_bed_model.stl", + "bed_texture": "model/M3D_bed_texture.png", + "default_materials": "Generic PLA @system", + "scan_folder": "1" +} \ No newline at end of file diff --git a/resources/profiles/M3D/machine/M3D Enabler D8500 MM.json b/resources/profiles/M3D/machine/M3D Enabler D8500 MM.json new file mode 100644 index 0000000000..2bcfbfcdae --- /dev/null +++ b/resources/profiles/M3D/machine/M3D Enabler D8500 MM.json @@ -0,0 +1,166 @@ +{ + "type": "machine", + "name": "M3D Enabler D8500 MM", + "printer_model": "M3D Enabler D8500 MM Model", + "printer_variant": "0.4", + "inherits": "fdm_machine_common", + "from": "system", + "instantiation": "true", + "is_custom_defined": "0", + "setting_id": "M3D_D8500_MM_04", + "version": "1.0.0", + + "auxiliary_fan": "1", + "change_filament_gcode": "M18 E", + "deretraction_speed": [ + "50", + "50" + ], + "extruder_clearance_height_to_rod": "19", + "extruder_clearance_radius": "100", + "extruder_colour": [ + "#FCE94F", + "#FCE94F" + ], + "extruder_offset": [ + "0x0", + "0x0" + ], + "fan_speedup_time": "1", + "host_type": "esp3d", + "long_retractions_when_cut": [ + "0", + "0" + ], + "machine_end_gcode": "; ===== ORCA END GCODE =====\nM400\nM83\nG92 E0\nG1 E-17 F1800 ; retract BEFORE any moves or power changes\n\n; Now lift and park\nG91\nG1 Z2 F2000\nG90\nG1 X100 Y160 F3000 ; parking point\n\n; Power down in order\nM104 T0 S0\nM104 T1 S0\nM106 S50 ; keep fan at ~50% while cooling (adjust if desired)\n; (Leave steppers on by omitting M84)\n; ===== END ORCA END GCODE =====\n", + "machine_load_filament_time": "0.5", + "machine_max_acceleration_e": [ + "10000", + "10000" + ], + "machine_max_acceleration_x": [ + "2000", + "2000" + ], + "machine_max_acceleration_y": [ + "2000", + "2000" + ], + "machine_max_acceleration_z": [ + "400", + "400" + ], + "machine_max_speed_e": [ + "30", + "30" + ], + "machine_max_speed_x": [ + "400", + "400" + ], + "machine_max_speed_y": [ + "300", + "300" + ], + "machine_max_speed_z": [ + "12", + "12" + ], + "machine_start_gcode": "; ===== ORCA START GCODE =====\n; minx:{first_layer_print_min[0]}\n; miny:{first_layer_print_min[1]}\n; maxx:{first_layer_print_max[0]}\n; maxy:{first_layer_print_max[1]}\n; used_0:{is_extruder_used[0]}\n; used_1:{is_extruder_used[1]}\n\n; Heaters\n{if is_extruder_used[0]}M104 T0 S{first_layer_temperature[0]}{endif}\n{if !is_extruder_used[0]}M104 T0 S150{endif}\n{if is_extruder_used[1]}M104 T1 S{first_layer_temperature[1]}{endif}\n{if !is_extruder_used[1]}M104 T1 S150{endif}\nM140 S0\nM106 S50\n\n; Home and clearance\nG28 X Y\nG28 Z\nG91\nG1 Z10 F1200 ; lift 10mm\nG90\n\n; Bed wait (dummy)\nM190 S0\n\n; Wait for target temps\n{if is_extruder_used[0]}M109 T0 S{first_layer_temperature[0]}{endif}\n{if is_extruder_used[1]}M109 T1 S{first_layer_temperature[1]}{endif}\n\n; Absolute XYZ / Relative E\nG90\nM83\n\n; ===== Dynamic Bed Leveling ====\nT0\nG1 Z3 F3000\nG1 X15 Y15 F6000\nG1 Z0.25 F1000; Otherwise Orca displays with a 3mm height\n; Single probe touch\nG30\nM420 S1\n; Bias the contact as -0.25 and fix Z-zero\nG92 Z-0.25 ; probed contact now treated as Z = -0.25\nG1 Z0.3 F300\n\n; ===== PRIME / TWO-LINE WIPES (sparse, no air extrude) =====\n\n; --- Tool 0: lines at Y=5 and Y=6 ---\n{if is_extruder_used[0]}\nT0\nG92 E0\nG1 X20 Y5 F3000\nG1 Z0.30 F600\nG1 X180 E18 F700\nG1 Y6.0 F1200\nG1 X20 E18 F700\nG92 E0\n{endif}\n\n; --- Tool 1: lines at Y=7 and Y=8 ---\n{if is_extruder_used[1]}\nT1\nG92 E0\nG1 X20 Y7 F3000\nG1 Z0.30 F600\nG1 X180 E18 F700\nG1 Y8.0 F1200\nG1 X20 E18 F700\nG92 E0\n{endif}\n\n; Activate initial tool (no retracts; Orca starts immediately)\nT{initial_extruder}\nG92 E0\n; ===== END ORCA START GCODE =====\n", + "machine_tool_change_time": "0.5", + "machine_unload_filament_time": "0.5", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "machine_pause_gcode": "M601", + "max_layer_height": [ + "0.32", + "0.32" + ], + "min_layer_height": [ + "0.1", + "0.1" + ], + "nozzle_diameter": [ + "0.4", + "0.4" + ], + "nozzle_type": "brass", + "print_host": "m3d-enabler.local", + "printable_area": [ + "0x0", + "210x0", + "210x150", + "0x150" + ], + "printer_settings_id": "M3D Enabler D8500 MM", + "retract_before_wipe": [ + "100%", + "100%" + ], + "retract_length_toolchange": [ + "17", + "17" + ], + "retract_lift_above": [ + "0", + "0" + ], + "retract_lift_below": [ + "0", + "0" + ], + "retract_lift_enforce": [ + "All Surfaces", + "All Surfaces" + ], + "retract_restart_extra": [ + "0", + "0" + ], + "retract_restart_extra_toolchange": [ + "0", + "0" + ], + "retract_when_changing_layer": [ + "1", + "1" + ], + "retraction_distances_when_cut": [ + "18", + "18" + ], + "retraction_length": [ + "4.5", + "4.5" + ], + "retraction_minimum_travel": [ + "2.5", + "2.5" + ], + "retraction_speed": [ + "60", + "60" + ], + "single_extruder_multi_material": "0", + "thumbnails": "120x60/PNG", + "travel_slope": [ + "45", + "45" + ], + "wipe": [ + "1", + "1" + ], + "wipe_distance": [ + "2", + "2" + ], + "z_hop": [ + "0", + "0" + ], + "z_hop_types": [ + "Normal Lift", + "Normal Lift" + ] +} \ No newline at end of file diff --git a/resources/profiles/M3D/machine/fdm_machine_common.json b/resources/profiles/M3D/machine/fdm_machine_common.json new file mode 100644 index 0000000000..9132e65373 --- /dev/null +++ b/resources/profiles/M3D/machine/fdm_machine_common.json @@ -0,0 +1,126 @@ +{ + "type": "machine", + "name": "fdm_machine_common", + "from": "system", + "instantiation": "false", + "printer_technology": "FFF", + "printer_settings_id": "fdm_machine_common", + "version": "1.0.0.0", + "nozzle_diameter": [ + "0.4" + ], + "printable_area": [ + "0x0", + "210x0", + "210x150", + "0x150" + ], + "thumbnails": [ + "16x16" + ], + "auxiliary_fan": "1", + "change_filament_gcode": "M18 E", + "deretraction_speed": [ + "50" + ], + "extruder_clearance_height_to_rod": "19", + "extruder_clearance_radius": "100", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_speedup_time": "1", + "host_type": "esp3d", + "long_retractions_when_cut": [ + "0" + ], + "machine_end_gcode": "; ===== ORCA END GCODE =====\nM400\nM83\nG92 E0\nG1 E-17 F1800 ; retract BEFORE any moves or power changes\n\n; Now lift and park\nG91\nG1 Z2 F2000\nG90\nG1 X100 Y160 F3000 ; parking point\n\n; Power down in order\nM104 T0 S0\nM104 T1 S0\nM106 S50 ; keep fan at ~50% while cooling (adjust if desired)\n; (Leave steppers on by omitting M84)\n; ===== END ORCA END GCODE =====\n", + "machine_load_filament_time": "0.5", + "machine_max_acceleration_e": [ + "10000" + ], + "machine_max_acceleration_x": [ + "2000" + ], + "machine_max_acceleration_y": [ + "2000" + ], + "machine_max_acceleration_z": [ + "400" + ], + "machine_max_speed_e": [ + "30" + ], + "machine_max_speed_x": [ + "400" + ], + "machine_max_speed_y": [ + "300" + ], + "machine_max_speed_z": [ + "12" + ], + "machine_start_gcode": "; ===== ORCA START GCODE =====\n; minx:{first_layer_print_min[0]}\n; miny:{first_layer_print_min[1]}\n; maxx:{first_layer_print_max[0]}\n; maxy:{first_layer_print_max[1]}\n; used_0:{is_extruder_used[0]}\n; used_1:{is_extruder_used[1]}\n\n; Heaters\n{if is_extruder_used[0]}M104 T0 S{first_layer_temperature[0]}{endif}\n{if !is_extruder_used[0]}M104 T0 S150{endif}\n{if is_extruder_used[1]}M104 T1 S{first_layer_temperature[1]}{endif}\n{if !is_extruder_used[1]}M104 T1 S150{endif}\nM140 S0\nM106 S50\n\n; Home and clearance\nG28 X Y\nG28 Z\nG91\nG1 Z10 F1200 ; lift 10mm\nG90\n\n; Bed wait (dummy)\nM190 S0\n\n; Wait for target temps\n{if is_extruder_used[0]}M109 T0 S{first_layer_temperature[0]}{endif}\n{if is_extruder_used[1]}M109 T1 S{first_layer_temperature[1]}{endif}\n\n; Absolute XYZ / Relative E\nG90\nM83\n\n; ===== Dynamic Bed Leveling ====\nT0\nG1 Z3 F3000\nG1 X15 Y15 F6000\nG1 Z0.25 F1000; Otherwise Orca displays with a 3mm height\n; Single probe touch\nG30\nM420 S1\n; Bias the contact as -0.25 and fix Z-zero\nG92 Z-0.25 ; probed contact now treated as Z = -0.25\nG1 Z0.3 F300\n\n; ===== PRIME / TWO-LINE WIPES (sparse, no air extrude) =====\n\n; --- Tool 0: lines at Y=5 and Y=6 ---\n{if is_extruder_used[0]}\nT0\nG92 E0\nG1 X20 Y5 F3000\nG1 Z0.30 F600\nG1 X180 E18 F700\nG1 Y6.0 F1200\nG1 X20 E18 F700\nG92 E0\n{endif}\n\n; --- Tool 1: lines at Y=7 and Y=8 ---\n{if is_extruder_used[1]}\nT1\nG92 E0\nG1 X20 Y7 F3000\nG1 Z0.30 F600\nG1 X180 E18 F700\nG1 Y8.0 F1200\nG1 X20 E18 F700\nG92 E0\n{endif}\n\n; Activate initial tool (no retracts; Orca starts immediately)\nT{initial_extruder}\nG92 E0\n; ===== END ORCA START GCODE =====\n", + "machine_tool_change_time": "0.5", + "machine_unload_filament_time": "0.5", + "max_layer_height": [ + "0.32" + ], + "min_layer_height": [ + "0.1" + ], + "retract_before_wipe": [ + "100%" + ], + "retract_length_toolchange": [ + "17" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "0" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "4.5" + ], + "retraction_minimum_travel": [ + "2.5" + ], + "retraction_speed": [ + "60" + ], + "single_extruder_multi_material": "0", + "travel_slope": [ + "45" + ], + "wipe": [ + "1" + ], + "wipe_distance": [ + "2" + ], + "z_hop": [ + "0" + ], + "z_hop_types": [ + "Normal Lift" + ] +} \ No newline at end of file diff --git a/resources/profiles/M3D/model/M3D_bed_model.stl b/resources/profiles/M3D/model/M3D_bed_model.stl new file mode 100644 index 0000000000..8ed24335dd Binary files /dev/null and b/resources/profiles/M3D/model/M3D_bed_model.stl differ diff --git a/resources/profiles/M3D/model/M3D_bed_texture.png b/resources/profiles/M3D/model/M3D_bed_texture.png new file mode 100644 index 0000000000..bd0e6b8b80 Binary files /dev/null and b/resources/profiles/M3D/model/M3D_bed_texture.png differ diff --git a/resources/profiles/M3D/process/0.15mm MM @D8500.json b/resources/profiles/M3D/process/0.15mm MM @D8500.json new file mode 100644 index 0000000000..ada09ff7ab --- /dev/null +++ b/resources/profiles/M3D/process/0.15mm MM @D8500.json @@ -0,0 +1,45 @@ +{ + "type": "process", + "name": "0.15mm MM @D8500", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "true", + "compatible_printers": [ + "M3D Enabler D8500 MM" + ], + "brim_type": "no_brim", + "support_object_first_layer_gap": "1", + "support_object_xy_distance": "0.5", + "bridge_acceleration": "50%", + "default_acceleration": "1000", + "initial_layer_acceleration": "500", + "inner_wall_acceleration": "1000", + "internal_solid_infill_acceleration": "100%", + "outer_wall_acceleration": "1000", + "sparse_infill_acceleration": "100%", + "top_surface_acceleration": "1000", + "travel_acceleration": "1000", + "enable_overhang_speed": "1", + "enable_prime_tower": "1", + "enable_support": "1", + "filename_format": "{input_filename_base}_{print_time}.gcode", + "gap_infill_speed": "60", + "initial_layer_speed": "35", + "inner_wall_line_width": "0.4", + "inner_wall_speed": "90", + "internal_solid_infill_speed": "60", + "layer_height": "0.15", + "outer_wall_speed": "45", + "prime_tower_brim_width": "1", + "prime_tower_width": "40", + "prime_volume": "30", + "slow_down_layers": "1", + "sparse_infill_density": "5%", + "sparse_infill_speed": "60", + "support_interface_speed": "30", + "support_type": "normal(manual)", + "travel_speed": "100", + "wall_loops": "2", + "wipe_tower_extra_spacing": "200%", + "wipe_tower_filament": "2" +} \ No newline at end of file diff --git a/resources/profiles/M3D/process/0.20mm MM @D8500.json b/resources/profiles/M3D/process/0.20mm MM @D8500.json new file mode 100644 index 0000000000..a2e2bd5a6a --- /dev/null +++ b/resources/profiles/M3D/process/0.20mm MM @D8500.json @@ -0,0 +1,46 @@ +{ + "type": "process", + "name": "0.20mm MM @D8500", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "true", + "compatible_printers": [ + "M3D Enabler D8500 MM" + ], + "brim_type": "no_brim", + "support_object_first_layer_gap": "1", + "support_object_xy_distance": "0.5", + "bridge_acceleration": "50%", + "default_acceleration": "1000", + "initial_layer_acceleration": "500", + "inner_wall_acceleration": "1000", + "internal_solid_infill_acceleration": "100%", + "outer_wall_acceleration": "1000", + "sparse_infill_acceleration": "100%", + "top_surface_acceleration": "1000", + "travel_acceleration": "1000", + "enable_overhang_speed": "1", + "enable_prime_tower": "1", + "enable_support": "1", + "filename_format": "{input_filename_base}_{print_time}.gcode", + "gap_infill_speed": "60", + "initial_layer_speed": "35", + "inner_wall_line_width": "0.4", + "inner_wall_speed": "90", + "internal_solid_infill_speed": "60", + "layer_height": "0.2", + "outer_wall_speed": "45", + "prime_tower_brim_width": "1", + "prime_tower_width": "40", + "prime_volume": "30", + "slow_down_layers": "1", + "sparse_infill_density": "5%", + "sparse_infill_speed": "60", + "support_interface_speed": "30", + "support_type": "normal(manual)", + "top_surface_speed": "40", + "travel_speed": "100", + "wall_loops": "2", + "wipe_tower_extra_spacing": "200%", + "wipe_tower_filament": "2" +} \ No newline at end of file diff --git a/resources/profiles/M3D/process/fdm_process_common.json b/resources/profiles/M3D/process/fdm_process_common.json new file mode 100644 index 0000000000..ac39c20dde --- /dev/null +++ b/resources/profiles/M3D/process/fdm_process_common.json @@ -0,0 +1,30 @@ +{ + "type": "process", + "name": "fdm_process_common", + "from": "system", + "instantiation": "false", + "brim_type": "no_brim", + "enable_overhang_speed": "0", + "enable_prime_tower": "1", + "enable_support": "1", + "filename_format": "{input_filename_base}_{print_time}.gcode", + "gap_infill_speed": "60", + "initial_layer_speed": "35", + "inner_wall_line_width": "0.4", + "inner_wall_speed": "90", + "internal_solid_infill_speed": "60", + "outer_wall_speed": "45", + "prime_tower_brim_width": "1", + "prime_tower_width": "40", + "prime_volume": "30", + "slow_down_layers": "1", + "sparse_infill_density": "5%", + "sparse_infill_speed": "60", + "support_interface_speed": "30", + "support_type": "normal(manual)", + "top_surface_speed": "40", + "travel_speed": "100", + "wall_loops": "2", + "wipe_tower_extra_spacing": "200%", + "wipe_tower_filament": "2" +} \ No newline at end of file diff --git a/resources/profiles/MagicMaker/MM hj sk_cover.png b/resources/profiles/MagicMaker/MM hj SK_cover.png similarity index 100% rename from resources/profiles/MagicMaker/MM hj sk_cover.png rename to resources/profiles/MagicMaker/MM hj SK_cover.png diff --git a/resources/profiles/OpenEYE.json b/resources/profiles/OpenEYE.json new file mode 100644 index 0000000000..b3bd6496dd --- /dev/null +++ b/resources/profiles/OpenEYE.json @@ -0,0 +1,198 @@ +{ + "name": "OpenEYE", + "url": "http://www.openeye.tech", + "version": "01.00.00.03", + "force_update": "0", + "description": "OpenEYE Printers Configurations", + "machine_model_list": [ + { + "name": "OpenEYE Peacock V2", + "sub_path": "machine/OpenEYE Peacock V2.json" + } + ], + "process_list": [ + { + "name": "fdm_process_common", + "sub_path": "process/fdm_process_common.json" + }, + { + "name": "fdm_process_openeye_common", + "sub_path": "process/fdm_process_openeye_common.json" + }, + { + "name": "fdm_process_openeye_0.06_nozzle_0.2", + "sub_path": "process/fdm_process_openeye_0.06_nozzle_0.2.json" + }, + { + "name": "fdm_process_openeye_0.08_nozzle_0.4", + "sub_path": "process/fdm_process_openeye_0.08_nozzle_0.4.json" + }, + { + "name": "fdm_process_openeye_0.08_nozzle_0.2", + "sub_path": "process/fdm_process_openeye_0.08_nozzle_0.2.json" + }, + { + "name": "fdm_process_openeye_0.10_nozzle_0.2", + "sub_path": "process/fdm_process_openeye_0.10_nozzle_0.2.json" + }, + { + "name": "fdm_process_openeye_0.12_nozzle_0.4", + "sub_path": "process/fdm_process_openeye_0.12_nozzle_0.4.json" + }, + { + "name": "fdm_process_openeye_0.12_nozzle_0.2", + "sub_path": "process/fdm_process_openeye_0.12_nozzle_0.2.json" + }, + { + "name": "fdm_process_openeye_0.14_nozzle_0.2", + "sub_path": "process/fdm_process_openeye_0.14_nozzle_0.2.json" + }, + { + "name": "fdm_process_openeye_0.16_nozzle_0.4", + "sub_path": "process/fdm_process_openeye_0.16_nozzle_0.4.json" + }, + { + "name": "fdm_process_openeye_0.18_nozzle_0.6", + "sub_path": "process/fdm_process_openeye_0.18_nozzle_0.6.json" + }, + { + "name": "fdm_process_openeye_0.20_nozzle_0.4", + "sub_path": "process/fdm_process_openeye_0.20_nozzle_0.4.json" + }, + { + "name": "fdm_process_openeye_0.24_nozzle_0.4", + "sub_path": "process/fdm_process_openeye_0.24_nozzle_0.4.json" + }, + { + "name": "fdm_process_openeye_0.24_nozzle_0.6", + "sub_path": "process/fdm_process_openeye_0.24_nozzle_0.6.json" + }, + { + "name": "fdm_process_openeye_0.24_nozzle_0.8", + "sub_path": "process/fdm_process_openeye_0.24_nozzle_0.8.json" + }, + { + "name": "fdm_process_openeye_0.28_nozzle_0.4", + "sub_path": "process/fdm_process_openeye_0.28_nozzle_0.4.json" + }, + { + "name": "fdm_process_openeye_0.30_nozzle_0.6", + "sub_path": "process/fdm_process_openeye_0.30_nozzle_0.6.json" + }, + { + "name": "fdm_process_openeye_0.32_nozzle_0.8", + "sub_path": "process/fdm_process_openeye_0.32_nozzle_0.8.json" + }, + { + "name": "fdm_process_openeye_0.36_nozzle_0.6", + "sub_path": "process/fdm_process_openeye_0.36_nozzle_0.6.json" + }, + { + "name": "fdm_process_openeye_0.40_nozzle_0.8", + "sub_path": "process/fdm_process_openeye_0.40_nozzle_0.8.json" + }, + { + "name": "fdm_process_openeye_0.42_nozzle_0.6", + "sub_path": "process/fdm_process_openeye_0.42_nozzle_0.6.json" + }, + { + "name": "fdm_process_openeye_0.48_nozzle_0.8", + "sub_path": "process/fdm_process_openeye_0.48_nozzle_0.8.json" + }, + { + "name": "fdm_process_openeye_0.56_nozzle_0.8", + "sub_path": "process/fdm_process_openeye_0.56_nozzle_0.8.json" + }, + { + "name": "0.08mm Extra Fine @OpenEYE Peacock V2 0.2 nozzle", + "sub_path": "process/0.08mm Extra Fine @OpenEYE Peacock V2 0.2 nozzle.json" + }, + { + "name": "0.08mm Extra Fine @OpenEYE Peacock V2", + "sub_path": "process/0.08mm Extra Fine @OpenEYE Peacock V2.json" + }, + { + "name": "0.10mm Standard @OpenEYE Peacock V2 0.2 nozzle", + "sub_path": "process/0.10mm Standard @OpenEYE Peacock V2 0.2 nozzle.json" + }, + { + "name": "0.12mm Balanced Quality @OpenEYE Peacock V2 0.2 nozzle", + "sub_path": "process/0.12mm Balanced Quality @OpenEYE Peacock V2 0.2 nozzle.json" + }, + { + "name": "0.12mm Fine @OpenEYE Peacock V2", + "sub_path": "process/0.12mm Fine @OpenEYE Peacock V2.json" + }, + { + "name": "0.16mm Balanced Quality @OpenEYE Peacock V2", + "sub_path": "process/0.16mm Balanced Quality @OpenEYE Peacock V2.json" + }, + { + "name": "0.16mm Standard @OpenEYE Peacock V2", + "sub_path": "process/0.16mm Standard @OpenEYE Peacock V2.json" + }, + { + "name": "0.18mm Balanced Quality @OpenEYE Peacock V2 0.6 nozzle", + "sub_path": "process/0.18mm Balanced Quality @OpenEYE Peacock V2 0.6 nozzle.json" + }, + { + "name": "0.20mm Balanced Strength @OpenEYE Peacock V2", + "sub_path": "process/0.20mm Balanced Strength @OpenEYE Peacock V2.json" + }, + { + "name": "0.20mm Standard @OpenEYE Peacock V2", + "sub_path": "process/0.20mm Standard @OpenEYE Peacock V2.json" + }, + { + "name": "0.24mm Balanced Quality @OpenEYE Peacock V2 0.8 nozzle", + "sub_path": "process/0.24mm Balanced Quality @OpenEYE Peacock V2 0.8 nozzle.json" + }, + { + "name": "0.24mm Balanced Strength @OpenEYE Peacock V2 0.6 nozzle", + "sub_path": "process/0.24mm Balanced Strength @OpenEYE Peacock V2 0.6 nozzle.json" + }, + { + "name": "0.24mm Standard @OpenEYE Peacock V2", + "sub_path": "process/0.24mm Standard @OpenEYE Peacock V2.json" + }, + { + "name": "0.30mm Standard @OpenEYE Peacock V2 0.6 nozzle", + "sub_path": "process/0.30mm Standard @OpenEYE Peacock V2 0.6 nozzle.json" + }, + { + "name": "0.32mm Balanced Strength @OpenEYE Peacock V2 0.8 nozzle", + "sub_path": "process/0.32mm Balanced Strength @OpenEYE Peacock V2 0.8 nozzle.json" + }, + { + "name": "0.40mm Standard @OpenEYE Peacock V2 0.8 nozzle", + "sub_path": "process/0.40mm Standard @OpenEYE Peacock V2 0.8 nozzle.json" + } + ], + "filament_list": [], + "machine_list": [ + { + "name": "fdm_machine_common", + "sub_path": "machine/fdm_machine_common.json" + }, + { + "name": "fdm_openeye_common", + "sub_path": "machine/fdm_openeye_common.json" + }, + { + "name": "OpenEYE Peacock V2 0.4 nozzle", + "sub_path": "machine/OpenEYE Peacock V2 0.4 nozzle.json" + }, + { + "name": "OpenEYE Peacock V2 0.2 nozzle", + "sub_path": "machine/OpenEYE Peacock V2 0.2 nozzle.json" + }, + { + "name": "OpenEYE Peacock V2 0.6 nozzle", + "sub_path": "machine/OpenEYE Peacock V2 0.6 nozzle.json" + }, + { + "name": "OpenEYE Peacock V2 0.8 nozzle", + "sub_path": "machine/OpenEYE Peacock V2 0.8 nozzle.json" + } + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/OpenEYE Peacock V2_cover.png b/resources/profiles/OpenEYE/OpenEYE Peacock V2_cover.png new file mode 100644 index 0000000000..394f42c693 Binary files /dev/null and b/resources/profiles/OpenEYE/OpenEYE Peacock V2_cover.png differ diff --git a/resources/profiles/OpenEYE/Plate.stl b/resources/profiles/OpenEYE/Plate.stl new file mode 100644 index 0000000000..c57b67b0aa Binary files /dev/null and b/resources/profiles/OpenEYE/Plate.stl differ diff --git a/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.2 nozzle.json b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.2 nozzle.json new file mode 100644 index 0000000000..1c427d38c2 --- /dev/null +++ b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.2 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "machine", + "name": "OpenEYE Peacock V2 0.2 nozzle", + "inherits": "OpenEYE Peacock V2 0.4 nozzle", + "from": "system", + "setting_id": "GM002", + "instantiation": "true", + "nozzle_diameter": [ + "0.2" + ], + "printer_model": "OpenEYE Peacock V2", + "printer_variant": "0.2", + "default_print_profile": "0.10mm Standard @OpenEYE Peacock V2 0.2 nozzle", + "default_bed_type": "Textured PEI Plate", + "max_layer_height": [ + "0.14" + ], + "min_layer_height": [ + "0.04" + ], + "retraction_length": [ + "0.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.4 nozzle.json b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.4 nozzle.json new file mode 100644 index 0000000000..2912a51b45 --- /dev/null +++ b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.4 nozzle.json @@ -0,0 +1,51 @@ +{ + "default_print_profile": "0.20mm Standard @OpenEYE Peacock V2", + "default_bed_type": "Textured PEI Plate", + "from": "system", + "inherits": "fdm_openeye_common", + "instantiation": "true", + "adaptive_bed_mesh_margin": "10", + "bed_mesh_max": "211,211", + "bed_mesh_min": "1.5,7", + "layer_change_gcode": "SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}\n_MMU_UPDATE_HEIGHT", + "machine_end_gcode": "MMU_END\nEND_PRINT", + "machine_load_filament_time": "30", + "machine_max_speed_e": [ + "60", + "60" + ], + "machine_max_speed_x": [ + "500", + "500" + ], + "machine_max_speed_y": [ + "500", + "500" + ], + "machine_max_speed_z": [ + "30", + "30" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nMMU_START_SETUP INITIAL_TOOL={initial_tool} TOTAL_TOOLCHANGES=!total_toolchanges! REFERENCED_TOOLS=!referenced_tools! TOOL_COLORS=!colors! TOOL_TEMPS=!temperatures! TOOL_MATERIALS=!materials! FILAMENT_NAMES=!filament_names! PURGE_VOLUMES=!purge_volumes!\nMMU_START_CHECK\nSTART_PRINT BED_TEMP=[bed_temperature_initial_layer] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TYPE=\"{curr_bed_type}\" MESH_MIN={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} MESH_MAX={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE_MARGIN={adaptive_bed_mesh_margin}\n; Enter YOUR exist start_print macro call here (minus purging logic because tool may not be loaded yet)\nMMU_START_LOAD_INITIAL_TOOL\n; Optionally add YOUR additional start logic (like purging) here to run just prior to start\nSTART_PRINT_SECONDARY\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} ; For pause at layer functionality and better print stats", + "machine_unload_filament_time": "30", + "name": "OpenEYE Peacock V2 0.4 nozzle", + "nozzle_diameter": [ + "0.4" + ], + "printable_area": [ + "1.5x7", + "235x7", + "235x235", + "1.5x235" + ], + "printable_height": "200", + "printer_model": "OpenEYE Peacock V2", + "printer_variant": "0.4", + "retract_lift_below": [ + "180", + "180" + ], + "setting_id": "GM001", + "type": "machine" +} diff --git a/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.6 nozzle.json b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.6 nozzle.json new file mode 100644 index 0000000000..aa78fa17ab --- /dev/null +++ b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.6 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "machine", + "name": "OpenEYE Peacock V2 0.6 nozzle", + "inherits": "OpenEYE Peacock V2 0.4 nozzle", + "from": "system", + "setting_id": "GM003", + "instantiation": "true", + "nozzle_diameter": [ + "0.6" + ], + "printer_model": "OpenEYE Peacock V2", + "printer_variant": "0.6", + "default_print_profile": "0.30mm Standard @OpenEYE Peacock V2 0.6 nozzle", + "default_bed_type": "Textured PEI Plate", + "max_layer_height": [ + "0.42" + ], + "min_layer_height": [ + "0.12" + ], + "retraction_length": [ + "1.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.8 nozzle.json b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.8 nozzle.json new file mode 100644 index 0000000000..ef5c46aed3 --- /dev/null +++ b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2 0.8 nozzle.json @@ -0,0 +1,24 @@ +{ + "type": "machine", + "name": "OpenEYE Peacock V2 0.8 nozzle", + "inherits": "OpenEYE Peacock V2 0.4 nozzle", + "from": "system", + "setting_id": "GM004", + "instantiation": "true", + "nozzle_diameter": [ + "0.8" + ], + "printer_model": "OpenEYE Peacock V2", + "printer_variant": "0.8", + "default_print_profile": "0.40mm Standard @OpenEYE Peacock V2 0.8 nozzle", + "default_bed_type": "Textured PEI Plate", + "max_layer_height": [ + "0.56" + ], + "min_layer_height": [ + "0.16" + ], + "retraction_length": [ + "3" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2.json new file mode 100644 index 0000000000..44b78a7450 --- /dev/null +++ b/resources/profiles/OpenEYE/machine/OpenEYE Peacock V2.json @@ -0,0 +1,13 @@ +{ + "type": "machine_model", + "name": "OpenEYE Peacock V2", + "nozzle_diameter": "0.4;0.2;0.6;0.8", + "url": "http://www.openeye.tech", + "bed_model": "Plate.stl", + "bed_texture": "pei.png", + "default_bed_type": "Textured PEI Plate", + "family": "OpenEYE", + "machine_tech": "FFF", + "model_id": "openeye_01", + "default_materials": "Generic ABS @System;Generic PLA @System;Generic PLA-CF @System;Generic PETG @System;Generic TPU @System;Generic ASA @System;Generic PC @System;Generic PVA @System;Generic PA @System;Generic PA-CF @System" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/machine/fdm_machine_common.json b/resources/profiles/OpenEYE/machine/fdm_machine_common.json new file mode 100644 index 0000000000..7a32c1630a --- /dev/null +++ b/resources/profiles/OpenEYE/machine/fdm_machine_common.json @@ -0,0 +1,121 @@ +{ + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n", + "best_object_pos": "0.5x0.5", + "change_filament_gcode": "", + "default_filament_profile": [], + "default_print_profile": "", + "deretraction_speed": [ + "40" + ], + "extruder_clearance_height_to_lid": "140", + "extruder_clearance_height_to_rod": "34", + "extruder_clearance_radius": "65", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "from": "system", + "gcode_flavor": "marlin", + "instantiation": "false", + "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]", + "machine_end_gcode": "M400 ; wait for buffer to clear\nG92 E0 ; zero the extruder\nG1 E-4.0 F3600; retract \nG91\nG1 Z3;\nM104 S0 ; turn off hotend\nM140 S0 ; turn off bed\nM106 S0 ; turn off fan\nG90 \nG0 X110 Y200 F3600 \nprint_end", + "machine_max_acceleration_e": [ + "5000" + ], + "machine_max_acceleration_extruding": [ + "10000" + ], + "machine_max_acceleration_retracting": [ + "1000" + ], + "machine_max_acceleration_x": [ + "10000" + ], + "machine_max_acceleration_y": [ + "10000" + ], + "machine_max_acceleration_z": [ + "100" + ], + "machine_max_jerk_e": [ + "5" + ], + "machine_max_jerk_x": [ + "8" + ], + "machine_max_jerk_y": [ + "8" + ], + "machine_max_jerk_z": [ + "3" + ], + "machine_max_speed_e": [ + "60" + ], + "machine_max_speed_x": [ + "500" + ], + "machine_max_speed_y": [ + "500" + ], + "machine_max_speed_z": [ + "10" + ], + "machine_min_extruding_rate": [ + "0" + ], + "machine_min_travel_rate": [ + "0" + ], + "machine_pause_gcode": "M601", + "machine_start_gcode": "G0 Z20 F9000\nG92 E0; G1 E-10 F1200\nG28\nM970 Q1 A10 B10 C130 K0\nM970 Q1 A10 B131 C250 K1\nM974 Q1 S1 P0\nM970 Q0 A10 B10 C130 H20 K0\nM970 Q0 A10 B131 C250 K1\nM974 Q0 S1 P0\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\nG29 ;Home\nG90;\nG92 E0 ;Reset Extruder \nG1 Z2.0 F3000 ;Move Z Axis up \nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nM109 S205;\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder \nG1 X110 Y110 Z2.0 F3000 ;Move Z Axis up", + "max_layer_height": [ + "0.28" + ], + "min_layer_height": [ + "0.08" + ], + "name": "fdm_machine_common", + "nozzle_diameter": [ + "0.4" + ], + "printable_height": "250", + "printer_settings_id": "", + "printer_technology": "FFF", + "printer_variant": "0.4", + "retract_before_wipe": [ + "70%" + ], + "retract_length_toolchange": [ + "1" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_length": [ + "5" + ], + "retraction_minimum_travel": [ + "2" + ], + "retraction_speed": [ + "60" + ], + "silent_mode": "0", + "single_extruder_multi_material": "1", + "type": "machine", + "wipe": [ + "1" + ], + "z_hop": [ + "0" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/machine/fdm_openeye_common.json b/resources/profiles/OpenEYE/machine/fdm_openeye_common.json new file mode 100644 index 0000000000..a428532958 --- /dev/null +++ b/resources/profiles/OpenEYE/machine/fdm_openeye_common.json @@ -0,0 +1,226 @@ +{ + "adaptive_bed_mesh_margin": "0", + "auxiliary_fan": "0", + "bed_exclude_area": [ + "0x0" + ], + "bed_mesh_max": "99999,99999", + "bed_mesh_min": "-99999,-99999", + "bed_mesh_probe_distance": "50,50", + "bed_temperature_formula": "by_highest_temp", + "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\nTIMELAPSE_TAKE_FRAME", + "best_object_pos": "0.5,0.5", + "change_filament_gcode": "", + "cooling_tube_length": "0", + "cooling_tube_retraction": "0", + "default_bed_type": "Textured PEI Plate", + "default_filament_profile": [ + "Generic PLA @System" + ], + "default_print_profile": "0.20mm Standard @OpenEYE Peacock V2", + "deretraction_speed": [ + "30" + ], + "disable_m73": "0", + "emit_machine_limits_to_gcode": "0", + "enable_filament_ramming": "0", + "enable_long_retraction_when_cut": "0", + "extra_loading_move": "0", + "extruder_clearance_height_to_lid": "34", + "extruder_clearance_height_to_rod": "34", + "extruder_clearance_radius": "47", + "extruder_colour": [ + "#FCE94F" + ], + "extruder_offset": [ + "0x0" + ], + "fan_kickstart": "0", + "fan_speedup_overhangs": "1", + "fan_speedup_time": "0", + "from": "system", + "gcode_flavor": "klipper", + "head_wrap_detect_zone": [], + "high_current_on_filament_swap": "0", + "host_type": "octoprint", + "inherits": "fdm_machine_common", + "instantiation": "false", + "layer_change_gcode": "SET_PRINT_STATS_INFO CURRENT_LAYER={layer_num + 1}\n_MMU_UPDATE_HEIGHT", + "long_retractions_when_cut": [ + "0" + ], + "machine_end_gcode": "MMU_END\nEND_PRINT", + "machine_load_filament_time": "0", + "machine_max_acceleration_e": [ + "5000", + "5000" + ], + "machine_max_acceleration_extruding": [ + "20000", + "20000" + ], + "machine_max_acceleration_retracting": [ + "5000", + "5000" + ], + "machine_max_acceleration_travel": [ + "9000", + "9000" + ], + "machine_max_acceleration_x": [ + "20000", + "20000" + ], + "machine_max_acceleration_y": [ + "20000", + "20000" + ], + "machine_max_acceleration_z": [ + "500", + "500" + ], + "machine_max_jerk_e": [ + "2.5", + "2.5" + ], + "machine_max_jerk_x": [ + "9", + "9" + ], + "machine_max_jerk_y": [ + "9", + "9" + ], + "machine_max_jerk_z": [ + "3", + "3" + ], + "machine_max_junction_deviation": [ + "0", + "0" + ], + "machine_max_speed_e": [ + "60", + "60" + ], + "machine_max_speed_x": [ + "500", + "500" + ], + "machine_max_speed_y": [ + "500", + "500" + ], + "machine_max_speed_z": [ + "30", + "30" + ], + "machine_min_extruding_rate": [ + "0", + "0" + ], + "machine_min_travel_rate": [ + "0", + "0" + ], + "machine_pause_gcode": "PAUSE", + "machine_start_gcode": "SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]\nMMU_START_SETUP INITIAL_TOOL={initial_tool} TOTAL_TOOLCHANGES=!total_toolchanges! REFERENCED_TOOLS=!referenced_tools! TOOL_COLORS=!colors! TOOL_TEMPS=!temperatures! TOOL_MATERIALS=!materials! FILAMENT_NAMES=!filament_names! PURGE_VOLUMES=!purge_volumes!\nMMU_START_CHECK\nSTART_PRINT BED_TEMP=[bed_temperature_initial_layer] EXTRUDER_TEMP=[nozzle_temperature_initial_layer] BED_TYPE=\"{curr_bed_type}\" MESH_MIN={adaptive_bed_mesh_min[0]},{adaptive_bed_mesh_min[1]} MESH_MAX={adaptive_bed_mesh_max[0]},{adaptive_bed_mesh_max[1]} ALGORITHM=[bed_mesh_algo] PROBE_COUNT={bed_mesh_probe_count[0]},{bed_mesh_probe_count[1]} ADAPTIVE_MARGIN={adaptive_bed_mesh_margin}\n; Enter YOUR exist start_print macro call here (minus purging logic because tool may not be loaded yet)\nMMU_START_LOAD_INITIAL_TOOL\n; Optionally add YOUR additional start logic (like purging) here to run just prior to start\nSTART_PRINT_SECONDARY\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} ; For pause at layer functionality and better print stats", + "machine_tool_change_time": "0", + "machine_unload_filament_time": "0", + "manual_filament_change": "0", + "max_layer_height": [ + "0.28" + ], + "max_resonance_avoidance_speed": "120", + "min_layer_height": [ + "0.08" + ], + "min_resonance_avoidance_speed": "70", + "name": "fdm_openeye_common", + "nozzle_diameter": [ + "0.4", + "0.4" + ], + "nozzle_height": "2.5", + "nozzle_hrc": "0", + "nozzle_type": "brass", + "nozzle_volume": "0", + "parking_pos_retraction": "0", + "pellet_modded_printer": "0", + "preferred_orientation": "0", + "print_host": "openeye3dpi.local", + "printable_height": "250", + "printer_settings_id": "", + "printer_technology": "FFF", + "printer_variant": "0.4", + "printing_by_object_gcode": "", + "purge_in_prime_tower": "1", + "resonance_avoidance": "0", + "retract_before_wipe": [ + "0%" + ], + "retract_length_toolchange": [ + "0" + ], + "retract_lift_above": [ + "0" + ], + "retract_lift_below": [ + "180", + "180" + ], + "retract_lift_enforce": [ + "All Surfaces" + ], + "retract_restart_extra": [ + "0" + ], + "retract_restart_extra_toolchange": [ + "0" + ], + "retract_when_changing_layer": [ + "1" + ], + "retraction_distances_when_cut": [ + "18" + ], + "retraction_length": [ + "0.8" + ], + "retraction_minimum_travel": [ + "1" + ], + "retraction_speed": [ + "30" + ], + "scan_first_layer": "0", + "silent_mode": "0", + "single_extruder_multi_material": "1", + "support_air_filtration": "0", + "support_chamber_temp_control": "0", + "support_multi_bed_types": "1", + "template_custom_gcode": "", + "thumbnails": "48x48/PNG, 300x300/PNG", + "thumbnails_format": "PNG", + "time_cost": "0", + "time_lapse_gcode": "", + "travel_slope": [ + "3" + ], + "type": "machine", + "use_firmware_retraction": "0", + "use_relative_e_distances": "1", + "wipe": [ + "1" + ], + "wipe_distance": [ + "1" + ], + "z_hop": [ + "0.4" + ], + "z_hop_types": [ + "Auto Lift" + ], + "z_offset": "0" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/pei.png b/resources/profiles/OpenEYE/pei.png new file mode 100644 index 0000000000..30c64391b8 Binary files /dev/null and b/resources/profiles/OpenEYE/pei.png differ diff --git a/resources/profiles/OpenEYE/peo.png b/resources/profiles/OpenEYE/peo.png new file mode 100644 index 0000000000..b3d70117d7 Binary files /dev/null and b/resources/profiles/OpenEYE/peo.png differ diff --git a/resources/profiles/OpenEYE/pet.png b/resources/profiles/OpenEYE/pet.png new file mode 100644 index 0000000000..0679d1bf93 Binary files /dev/null and b/resources/profiles/OpenEYE/pet.png differ diff --git a/resources/profiles/OpenEYE/process/0.08mm Extra Fine @OpenEYE Peacock V2 0.2 nozzle.json b/resources/profiles/OpenEYE/process/0.08mm Extra Fine @OpenEYE Peacock V2 0.2 nozzle.json new file mode 100644 index 0000000000..b936ec8a5e --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.08mm Extra Fine @OpenEYE Peacock V2 0.2 nozzle.json @@ -0,0 +1,18 @@ +{ + "type": "process", + "name": "0.08mm Extra Fine @OpenEYE Peacock V2 0.2 nozzle", + "inherits": "fdm_process_openeye_0.08_nozzle_0.2", + "from": "system", + "setting_id": "GP139", + "instantiation": "true", + "description": "High quality profile for 0.2mm nozzle, prioritizing print quality.", + "default_acceleration": "8000", + "initial_layer_speed": "40", + "overhang_1_4_speed": "60", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.08mm Extra Fine @OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/process/0.08mm Extra Fine @OpenEYE Peacock V2.json new file mode 100644 index 0000000000..a0a4d450db --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.08mm Extra Fine @OpenEYE Peacock V2.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "0.08mm Extra Fine @OpenEYE Peacock V2", + "inherits": "fdm_process_openeye_0.08_nozzle_0.4", + "from": "system", + "setting_id": "GP136", + "instantiation": "true", + "default_acceleration": "4000", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "40", + "inner_wall_speed": "120", + "internal_solid_infill_speed": "120", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_pattern": "gyroid", + "sparse_infill_speed": "100", + "top_surface_speed": "120", + "compatible_printers": [ + "OpenEYE Peacock V2 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.10mm Standard @OpenEYE Peacock V2 0.2 nozzle.json b/resources/profiles/OpenEYE/process/0.10mm Standard @OpenEYE Peacock V2 0.2 nozzle.json new file mode 100644 index 0000000000..3b7dad1b6d --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.10mm Standard @OpenEYE Peacock V2 0.2 nozzle.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "0.10mm Standard @OpenEYE Peacock V2 0.2 nozzle", + "inherits": "fdm_process_openeye_0.10_nozzle_0.2", + "from": "system", + "setting_id": "GP123", + "instantiation": "true", + "default_acceleration": "8000", + "initial_layer_speed": "40", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.12mm Balanced Quality @OpenEYE Peacock V2 0.2 nozzle.json b/resources/profiles/OpenEYE/process/0.12mm Balanced Quality @OpenEYE Peacock V2 0.2 nozzle.json new file mode 100644 index 0000000000..a0f9480ac6 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.12mm Balanced Quality @OpenEYE Peacock V2 0.2 nozzle.json @@ -0,0 +1,17 @@ +{ + "type": "process", + "name": "0.12mm Balanced Quality @OpenEYE Peacock V2 0.2 nozzle", + "inherits": "fdm_process_openeye_0.12_nozzle_0.2", + "from": "system", + "setting_id": "GP140", + "instantiation": "true", + "default_acceleration": "8000", + "initial_layer_speed": "40", + "overhang_1_4_speed": "60", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.2 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.12mm Fine @OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/process/0.12mm Fine @OpenEYE Peacock V2.json new file mode 100644 index 0000000000..5977f3977d --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.12mm Fine @OpenEYE Peacock V2.json @@ -0,0 +1,31 @@ +{ + "type": "process", + "name": "0.12mm Fine @OpenEYE Peacock V2", + "inherits": "fdm_process_openeye_0.12_nozzle_0.4", + "from": "system", + "setting_id": "GP142", + "instantiation": "true", + "bottom_shell_layers": "7", + "default_acceleration": "4000", + "gap_infill_speed": "50", + "initial_layer_infill_speed": "70", + "initial_layer_speed": "40", + "inner_wall_speed": "120", + "internal_solid_infill_speed": "150", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_pattern": "gyroid", + "sparse_infill_speed": "100", + "top_color_penetration_layers": "7", + "top_shell_layers": "9", + "top_shell_thickness": "0.8", + "top_surface_speed": "150", + "compatible_printers": [ + "OpenEYE Peacock V2 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.16mm Balanced Quality @OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/process/0.16mm Balanced Quality @OpenEYE Peacock V2.json new file mode 100644 index 0000000000..9d3101e52d --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.16mm Balanced Quality @OpenEYE Peacock V2.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.16mm Balanced Quality @OpenEYE Peacock V2", + "inherits": "fdm_process_openeye_0.16_nozzle_0.4", + "from": "system", + "setting_id": "GP174", + "instantiation": "true", + "description": "High quality profile for 0.16mm layer height, prioritizing print quality and strength.", + "default_acceleration": "4000", + "initial_layer_speed": "50", + "inner_wall_speed": "150", + "internal_solid_infill_speed": "180", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "overhang_1_4_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_pattern": "gyroid", + "sparse_infill_speed": "180", + "top_surface_speed": "150", + "compatible_printers": [ + "OpenEYE Peacock V2 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.16mm Standard @OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/process/0.16mm Standard @OpenEYE Peacock V2.json new file mode 100644 index 0000000000..66e8d419b0 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.16mm Standard @OpenEYE Peacock V2.json @@ -0,0 +1,21 @@ +{ + "type": "process", + "name": "0.16mm Standard @OpenEYE Peacock V2", + "inherits": "fdm_process_openeye_0.16_nozzle_0.4", + "from": "system", + "setting_id": "GP143", + "instantiation": "true", + "description": "Standard profile for 0.16mm layer height, prioritizing speed.", + "default_acceleration": "8000", + "initial_layer_speed": "50", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "overhang_1_4_speed": "60", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.18mm Balanced Quality @OpenEYE Peacock V2 0.6 nozzle.json b/resources/profiles/OpenEYE/process/0.18mm Balanced Quality @OpenEYE Peacock V2 0.6 nozzle.json new file mode 100644 index 0000000000..07e5caf0ad --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.18mm Balanced Quality @OpenEYE Peacock V2 0.6 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.18mm Balanced Quality @OpenEYE Peacock V2 0.6 nozzle", + "inherits": "fdm_process_openeye_0.18_nozzle_0.6", + "from": "system", + "setting_id": "GP137", + "instantiation": "true", + "description": "High quality profile for 0.6mm nozzle, prioritizing print quality and strength.", + "bridge_speed": "50", + "default_acceleration": "8000", + "gap_infill_speed": "250", + "initial_layer_infill_speed": "105", + "initial_layer_speed": "50", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "overhang_3_4_speed": "30", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "top_surface_speed": "200", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.20mm Balanced Strength @OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/process/0.20mm Balanced Strength @OpenEYE Peacock V2.json new file mode 100644 index 0000000000..997c79a2d1 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.20mm Balanced Strength @OpenEYE Peacock V2.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.20mm Balanced Strength @OpenEYE Peacock V2", + "inherits": "fdm_process_openeye_0.20_nozzle_0.4", + "from": "system", + "setting_id": "GP173", + "instantiation": "true", + "description": "High quality profile for 0.2mm layer height, prioritizing strength and print quality.", + "bottom_shell_layers": "4", + "default_acceleration": "4000", + "initial_layer_speed": "50", + "inner_wall_speed": "150", + "internal_solid_infill_speed": "200", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "overhang_2_4_speed": "30", + "overhang_3_4_speed": "10", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "200", + "top_shell_layers": "6", + "top_surface_speed": "150", + "compatible_printers": [ + "OpenEYE Peacock V2 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.20mm Standard @OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/process/0.20mm Standard @OpenEYE Peacock V2.json new file mode 100644 index 0000000000..6cfd900f45 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.20mm Standard @OpenEYE Peacock V2.json @@ -0,0 +1,21 @@ +{ + "type": "process", + "name": "0.20mm Standard @OpenEYE Peacock V2", + "inherits": "fdm_process_openeye_0.20_nozzle_0.4", + "from": "system", + "setting_id": "GP124", + "instantiation": "true", + "description": "Standard profile for 0.4mm nozzle, prioritizing speed.", + "default_acceleration": "8000", + "initial_layer_speed": "50", + "internal_solid_infill_speed": "250", + "inner_wall_speed": "300", + "outer_wall_speed": "200", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.24mm Balanced Quality @OpenEYE Peacock V2 0.8 nozzle.json b/resources/profiles/OpenEYE/process/0.24mm Balanced Quality @OpenEYE Peacock V2 0.8 nozzle.json new file mode 100644 index 0000000000..1485ca9fe0 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.24mm Balanced Quality @OpenEYE Peacock V2 0.8 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "0.24mm Balanced Quality @OpenEYE Peacock V2 0.8 nozzle", + "inherits": "fdm_process_openeye_0.24_nozzle_0.8", + "from": "system", + "setting_id": "GP138", + "instantiation": "true", + "description": "High quality profile for 0.8mm nozzle, prioritizing print quality.", + "bridge_speed": "50", + "default_acceleration": "8000", + "gap_infill_speed": "250", + "initial_layer_infill_speed": "105", + "initial_layer_speed": "50", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "top_surface_speed": "200", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.24mm Balanced Strength @OpenEYE Peacock V2 0.6 nozzle.json b/resources/profiles/OpenEYE/process/0.24mm Balanced Strength @OpenEYE Peacock V2 0.6 nozzle.json new file mode 100644 index 0000000000..316b2e7ae0 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.24mm Balanced Strength @OpenEYE Peacock V2 0.6 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.24mm Balanced Strength @OpenEYE Peacock V2 0.6 nozzle", + "inherits": "fdm_process_openeye_0.24_nozzle_0.6", + "from": "system", + "setting_id": "GP146", + "instantiation": "true", + "description": "Strength profile for 0.6mm nozzle, prioritizing strength.", + "bridge_speed": "50", + "default_acceleration": "8000", + "gap_infill_speed": "250", + "initial_layer_infill_speed": "105", + "initial_layer_speed": "50", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "overhang_3_4_speed": "30", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "top_surface_speed": "200", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.24mm Standard @OpenEYE Peacock V2.json b/resources/profiles/OpenEYE/process/0.24mm Standard @OpenEYE Peacock V2.json new file mode 100644 index 0000000000..71492028d9 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.24mm Standard @OpenEYE Peacock V2.json @@ -0,0 +1,19 @@ +{ + "type": "process", + "name": "0.24mm Standard @OpenEYE Peacock V2", + "inherits": "fdm_process_openeye_0.24_nozzle_0.4", + "from": "system", + "setting_id": "GP144", + "instantiation": "true", + "default_acceleration": "8000", + "initial_layer_speed": "50", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.4 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.30mm Standard @OpenEYE Peacock V2 0.6 nozzle.json b/resources/profiles/OpenEYE/process/0.30mm Standard @OpenEYE Peacock V2 0.6 nozzle.json new file mode 100644 index 0000000000..4733f27324 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.30mm Standard @OpenEYE Peacock V2 0.6 nozzle.json @@ -0,0 +1,26 @@ +{ + "type": "process", + "name": "0.30mm Standard @OpenEYE Peacock V2 0.6 nozzle", + "inherits": "fdm_process_openeye_0.30_nozzle_0.6", + "from": "system", + "setting_id": "GP125", + "instantiation": "true", + "description": "Standard profile for 0.6mm nozzle, prioritizing speed.", + "bridge_speed": "50", + "default_acceleration": "8000", + "gap_infill_speed": "250", + "initial_layer_infill_speed": "105", + "initial_layer_speed": "50", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "overhang_3_4_speed": "30", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "top_surface_speed": "200", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.6 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.32mm Balanced Strength @OpenEYE Peacock V2 0.8 nozzle.json b/resources/profiles/OpenEYE/process/0.32mm Balanced Strength @OpenEYE Peacock V2 0.8 nozzle.json new file mode 100644 index 0000000000..170c9e4e7f --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.32mm Balanced Strength @OpenEYE Peacock V2 0.8 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "0.32mm Balanced Strength @OpenEYE Peacock V2 0.8 nozzle", + "inherits": "fdm_process_openeye_0.32_nozzle_0.8", + "from": "system", + "setting_id": "GP149", + "instantiation": "true", + "description": "Strength profile for 0.8mm nozzle, prioritizing strength.", + "bridge_speed": "50", + "default_acceleration": "8000", + "gap_infill_speed": "250", + "initial_layer_infill_speed": "105", + "initial_layer_speed": "50", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "top_surface_speed": "200", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/0.40mm Standard @OpenEYE Peacock V2 0.8 nozzle.json b/resources/profiles/OpenEYE/process/0.40mm Standard @OpenEYE Peacock V2 0.8 nozzle.json new file mode 100644 index 0000000000..878383b1f6 --- /dev/null +++ b/resources/profiles/OpenEYE/process/0.40mm Standard @OpenEYE Peacock V2 0.8 nozzle.json @@ -0,0 +1,27 @@ +{ + "type": "process", + "name": "0.40mm Standard @OpenEYE Peacock V2 0.8 nozzle", + "inherits": "fdm_process_openeye_0.40_nozzle_0.8", + "from": "system", + "setting_id": "GP126", + "instantiation": "true", + "description": "Standard profile for 0.8mm nozzle, prioritizing speed.", + "bridge_speed": "50", + "default_acceleration": "8000", + "gap_infill_speed": "250", + "initial_layer_infill_speed": "105", + "initial_layer_speed": "50", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "outer_wall_speed": "200", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "prime_tower_brim_width": "3", + "prime_tower_width": "60", + "sparse_infill_speed": "350", + "top_surface_speed": "200", + "travel_speed": "500", + "compatible_printers": [ + "OpenEYE Peacock V2 0.8 nozzle" + ] +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_common.json b/resources/profiles/OpenEYE/process/fdm_process_common.json new file mode 100644 index 0000000000..40987d67ab --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_common.json @@ -0,0 +1,116 @@ +{ + "type": "process", + "name": "fdm_process_common", + "from": "system", + "instantiation": "false", + "adaptive_layer_height": "0", + "bottom_shell_layers": "3", + "bottom_shell_thickness": "0", + "bottom_surface_pattern": "monotonic", + "bridge_flow": "0.95", + "bridge_no_support": "0", + "bridge_speed": "25", + "brim_object_gap": "0.1", + "brim_width": "5", + "compatible_printers_condition": "", + "default_acceleration": "10000", + "detect_overhang_wall": "1", + "detect_thin_wall": "0", + "draft_shield": "disabled", + "elefant_foot_compensation": "0.15", + "elefant_foot_compensation_layers": "1", + "enable_arc_fitting": "1", + "enable_prime_tower": "1", + "enable_support": "0", + "filename_format": "{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode", + "gap_infill_speed": "30", + "infill_combination": "0", + "infill_direction": "45", + "infill_wall_overlap": "15%", + "initial_layer_line_width": "0.5", + "initial_layer_print_height": "0.2", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.45", + "inner_wall_speed": "40", + "interface_shells": "0", + "internal_bridge_support_thickness": "0.8", + "internal_solid_infill_line_width": "0.42", + "internal_solid_infill_speed": "40", + "ironing_flow": "10%", + "ironing_inset": "0.21", + "ironing_spacing": "0.15", + "ironing_speed": "30", + "ironing_type": "no ironing", + "layer_height": "0.2", + "line_width": "0.42", + "max_bridge_length": "0", + "max_travel_detour_distance": "0", + "minimum_sparse_infill_area": "15", + "only_one_wall_top": "1", + "outer_wall_line_width": "0.42", + "outer_wall_speed": "120", + "prime_tower_width": "35", + "print_sequence": "by layer", + "print_settings_id": "", + "prime_tower_brim_width": "3", + "raft_layers": "0", + "reduce_crossing_wall": "0", + "reduce_infill_retraction": "1", + "resolution": "0.012", + "scarf_angle_threshold": "155", + "seam_position": "aligned", + "skirt_distance": "2", + "skirt_height": "1", + "skirt_loops": "0", + "sparse_infill_density": "15%", + "skeleton_infill_density": "15%", + "skin_infill_density": "15%", + "sparse_infill_line_width": "0.45", + "skin_infill_line_width": "0.45", + "skin_infill_depth": "2.0", + "skeleton_infill_line_width": "0.45", + "sparse_infill_pattern": "grid", + "sparse_infill_speed": "50", + "spiral_mode": "0", + "standby_temperature_delta": "-5", + "support_base_pattern": "default", + "support_base_pattern_spacing": "2.5", + "support_bottom_z_distance": "0.2", + "support_expansion": "0", + "support_filament": "0", + "support_interface_bottom_layers": "2", + "support_interface_filament": "0", + "support_interface_loop_pattern": "0", + "support_interface_pattern": "auto", + "support_interface_spacing": "0.5", + "support_interface_speed": "80", + "support_interface_top_layers": "2", + "support_line_width": "0.42", + "support_object_xy_distance": "0.35", + "support_on_build_plate_only": "0", + "support_speed": "40", + "support_style": "default", + "support_threshold_angle": "30", + "support_top_z_distance": "0.2", + "support_type": "tree(auto)", + "seam_slope_type": "none", + "seam_slope_start_height": "10%", + "seam_slope_min_length": "10", + "symmetric_infill_y_axis": "0", + "top_shell_layers": "3", + "top_shell_thickness": "0.8", + "top_surface_line_width": "0.42", + "top_surface_pattern": "monotonicline", + "top_surface_speed": "30", + "travel_acceleration": "10000", + "travel_speed": "400", + "tree_support_branch_angle": "45", + "tree_support_branch_diameter": "2", + "tree_support_wall_count": "0", + "wall_generator": "classic", + "wall_infill_order": "inner wall/outer wall/infill", + "wall_loops": "2", + "wipe_tower_no_sparse_layers": "0", + "xy_contour_compensation": "0", + "xy_hole_compensation": "0" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.06_nozzle_0.2.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.06_nozzle_0.2.json new file mode 100644 index 0000000000..6354d949fd --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.06_nozzle_0.2.json @@ -0,0 +1,33 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.06_nozzle_0.2", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "5", + "bottom_color_penetration_layers": "5", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "ironing_inset": "0.11", + "initial_layer_infill_speed": "70", + "layer_height": "0.06", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "skin_infill_line_width": "0.22", + "skeleton_infill_line_width": "0.22", + "sparse_infill_speed": "100", + "support_bottom_z_distance": "0.06", + "support_line_width": "0.22", + "support_top_z_distance": "0.06", + "top_shell_layers": "7", + "top_color_penetration_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": "150", + "wall_loops": "4" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.08_nozzle_0.2.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.08_nozzle_0.2.json new file mode 100644 index 0000000000..309d338619 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.08_nozzle_0.2.json @@ -0,0 +1,33 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.08_nozzle_0.2", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "5", + "bottom_color_penetration_layers": "5", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "ironing_inset": "0.11", + "initial_layer_infill_speed": "70", + "layer_height": "0.08", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "skin_infill_line_width": "0.22", + "skeleton_infill_line_width": "0.22", + "sparse_infill_speed": "100", + "support_bottom_z_distance": "0.08", + "support_line_width": "0.22", + "support_top_z_distance": "0.08", + "top_shell_layers": "7", + "top_color_penetration_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": "150", + "wall_loops": "4" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.08_nozzle_0.4.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.08_nozzle_0.4.json new file mode 100644 index 0000000000..25f9cc89a5 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.08_nozzle_0.4.json @@ -0,0 +1,25 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.08_nozzle_0.4", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "7", + "bottom_color_penetration_layers": "7", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "gap_infill_speed": "250", + "initial_layer_speed":"20", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "ironing_flow": "8%", + "initial_layer_infill_speed": "105", + "layer_height": "0.08", + "sparse_infill_speed": "270", + "support_bottom_z_distance": "0.08", + "support_threshold_angle": "15", + "support_top_z_distance": "0.08", + "top_shell_layers": "9", + "top_color_penetration_layers": "9", + "top_shell_thickness": "1.0" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.10_nozzle_0.2.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.10_nozzle_0.2.json new file mode 100644 index 0000000000..983138a494 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.10_nozzle_0.2.json @@ -0,0 +1,33 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.10_nozzle_0.2", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "5", + "bottom_color_penetration_layers": "5", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "ironing_inset": "0.11", + "initial_layer_infill_speed": "70", + "layer_height": "0.1", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "skin_infill_line_width": "0.22", + "skeleton_infill_line_width": "0.22", + "sparse_infill_speed": "100", + "support_bottom_z_distance": "0.1", + "support_line_width": "0.22", + "support_top_z_distance": "0.1", + "top_shell_layers": "7", + "top_color_penetration_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": "150", + "wall_loops": "4" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.12_nozzle_0.2.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.12_nozzle_0.2.json new file mode 100644 index 0000000000..67146aef2c --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.12_nozzle_0.2.json @@ -0,0 +1,33 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.12_nozzle_0.2", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "5", + "bottom_color_penetration_layers": "5", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "ironing_inset": "0.11", + "initial_layer_infill_speed": "70", + "layer_height": "0.12", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "skin_infill_line_width": "0.22", + "skeleton_infill_line_width": "0.22", + "sparse_infill_speed": "100", + "support_bottom_z_distance": "0.12", + "support_line_width": "0.22", + "support_top_z_distance": "0.12", + "top_shell_layers": "7", + "top_color_penetration_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": "150", + "wall_loops": "4" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.12_nozzle_0.4.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.12_nozzle_0.4.json new file mode 100644 index 0000000000..a08f0fc9ff --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.12_nozzle_0.4.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.12_nozzle_0.4", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "5", + "bottom_color_penetration_layers": "5", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "gap_infill_speed": "250", + "initial_layer_speed": "20", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "initial_layer_infill_speed": "105", + "layer_height": "0.12", + "sparse_infill_speed": "270", + "support_bottom_z_distance": "0.12", + "support_threshold_angle": "20", + "support_top_z_distance": "0.12", + "top_shell_layers": "5", + "top_color_penetration_layers": "5", + "top_shell_thickness": "0.6" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.14_nozzle_0.2.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.14_nozzle_0.2.json new file mode 100644 index 0000000000..f5ced921a7 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.14_nozzle_0.2.json @@ -0,0 +1,33 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.14_nozzle_0.2", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "5", + "bottom_color_penetration_layers": "5", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.25", + "initial_layer_print_height": "0.1", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "ironing_inset": "0.11", + "initial_layer_infill_speed": "70", + "layer_height": "0.14", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "sparse_infill_line_width": "0.22", + "skin_infill_line_width": "0.22", + "skeleton_infill_line_width": "0.22", + "sparse_infill_speed": "100", + "support_bottom_z_distance": "0.14", + "support_line_width": "0.22", + "support_top_z_distance": "0.14", + "top_shell_layers": "7", + "top_color_penetration_layers": "7", + "top_surface_line_width": "0.22", + "top_surface_speed": "150", + "wall_loops": "4" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.16_nozzle_0.4.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.16_nozzle_0.4.json new file mode 100644 index 0000000000..8a106a5385 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.16_nozzle_0.4.json @@ -0,0 +1,24 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.16_nozzle_0.4", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bottom_shell_layers": "4", + "bottom_color_penetration_layers": "4", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "gap_infill_speed": "250", + "initial_layer_speed": "20", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "initial_layer_infill_speed": "105", + "layer_height": "0.16", + "sparse_infill_speed": "270", + "support_bottom_z_distance": "0.16", + "support_threshold_angle": "25", + "support_top_z_distance": "0.16", + "top_shell_layers": "6", + "top_color_penetration_layers": "6", + "top_shell_thickness": "1.0" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.18_nozzle_0.6.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.18_nozzle_0.6.json new file mode 100644 index 0000000000..8b6629efba --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.18_nozzle_0.6.json @@ -0,0 +1,30 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.18_nozzle_0.6", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "ironing_inset": "0.31", + "initial_layer_infill_speed": "55", + "layer_height": "0.18", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "overhang_3_4_speed": "15", + "sparse_infill_line_width": "0.62", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_speed": "100", + "support_bottom_z_distance": "0.18", + "support_line_width": "0.62", + "support_top_z_distance": "0.18", + "top_surface_line_width": "0.62", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.20_nozzle_0.4.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.20_nozzle_0.4.json new file mode 100644 index 0000000000..6689407a67 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.20_nozzle_0.4.json @@ -0,0 +1,18 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.20_nozzle_0.4", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "gap_infill_speed": "250", + "initial_layer_speed": "20", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "initial_layer_infill_speed": "105", + "sparse_infill_speed": "270", + "top_shell_layers": "5", + "top_color_penetration_layers": "5", + "top_shell_thickness": "1.0" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.4.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.4.json new file mode 100644 index 0000000000..552092e6d9 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.4.json @@ -0,0 +1,21 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.24_nozzle_0.4", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "gap_infill_speed": "250", + "initial_layer_speed": "20", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "initial_layer_infill_speed": "105", + "layer_height": "0.24", + "sparse_infill_speed": "270", + "support_threshold_angle": "35", + "top_shell_layers": "4", + "top_color_penetration_layers": "4", + "top_shell_thickness": "1.0", + "top_surface_line_width": "0.45" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.6.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.6.json new file mode 100644 index 0000000000..7f0e3b3e88 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.6.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.24_nozzle_0.6", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "ironing_inset": "0.31", + "initial_layer_infill_speed": "55", + "layer_height": "0.24", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "overhang_3_4_speed": "15", + "sparse_infill_line_width": "0.62", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_speed": "100", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.8.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.8.json new file mode 100644 index 0000000000..34e37cea92 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.24_nozzle_0.8.json @@ -0,0 +1,30 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.24_nozzle_0.8", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "ironing_inset": "0.41", + "initial_layer_infill_speed": "55", + "layer_height": "0.24", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "sparse_infill_line_width": "0.82", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_speed": "100", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.28_nozzle_0.4.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.28_nozzle_0.4.json new file mode 100644 index 0000000000..d1a15baea5 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.28_nozzle_0.4.json @@ -0,0 +1,21 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.28_nozzle_0.4", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "elefant_foot_compensation": "0.15", + "gap_infill_speed": "250", + "initial_layer_speed": "20", + "inner_wall_speed": "300", + "internal_solid_infill_speed": "250", + "initial_layer_infill_speed": "105", + "layer_height": "0.28", + "sparse_infill_speed": "270", + "support_threshold_angle": "40", + "top_shell_layers": "4", + "top_color_penetration_layers": "4", + "top_shell_thickness": "1.0", + "top_surface_line_width": "0.45" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.30_nozzle_0.6.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.30_nozzle_0.6.json new file mode 100644 index 0000000000..b1106a1682 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.30_nozzle_0.6.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.30_nozzle_0.6", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "ironing_inset": "0.31", + "initial_layer_infill_speed": "55", + "layer_height": "0.3", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "overhang_3_4_speed": "15", + "sparse_infill_line_width": "0.62", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_speed": "100", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.32_nozzle_0.8.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.32_nozzle_0.8.json new file mode 100644 index 0000000000..f0f9f2da9d --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.32_nozzle_0.8.json @@ -0,0 +1,30 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.32_nozzle_0.8", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "ironing_inset": "0.41", + "initial_layer_infill_speed": "55", + "layer_height": "0.32", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "sparse_infill_line_width": "0.82", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_speed": "100", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.36_nozzle_0.6.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.36_nozzle_0.6.json new file mode 100644 index 0000000000..b625904c7b --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.36_nozzle_0.6.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.36_nozzle_0.6", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "ironing_inset": "0.31", + "initial_layer_infill_speed": "55", + "layer_height": "0.36", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "overhang_3_4_speed": "15", + "sparse_infill_line_width": "0.62", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_speed": "100", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.40_nozzle_0.8.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.40_nozzle_0.8.json new file mode 100644 index 0000000000..304d66c8de --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.40_nozzle_0.8.json @@ -0,0 +1,30 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.40_nozzle_0.8", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "ironing_inset": "0.41", + "initial_layer_infill_speed": "55", + "layer_height": "0.4", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "sparse_infill_line_width": "0.82", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_speed": "100", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.42_nozzle_0.6.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.42_nozzle_0.6.json new file mode 100644 index 0000000000..e2fd061207 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.42_nozzle_0.6.json @@ -0,0 +1,28 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.42_nozzle_0.6", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.62", + "initial_layer_print_height": "0.3", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.62", + "internal_solid_infill_line_width": "0.62", + "ironing_inset": "0.31", + "initial_layer_infill_speed": "55", + "layer_height": "0.42", + "line_width": "0.62", + "outer_wall_line_width": "0.62", + "overhang_3_4_speed": "15", + "sparse_infill_line_width": "0.62", + "skin_infill_line_width": "0.62", + "skeleton_infill_line_width": "0.62", + "sparse_infill_speed": "100", + "support_line_width": "0.62", + "top_surface_line_width": "0.62", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.48_nozzle_0.8.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.48_nozzle_0.8.json new file mode 100644 index 0000000000..12a5931ee2 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.48_nozzle_0.8.json @@ -0,0 +1,30 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.48_nozzle_0.8", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "ironing_inset": "0.41", + "initial_layer_infill_speed": "55", + "layer_height": "0.48", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "sparse_infill_line_width": "0.82", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_speed": "100", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_0.56_nozzle_0.8.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.56_nozzle_0.8.json new file mode 100644 index 0000000000..6522f6b686 --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_0.56_nozzle_0.8.json @@ -0,0 +1,30 @@ +{ + "type": "process", + "name": "fdm_process_openeye_0.56_nozzle_0.8", + "inherits": "fdm_process_openeye_common", + "from": "system", + "instantiation": "false", + "bridge_flow": "1", + "bridge_speed": "30", + "elefant_foot_compensation": "0.15", + "initial_layer_line_width": "0.82", + "initial_layer_print_height": "0.4", + "initial_layer_speed": "20", + "inner_wall_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "ironing_inset": "0.41", + "initial_layer_infill_speed": "55", + "layer_height": "0.56", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "sparse_infill_line_width": "0.82", + "skin_infill_line_width": "0.82", + "skeleton_infill_line_width": "0.82", + "sparse_infill_speed": "100", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "top_surface_pattern": "monotonic", + "top_surface_speed": "150" +} \ No newline at end of file diff --git a/resources/profiles/OpenEYE/process/fdm_process_openeye_common.json b/resources/profiles/OpenEYE/process/fdm_process_openeye_common.json new file mode 100644 index 0000000000..c83936321b --- /dev/null +++ b/resources/profiles/OpenEYE/process/fdm_process_openeye_common.json @@ -0,0 +1,54 @@ +{ + "type": "process", + "name": "fdm_process_openeye_common", + "inherits": "fdm_process_common", + "from": "system", + "instantiation": "false", + "align_infill_direction_to_model": "1", + "exclude_object": "1", + "bridge_speed": "50", + "default_acceleration": "10000", + "enable_overhang_speed": "1", + "gap_infill_speed": "50", + "initial_layer_acceleration": "500", + "initial_layer_infill_speed": "60", + "initial_layer_speed": "30", + "inner_wall_acceleration": "0", + "inner_wall_speed": "150", + "internal_solid_infill_speed": "150", + "outer_wall_acceleration": "5000", + "outer_wall_speed": "120", + "overhang_1_4_speed": "0", + "overhang_2_4_speed": "50", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "10", + "reduce_crossing_wall": "1", + "role_based_wipe_speed": "1", + "scarf_angle_threshold": "155", + "scarf_joint_flow_ratio": "1", + "scarf_joint_speed": "100%", + "scarf_overhang_threshold": "40%", + "seam_gap": "10%", + "seam_position": "aligned_back", + "seam_slope_conditional": "1", + "seam_slope_entire_loop": "0", + "seam_slope_inner_walls": "1", + "seam_slope_min_length": "20", + "seam_slope_start_height": "0", + "seam_slope_steps": "10", + "seam_slope_type": "none", + "small_perimeter_speed": "50%", + "small_perimeter_threshold": "0", + "sparse_infill_acceleration": "100%", + "sparse_infill_speed": "250", + "support_interface_speed": "80", + "support_speed": "150", + "support_on_build_plate_only": "1", + "travel_acceleration": "10000", + "top_surface_acceleration": "2000", + "top_surface_speed": "200", + "travel_speed": "500", + "travel_speed_z": "0", + "wipe_tower_wall_type": "rib", + "wipe_tower_rib_width": "8" +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary.json b/resources/profiles/OrcaFilamentLibrary.json index ca80b86d12..8e6ac439b1 100644 --- a/resources/profiles/OrcaFilamentLibrary.json +++ b/resources/profiles/OrcaFilamentLibrary.json @@ -108,6 +108,10 @@ "name": "COEX ABS PRIME @base", "sub_path": "filament/COEX/COEX ABS PRIME @base.json" }, + { + "name": "Eolas Prints ABS @System", + "sub_path": "filament/Eolas Prints/Eolas Prints ABS @System.json" + }, { "name": "FDplast ABS @base", "sub_path": "filament/FDplast/FDplast ABS @base.json" @@ -144,6 +148,10 @@ "name": "COEX ASA PRIME @base", "sub_path": "filament/COEX/COEX ASA PRIME @base.json" }, + { + "name": "Eolas Prints ASA @System", + "sub_path": "filament/Eolas Prints/Eolas Prints ASA @System.json" + }, { "name": "Generic ASA @System", "sub_path": "filament/Generic ASA @System.json" @@ -288,6 +296,18 @@ "name": "COEX PETG @base", "sub_path": "filament/COEX/COEX PETG @base.json" }, + { + "name": "Eolas Prints PETG @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PETG @System.json" + }, + { + "name": "Eolas Prints PETG Transition @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PETG Transition @System.json" + }, + { + "name": "Eolas Prints PETG UV Resistant @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PETG UV Resistant @System.json" + }, { "name": "FDplast PETG @base", "sub_path": "filament/FDplast/FDplast PETG @base.json" @@ -420,6 +440,42 @@ "name": "COEX PLA PRIME @base", "sub_path": "filament/COEX/COEX PLA PRIME @base.json" }, + { + "name": "Eolas Prints PLA Antibacterial @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA Antibacterial @System.json" + }, + { + "name": "Eolas Prints PLA High Speed @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA High Speed @System.json" + }, + { + "name": "Eolas Prints PLA INGEO 850 @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA INGEO 850 @System.json" + }, + { + "name": "Eolas Prints PLA INGEO 870 @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA INGEO 870 @System.json" + }, + { + "name": "Eolas Prints PLA Matte @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA Matte @System.json" + }, + { + "name": "Eolas Prints PLA Neon @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA Neon @System.json" + }, + { + "name": "Eolas Prints PLA Premium @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA Premium @System.json" + }, + { + "name": "Eolas Prints PLA Silk @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA Silk @System.json" + }, + { + "name": "Eolas Prints PLA Transition @System", + "sub_path": "filament/Eolas Prints/Eolas Prints PLA Transition @System.json" + }, { "name": "FDplast PLA @base", "sub_path": "filament/FDplast/FDplast PLA @base.json" @@ -444,6 +500,10 @@ "name": "NIT PLA @base", "sub_path": "filament/NIT/NIT PLA @base.json" }, + { + "name": "Numakers PLA+ @base", + "sub_path": "filament/Numakers/Numakers PLA+ @base.json" + }, { "name": "Overture Air PLA @base", "sub_path": "filament/Overture/Overture Air PLA @base.json" @@ -517,12 +577,12 @@ "sub_path": "filament/Polymaker/Panchroma PLA Neon @base.json" }, { - "name": "Panchroma PLA Silk @base", - "sub_path": "filament/Polymaker/Panchroma PLA Silk @base.json" + "name": "Panchroma PLA Satin @base", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @base.json" }, { - "name": "Panchroma PLA Stain @base", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @base.json" + "name": "Panchroma PLA Silk @base", + "sub_path": "filament/Polymaker/Panchroma PLA Silk @base.json" }, { "name": "Panchroma PLA Starlight @base", @@ -680,6 +740,22 @@ "name": "COEX TPU 60A @base", "sub_path": "filament/COEX/COEX TPU 60A @base.json" }, + { + "name": "Eolas Prints TPU D60 UV Resistant @System", + "sub_path": "filament/Eolas Prints/Eolas Prints TPU Flex D60 UV Resistant @System.json" + }, + { + "name": "Eolas Prints TPU Flex 93A @System", + "sub_path": "filament/Eolas Prints/Eolas Prints TPU Flex 93A @System.json" + }, + { + "name": "Eolas Prints TPU Flex D53 @System", + "sub_path": "filament/Eolas Prints/Eolas Prints TPU Flex D53 @System.json" + }, + { + "name": "Eolas Prints TPU Transition @System", + "sub_path": "filament/Eolas Prints/Eolas Prints TPU Transition @System.json" + }, { "name": "FDplast TPU @base", "sub_path": "filament/FDplast/FDplast TPU @base.json" @@ -692,10 +768,6 @@ "name": "Overture TPU @base", "sub_path": "filament/Overture/Overture TPU @base.json" }, - { - "name": "Numakers PLA+ @base", - "sub_path": "filament/Numakers/Numakers PLA+ @base.json" - }, { "name": "Bambu ABS @System", "sub_path": "filament/Bambu/Bambu ABS @System.json" @@ -980,6 +1052,10 @@ "name": "NIT PLA @System", "sub_path": "filament/NIT/NIT PLA @System.json" }, + { + "name": "Numakers PLA+ @System", + "sub_path": "filament/Numakers/Numakers PLA+ @System.json" + }, { "name": "Overture Air PLA @System", "sub_path": "filament/Overture/Overture Air PLA @System.json" @@ -1053,12 +1129,12 @@ "sub_path": "filament/Polymaker/Panchroma PLA Neon @System.json" }, { - "name": "Panchroma PLA Silk @System", - "sub_path": "filament/Polymaker/Panchroma PLA Silk @System.json" + "name": "Panchroma PLA Satin @System", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @System.json" }, { - "name": "Panchroma PLA Stain @System", - "sub_path": "filament/Polymaker/Panchroma PLA Stain @System.json" + "name": "Panchroma PLA Silk @System", + "sub_path": "filament/Polymaker/Panchroma PLA Silk @System.json" }, { "name": "Panchroma PLA Starlight @System", @@ -1211,10 +1287,6 @@ { "name": "COEX PLA+Silk @System", "sub_path": "filament/COEX/COEX PLA+Silk @System.json" - }, - { - "name": "Numakers PLA+ @System", - "sub_path": "filament/Numakers/Numakers PLA+ @System.json" } ], "process_list": [], diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints ABS @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints ABS @System.json new file mode 100644 index 0000000000..bf8afa8b31 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints ABS @System.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "filament_id": "GFSEP017", + "setting_id": "GFSEP017_00", + "name": "Eolas Prints ABS @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_abs", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["ABS"], + "nozzle_temperature": ["255"], + "nozzle_temperature_initial_layer": ["260"], + "nozzle_temperature_range_low": ["240"], + "nozzle_temperature_range_high": ["270"], + "hot_plate_temp": ["100"], + "hot_plate_temp_initial_layer": ["105"], + "chamber_temperature": ["40"], + "filament_density": ["1.04"], + "filament_cost": ["19.50"], + "filament_spool_weight": ["900"], + "filament_max_volumetric_speed": ["18"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints ASA @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints ASA @System.json new file mode 100644 index 0000000000..21d7ef887b --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints ASA @System.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "filament_id": "GFSEP018", + "setting_id": "GFSEP018_00", + "name": "Eolas Prints ASA @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_asa", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["ASA"], + "nozzle_temperature": ["260"], + "nozzle_temperature_initial_layer": ["270"], + "nozzle_temperature_range_low": ["245"], + "nozzle_temperature_range_high": ["275"], + "hot_plate_temp": ["100"], + "hot_plate_temp_initial_layer": ["105"], + "chamber_temperature": ["40"], + "filament_density": ["1.07"], + "filament_cost": ["22.50"], + "filament_spool_weight": ["900"], + "filament_max_volumetric_speed": ["18"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG @System.json new file mode 100644 index 0000000000..6f02d13138 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP010", + "setting_id": "GFSEP010_00", + "name": "Eolas Prints PETG @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pet", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PETG"], + "nozzle_temperature": ["240"], + "nozzle_temperature_initial_layer": ["245"], + "nozzle_temperature_range_low": ["230"], + "nozzle_temperature_range_high": ["260"], + "hot_plate_temp": ["80"], + "hot_plate_temp_initial_layer": ["85"], + "filament_density": ["1.27"], + "filament_cost": ["25.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG Transition @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG Transition @System.json new file mode 100644 index 0000000000..d9e125b8ff --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG Transition @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP012", + "setting_id": "GFSEP012_00", + "name": "Eolas Prints PETG Transition @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pet", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PETG"], + "nozzle_temperature": ["240"], + "nozzle_temperature_initial_layer": ["245"], + "nozzle_temperature_range_low": ["230"], + "nozzle_temperature_range_high": ["260"], + "hot_plate_temp": ["80"], + "hot_plate_temp_initial_layer": ["85"], + "filament_density": ["1.27"], + "filament_cost": ["17.40"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG UV Resistant @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG UV Resistant @System.json new file mode 100644 index 0000000000..8810346918 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PETG UV Resistant @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP011", + "setting_id": "GFSEP011_00", + "name": "Eolas Prints PETG UV Resistant @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pet", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PETG"], + "nozzle_temperature": ["245"], + "nozzle_temperature_initial_layer": ["250"], + "nozzle_temperature_range_low": ["235"], + "nozzle_temperature_range_high": ["265"], + "hot_plate_temp": ["80"], + "hot_plate_temp_initial_layer": ["85"], + "filament_density": ["1.27"], + "filament_cost": ["30.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Antibacterial @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Antibacterial @System.json new file mode 100644 index 0000000000..b41e563301 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Antibacterial @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP008", + "setting_id": "GFSEP008_00", + "name": "Eolas Prints PLA Antibacterial @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["216"], + "nozzle_temperature_initial_layer": ["220"], + "nozzle_temperature_range_low": ["195"], + "nozzle_temperature_range_high": ["230"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["30.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA High Speed @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA High Speed @System.json new file mode 100644 index 0000000000..fd41493192 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA High Speed @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP005", + "setting_id": "GFSEP005_00", + "name": "Eolas Prints PLA High Speed @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["220"], + "nozzle_temperature_initial_layer": ["220"], + "nozzle_temperature_range_low": ["210"], + "nozzle_temperature_range_high": ["240"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["25.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["17.8"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA INGEO 850 @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA INGEO 850 @System.json new file mode 100644 index 0000000000..ccef240d17 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA INGEO 850 @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP006", + "setting_id": "GFSEP006_00", + "name": "Eolas Prints PLA INGEO 850 @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["210"], + "nozzle_temperature_initial_layer": ["215"], + "nozzle_temperature_range_low": ["190"], + "nozzle_temperature_range_high": ["230"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["25.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA INGEO 870 @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA INGEO 870 @System.json new file mode 100644 index 0000000000..da7ebe735d --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA INGEO 870 @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP007", + "setting_id": "GFSEP007_00", + "name": "Eolas Prints PLA INGEO 870 @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["220"], + "nozzle_temperature_initial_layer": ["225"], + "nozzle_temperature_range_low": ["200"], + "nozzle_temperature_range_high": ["235"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.22"], + "filament_cost": ["30.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Matte @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Matte @System.json new file mode 100644 index 0000000000..5c90dff774 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Matte @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP002", + "setting_id": "GFSEP002_00", + "name": "Eolas Prints PLA Matte @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["215"], + "nozzle_temperature_initial_layer": ["220"], + "nozzle_temperature_range_low": ["200"], + "nozzle_temperature_range_high": ["230"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["25.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Neon @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Neon @System.json new file mode 100644 index 0000000000..857924f75a --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Neon @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP004", + "setting_id": "GFSEP004_00", + "name": "Eolas Prints PLA Neon @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["210"], + "nozzle_temperature_initial_layer": ["215"], + "nozzle_temperature_range_low": ["200"], + "nozzle_temperature_range_high": ["230"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["25.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["10"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Premium @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Premium @System.json new file mode 100644 index 0000000000..ceeaabbcf5 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Premium @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP001", + "setting_id": "GFSEP001_00", + "name": "Eolas Prints PLA Premium @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["210"], + "nozzle_temperature_initial_layer": ["215"], + "nozzle_temperature_range_low": ["190"], + "nozzle_temperature_range_high": ["230"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["19.90"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Silk @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Silk @System.json new file mode 100644 index 0000000000..0409a36e12 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Silk @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP003", + "setting_id": "GFSEP003_00", + "name": "Eolas Prints PLA Silk @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["215"], + "nozzle_temperature_initial_layer": ["220"], + "nozzle_temperature_range_low": ["205"], + "nozzle_temperature_range_high": ["235"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["25.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["8"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Transition @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Transition @System.json new file mode 100644 index 0000000000..0804a78a64 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints PLA Transition @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP009", + "setting_id": "GFSEP009_00", + "name": "Eolas Prints PLA Transition @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_pla", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["PLA"], + "nozzle_temperature": ["210"], + "nozzle_temperature_initial_layer": ["215"], + "nozzle_temperature_range_low": ["200"], + "nozzle_temperature_range_high": ["230"], + "hot_plate_temp": ["60"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.24"], + "filament_cost": ["13.90"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["15"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex 93A @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex 93A @System.json new file mode 100644 index 0000000000..90cc77ff33 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex 93A @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP013", + "setting_id": "GFSEP013_00", + "name": "Eolas Prints TPU Flex 93A @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_tpu", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["TPU"], + "nozzle_temperature": ["220"], + "nozzle_temperature_initial_layer": ["225"], + "nozzle_temperature_range_low": ["210"], + "nozzle_temperature_range_high": ["240"], + "hot_plate_temp": ["50"], + "hot_plate_temp_initial_layer": ["55"], + "filament_density": ["1.21"], + "filament_cost": ["34.99"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["6"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex D53 @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex D53 @System.json new file mode 100644 index 0000000000..96237eb712 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex D53 @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP014", + "setting_id": "GFSEP014_00", + "name": "Eolas Prints TPU Flex D53 @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_tpu", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["TPU"], + "nozzle_temperature": ["220"], + "nozzle_temperature_initial_layer": ["225"], + "nozzle_temperature_range_low": ["205"], + "nozzle_temperature_range_high": ["235"], + "hot_plate_temp": ["45"], + "hot_plate_temp_initial_layer": ["50"], + "filament_density": ["1.17"], + "filament_cost": ["38.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["8"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex D60 UV Resistant @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex D60 UV Resistant @System.json new file mode 100644 index 0000000000..e88f950722 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Flex D60 UV Resistant @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP015", + "setting_id": "GFSEP015_00", + "name": "Eolas Prints TPU D60 UV Resistant @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_tpu", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["TPU"], + "nozzle_temperature": ["225"], + "nozzle_temperature_initial_layer": ["230"], + "nozzle_temperature_range_low": ["215"], + "nozzle_temperature_range_high": ["245"], + "hot_plate_temp": ["55"], + "hot_plate_temp_initial_layer": ["60"], + "filament_density": ["1.16"], + "filament_cost": ["37.90"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["8"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Transition @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Transition @System.json new file mode 100644 index 0000000000..c1029399d4 --- /dev/null +++ b/resources/profiles/OrcaFilamentLibrary/filament/Eolas Prints/Eolas Prints TPU Transition @System.json @@ -0,0 +1,22 @@ +{ + "type": "filament", + "filament_id": "GFSEP016", + "setting_id": "GFSEP016_00", + "name": "Eolas Prints TPU Transition @System", + "from": "system", + "instantiation": "true", + "inherits": "fdm_filament_tpu", + "filament_color": ["#4d9398"], + "filament_vendor": ["Eolas Prints"], + "filament_type": ["TPU"], + "nozzle_temperature": ["220"], + "nozzle_temperature_initial_layer": ["225"], + "nozzle_temperature_range_low": ["210"], + "nozzle_temperature_range_high": ["240"], + "hot_plate_temp": ["50"], + "hot_plate_temp_initial_layer": ["55"], + "filament_density": ["1.21"], + "filament_cost": ["22.50"], + "filament_spool_weight": ["1000"], + "filament_max_volumetric_speed": ["5"] +} \ No newline at end of file diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Stain @System.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Satin @System.json similarity index 60% rename from resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Stain @System.json rename to resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Satin @System.json index 96e40e373f..bbb5b658f6 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Stain @System.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Satin @System.json @@ -1,7 +1,8 @@ { "type": "filament", - "name": "Panchroma PLA Stain @System", - "inherits": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @System", + "renamed_from": "Panchroma PLA Stain @System", + "inherits": "Panchroma PLA Satin @base", "from": "system", "setting_id": "OGFSPM005", "instantiation": "true", @@ -11,4 +12,4 @@ "filament_max_volumetric_speed": [ "16" ] -} \ No newline at end of file +} diff --git a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Stain @base.json b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Satin @base.json similarity index 87% rename from resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Stain @base.json rename to resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Satin @base.json index 4021abe0c3..a3ae93632b 100644 --- a/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Stain @base.json +++ b/resources/profiles/OrcaFilamentLibrary/filament/Polymaker/Panchroma PLA Satin @base.json @@ -1,6 +1,7 @@ { "type": "filament", - "name": "Panchroma PLA Stain @base", + "name": "Panchroma PLA Satin @base", + "renamed_from": "Panchroma PLA Stain @base", "inherits": "fdm_filament_pla", "from": "system", "filament_id": "OGFPM005", @@ -32,4 +33,4 @@ "temperature_vitrification": [ "59" ] -} \ No newline at end of file +} diff --git a/resources/profiles/Prusa/machine/Prusa MINIIS 0.4 nozzle.json b/resources/profiles/Prusa/machine/Prusa MINIIS 0.4 nozzle.json index 6f7bd1649a..b63413d8ce 100644 --- a/resources/profiles/Prusa/machine/Prusa MINIIS 0.4 nozzle.json +++ b/resources/profiles/Prusa/machine/Prusa MINIIS 0.4 nozzle.json @@ -94,6 +94,9 @@ ], "z_hop": [ "0.2" + ], + "machine_max_junction_deviation": [ + "0.01" ], "fan_speedup_time": "0.2", "fan_speedup_overhangs": "1", @@ -102,7 +105,7 @@ "printable_height": "180", "machine_end_gcode": "{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F720 ; Move print head up{endif}\nG1 X170 Y170 F4200 ; park print head\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+50, max_print_height)} F720 ; Move print head further up{endif}\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM572 S0 ; reset PA\nM569 S1 X Y ; reset to stealthchop for X Y\nM84 ; disable motors\n; max_layer_z = [max_layer_z]", "machine_pause_gcode": "M601", - "machine_start_gcode": "M862.3 P \"MINI\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM862.5 P2 ; g-code level check\nM862.6 P\"Input shaper\" ; FW feature check\nM115 U6.0.3+14902\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nG28 ; home all without mesh bed level\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM569 S1 X Y ; set stealthchop for X Y\nM204 T1250 ; set travel acceleration\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0\n\nG1 X0 Y-2 Z3 F2400\n\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X10 Z0.2 F1000\nG1 X70 E8 F900\nG1 X140 E10 F700\nG92 E0\n\nM569 S0 X Y ; set spreadcycle for X Y\nM204 T[machine_max_acceleration_travel] ; restore travel acceleration\nM572 W0.06 ; set smooth time\nM221 S95 ; set flow", + "machine_start_gcode": "M862.3 P \"MINI\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM862.5 P2 ; g-code level check\nM862.6 P\"Input shaper\" ; FW feature check\nM115 U6.4.0+11974\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nG28 ; home all without mesh bed level\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM569 S1 X Y ; set stealthchop for X Y\nM204 T1250 ; set travel acceleration\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0\n\nG1 X0 Y-2 Z3 F2400\n\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X10 Z0.2 F1000\nG1 X70 E8 F900\nG1 X140 E10 F700\nG92 E0\n\nM569 S0 X Y ; set spreadcycle for X Y\nM204 T[machine_max_acceleration_travel] ; restore travel acceleration\nM572 W0.06 ; set smooth time\nM221 S95 ; set flow", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\nM201 X{interpolate_table(extruded_weight_total, (0,4000), (1000,1700), (10000,1700))} Y{interpolate_table(extruded_weight_total, (0,4000), (1000,1700), (10000,1700))}", "change_filament_gcode": "M600", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\n{if ! spiral_mode}M74 W[extruded_weight_total]{endif}\n", diff --git a/resources/profiles/Prusa/machine/Prusa MK3.5 0.4 nozzle.json b/resources/profiles/Prusa/machine/Prusa MK3.5 0.4 nozzle.json index 8d5307d1a8..18576df366 100644 --- a/resources/profiles/Prusa/machine/Prusa MK3.5 0.4 nozzle.json +++ b/resources/profiles/Prusa/machine/Prusa MK3.5 0.4 nozzle.json @@ -95,6 +95,9 @@ "z_hop": [ "0.2" ], + "machine_max_junction_deviation": [ + "0.01" + ], "fan_speedup_time": "0.2", "fan_speedup_overhangs": "1", "fan_kickstart": "0", @@ -102,7 +105,7 @@ "printable_height": "210", "machine_end_gcode": "{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+1, max_print_height)} F720 ; Move print head up{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X241 Y201 F3600 ; park\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+23, max_print_height)} F300 ; Move print head up{endif}\nG4 ; wait\nM572 S0 ; reset PA\nM593 X T2 F0 ; disable IS\nM593 Y T2 F0 ; disable IS\nM84 X Y E ; disable motors\n; max_layer_z = [max_layer_z]", "machine_pause_gcode": "M601", - "machine_start_gcode": "M17 ; enable steppers\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM862.3 P \"MK3.5\" ; printer model check\nM862.5 P2 ; g-code level check\nM862.6 P\"Input shaper\" ; FW feature check\nM115 U6.2.2+8853\n\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n\nG28 ; home all\n\nM140 S[first_layer_bed_temperature] ; set bed temp\nM104 T0 S170 ; set extruder temp for bed leveling\nM109 T0 R170 ; wait for temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nG29 P1 ; invalidate mbl & probe print area\nG29 P1 X23 Y5 W80 H20 C ; probe near purge place\nG29 P3.2 ; interpolate mbl probes\nG29 P3.13 ; extrapolate mbl outside probe area\nG29 A ; activate mbl\n\n; prepare for purge\nM104 S{first_layer_temperature[0]}\nG0 X0 Y-4 Z15 F4800 ; move away and ready for the purge\nM109 S{first_layer_temperature[0]}\n\n; Extrude purge line\n\nG92 E0 ; reset extruder position\nG0 E7 X15 Z0.2 F500 ; purge\nG0 X25 E4 F500 ; purge\nG0 X35 E4 F650 ; purge\nG0 X45 E4 F800 ; purge\nG0 X{45 + 3} Z0.05 F8000 ; wipe, move close to the bed\nG0 X{45 + 3 * 2} Z0.2 F8000 ; wipe, move quickly away from the bed\n\nG92 E0\nM221 S100 ; reset flow to 100%\n", + "machine_start_gcode": "M17 ; enable steppers\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM862.3 P \"MK3.5\" ; printer model check\nM862.5 P2 ; g-code level check\nM862.6 P\"Input shaper\" ; FW feature check\nM115 U6.4.0+11974\n\nM555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))}\n\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n\nG28 ; home all\n\nM140 S[first_layer_bed_temperature] ; set bed temp\nM104 T0 S170 ; set extruder temp for bed leveling\nM109 T0 R170 ; wait for temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\n\nG29 P1 ; invalidate mbl & probe print area\nG29 P1 X23 Y5 W80 H20 C ; probe near purge place\nG29 P3.2 ; interpolate mbl probes\nG29 P3.13 ; extrapolate mbl outside probe area\nG29 A ; activate mbl\n\n; prepare for purge\nM104 S{first_layer_temperature[0]}\nG0 X0 Y-4 Z15 F4800 ; move away and ready for the purge\nM109 S{first_layer_temperature[0]}\n\n; Extrude purge line\n\nG92 E0 ; reset extruder position\nG0 E7 X15 Z0.2 F500 ; purge\nG0 X25 E4 F500 ; purge\nG0 X35 E4 F650 ; purge\nG0 X45 E4 F800 ; purge\nG0 X{45 + 3} Z0.05 F8000 ; wipe, move close to the bed\nG0 X{45 + 3 * 2} Z0.2 F8000 ; wipe, move quickly away from the bed\n\nG92 E0\nM221 S100 ; reset flow to 100%\n", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\nM201 X{interpolate_table(extruded_weight_total, (0,4000), (1400,2500), (10000,2500))} Y{interpolate_table(extruded_weight_total, (0,4000), (1400,2500), (10000,2500))}\n", "change_filament_gcode": "M600", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\n{if ! spiral_mode}M74 W[extruded_weight_total]{endif}\n", diff --git a/resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json index 90282356ee..5a5e94e124 100644 --- a/resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json +++ b/resources/profiles/Prusa/process/0.05mm DETAIL @CORE One 0.25.json @@ -10,5 +10,8 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "45", "initial_layer_speed": "25", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25", + "gap_infill_speed": "45", + "small_perimeter_speed": "45", + "outer_wall_speed": "45" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.05mm Detail @MINIIS.json b/resources/profiles/Prusa/process/0.05mm Detail @MINIIS.json index 9f2b524b57..6298c71d49 100644 --- a/resources/profiles/Prusa/process/0.05mm Detail @MINIIS.json +++ b/resources/profiles/Prusa/process/0.05mm Detail @MINIIS.json @@ -19,6 +19,9 @@ "top_shell_layers": "13", "bottom_shell_thickness": "0.5", "bottom_shell_layers": "10", + "support_base_pattern_spacing": "1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MINIIS 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.05mm Detail @MK3.5.json b/resources/profiles/Prusa/process/0.05mm Detail @MK3.5.json index 9f82ceb6eb..a9a79b47a1 100644 --- a/resources/profiles/Prusa/process/0.05mm Detail @MK3.5.json +++ b/resources/profiles/Prusa/process/0.05mm Detail @MK3.5.json @@ -19,7 +19,9 @@ "top_shell_layers": "13", "bottom_shell_thickness": "0.5", "bottom_shell_layers": "10", + "support_base_pattern_spacing": "1", "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MK3.5 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json index aa1fb6b9f7..cda4e3096b 100644 --- a/resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json +++ b/resources/profiles/Prusa/process/0.07mm DETAIL @CORE One 0.25.json @@ -10,5 +10,8 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "45", "initial_layer_speed": "25", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25", + "gap_infill_speed": "45", + "small_perimeter_speed": "45", + "outer_wall_speed": "45" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.07mm Detail @MINIIS.json b/resources/profiles/Prusa/process/0.07mm Detail @MINIIS.json index 9217fc2f00..63d1757fd0 100644 --- a/resources/profiles/Prusa/process/0.07mm Detail @MINIIS.json +++ b/resources/profiles/Prusa/process/0.07mm Detail @MINIIS.json @@ -21,7 +21,9 @@ "bottom_shell_layers": "8", "bridge_speed": "30", "internal_solid_infill_speed": "140", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MINIIS 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.07mm Detail @MK3.5.json b/resources/profiles/Prusa/process/0.07mm Detail @MK3.5.json index 6fc9c6886c..eb90dc1922 100644 --- a/resources/profiles/Prusa/process/0.07mm Detail @MK3.5.json +++ b/resources/profiles/Prusa/process/0.07mm Detail @MK3.5.json @@ -21,7 +21,9 @@ "bottom_shell_layers": "8", "bridge_speed": "30", "internal_solid_infill_speed": "140", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MK3.5 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json index d481f3139d..b2c2ca9528 100644 --- a/resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json +++ b/resources/profiles/Prusa/process/0.10mm FAST DETAIL @CORE One 0.4.json @@ -13,5 +13,8 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "100", "initial_layer_speed": "45", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4", + "small_perimeter_speed": "145", + "inner_wall_speed": "145", + "outer_wall_speed": "145" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json index f5f6a460b0..df335dbe67 100644 --- a/resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json +++ b/resources/profiles/Prusa/process/0.10mm STRUCTURAL @CORE One 0.5.json @@ -4,9 +4,9 @@ "inherits": "0.10mm STRUCTURAL @MK4S 0.5", "from": "system", "instantiation": "true", - "inner_wall_speed": "80", - "small_perimeter_speed": "45", - "outer_wall_speed": "45", + "inner_wall_speed": "70", + "small_perimeter_speed": "50", + "outer_wall_speed": "50", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.10mm Speed @MINIIS.json b/resources/profiles/Prusa/process/0.10mm Speed @MINIIS.json index b8107625fa..6a87714bb0 100644 --- a/resources/profiles/Prusa/process/0.10mm Speed @MINIIS.json +++ b/resources/profiles/Prusa/process/0.10mm Speed @MINIIS.json @@ -24,7 +24,9 @@ "internal_solid_infill_acceleration": "3000", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.17", + "support_bottom_z_distance": "0.17", "compatible_printers": [ "Prusa MINIIS 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.10mm Speed @MK3.5.json b/resources/profiles/Prusa/process/0.10mm Speed @MK3.5.json index 92d201b8e1..7327e51e82 100644 --- a/resources/profiles/Prusa/process/0.10mm Speed @MK3.5.json +++ b/resources/profiles/Prusa/process/0.10mm Speed @MK3.5.json @@ -24,7 +24,9 @@ "internal_solid_infill_acceleration": "3000", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.17", + "support_bottom_z_distance": "0.17", "compatible_printers": [ "Prusa MK3.5 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json b/resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json index 69ef541dae..3fc92e8b42 100644 --- a/resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json +++ b/resources/profiles/Prusa/process/0.12mm SPEED @CORE One 0.25.json @@ -10,5 +10,8 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "45", "initial_layer_speed": "25", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25", + "small_perimeter_speed": "150", + "outer_wall_speed": "150", + "inner_wall_speed": "150" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json index a61d130cb5..ec754dc350 100644 --- a/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json +++ b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.25.json @@ -10,5 +10,8 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "45", "initial_layer_speed": "25", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25", + "gap_infill_speed": "45", + "small_perimeter_speed": "45", + "outer_wall_speed": "45" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json index 35b0d2c525..101e7f0968 100644 --- a/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json +++ b/resources/profiles/Prusa/process/0.12mm STRUCTURAL @CORE One 0.3.json @@ -12,5 +12,8 @@ "initial_layer_infill_speed": "60", "initial_layer_speed": "45", "top_surface_acceleration": "1500", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3", + "small_perimeter_speed": "45", + "inner_wall_speed": "70", + "outer_wall_speed": "45" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.12mm Speed @MINIIS.json b/resources/profiles/Prusa/process/0.12mm Speed @MINIIS.json index e8518fdb25..c4d772993f 100644 --- a/resources/profiles/Prusa/process/0.12mm Speed @MINIIS.json +++ b/resources/profiles/Prusa/process/0.12mm Speed @MINIIS.json @@ -31,7 +31,8 @@ "overhang_1_4_speed": "60", "internal_solid_infill_acceleration": "2500", "sparse_infill_acceleration": "2500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MINIIS 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.12mm Speed @MK3.5.json b/resources/profiles/Prusa/process/0.12mm Speed @MK3.5.json index abaef8f727..76ce6b9221 100644 --- a/resources/profiles/Prusa/process/0.12mm Speed @MK3.5.json +++ b/resources/profiles/Prusa/process/0.12mm Speed @MK3.5.json @@ -31,7 +31,8 @@ "overhang_1_4_speed": "60", "internal_solid_infill_acceleration": "2500", "sparse_infill_acceleration": "2500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MK3.5 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.12mm Standard @MINIIS.json b/resources/profiles/Prusa/process/0.12mm Standard @MINIIS.json index f0d03268c4..72175e280d 100644 --- a/resources/profiles/Prusa/process/0.12mm Standard @MINIIS.json +++ b/resources/profiles/Prusa/process/0.12mm Standard @MINIIS.json @@ -36,7 +36,9 @@ "internal_solid_infill_acceleration": "2500", "sparse_infill_acceleration": "2500", "travel_acceleration": "3000", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MINIIS 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.12mm Standard @MK3.5.json b/resources/profiles/Prusa/process/0.12mm Standard @MK3.5.json index 6099147be4..8f4b41b380 100644 --- a/resources/profiles/Prusa/process/0.12mm Standard @MK3.5.json +++ b/resources/profiles/Prusa/process/0.12mm Standard @MK3.5.json @@ -36,7 +36,9 @@ "internal_solid_infill_acceleration": "2500", "sparse_infill_acceleration": "2500", "travel_acceleration": "3000", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MK3.5 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm High Flow @MINIIS.json b/resources/profiles/Prusa/process/0.15mm High Flow @MINIIS.json index 58a8211986..81711734a1 100644 --- a/resources/profiles/Prusa/process/0.15mm High Flow @MINIIS.json +++ b/resources/profiles/Prusa/process/0.15mm High Flow @MINIIS.json @@ -29,7 +29,8 @@ "inner_wall_acceleration": "3500", "outer_wall_acceleration": "2500", "bridge_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.17", + "support_bottom_z_distance": "0.17", "compatible_printers": [ "Prusa MINIIS 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm High Flow @MK3.5.json b/resources/profiles/Prusa/process/0.15mm High Flow @MK3.5.json index 92db093a4c..a3ecfea49b 100644 --- a/resources/profiles/Prusa/process/0.15mm High Flow @MK3.5.json +++ b/resources/profiles/Prusa/process/0.15mm High Flow @MK3.5.json @@ -29,7 +29,8 @@ "inner_wall_acceleration": "3500", "outer_wall_acceleration": "2500", "bridge_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.17", + "support_bottom_z_distance": "0.17", "compatible_printers": [ "Prusa MK3.5 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json index 8e5f0cab2d..4600a136a8 100644 --- a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json +++ b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.25.json @@ -10,5 +10,8 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "45", "initial_layer_speed": "25", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25", + "small_perimeter_speed": "150", + "inner_wall_speed": "150", + "outer_wall_speed": "150" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json index 2c3b531050..e08b21a26f 100644 --- a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json +++ b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One 0.4.json @@ -4,7 +4,7 @@ "inherits": "0.15mm SPEED @MK4S 0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -16,5 +16,6 @@ "internal_solid_infill_acceleration": "6000", "inner_wall_acceleration": "6000", "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "support_threshold_angle": "35" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json index fa9fb8c30c..50ad496cd2 100644 --- a/resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json +++ b/resources/profiles/Prusa/process/0.15mm SPEED @CORE One HF 0.4.json @@ -4,7 +4,7 @@ "inherits": "0.15mm SPEED @MK4S HF0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_1_4_speed": "50", "overhang_3_4_speed": "60%", "sparse_infill_speed": "300", "travel_speed": "350", @@ -18,5 +18,6 @@ "internal_solid_infill_acceleration": "6000", "inner_wall_acceleration": "6000", "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "support_threshold_angle": "35" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json index 55e9dc654c..51886f189e 100644 --- a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.25.json @@ -10,5 +10,8 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "45", "initial_layer_speed": "25", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.25", + "gap_infill_speed": "45", + "small_perimeter_speed": "45", + "outer_wall_speed": "45" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json index fd2d410e48..017b232df4 100644 --- a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.4.json @@ -4,7 +4,7 @@ "inherits": "0.15mm STRUCTURAL @MK4S 0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", + "overhang_3_4_speed": "45", "sparse_infill_speed": "120", "travel_speed": "350", "travel_acceleration": "7000", diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json index 2cecda0dd0..765d0efa49 100644 --- a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.15mm STRUCTURAL @MK4S 0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", + "overhang_3_4_speed": "45", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json index 2f58de84e9..0024001fd9 100644 --- a/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json +++ b/resources/profiles/Prusa/process/0.15mm STRUCTURAL @CORE One 0.6.json @@ -4,9 +4,9 @@ "inherits": "0.15mm STRUCTURAL @MK4S 0.6", "from": "system", "instantiation": "true", - "inner_wall_speed": "80", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "70%", + "inner_wall_speed": "70", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "70%", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -18,5 +18,6 @@ "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6", "inner_wall_acceleration": "2500", "outer_wall_acceleration": "1500", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "gap_infill_speed": "70" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.15mm Speed @MINIIS 0.25.json b/resources/profiles/Prusa/process/0.15mm Speed @MINIIS 0.25.json index 30d9a165d5..3aa3019d76 100644 --- a/resources/profiles/Prusa/process/0.15mm Speed @MINIIS 0.25.json +++ b/resources/profiles/Prusa/process/0.15mm Speed @MINIIS 0.25.json @@ -29,7 +29,8 @@ "internal_solid_infill_acceleration": "2500", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MINIIS 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Speed @MINIIS.json b/resources/profiles/Prusa/process/0.15mm Speed @MINIIS.json index 853e0e01e6..6f6a9cffcd 100644 --- a/resources/profiles/Prusa/process/0.15mm Speed @MINIIS.json +++ b/resources/profiles/Prusa/process/0.15mm Speed @MINIIS.json @@ -29,7 +29,8 @@ "internal_solid_infill_acceleration": "2500", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.17", + "support_bottom_z_distance": "0.17", "compatible_printers": [ "Prusa MINIIS 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Speed @MK3.5 0.25.json b/resources/profiles/Prusa/process/0.15mm Speed @MK3.5 0.25.json index 09c562d356..e322f1ce63 100644 --- a/resources/profiles/Prusa/process/0.15mm Speed @MK3.5 0.25.json +++ b/resources/profiles/Prusa/process/0.15mm Speed @MK3.5 0.25.json @@ -29,7 +29,8 @@ "internal_solid_infill_acceleration": "2500", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.09", + "support_bottom_interface_spacing": "0.09", "compatible_printers": [ "Prusa MK3.5 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Speed @MK3.5.json b/resources/profiles/Prusa/process/0.15mm Speed @MK3.5.json index 175c896845..31eb1443bb 100644 --- a/resources/profiles/Prusa/process/0.15mm Speed @MK3.5.json +++ b/resources/profiles/Prusa/process/0.15mm Speed @MK3.5.json @@ -29,7 +29,8 @@ "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", "bridge_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.17", + "support_bottom_interface_spacing": "0.17", "compatible_printers": [ "Prusa MK3.5 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.25.json b/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.25.json index b6fe166ce1..362ed653d2 100644 --- a/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.25.json +++ b/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.25.json @@ -29,7 +29,9 @@ "internal_solid_infill_acceleration": "2500", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MINIIS 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.6.json b/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.6.json index 606e52ecb7..5cd6746563 100644 --- a/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.6.json +++ b/resources/profiles/Prusa/process/0.15mm Standard @MINIIS 0.6.json @@ -37,7 +37,10 @@ "inner_wall_acceleration": "2500", "outer_wall_acceleration": "1500", "bridge_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Standard @MINIIS.json b/resources/profiles/Prusa/process/0.15mm Standard @MINIIS.json index 3f1a5c6825..d61a785155 100644 --- a/resources/profiles/Prusa/process/0.15mm Standard @MINIIS.json +++ b/resources/profiles/Prusa/process/0.15mm Standard @MINIIS.json @@ -33,7 +33,8 @@ "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", "bridge_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.17", + "support_bottom_z_distance": "0.17", "compatible_printers": [ "Prusa MINIIS 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.25.json b/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.25.json index eca3cdad8c..3d55cc1e39 100644 --- a/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.25.json +++ b/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.25.json @@ -29,7 +29,9 @@ "internal_solid_infill_acceleration": "2500", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "1", + "support_top_z_distance": "0.09", + "support_bottom_z_distance": "0.09", "compatible_printers": [ "Prusa MK3.5 0.25 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.6.json b/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.6.json index 6c6a80a261..c0087d57ea 100644 --- a/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.6.json +++ b/resources/profiles/Prusa/process/0.15mm Standard @MK3.5 0.6.json @@ -37,7 +37,11 @@ "inner_wall_acceleration": "2500", "outer_wall_acceleration": "1500", "bridge_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.15mm Standard @MK3.5.json b/resources/profiles/Prusa/process/0.15mm Standard @MK3.5.json index 4044df4712..e6161e5896 100644 --- a/resources/profiles/Prusa/process/0.15mm Standard @MK3.5.json +++ b/resources/profiles/Prusa/process/0.15mm Standard @MK3.5.json @@ -28,7 +28,8 @@ "internal_solid_infill_acceleration": "2500", "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", - "support_top_z_distance": "0.1", + "support_top_z_distance": "0.17", + "support_bottom_z_distance": "0.17", "compatible_printers": [ "Prusa MK3.5 0.4 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json b/resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json index d0ca7859df..15096ebd6b 100644 --- a/resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json +++ b/resources/profiles/Prusa/process/0.16mm SPEED @CORE One 0.3.json @@ -13,5 +13,8 @@ "initial_layer_infill_speed": "60", "initial_layer_speed": "45", "top_surface_acceleration": "1500", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3", + "small_perimeter_speed": "160", + "inner_wall_speed": "160", + "outer_wall_speed": "160" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json b/resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json index 192682e5b7..4e11371cfe 100644 --- a/resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json +++ b/resources/profiles/Prusa/process/0.16mm STRUCTURAL @CORE One 0.3.json @@ -12,5 +12,8 @@ "initial_layer_infill_speed": "60", "initial_layer_speed": "45", "top_surface_acceleration": "1500", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3", + "small_perimeter_speed": "50", + "inner_wall_speed": "70", + "outer_wall_speed": "50" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm High Flow @MINIIS 0.6.json b/resources/profiles/Prusa/process/0.20mm High Flow @MINIIS 0.6.json index aeca348889..15363df16c 100644 --- a/resources/profiles/Prusa/process/0.20mm High Flow @MINIIS 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm High Flow @MINIIS 0.6.json @@ -36,5 +36,10 @@ "outer_wall_acceleration": "4000", "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", - "overhang_1_4_speed": "45" + "overhang_1_4_speed": "45", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm High Flow @MK3.5 0.6.json b/resources/profiles/Prusa/process/0.20mm High Flow @MK3.5 0.6.json index 2aa0d96b93..c9056822db 100644 --- a/resources/profiles/Prusa/process/0.20mm High Flow @MK3.5 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm High Flow @MK3.5 0.6.json @@ -36,5 +36,10 @@ "outer_wall_acceleration": "4000", "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", - "overhang_1_4_speed": "45" + "overhang_1_4_speed": "45", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json index 3fe89b38a6..7e0f0042c0 100644 --- a/resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json +++ b/resources/profiles/Prusa/process/0.20mm SOLUBLE FULL @CORE One 0.4.json @@ -4,12 +4,15 @@ "inherits": "0.20mm SOLUBLE FULL @MK4S 0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes!~/.*HF_NOZZLE.*/", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", "support_interface_top_layers": "3", "initial_layer_infill_speed": "100", - "initial_layer_speed": "45" + "initial_layer_speed": "45", + "small_perimeter_speed": "50", + "inner_wall_speed": "70", + "outer_wall_speed": "50" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json index 49c4c28280..222663644c 100644 --- a/resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json +++ b/resources/profiles/Prusa/process/0.20mm SOLUBLE INTERFACE @CORE One 0.4.json @@ -4,12 +4,15 @@ "inherits": "0.20mm SOLUBLE INTERFACE @MK4S 0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes!~/.*HF_NOZZLE.*/", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", "support_interface_top_layers": "3", "initial_layer_infill_speed": "100", - "initial_layer_speed": "45" + "initial_layer_speed": "45", + "small_perimeter_speed": "50", + "inner_wall_speed": "70", + "outer_wall_speed": "50" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json index df4d8e80cc..0f0cc78362 100644 --- a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.3.json @@ -13,5 +13,8 @@ "initial_layer_infill_speed": "60", "initial_layer_speed": "45", "top_surface_acceleration": "1500", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3", + "small_perimeter_speed": "160", + "inner_wall_speed": "160", + "outer_wall_speed": "160" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json index 9171ec4b21..79cd06680f 100644 --- a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.4.json @@ -4,7 +4,7 @@ "inherits": "0.20mm SPEED @MK4S 0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -16,5 +16,6 @@ "internal_solid_infill_acceleration": "6000", "inner_wall_acceleration": "6000", "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "support_threshold_angle": "35" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json index e7299809ea..20d64e324c 100644 --- a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.20mm SPEED @MK4S 0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json index 78446c1687..1bbd442a02 100644 --- a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One 0.6.json @@ -4,8 +4,8 @@ "inherits": "0.20mm SPEED @MK4S 0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "70%", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "70%", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -17,5 +17,8 @@ "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes!~/.*HF_NOZZLE.*/", "inner_wall_acceleration": "6000", "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "small_perimeter_speed": "130", + "inner_wall_speed": "130", + "outer_wall_speed": "130" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json index 96433e26e8..5b9b42f34c 100644 --- a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json @@ -4,8 +4,8 @@ "inherits": "0.20mm SPEED @MK4S HF0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "60%", + "overhang_3_4_speed": "50", + "overhang_4_4_speed": "70%", "sparse_infill_speed": "300", "travel_speed": "350", "travel_acceleration": "7000", @@ -18,5 +18,6 @@ "internal_solid_infill_acceleration": "6000", "inner_wall_acceleration": "6000", "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "support_threshold_angle": "35" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json index 3ad26d4548..c7324713ea 100644 --- a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.20mm SPEED @MK4S HF0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json index 204f356661..8cb0eb8f1c 100644 --- a/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm SPEED @CORE One HF 0.6.json @@ -4,8 +4,8 @@ "inherits": "0.20mm SPEED @MK4S HF0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "70%", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "70%", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json index e7dd110d1d..d9b1a2ef54 100644 --- a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.3.json @@ -12,5 +12,8 @@ "initial_layer_infill_speed": "60", "initial_layer_speed": "45", "top_surface_acceleration": "1500", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.3", + "small_perimeter_speed": "50", + "inner_wall_speed": "70", + "outer_wall_speed": "50" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json index 95d97fea4e..a139f2cd4f 100644 --- a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.4.json @@ -4,7 +4,7 @@ "inherits": "0.20mm STRUCTURAL @MK4S 0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", + "overhang_3_4_speed": "45", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json index c6fba65551..57c2968e0d 100644 --- a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.20mm STRUCTURAL @MK4S 0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", + "overhang_3_4_speed": "45", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json index 5445f967b5..9bbd5097c8 100644 --- a/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm STRUCTURAL @CORE One 0.6.json @@ -4,7 +4,7 @@ "inherits": "0.20mm STRUCTURAL @MK4S 0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", + "overhang_3_4_speed": "30", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.20mm Speed @MINIIS 0.6.json b/resources/profiles/Prusa/process/0.20mm Speed @MINIIS 0.6.json index 2e2cb971fe..29f9977358 100644 --- a/resources/profiles/Prusa/process/0.20mm Speed @MINIIS 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm Speed @MINIIS 0.6.json @@ -34,5 +34,10 @@ "outer_wall_acceleration": "2000", "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", - "overhang_1_4_speed": "45" + "overhang_1_4_speed": "45", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm Speed @MK3.5 0.6.json b/resources/profiles/Prusa/process/0.20mm Speed @MK3.5 0.6.json index fb256ecc05..79c38ffeea 100644 --- a/resources/profiles/Prusa/process/0.20mm Speed @MK3.5 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm Speed @MK3.5 0.6.json @@ -34,5 +34,10 @@ "outer_wall_acceleration": "2000", "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", - "overhang_1_4_speed": "45" + "overhang_1_4_speed": "45", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.20mm Standard @MINIIS 0.6.json b/resources/profiles/Prusa/process/0.20mm Standard @MINIIS 0.6.json index 6ed283fa8c..d27e89b756 100644 --- a/resources/profiles/Prusa/process/0.20mm Standard @MINIIS 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm Standard @MINIIS 0.6.json @@ -29,6 +29,11 @@ "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", "overhang_1_4_speed": "45", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.20mm Standard @MK3.5 0.6.json b/resources/profiles/Prusa/process/0.20mm Standard @MK3.5 0.6.json index f6e1946a04..e4b4f4b5d1 100644 --- a/resources/profiles/Prusa/process/0.20mm Standard @MK3.5 0.6.json +++ b/resources/profiles/Prusa/process/0.20mm Standard @MK3.5 0.6.json @@ -29,6 +29,11 @@ "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", "overhang_1_4_speed": "45", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.25mm High Flow @MINIIS.json b/resources/profiles/Prusa/process/0.25mm High Flow @MINIIS.json index 4521f5fbb1..f1784af6c5 100644 --- a/resources/profiles/Prusa/process/0.25mm High Flow @MINIIS.json +++ b/resources/profiles/Prusa/process/0.25mm High Flow @MINIIS.json @@ -40,7 +40,11 @@ "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", "overhang_1_4_speed": "45", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.25mm High Flow @MK3.5.json b/resources/profiles/Prusa/process/0.25mm High Flow @MK3.5.json index 00faf7f563..0cb9257ddf 100644 --- a/resources/profiles/Prusa/process/0.25mm High Flow @MK3.5.json +++ b/resources/profiles/Prusa/process/0.25mm High Flow @MK3.5.json @@ -40,7 +40,11 @@ "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", "overhang_1_4_speed": "45", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json index bfe931bc62..cb087eb345 100644 --- a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.25mm SPEED @MK4S 0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json index 4cd0500e7b..621c94e9d8 100644 --- a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One 0.6.json @@ -4,8 +4,8 @@ "inherits": "0.25mm SPEED @MK4S 0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "70%", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "70%", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -17,5 +17,8 @@ "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes!~/.*HF_NOZZLE.*/", "inner_wall_acceleration": "6000", "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "small_perimeter_speed": "75", + "inner_wall_speed": "95", + "outer_wall_speed": "75" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json index b0b066e261..634c502f73 100644 --- a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.4.json @@ -4,8 +4,8 @@ "inherits": "0.25mm SPEED @MK4S HF0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", - "overhang_3_4_speed": "60%", + "overhang_3_4_speed": "50", + "overhang_4_4_speed": "70%", "sparse_infill_speed": "300", "travel_speed": "350", "travel_acceleration": "7000", @@ -13,10 +13,11 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "100", "initial_layer_speed": "45", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/", +"compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/", "sparse_infill_acceleration": "7000", "internal_solid_infill_acceleration": "6000", "inner_wall_acceleration": "6000", "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "top_surface_acceleration": "2000", + "support_threshold_angle": "35" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json index 20634c06e1..268891fb46 100644 --- a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.25mm SPEED @MK4S HF0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json index 493f82b29b..bb26e69f5d 100644 --- a/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json +++ b/resources/profiles/Prusa/process/0.25mm SPEED @CORE One HF 0.6.json @@ -4,8 +4,8 @@ "inherits": "0.25mm SPEED @MK4S HF0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "70%", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "70%", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json index a89610e3ee..c4d22efeb2 100644 --- a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json +++ b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.25mm STRUCTURAL @MK4S 0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", + "overhang_3_4_speed": "45", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json index 5418273bb2..96a614266d 100644 --- a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json +++ b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One 0.6.json @@ -4,7 +4,7 @@ "inherits": "0.25mm STRUCTURAL @MK4S 0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", + "overhang_3_4_speed": "30", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json index 6392a2c0f7..978f3f94d0 100644 --- a/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json +++ b/resources/profiles/Prusa/process/0.25mm STRUCTURAL @CORE One HF 0.4.json @@ -4,7 +4,7 @@ "inherits": "0.25mm STRUCTURAL @MK4S HF0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", + "overhang_3_4_speed": "45", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.25mm Speed @MINIIS.json b/resources/profiles/Prusa/process/0.25mm Speed @MINIIS.json index c5085cbf7c..33e3de92dc 100644 --- a/resources/profiles/Prusa/process/0.25mm Speed @MINIIS.json +++ b/resources/profiles/Prusa/process/0.25mm Speed @MINIIS.json @@ -30,7 +30,11 @@ "overhang_1_4_speed": "45", "travel_speed": "300", "internal_solid_infill_acceleration": "3000", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.25mm Speed @MK3.5.json b/resources/profiles/Prusa/process/0.25mm Speed @MK3.5.json index 6dec0d7f5c..7ebe2664ef 100644 --- a/resources/profiles/Prusa/process/0.25mm Speed @MK3.5.json +++ b/resources/profiles/Prusa/process/0.25mm Speed @MK3.5.json @@ -30,7 +30,11 @@ "overhang_1_4_speed": "45", "travel_speed": "300", "internal_solid_infill_acceleration": "3000", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.25mm Standard @MINIIS.json b/resources/profiles/Prusa/process/0.25mm Standard @MINIIS.json index e98b851fc4..4191366100 100644 --- a/resources/profiles/Prusa/process/0.25mm Standard @MINIIS.json +++ b/resources/profiles/Prusa/process/0.25mm Standard @MINIIS.json @@ -29,7 +29,11 @@ "gap_infill_speed": "60", "support_speed": "80", "travel_speed": "300", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.25mm Standard @MK3.5.json b/resources/profiles/Prusa/process/0.25mm Standard @MK3.5.json index e9c0451d61..64e099d97e 100644 --- a/resources/profiles/Prusa/process/0.25mm Standard @MK3.5.json +++ b/resources/profiles/Prusa/process/0.25mm Standard @MK3.5.json @@ -29,7 +29,11 @@ "gap_infill_speed": "60", "support_speed": "80", "travel_speed": "300", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json b/resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json index a1f896b3c0..e493e19467 100644 --- a/resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json +++ b/resources/profiles/Prusa/process/0.28mm DRAFT @CORE One HF 0.4.json @@ -4,7 +4,7 @@ "inherits": "0.28mm DRAFT @MK4S HF0.4", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "support_threshold_angle": "35", "outer_wall_acceleration": "3000", "inner_wall_acceleration": "6000", diff --git a/resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json b/resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json index 0ecac72e60..db88957c69 100644 --- a/resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json +++ b/resources/profiles/Prusa/process/0.30mm DETAIL @CORE One 0.8.json @@ -4,8 +4,8 @@ "inherits": "0.30mm DETAIL @MK4S 0.8", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "35", - "top_surface_speed": "2000", + "overhang_3_4_speed": "35", + "top_surface_acceleration": "2000", "inner_wall_acceleration": "2500", "internal_solid_infill_acceleration": "5000", "sparse_infill_acceleration": "7000", @@ -15,5 +15,6 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "55", "initial_layer_speed": "45", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes!~/.*HF_NOZZLE.*/" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes!~/.*HF_NOZZLE.*/", + "gap_infill_speed": "45" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.30mm Detail @MINIIS.json b/resources/profiles/Prusa/process/0.30mm Detail @MINIIS.json index 90a7a28fb8..dcc20a87bd 100644 --- a/resources/profiles/Prusa/process/0.30mm Detail @MINIIS.json +++ b/resources/profiles/Prusa/process/0.30mm Detail @MINIIS.json @@ -21,7 +21,11 @@ "bottom_shell_thickness": "0.5", "bottom_shell_layers": "2", "travel_speed": "300", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.35", "compatible_printers": [ "Prusa MINIIS 0.8 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.30mm Detail @MK3.5.json b/resources/profiles/Prusa/process/0.30mm Detail @MK3.5.json index 7d4ed7d622..975851d38f 100644 --- a/resources/profiles/Prusa/process/0.30mm Detail @MK3.5.json +++ b/resources/profiles/Prusa/process/0.30mm Detail @MK3.5.json @@ -21,7 +21,11 @@ "bottom_shell_thickness": "0.5", "bottom_shell_layers": "2", "travel_speed": "300", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.35", "compatible_printers": [ "Prusa MK3.5 0.8 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json index 8477a7c0f9..d4be25be9a 100644 --- a/resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json +++ b/resources/profiles/Prusa/process/0.30mm SPEED @CORE One HF 0.8.json @@ -4,8 +4,8 @@ "inherits": "0.30mm SPEED @MK4S HF0.8", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", - "top_surface_speed": "2000", + "overhang_3_4_speed": "45", + "top_surface_acceleration": "2000", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json index d8cb0916af..7426aa3a21 100644 --- a/resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json +++ b/resources/profiles/Prusa/process/0.30mm STRUCTURAL @CORE One HF 0.8.json @@ -4,8 +4,8 @@ "inherits": "0.30mm STRUCTURAL @MK4S HF0.8", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "40", - "top_surface_speed": "2000", + "overhang_3_4_speed": "40", + "top_surface_acceleration": "2000", "support_speed": "100", "support_interface_speed": "55%", "travel_speed": "350", @@ -18,6 +18,5 @@ "sparse_infill_acceleration": "6000", "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/", "inner_wall_acceleration": "2500", - "outer_wall_acceleration": "1500", - "top_surface_acceleration": "2000" + "outer_wall_acceleration": "1500" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm High Flow @MINIIS.json b/resources/profiles/Prusa/process/0.32mm High Flow @MINIIS.json index a1fbbc989f..7602017ccd 100644 --- a/resources/profiles/Prusa/process/0.32mm High Flow @MINIIS.json +++ b/resources/profiles/Prusa/process/0.32mm High Flow @MINIIS.json @@ -37,7 +37,11 @@ "outer_wall_acceleration": "4000", "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.32mm High Flow @MK3.5.json b/resources/profiles/Prusa/process/0.32mm High Flow @MK3.5.json index 43a0733ac4..b295a0b1b3 100644 --- a/resources/profiles/Prusa/process/0.32mm High Flow @MK3.5.json +++ b/resources/profiles/Prusa/process/0.32mm High Flow @MK3.5.json @@ -39,7 +39,11 @@ "outer_wall_acceleration": "4000", "bridge_acceleration": "1500", "internal_solid_infill_acceleration": "3000", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json index 549b62c466..8b4b7511b1 100644 --- a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json +++ b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One 0.6.json @@ -4,8 +4,8 @@ "inherits": "0.32mm SPEED @MK4S 0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", - "overhang_3_4_speed": "70%", + "overhang_3_4_speed": "30", + "overhang_4_4_speed": "70%", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json index 1471abb700..55594a5dd2 100644 --- a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json +++ b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.32mm SPEED @MK4S HF0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "50", + "overhang_3_4_speed": "50", "support_interface_speed": "50%", "travel_speed": "350", "travel_acceleration": "7000", diff --git a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json index e9bde33023..533da07e95 100644 --- a/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json +++ b/resources/profiles/Prusa/process/0.32mm SPEED @CORE One HF 0.6.json @@ -4,9 +4,9 @@ "inherits": "0.32mm SPEED @MK4S HF0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "35", - "overhang_3_4_speed": "70%", - "top_surface_speed": "2000", + "overhang_3_4_speed": "35", + "overhang_4_4_speed": "70%", + "top_surface_acceleration": "2000", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -17,6 +17,5 @@ "sparse_infill_acceleration": "7000", "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", "inner_wall_acceleration": "6000", - "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "outer_wall_acceleration": "3000" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json index e52aa90a5f..a652b7097c 100644 --- a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json +++ b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One 0.6.json @@ -4,7 +4,7 @@ "inherits": "0.32mm STRUCTURAL @MK4S 0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "30", + "overhang_3_4_speed": "30", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json index a1f851d518..7fb4500b02 100644 --- a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json +++ b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.5.json @@ -4,7 +4,7 @@ "inherits": "0.32mm STRUCTURAL @MK4S HF0.5", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", + "overhang_3_4_speed": "45", "support_speed": "120", "support_interface_speed": "50%", "travel_speed": "350", diff --git a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json index 2a3f2ce950..887768ee8e 100644 --- a/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json +++ b/resources/profiles/Prusa/process/0.32mm STRUCTURAL @CORE One HF 0.6.json @@ -4,7 +4,7 @@ "inherits": "0.32mm STRUCTURAL @MK4S HF0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "35", + "overhang_3_4_speed": "35", "support_speed": "110", "support_interface_speed": "50%", "travel_speed": "350", diff --git a/resources/profiles/Prusa/process/0.32mm Standard @MINIIS.json b/resources/profiles/Prusa/process/0.32mm Standard @MINIIS.json index 411a870db7..c1edeeb9eb 100644 --- a/resources/profiles/Prusa/process/0.32mm Standard @MINIIS.json +++ b/resources/profiles/Prusa/process/0.32mm Standard @MINIIS.json @@ -30,7 +30,11 @@ "top_surface_speed": "55", "gap_infill_speed": "45", "travel_speed": "300", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.32mm Standard @MK3.5.json b/resources/profiles/Prusa/process/0.32mm Standard @MK3.5.json index 1f4001c0fb..5674aed58e 100644 --- a/resources/profiles/Prusa/process/0.32mm Standard @MK3.5.json +++ b/resources/profiles/Prusa/process/0.32mm Standard @MK3.5.json @@ -30,7 +30,11 @@ "top_surface_speed": "55", "gap_infill_speed": "45", "travel_speed": "300", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.35mm Standard @MINIIS.json b/resources/profiles/Prusa/process/0.35mm Standard @MINIIS.json index bb7145adc8..edc3044976 100644 --- a/resources/profiles/Prusa/process/0.35mm Standard @MINIIS.json +++ b/resources/profiles/Prusa/process/0.35mm Standard @MINIIS.json @@ -30,7 +30,11 @@ "top_surface_speed": "55", "gap_infill_speed": "45", "travel_speed": "300", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MINIIS 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.35mm Standard @MK3.5.json b/resources/profiles/Prusa/process/0.35mm Standard @MK3.5.json index 9ff6c800c2..82e2034788 100644 --- a/resources/profiles/Prusa/process/0.35mm Standard @MK3.5.json +++ b/resources/profiles/Prusa/process/0.35mm Standard @MK3.5.json @@ -30,7 +30,11 @@ "top_surface_speed": "55", "gap_infill_speed": "45", "travel_speed": "300", - "support_top_z_distance": "0.25", + "support_base_pattern_spacing": "2", + "support_top_z_distance": "0.22", + "support_bottom_z_distance": "0.22", + "support_bottom_interface_spacing": "0.22", + "support_interface_spacing": "0.25", "compatible_printers": [ "Prusa MK3.5 0.6 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.40mm High Flow @MINIIS.json b/resources/profiles/Prusa/process/0.40mm High Flow @MINIIS.json index 593fda4beb..ea55022d19 100644 --- a/resources/profiles/Prusa/process/0.40mm High Flow @MINIIS.json +++ b/resources/profiles/Prusa/process/0.40mm High Flow @MINIIS.json @@ -41,7 +41,11 @@ "inner_wall_acceleration": "3000", "outer_wall_acceleration": "2500", "bridge_acceleration": "1000", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.35", "compatible_printers": [ "Prusa MINIIS 0.8 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.40mm High Flow @MK3.5.json b/resources/profiles/Prusa/process/0.40mm High Flow @MK3.5.json index 056c8cb2be..79fda27a93 100644 --- a/resources/profiles/Prusa/process/0.40mm High Flow @MK3.5.json +++ b/resources/profiles/Prusa/process/0.40mm High Flow @MK3.5.json @@ -41,7 +41,11 @@ "inner_wall_acceleration": "3000", "outer_wall_acceleration": "2500", "bridge_acceleration": "1000", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.35", "compatible_printers": [ "Prusa MK3.5 0.8 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json b/resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json index 4567cd1dd7..a92c5eb3dd 100644 --- a/resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json +++ b/resources/profiles/Prusa/process/0.40mm QUALITY @CORE One 0.8.json @@ -4,8 +4,8 @@ "inherits": "0.40mm QUALITY @MK4S 0.8", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "35", - "top_surface_speed": "2000", + "overhang_3_4_speed": "35", + "top_surface_acceleration": "2000", "inner_wall_acceleration": "2500", "internal_solid_infill_acceleration": "5000", "sparse_infill_acceleration": "7000", diff --git a/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json index e0b870c9ad..bb913bcabd 100644 --- a/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json +++ b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.6.json @@ -4,9 +4,9 @@ "inherits": "0.40mm SPEED @MK4S HF0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "35", - "overhang_3_4_speed": "70%", - "top_surface_speed": "2000", + "overhang_3_4_speed": "35", + "overhang_4_4_speed": "70%", + "top_surface_acceleration": "2000", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -17,6 +17,5 @@ "sparse_infill_acceleration": "7000", "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.6 and printer_notes=~/.*HF_NOZZLE.*/", "inner_wall_acceleration": "6000", - "outer_wall_acceleration": "3000", - "top_surface_acceleration": "2000" + "outer_wall_acceleration": "3000" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json index 142556619a..7e6f2c156c 100644 --- a/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json +++ b/resources/profiles/Prusa/process/0.40mm SPEED @CORE One HF 0.8.json @@ -4,8 +4,8 @@ "inherits": "0.40mm SPEED @MK4S HF0.8", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", - "top_surface_speed": "2000", + "overhang_3_4_speed": "45", + "top_surface_acceleration": "2000", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -14,5 +14,7 @@ "initial_layer_speed": "45", "internal_solid_infill_acceleration": "5000", "sparse_infill_acceleration": "7000", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/", + "small_perimeter_speed": "85", + "outer_wall_speed": "85" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json index adfba858f2..fe8697d887 100644 --- a/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json +++ b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.6.json @@ -4,7 +4,7 @@ "inherits": "0.40mm STRUCTURAL @MK4S HF0.6", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "35", + "overhang_3_4_speed": "35", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json index e651c26ce3..6fbe39f6ba 100644 --- a/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json +++ b/resources/profiles/Prusa/process/0.40mm STRUCTURAL @CORE One HF 0.8.json @@ -4,8 +4,8 @@ "inherits": "0.40mm STRUCTURAL @MK4S HF0.8", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "40", - "top_surface_speed": "2000", + "overhang_3_4_speed": "40", + "top_surface_acceleration": "2000", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", @@ -16,6 +16,5 @@ "sparse_infill_acceleration": "6000", "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes=~/.*HF_NOZZLE.*/", "inner_wall_acceleration": "2500", - "outer_wall_acceleration": "1500", - "top_surface_acceleration": "2000" + "outer_wall_acceleration": "1500" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.40mm Standard @MINIIS.json b/resources/profiles/Prusa/process/0.40mm Standard @MINIIS.json index c040568d16..a29bbbdbbe 100644 --- a/resources/profiles/Prusa/process/0.40mm Standard @MINIIS.json +++ b/resources/profiles/Prusa/process/0.40mm Standard @MINIIS.json @@ -40,7 +40,11 @@ "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", "bridge_acceleration": "1000", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.35", "compatible_printers": [ "Prusa MINIIS 0.8 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.40mm Standard @MK3.5.json b/resources/profiles/Prusa/process/0.40mm Standard @MK3.5.json index 31fddc238b..41659260f1 100644 --- a/resources/profiles/Prusa/process/0.40mm Standard @MK3.5.json +++ b/resources/profiles/Prusa/process/0.40mm Standard @MK3.5.json @@ -41,7 +41,11 @@ "inner_wall_acceleration": "2000", "outer_wall_acceleration": "1500", "bridge_acceleration": "1000", + "support_base_pattern_spacing": "2", "support_top_z_distance": "0.25", + "support_bottom_z_distance": "0.25", + "support_bottom_interface_spacing": "0.25", + "support_interface_spacing": "0.35", "compatible_printers": [ "Prusa MK3.5 0.8 nozzle" ] diff --git a/resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json b/resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json index 6037cbdbda..5d350f3738 100644 --- a/resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json +++ b/resources/profiles/Prusa/process/0.55mm DRAFT @CORE One 0.8.json @@ -4,7 +4,7 @@ "inherits": "0.55mm DRAFT @MK4S 0.8", "from": "system", "instantiation": "true", - "top_surface_speed": "2000", + "top_surface_acceleration": "2000", "inner_wall_acceleration": "2500", "internal_solid_infill_acceleration": "5000", "sparse_infill_acceleration": "7000", @@ -14,5 +14,6 @@ "support_interface_top_layers": "3", "initial_layer_infill_speed": "55", "initial_layer_speed": "45", - "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes!~/.*HF_NOZZLE.*/" + "compatible_printers_condition": "printer_notes=~/.*PRINTER_MODEL_COREONE.*/ and nozzle_diameter[0]==0.8 and printer_notes!~/.*HF_NOZZLE.*/", + "inner_wall_speed": "45" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json b/resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json index 11b159f114..f9270671a2 100644 --- a/resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json +++ b/resources/profiles/Prusa/process/0.55mm SPEED @CORE One HF 0.8.json @@ -4,8 +4,8 @@ "inherits": "0.55mm SPEED @MK4S HF0.8", "from": "system", "instantiation": "true", - "overhang_2_4_speed": "45", - "top_surface_speed": "2000", + "overhang_3_4_speed": "45", + "top_surface_acceleration": "2000", "travel_speed": "350", "travel_acceleration": "7000", "default_acceleration": "3000", diff --git a/resources/profiles/Prusa/process/process_common_MK3.5.json b/resources/profiles/Prusa/process/process_common_MK3.5.json index a5471d2bf6..4873772bf7 100644 --- a/resources/profiles/Prusa/process/process_common_MK3.5.json +++ b/resources/profiles/Prusa/process/process_common_MK3.5.json @@ -55,10 +55,13 @@ "raft_contact_distance": "0.15", "raft_expansion": "1.5", "raft_first_layer_density": "90%", - "raft_first_layer_expansion": "3.5", "support_threshold_angle": "40", "support_interface_bottom_layers": "0", "support_base_pattern": "rectilinear", "support_interface_top_layers": "3", - "support_top_z_distance": "0.17" + "raft_first_layer_expansion": "3", + "support_base_pattern_spacing": "2", + "support_bottom_interface_spacing": "0.2", + "support_interface_spacing": "0.2", + "support_top_z_distance": "0.2" } \ No newline at end of file diff --git a/resources/profiles/Prusa/process/process_common_miniis.json b/resources/profiles/Prusa/process/process_common_miniis.json index 443fae9dc3..533d660224 100644 --- a/resources/profiles/Prusa/process/process_common_miniis.json +++ b/resources/profiles/Prusa/process/process_common_miniis.json @@ -55,10 +55,13 @@ "raft_contact_distance": "0.15", "raft_expansion": "1.5", "raft_first_layer_density": "90%", - "raft_first_layer_expansion": "3.5", "support_threshold_angle": "40", "support_interface_bottom_layers": "0", "support_base_pattern": "rectilinear", "support_interface_top_layers": "3", - "support_top_z_distance": "0.17" + "raft_first_layer_expansion": "3", + "support_base_pattern_spacing": "2", + "support_bottom_interface_spacing": "0.2", + "support_interface_spacing": "0.2", + "support_top_z_distance": "0.2" } \ No newline at end of file diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index e5b3b2b155..a468a8edf1 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -462,7 +462,7 @@ "filament_list": [ { "name": "PolyTerra PLA @0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" + "sub_path": "filament/Polymaker/PolyTerra PLA @0.2 nozzle.json" }, { "name": "Snapmaker PLA Lite @U1 base", @@ -482,11 +482,11 @@ }, { "name": "PolyTerra Dual PLA @0.2 nozzle", - "sub_path": "filament/PolyTerra Dual PLA @0.2 nozzle.json" + "sub_path": "filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json" }, { "name": "PolyTerra J1 PLA @0.2 nozzle", - "sub_path": "filament/PolyTerra J1 PLA @0.2 nozzle.json" + "sub_path": "filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json" }, { "name": "Snapmaker PLA Lite @U1", @@ -608,6 +608,14 @@ "name": "Snapmaker PET @base", "sub_path": "filament/Snapmaker PET @base.json" }, + { + "name": "PolyLite PETG @Base", + "sub_path": "filament/Polymaker/PolyLite PETG @Base.json" + }, + { + "name": "Polymaker PETG @Base", + "sub_path": "filament/Polymaker/Polymaker PETG @Base.json" + }, { "name": "Snapmaker Dual PETG @base", "sub_path": "filament/Snapmaker Dual PETG @base.json" @@ -640,17 +648,105 @@ "name": "Snapmaker PETG-CF @base", "sub_path": "filament/Snapmaker PETG-CF @base.json" }, + { + "name": "Panchroma CoPE @U1 base", + "sub_path": "filament/Polymaker/Panchroma CoPE @U1 base.json" + }, + { + "name": "Panchroma PLA @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA @U1 base.json" + }, + { + "name": "Panchroma PLA Celestial @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Celestial @U1 base.json" + }, + { + "name": "Panchroma PLA Galaxy @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Galaxy @U1 base.json" + }, + { + "name": "Panchroma PLA Glow @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Glow @U1 base.json" + }, + { + "name": "Panchroma PLA Luminous @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Luminous @U1 base.json" + }, + { + "name": "Panchroma PLA Marble @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Marble @U1 base.json" + }, + { + "name": "Panchroma PLA Matte @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Matte @U1 base.json" + }, + { + "name": "Panchroma PLA Metallic @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Metallic @U1 base.json" + }, + { + "name": "Panchroma PLA Neon @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Neon @U1 base.json" + }, + { + "name": "Panchroma PLA Satin @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @U1 base.json" + }, + { + "name": "Panchroma PLA Silk @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Silk @U1 base.json" + }, + { + "name": "Panchroma PLA Starlight @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Starlight @U1 base.json" + }, + { + "name": "Panchroma PLA Temp Shift @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Temp Shift @U1 base.json" + }, + { + "name": "Panchroma PLA Translucent @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA Translucent @U1 base.json" + }, + { + "name": "Panchroma PLA UV Shift @U1 base", + "sub_path": "filament/Polymaker/Panchroma PLA UV Shift @U1 base.json" + }, { "name": "PolyLite PLA @U1 base", - "sub_path": "filament/PolyLite PLA @U1 base.json" + "sub_path": "filament/Polymaker/PolyLite PLA @U1 base.json" }, { "name": "PolyLite PLA @base", - "sub_path": "filament/PolyLite PLA @base.json" + "sub_path": "filament/Polymaker/PolyLite PLA @base.json" + }, + { + "name": "PolyLite PLA Pro @U1 base", + "sub_path": "filament/Polymaker/PolyLite PLA Pro @U1 base.json" }, { "name": "PolyTerra PLA @U1 base", - "sub_path": "filament/PolyTerra PLA @U1 base.json" + "sub_path": "filament/Polymaker/PolyTerra PLA @U1 base.json" + }, + { + "name": "Polymaker HT-PLA @Base", + "sub_path": "filament/Polymaker/Polymaker HT-PLA @Base.json" + }, + { + "name": "Polymaker HT-PLA @U1 base", + "sub_path": "filament/Polymaker/Polymaker HT-PLA @U1 base.json" + }, + { + "name": "Polymaker HT-PLA-GF @Base", + "sub_path": "filament/Polymaker/Polymaker HT-PLA-GF @Base.json" + }, + { + "name": "Polymaker HT-PLA-GF @U1 base", + "sub_path": "filament/Polymaker/Polymaker HT-PLA-GF @U1 base.json" + }, + { + "name": "Polymaker PLA Pro @Base", + "sub_path": "filament/Polymaker/Polymaker PLA Pro @Base.json" }, { "name": "Snapmaker Dual PLA @base", @@ -884,6 +980,14 @@ "name": "Snapmaker PET", "sub_path": "filament/Snapmaker PET.json" }, + { + "name": "PolyLite PETG @Snapmaker U1", + "sub_path": "filament/Polymaker/PolyLite PETG @Snapmaker U1.json" + }, + { + "name": "Polymaker PETG @Snapmaker U1", + "sub_path": "filament/Polymaker/Polymaker PETG @Snapmaker U1.json" + }, { "name": "Snapmaker Dual PETG", "sub_path": "filament/Snapmaker Dual PETG.json" @@ -936,21 +1040,109 @@ "name": "Snapmaker PETG-CF", "sub_path": "filament/Snapmaker PETG-CF.json" }, + { + "name": "Panchroma CoPE @U1", + "sub_path": "filament/Polymaker/Panchroma CoPE @U1.json" + }, + { + "name": "Panchroma PLA @U1", + "sub_path": "filament/Polymaker/Panchroma PLA @U1.json" + }, + { + "name": "Panchroma PLA Celestial @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Celestial @U1.json" + }, + { + "name": "Panchroma PLA Galaxy @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Galaxy @U1.json" + }, + { + "name": "Panchroma PLA Glow @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Glow @U1.json" + }, + { + "name": "Panchroma PLA Luminous @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Luminous @U1.json" + }, + { + "name": "Panchroma PLA Marble @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Marble @U1.json" + }, + { + "name": "Panchroma PLA Matte @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Matte @U1.json" + }, + { + "name": "Panchroma PLA Metallic @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Metallic @U1.json" + }, + { + "name": "Panchroma PLA Neon @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Neon @U1.json" + }, + { + "name": "Panchroma PLA Satin @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Satin @U1.json" + }, + { + "name": "Panchroma PLA Silk @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Silk @U1.json" + }, + { + "name": "Panchroma PLA Starlight @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Starlight @U1.json" + }, + { + "name": "Panchroma PLA Temp Shift @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Temp Shift @U1.json" + }, + { + "name": "Panchroma PLA Translucent @U1", + "sub_path": "filament/Polymaker/Panchroma PLA Translucent @U1.json" + }, + { + "name": "Panchroma PLA UV Shift @U1", + "sub_path": "filament/Polymaker/Panchroma PLA UV Shift @U1.json" + }, { "name": "PolyLite PLA @U1", - "sub_path": "filament/PolyLite PLA @U1.json" + "sub_path": "filament/Polymaker/PolyLite PLA @U1.json" }, { "name": "PolyLite J1 PLA", - "sub_path": "filament/PolyLite J1 PLA.json" + "sub_path": "filament/Polymaker/PolyLite J1 PLA.json" }, { "name": "PolyLite PLA @0.2 nozzle", - "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" + "sub_path": "filament/Polymaker/PolyLite PLA @0.2 nozzle.json" + }, + { + "name": "PolyLite PLA Pro @U1", + "sub_path": "filament/Polymaker/PolyLite PLA Pro @U1.json" }, { "name": "PolyTerra PLA @U1", - "sub_path": "filament/PolyTerra PLA @U1.json" + "sub_path": "filament/Polymaker/PolyTerra PLA @U1.json" + }, + { + "name": "Polymaker HT-PLA @Snapmaker U1", + "sub_path": "filament/Polymaker/Polymaker HT-PLA @Snapmaker U1.json" + }, + { + "name": "Polymaker HT-PLA @U1", + "sub_path": "filament/Polymaker/Polymaker HT-PLA @U1.json" + }, + { + "name": "Polymaker HT-PLA-GF @Snapmaker U1", + "sub_path": "filament/Polymaker/Polymaker HT-PLA-GF @Snapmaker U1.json" + }, + { + "name": "Polymaker HT-PLA-GF @U1", + "sub_path": "filament/Polymaker/Polymaker HT-PLA-GF @U1.json" + }, + { + "name": "Polymaker PLA Pro @Snapmaker U1", + "sub_path": "filament/Polymaker/Polymaker PLA Pro @Snapmaker U1.json" }, { "name": "Snapmaker Dual PLA", @@ -1158,11 +1350,11 @@ }, { "name": "PolyLite Dual PLA @0.2 nozzle", - "sub_path": "filament/PolyLite Dual PLA @0.2 nozzle.json" + "sub_path": "filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json" }, { "name": "PolyLite J1 PLA @0.2 nozzle", - "sub_path": "filament/PolyLite J1 PLA @0.2 nozzle.json" + "sub_path": "filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json" }, { "name": "Snapmaker Dual PLA Eco", @@ -1206,7 +1398,7 @@ }, { "name": "PolyTerra J1 PLA", - "sub_path": "filament/PolyTerra J1 PLA.json" + "sub_path": "filament/Polymaker/PolyTerra J1 PLA.json" }, { "name": "Snapmaker PLA Matte @U1 base", diff --git a/resources/profiles/Snapmaker/filament/PolyLite Dual PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyLite Dual PLA @0.2 nozzle.json deleted file mode 100644 index 6528cd8ca0..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyLite Dual PLA @0.2 nozzle.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "filament", - "name": "PolyLite Dual PLA @0.2 nozzle", - "inherits": "PolyLite PLA @0.2 nozzle", - "from": "system", - "setting_id": "490991920", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker A250 Dual (0.2 nozzle)", - "Snapmaker A250 Dual BKit (0.2 nozzle)", - "Snapmaker A250 Dual QS+B Kit (0.2 nozzle)", - "Snapmaker A250 Dual QSKit (0.2 nozzle)", - "Snapmaker A350 Dual (0.2 nozzle)", - "Snapmaker A350 Dual BKit (0.2 nozzle)", - "Snapmaker A350 Dual QS+B Kit (0.2 nozzle)", - "Snapmaker A350 Dual QSKit (0.2 nozzle)", - "Snapmaker Artisan (0.2 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyLite J1 PLA @0.2 nozzle.json deleted file mode 100644 index 65a87c28d8..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyLite J1 PLA @0.2 nozzle.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "filament", - "name": "PolyLite J1 PLA @0.2 nozzle", - "inherits": "PolyLite PLA @0.2 nozzle", - "from": "system", - "setting_id": "431382384", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker J1 (0.2 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite J1 PLA.json b/resources/profiles/Snapmaker/filament/PolyLite J1 PLA.json deleted file mode 100644 index 0d09c5528a..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyLite J1 PLA.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "filament", - "name": "PolyLite J1 PLA", - "inherits": "PolyLite PLA @base", - "from": "system", - "setting_id": "116125055", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker J1 (0.4 nozzle)", - "Snapmaker J1 (0.6 nozzle)", - "Snapmaker J1 (0.8 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @0.2 nozzle.json deleted file mode 100644 index 69999b740a..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyLite PLA @0.2 nozzle.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "filament", - "name": "PolyLite PLA @0.2 nozzle", - "inherits": "PolyLite PLA @base", - "from": "system", - "setting_id": "1592803578", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker A250 (0.2 nozzle)", - "Snapmaker A250 BKit (0.2 nozzle)", - "Snapmaker A250 QS+B Kit (0.2 nozzle)", - "Snapmaker A250 QSKit (0.2 nozzle)", - "Snapmaker A350 (0.2 nozzle)", - "Snapmaker A350 BKit (0.2 nozzle)", - "Snapmaker A350 QS+B Kit (0.2 nozzle)", - "Snapmaker A350 QSKit (0.2 nozzle)" - ], - "filament_max_volumetric_speed": [ - "1.6" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1 base.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1 base.json deleted file mode 100644 index fb9c55cdc7..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1 base.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "filament", - "name": "PolyLite PLA @U1 base", - "inherits": "fdm_filament_pla", - "from": "system", - "filament_id": "13938660340", - "instantiation": "false", - "filament_flow_ratio": [ - "0.95" - ], - "filament_cost": [ - "90" - ], - "filament_max_volumetric_speed": [ - "15" - ], - "default_filament_colour": [ - "" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json deleted file mode 100644 index 0648fdde39..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "filament", - "name": "PolyLite PLA @U1", - "inherits": "PolyLite PLA @U1 base", - "from": "system", - "setting_id": "6486836500", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker U1 (0.4 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @base.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @base.json deleted file mode 100644 index e4db1c70b6..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyLite PLA @base.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "filament", - "name": "PolyLite PLA @base", - "inherits": "fdm_filament_pla", - "from": "system", - "filament_id": "1393866034", - "instantiation": "false", - "filament_flow_ratio": [ - "0.95" - ], - "filament_cost": [ - "90" - ], - "filament_max_volumetric_speed": [ - "15" - ], - "default_filament_colour": [ - "" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra Dual PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyTerra Dual PLA @0.2 nozzle.json deleted file mode 100644 index 9ce3e9f972..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyTerra Dual PLA @0.2 nozzle.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "type": "filament", - "name": "PolyTerra Dual PLA @0.2 nozzle", - "inherits": "PolyTerra PLA @0.2 nozzle", - "from": "system", - "setting_id": "1258531391", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker A250 Dual (0.2 nozzle)", - "Snapmaker A250 Dual BKit (0.2 nozzle)", - "Snapmaker A250 Dual QS+B Kit (0.2 nozzle)", - "Snapmaker A250 Dual QSKit (0.2 nozzle)", - "Snapmaker A350 Dual (0.2 nozzle)", - "Snapmaker A350 Dual BKit (0.2 nozzle)", - "Snapmaker A350 Dual QS+B Kit (0.2 nozzle)", - "Snapmaker A350 Dual QSKit (0.2 nozzle)", - "Snapmaker Artisan (0.2 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA @0.2 nozzle.json deleted file mode 100644 index a2f99fd132..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA @0.2 nozzle.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "filament", - "name": "PolyTerra J1 PLA @0.2 nozzle", - "inherits": "PolyTerra PLA @0.2 nozzle", - "from": "system", - "setting_id": "1072374370", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker J1 (0.2 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA.json b/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA.json deleted file mode 100644 index c696f52735..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyTerra J1 PLA.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "type": "filament", - "name": "PolyTerra J1 PLA", - "inherits": "PolyTerra PLA @base", - "from": "system", - "setting_id": "3958200796", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker J1 (0.4 nozzle)", - "Snapmaker J1 (0.6 nozzle)", - "Snapmaker J1 (0.8 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @0.2 nozzle.json deleted file mode 100644 index f996844ce1..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyTerra PLA @0.2 nozzle.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "filament", - "name": "PolyTerra PLA @0.2 nozzle", - "inherits": "PolyTerra PLA @base", - "from": "system", - "setting_id": "409934824", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker A250 (0.2 nozzle)", - "Snapmaker A250 BKit (0.2 nozzle)", - "Snapmaker A250 QS+B Kit (0.2 nozzle)", - "Snapmaker A250 QSKit (0.2 nozzle)", - "Snapmaker A350 (0.2 nozzle)", - "Snapmaker A350 BKit (0.2 nozzle)", - "Snapmaker A350 QS+B Kit (0.2 nozzle)", - "Snapmaker A350 QSKit (0.2 nozzle)" - ], - "filament_max_volumetric_speed": [ - "1.4" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1 base.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1 base.json deleted file mode 100644 index 3b7b9a8b94..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1 base.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "filament", - "name": "PolyTerra PLA @U1 base", - "inherits": "fdm_filament_pla", - "from": "system", - "filament_id": "37895926870", - "instantiation": "false", - "filament_cost": [ - "80" - ], - "filament_density": [ - "1.31" - ], - "filament_max_volumetric_speed": [ - "14.4" - ], - "default_filament_colour": [ - "" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json deleted file mode 100644 index 478c008d7a..0000000000 --- a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "filament", - "name": "PolyTerra PLA @U1", - "inherits": "PolyTerra PLA @U1 base", - "from": "system", - "setting_id": "12580059400", - "instantiation": "true", - "compatible_printers": [ - "Snapmaker U1 (0.4 nozzle)" - ] -} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma CoPE @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma CoPE @U1 base.json new file mode 100644 index 0000000000..1575543964 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma CoPE @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma CoPE @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM016", + "instantiation": "false", + "filament_cost": [ + "19.99" + ], + "filament_density": [ + "1.29" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "58" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma CoPE @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma CoPE @U1.json new file mode 100644 index 0000000000..abd252e87a --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma CoPE @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma CoPE @U1", + "inherits": "Panchroma CoPE @U1 base", + "from": "system", + "setting_id": "GFSPM016_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA @U1 base.json new file mode 100644 index 0000000000..a09edc3df1 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA @U1 base.json @@ -0,0 +1,44 @@ +{ + "type": "filament", + "name": "Panchroma PLA @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM001", + "instantiation": "false", + "filament_cost": [ + "19.99" + ], + "filament_density": [ + "1.32" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "filament_wipe": [ + "0" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "58" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA @U1.json new file mode 100644 index 0000000000..a77038834b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA @U1", + "inherits": "Panchroma PLA @U1 base", + "from": "system", + "setting_id": "GFSPM001_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Celestial @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Celestial @U1 base.json new file mode 100644 index 0000000000..305c3b8476 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Celestial @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Celestial @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM008", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Celestial @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Celestial @U1.json new file mode 100644 index 0000000000..cfd1b918b1 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Celestial @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Celestial @U1", + "inherits": "Panchroma PLA Celestial @U1 base", + "from": "system", + "setting_id": "GFSPM008_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Galaxy @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Galaxy @U1 base.json new file mode 100644 index 0000000000..9129ce17a7 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Galaxy @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Galaxy @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM007", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Galaxy @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Galaxy @U1.json new file mode 100644 index 0000000000..465e8b461d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Galaxy @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Galaxy @U1", + "inherits": "Panchroma PLA Galaxy @U1 base", + "from": "system", + "setting_id": "GFSPM007_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Glow @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Glow @U1 base.json new file mode 100644 index 0000000000..21177be0db --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Glow @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Glow @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM010", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Glow @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Glow @U1.json new file mode 100644 index 0000000000..5cbf021349 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Glow @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Glow @U1", + "inherits": "Panchroma PLA Glow @U1 base", + "from": "system", + "setting_id": "GFSPM010_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Luminous @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Luminous @U1 base.json new file mode 100644 index 0000000000..c8afc7bc16 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Luminous @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Luminous @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM011", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Luminous @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Luminous @U1.json new file mode 100644 index 0000000000..7747c1ccfb --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Luminous @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Luminous @U1", + "inherits": "Panchroma PLA Luminous @U1 base", + "from": "system", + "setting_id": "GFSPM011_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Marble @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Marble @U1 base.json new file mode 100644 index 0000000000..8a462959a8 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Marble @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Marble @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM003", + "instantiation": "false", + "filament_cost": [ + "21.99" + ], + "filament_density": [ + "1.31" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Marble @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Marble @U1.json new file mode 100644 index 0000000000..8fb2780b8f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Marble @U1.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "name": "Panchroma PLA Marble @U1", + "inherits": "Panchroma PLA Marble @U1 base", + "from": "system", + "setting_id": "GFSPM003_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Matte @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Matte @U1 base.json new file mode 100644 index 0000000000..9ab72e1484 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Matte @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Matte @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM002", + "instantiation": "false", + "filament_cost": [ + "20.99" + ], + "filament_density": [ + "1.31" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Matte @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Matte @U1.json new file mode 100644 index 0000000000..9823adaa0c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Matte @U1.json @@ -0,0 +1,23 @@ +{ + "type": "filament", + "name": "Panchroma PLA Matte @U1", + "inherits": "Panchroma PLA Matte @U1 base", + "from": "system", + "setting_id": "GFSPM002_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Metallic @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Metallic @U1 base.json new file mode 100644 index 0000000000..f9a33ba035 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Metallic @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Metallic @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM012", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Metallic @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Metallic @U1.json new file mode 100644 index 0000000000..0196929a54 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Metallic @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Metallic @U1", + "inherits": "Panchroma PLA Metallic @U1 base", + "from": "system", + "setting_id": "GFSPM012_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Neon @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Neon @U1 base.json new file mode 100644 index 0000000000..70332dc961 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Neon @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Neon @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM013", + "instantiation": "false", + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Neon @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Neon @U1.json new file mode 100644 index 0000000000..cc5ab3fbaf --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Neon @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Neon @U1", + "inherits": "Panchroma PLA Neon @U1 base", + "from": "system", + "setting_id": "GFSPM013_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Satin @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Satin @U1 base.json new file mode 100644 index 0000000000..1f38ea1a45 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Satin @U1 base.json @@ -0,0 +1,42 @@ +{ + "type": "filament", + "name": "Panchroma PLA Satin @U1 base", + "renamed_from": "Panchroma PLA Stain @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM005", + "instantiation": "false", + "filament_cost": [ + "20.99" + ], + "filament_density": [ + "1.24" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "59" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Satin @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Satin @U1.json new file mode 100644 index 0000000000..6e914b56a4 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Satin @U1.json @@ -0,0 +1,27 @@ +{ + "type": "filament", + "name": "Panchroma PLA Satin @U1", + "renamed_from": "Panchroma PLA Stain @U1", + "inherits": "Panchroma PLA Satin @U1 base", + "from": "system", + "setting_id": "GFSPM005_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "slow_down_layer_time": [ + "4" + ] +} diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Silk @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Silk @U1 base.json new file mode 100644 index 0000000000..43e9f98164 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Silk @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Silk @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM004", + "instantiation": "false", + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.31" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "230" + ], + "nozzle_temperature_initial_layer": [ + "230" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "58" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Silk @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Silk @U1.json new file mode 100644 index 0000000000..52102ab63b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Silk @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Silk @U1", + "inherits": "Panchroma PLA Silk @U1 base", + "from": "system", + "setting_id": "GFSPM004_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Starlight @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Starlight @U1 base.json new file mode 100644 index 0000000000..0c9fd9bf52 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Starlight @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Starlight @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM009", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Starlight @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Starlight @U1.json new file mode 100644 index 0000000000..9029dc250c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Starlight @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Starlight @U1", + "inherits": "Panchroma PLA Starlight @U1 base", + "from": "system", + "setting_id": "GFSPM009_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Temp Shift @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Temp Shift @U1 base.json new file mode 100644 index 0000000000..c86779555f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Temp Shift @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Temp Shift @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM015", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Temp Shift @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Temp Shift @U1.json new file mode 100644 index 0000000000..5d7e17696b --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Temp Shift @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Temp Shift @U1", + "inherits": "Panchroma PLA Temp Shift @U1 base", + "from": "system", + "setting_id": "GFSPM015_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Translucent @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Translucent @U1 base.json new file mode 100644 index 0000000000..cb786e6f9a --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Translucent @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA Translucent @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM006", + "instantiation": "false", + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Translucent @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Translucent @U1.json new file mode 100644 index 0000000000..6e35878869 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA Translucent @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA Translucent @U1", + "inherits": "Panchroma PLA Translucent @U1 base", + "from": "system", + "setting_id": "GFSPM006_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA UV Shift @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA UV Shift @U1 base.json new file mode 100644 index 0000000000..c209198398 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA UV Shift @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "Panchroma PLA UV Shift @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM014", + "instantiation": "false", + "filament_cost": [ + "29.99" + ], + "filament_density": [ + "1.17" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "240" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "61" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA UV Shift @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA UV Shift @U1.json new file mode 100644 index 0000000000..f85802624c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Panchroma PLA UV Shift @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Panchroma PLA UV Shift @U1", + "inherits": "Panchroma PLA UV Shift @U1 base", + "from": "system", + "setting_id": "GFSPM014_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json new file mode 100644 index 0000000000..f47614d710 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite Dual PLA @0.2 nozzle.json @@ -0,0 +1,19 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite Dual PLA @0.2 nozzle", + "setting_id": "490991920", + "inherits": "PolyLite PLA @0.2 nozzle", + "compatible_printers": [ + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A250 Dual BKit (0.2 nozzle)", + "Snapmaker A250 Dual QS+B Kit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A350 Dual BKit (0.2 nozzle)", + "Snapmaker A350 Dual QS+B Kit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker Artisan (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json new file mode 100644 index 0000000000..4e2b21f785 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA @0.2 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite J1 PLA @0.2 nozzle", + "setting_id": "431382384", + "inherits": "PolyLite PLA @0.2 nozzle", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA.json new file mode 100644 index 0000000000..ac3cdd9ba9 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite J1 PLA.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite J1 PLA", + "setting_id": "116125055", + "inherits": "PolyLite PLA @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Base.json new file mode 100644 index 0000000000..ed8ea01808 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Base.json @@ -0,0 +1,29 @@ +{ + "filament_density": [ + "1.25" + ], + "temp_min": [ + "230" + ], + "temp_max": [ + "240" + ], + "temperture_vitrification": [ + "75" + ], + "idle_temperture": [ + "0" + ], + "filament_soluble": [ + "0" + ], + "description": "", + "inherits": "fdm_filament_petg", + "name": "PolyLite PETG @Base", + "type": "filament", + "instantiation": "false", + "from": "system", + "filament_vendor": [ + "Polymaker" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Snapmaker U1.json new file mode 100644 index 0000000000..2e8a0e0943 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PETG @Snapmaker U1.json @@ -0,0 +1,117 @@ +{ + "type": "filament", + "name": "PolyLite PETG @Snapmaker U1", + "from": "system", + "instantiation": "true", + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "0" + ], + "hot_plate_temp": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "0" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "overhang_fan_threshold": [ + "95%" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.92" + ], + "fan_cooling_layer_time": [ + "20" + ], + "filament_cost": [ + "0" + ], + "filament_diameter": [ + "1.75" + ], + "filament_max_volumetric_speed": [ + "7.5" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "bed_type": [ + "Cool Plate" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "full_fan_speed_layer": [ + "0" + ], + "fan_max_speed": [ + "40" + ], + "fan_min_speed": [ + "0" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "6" + ], + "filament_start_gcode": [ + "; Filament gcode\n" + ], + "nozzle_temperature": [ + "260" + ], + "temperature_vitrification": [ + "81" + ], + "filament_id": "PMPE04", + "nozzle_temperature_range_high": [ + "260" + ], + "nozzle_temperature_range_low": [ + "230" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "setting_id": "PMPE04_U1", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "pressure_advance": [ + "0.05" + ], + "inherits": "PolyLite PETG @Base" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @0.2 nozzle.json new file mode 100644 index 0000000000..b3c643a042 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite PLA @0.2 nozzle", + "setting_id": "1592803578", + "inherits": "PolyLite PLA @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A250 BKit (0.2 nozzle)", + "Snapmaker A250 QS+B Kit (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A350 BKit (0.2 nozzle)", + "Snapmaker A350 QS+B Kit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1.6" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @U1 base.json new file mode 100644 index 0000000000..d0547572b6 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @U1 base.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "PolyLite PLA @U1 base", + "filament_id": "13938660340", + "inherits": "fdm_filament_pla", + "filament_flow_ratio": [ + "0.95" + ], + "filament_cost": [ + "90" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "default_filament_colour": [ + "" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @U1.json new file mode 100644 index 0000000000..ad81f2d79d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @U1.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyLite PLA @U1", + "setting_id": "6486836500", + "inherits": "PolyLite PLA @U1 base", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @base.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @base.json new file mode 100644 index 0000000000..2a7310f405 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA @base.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "PolyLite PLA @base", + "filament_id": "1393866034", + "inherits": "fdm_filament_pla", + "filament_flow_ratio": [ + "0.95" + ], + "filament_cost": [ + "90" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "default_filament_colour": [ + "" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA Pro @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA Pro @U1 base.json new file mode 100644 index 0000000000..f5d87e4277 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA Pro @U1 base.json @@ -0,0 +1,41 @@ +{ + "type": "filament", + "name": "PolyLite PLA Pro @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM019", + "instantiation": "false", + "filament_cost": [ + "24.99" + ], + "filament_density": [ + "1.22" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "220" + ], + "nozzle_temperature_range_low": [ + "190" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "62" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA Pro @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA Pro @U1.json new file mode 100644 index 0000000000..f0b65f7717 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyLite PLA Pro @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "PolyLite PLA Pro @U1", + "inherits": "PolyLite PLA Pro @U1 base", + "from": "system", + "setting_id": "GFSPM019_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json new file mode 100644 index 0000000000..c3673b4d3c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra Dual PLA @0.2 nozzle.json @@ -0,0 +1,19 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra Dual PLA @0.2 nozzle", + "setting_id": "1258531391", + "inherits": "PolyTerra PLA @0.2 nozzle", + "compatible_printers": [ + "Snapmaker A250 Dual (0.2 nozzle)", + "Snapmaker A250 Dual BKit (0.2 nozzle)", + "Snapmaker A250 Dual QS+B Kit (0.2 nozzle)", + "Snapmaker A250 Dual QSKit (0.2 nozzle)", + "Snapmaker A350 Dual (0.2 nozzle)", + "Snapmaker A350 Dual BKit (0.2 nozzle)", + "Snapmaker A350 Dual QS+B Kit (0.2 nozzle)", + "Snapmaker A350 Dual QSKit (0.2 nozzle)", + "Snapmaker Artisan (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json new file mode 100644 index 0000000000..24fda4c652 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA @0.2 nozzle.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra J1 PLA @0.2 nozzle", + "setting_id": "1072374370", + "inherits": "PolyTerra PLA @0.2 nozzle", + "compatible_printers": [ + "Snapmaker J1 (0.2 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA.json new file mode 100644 index 0000000000..9592d5cbd0 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra J1 PLA.json @@ -0,0 +1,13 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra J1 PLA", + "setting_id": "3958200796", + "inherits": "PolyTerra PLA @base", + "compatible_printers": [ + "Snapmaker J1 (0.4 nozzle)", + "Snapmaker J1 (0.6 nozzle)", + "Snapmaker J1 (0.8 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @0.2 nozzle.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @0.2 nozzle.json new file mode 100644 index 0000000000..215685b8e3 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @0.2 nozzle.json @@ -0,0 +1,21 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra PLA @0.2 nozzle", + "setting_id": "409934824", + "inherits": "PolyTerra PLA @base", + "compatible_printers": [ + "Snapmaker A250 (0.2 nozzle)", + "Snapmaker A250 BKit (0.2 nozzle)", + "Snapmaker A250 QS+B Kit (0.2 nozzle)", + "Snapmaker A250 QSKit (0.2 nozzle)", + "Snapmaker A350 (0.2 nozzle)", + "Snapmaker A350 BKit (0.2 nozzle)", + "Snapmaker A350 QS+B Kit (0.2 nozzle)", + "Snapmaker A350 QSKit (0.2 nozzle)" + ], + "filament_max_volumetric_speed": [ + "1.4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @U1 base.json new file mode 100644 index 0000000000..861179ca06 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @U1 base.json @@ -0,0 +1,20 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "false", + "name": "PolyTerra PLA @U1 base", + "filament_id": "37895926870", + "inherits": "fdm_filament_pla", + "filament_cost": [ + "80" + ], + "filament_density": [ + "1.31" + ], + "filament_max_volumetric_speed": [ + "14.4" + ], + "default_filament_colour": [ + "" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @U1.json new file mode 100644 index 0000000000..f77d1d8082 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/PolyTerra PLA @U1.json @@ -0,0 +1,11 @@ +{ + "type": "filament", + "from": "system", + "instantiation": "true", + "name": "PolyTerra PLA @U1", + "setting_id": "12580059400", + "inherits": "PolyTerra PLA @U1 base", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Base.json new file mode 100644 index 0000000000..77e155ade4 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Base.json @@ -0,0 +1,29 @@ +{ + "filament_density": [ + "1.28" + ], + "temp_min": [ + "210" + ], + "temp_max": [ + "230" + ], + "temperture_vitrification": [ + "156" + ], + "idle_temperture": [ + "0" + ], + "filament_soluble": [ + "0" + ], + "description": "", + "inherits": "fdm_filament_pla", + "name": "Polymaker HT-PLA @Base", + "type": "filament", + "instantiation": "false", + "from": "system", + "filament_vendor": [ + "Polymaker" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Snapmaker U1.json new file mode 100644 index 0000000000..b466d702fe --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @Snapmaker U1.json @@ -0,0 +1,96 @@ +{ + "type": "filament", + "name": "Polymaker HT-PLA @Snapmaker U1", + "from": "system", + "instantiation": "true", + "cool_plate_temp": [ + "50" + ], + "eng_plate_temp": [ + "50" + ], + "hot_plate_temp": [ + "65" + ], + "textured_plate_temp": [ + "50" + ], + "cool_plate_temp_initial_layer": [ + "50" + ], + "eng_plate_temp_initial_layer": [ + "50" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "50" + ], + "overhang_fan_threshold": [ + "50%" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_cost": [ + "0" + ], + "filament_diameter": [ + "1.75" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "bed_type": [ + "Cool Plate" + ], + "full_fan_speed_layer": [ + "0" + ], + "fan_max_speed": [ + "100" + ], + "slow_down_min_speed": [ + "5" + ], + "slow_down_layer_time": [ + "6" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "nozzle_temperature": [ + "220" + ], + "temperature_vitrification": [ + "60" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "setting_id": "PMPL02_U1", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "inherits": "Polymaker HT-PLA @Base", + "filament_id": "PMPL02" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @U1 base.json new file mode 100644 index 0000000000..9a997d8e3f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @U1 base.json @@ -0,0 +1,53 @@ +{ + "type": "filament", + "name": "Polymaker HT-PLA @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM017", + "instantiation": "false", + "filament_cost": [ + "26.99" + ], + "filament_density": [ + "1.28" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_vendor": [ + "Polymaker" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "60" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @U1.json new file mode 100644 index 0000000000..da678d8a4c --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Polymaker HT-PLA @U1", + "inherits": "Polymaker HT-PLA @U1 base", + "from": "system", + "setting_id": "GFSPM017_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Base.json new file mode 100644 index 0000000000..4cd066b3d0 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Base.json @@ -0,0 +1,29 @@ +{ + "filament_density": [ + "1.34" + ], + "temp_min": [ + "210" + ], + "temp_max": [ + "230" + ], + "temperture_vitrification": [ + "148" + ], + "idle_temperture": [ + "0" + ], + "filament_soluble": [ + "0" + ], + "description": "", + "inherits": "fdm_filament_pla", + "name": "Polymaker HT-PLA-GF @Base", + "type": "filament", + "instantiation": "false", + "from": "system", + "filament_vendor": [ + "Polymaker" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Snapmaker U1.json new file mode 100644 index 0000000000..b18f79d461 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @Snapmaker U1.json @@ -0,0 +1,96 @@ +{ + "type": "filament", + "name": "Polymaker HT-PLA-GF @Snapmaker U1", + "from": "system", + "instantiation": "true", + "cool_plate_temp": [ + "50" + ], + "eng_plate_temp": [ + "50" + ], + "hot_plate_temp": [ + "65" + ], + "textured_plate_temp": [ + "50" + ], + "cool_plate_temp_initial_layer": [ + "50" + ], + "eng_plate_temp_initial_layer": [ + "50" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "50" + ], + "overhang_fan_threshold": [ + "50%" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "1.04" + ], + "filament_cost": [ + "0" + ], + "filament_diameter": [ + "1.75" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "bed_type": [ + "Cool Plate" + ], + "full_fan_speed_layer": [ + "0" + ], + "fan_max_speed": [ + "100" + ], + "slow_down_min_speed": [ + "5" + ], + "slow_down_layer_time": [ + "6" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "nozzle_temperature": [ + "220" + ], + "temperature_vitrification": [ + "60" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "setting_id": "PMPL01_U1", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "inherits": "Polymaker HT-PLA-GF @Base", + "filament_id": "PMPL01" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @U1 base.json new file mode 100644 index 0000000000..fb70c1df40 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @U1 base.json @@ -0,0 +1,53 @@ +{ + "type": "filament", + "name": "Polymaker HT-PLA-GF @U1 base", + "inherits": "fdm_filament_pla", + "from": "system", + "filament_id": "GFPM018", + "instantiation": "false", + "filament_cost": [ + "32.99" + ], + "filament_density": [ + "1.34" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "filament_vendor": [ + "Polymaker" + ], + "hot_plate_temp": [ + "65" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "nozzle_temperature_range_low": [ + "210" + ], + "slow_down_layer_time": [ + "4" + ], + "temperature_vitrification": [ + "60" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @U1.json new file mode 100644 index 0000000000..554d1452be --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker HT-PLA-GF @U1.json @@ -0,0 +1,26 @@ +{ + "type": "filament", + "name": "Polymaker HT-PLA-GF @U1", + "inherits": "Polymaker HT-PLA-GF @U1 base", + "from": "system", + "setting_id": "GFSPM018_00", + "instantiation": "true", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "fan_max_speed": [ + "100" + ], + "fan_min_speed": [ + "100" + ], + "filament_flow_ratio": [ + "0.98" + ], + "filament_max_volumetric_speed": [ + "20" + ], + "slow_down_layer_time": [ + "4" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Base.json new file mode 100644 index 0000000000..04b25b012d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Base.json @@ -0,0 +1,29 @@ +{ + "filament_density": [ + "1.3" + ], + "temp_min": [ + "240" + ], + "temp_max": [ + "260" + ], + "temperture_vitrification": [ + "75" + ], + "idle_temperture": [ + "0" + ], + "filament_soluble": [ + "0" + ], + "description": "", + "inherits": "fdm_filament_petg", + "name": "Polymaker PETG @Base", + "type": "filament", + "instantiation": "false", + "from": "system", + "filament_vendor": [ + "Polymaker" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Snapmaker U1.json new file mode 100644 index 0000000000..c7559a65f7 --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PETG @Snapmaker U1.json @@ -0,0 +1,111 @@ +{ + "type": "filament", + "name": "Polymaker PETG @Snapmaker U1", + "from": "system", + "instantiation": "true", + "cool_plate_temp": [ + "60" + ], + "eng_plate_temp": [ + "0" + ], + "hot_plate_temp": [ + "80" + ], + "textured_plate_temp": [ + "80" + ], + "cool_plate_temp_initial_layer": [ + "60" + ], + "eng_plate_temp_initial_layer": [ + "0" + ], + "hot_plate_temp_initial_layer": [ + "80" + ], + "textured_plate_temp_initial_layer": [ + "80" + ], + "overhang_fan_threshold": [ + "95%" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_cost": [ + "0" + ], + "filament_diameter": [ + "1.75" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "bed_type": [ + "Cool Plate" + ], + "nozzle_temperature_initial_layer": [ + "260" + ], + "full_fan_speed_layer": [ + "0" + ], + "fan_max_speed": [ + "10" + ], + "fan_min_speed": [ + "50" + ], + "slow_down_min_speed": [ + "10" + ], + "slow_down_layer_time": [ + "6" + ], + "filament_start_gcode": [ + "; Filament gcode\n" + ], + "nozzle_temperature": [ + "260" + ], + "temperature_vitrification": [ + "71" + ], + "filament_id": "PMPE01", + "nozzle_temperature_range_high": [ + "260" + ], + "nozzle_temperature_range_low": [ + "240" + ], + "supertack_plate_temp": [ + "70" + ], + "supertack_plate_temp_initial_layer": [ + "70" + ], + "setting_id": "PMPE01_U1", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "inherits": "Polymaker PETG @Base" +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Base.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Base.json new file mode 100644 index 0000000000..d25cf0270d --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Base.json @@ -0,0 +1,29 @@ +{ + "filament_density": [ + "1.23" + ], + "temp_min": [ + "190" + ], + "temp_max": [ + "230" + ], + "temperture_vitrification": [ + "55" + ], + "idle_temperture": [ + "0" + ], + "filament_soluble": [ + "0" + ], + "description": "", + "inherits": "fdm_filament_pla", + "name": "Polymaker PLA Pro @Base", + "type": "filament", + "instantiation": "false", + "from": "system", + "filament_vendor": [ + "Polymaker" + ] +} \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Snapmaker U1.json b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Snapmaker U1.json new file mode 100644 index 0000000000..8b77ae186f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/Polymaker/Polymaker PLA Pro @Snapmaker U1.json @@ -0,0 +1,96 @@ +{ + "type": "filament", + "name": "Polymaker PLA Pro @Snapmaker U1", + "from": "system", + "instantiation": "true", + "cool_plate_temp": [ + "50" + ], + "eng_plate_temp": [ + "50" + ], + "hot_plate_temp": [ + "65" + ], + "textured_plate_temp": [ + "50" + ], + "cool_plate_temp_initial_layer": [ + "50" + ], + "eng_plate_temp_initial_layer": [ + "50" + ], + "hot_plate_temp_initial_layer": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "50" + ], + "overhang_fan_threshold": [ + "50%" + ], + "overhang_fan_speed": [ + "100" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "filament_end_gcode": [ + "; filament end gcode \n" + ], + "filament_flow_ratio": [ + "0.96" + ], + "filament_cost": [ + "0" + ], + "filament_diameter": [ + "1.75" + ], + "filament_max_volumetric_speed": [ + "15" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_vendor": [ + "Polymaker" + ], + "bed_type": [ + "Cool Plate" + ], + "full_fan_speed_layer": [ + "0" + ], + "fan_max_speed": [ + "100" + ], + "slow_down_min_speed": [ + "5" + ], + "slow_down_layer_time": [ + "6" + ], + "filament_start_gcode": [ + "; filament start gcode\n" + ], + "nozzle_temperature": [ + "220" + ], + "temperature_vitrification": [ + "61" + ], + "nozzle_temperature_range_high": [ + "230" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "setting_id": "PMPL03_U1", + "compatible_printers": [ + "Snapmaker U1 (0.4 nozzle)" + ], + "inherits": "Polymaker PLA Pro @Base", + "filament_id": "PMPL03" +} \ No newline at end of file diff --git a/resources/profiles/WonderMaker/WonderMaker ZR ULtra S_cover.png b/resources/profiles/WonderMaker/WonderMaker ZR Ultra S_cover.png similarity index 100% rename from resources/profiles/WonderMaker/WonderMaker ZR ULtra S_cover.png rename to resources/profiles/WonderMaker/WonderMaker ZR Ultra S_cover.png diff --git a/resources/profiles/iQ.json b/resources/profiles/iQ.json index 17d813bac9..c904ad1a1f 100644 --- a/resources/profiles/iQ.json +++ b/resources/profiles/iQ.json @@ -80,6 +80,10 @@ { "name": "0.20mm Standard @iQ TiQ2 P2 - PACF Pro Fiberthree + VXL90 Xioneer (0.4 Nozzle)", "sub_path": "process/0.20mm Standard @iQ TiQ2 P2 - PACF Pro Fiberthree + VXL90 Xioneer (0.4 Nozzle).json" + }, + { + "name": "0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)", + "sub_path": "process/0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle).json" } ], "filament_list": [ @@ -106,6 +110,10 @@ { "name": "VXL90 TiQ2 P2 @iQ TiQ2 0.4 Nozzle", "sub_path": "filament/VXL90 TiQ2 P2 @iQ TiQ2 0.4 Nozzle.json" + }, + { + "name": "Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle", + "sub_path": "filament/Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle.json" } ] } diff --git a/resources/profiles/iQ/filament/Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle.json b/resources/profiles/iQ/filament/Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle.json new file mode 100644 index 0000000000..20146fa309 --- /dev/null +++ b/resources/profiles/iQ/filament/Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle.json @@ -0,0 +1,303 @@ +{ + "type": "filament", + "name": "Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle", + "inherits": "fdm_filament_common", + "from": "system", + "setting_id": "IQS1", + "filament_id": "IQM1", + "instantiation": "true", + "compatible_prints": [ + "0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)" + ], + "filament_cost": [ + "70.58" + ], + "filament_density": [ + "1.09" + ], + "filament_end_gcode": [ + "; filament end gcode\n{if current_extruder==0}\nG1 Z{layer_z+2} F900 ; safe distance for T0 while tool change\nG1 X-17 Y1 F9000\nG1 X-17 Y45 F9000\nG1 Y1 F9000\nG1 Y45 F9000\n{endif}\n\n{if current_extruder==1}\n{if current_extruder==0}T1{endif}\nG1 X-23 Y3 F9000\nG1 Y45 F9000\nG1 Y3 F9000\nG1 Y45 F9000\n{endif}\n" + ], + "filament_flow_ratio": [ + "0.926" + ], + "filament_settings_id": [ + "Grauts HPP4GF25 P1 @iQ TiQ2 0.4 Nozzle" + ], + "filament_shrink": [ + "98.994%" + ], + "filament_shrinkage_compensation_z": [ + "99%" + ], + "filament_start_gcode": [ + "; Filament gcode\n{if current_extruder==0}\nG1 X-17 Y1 F9000\nG1 Y45 F9000\nG1 Y1 F9000\nG1 Y45 F9000\n{if layer_z==0}G1 Z{first_layer_height + 2.0}{endif}\n{if layer_z==0}G1 X[first_layer_print_min_0] Y[first_layer_print_min_1]{endif}\n{if layer_z==0}G1 Z{layer_z}{endif}\n{endif}\n\n{if current_extruder==1}\nG1 X-23 Y3 F9000\nG1 Y45 F9000\nG1 Y3 F9000\nG1 Y45 F9000\n{endif}\n" + ], + "filament_type": [ + "HPP4GF25" + ], + "hot_plate_temp": [ + "110" + ], + "hot_plate_temp_initial_layer": [ + "110" + ], + "idle_temperature": [ + "180" + ], + "is_custom_defined": "0", + "nozzle_temperature": [ + "220" + ], + "nozzle_temperature_initial_layer": [ + "220" + ], + "nozzle_temperature_range_high": [ + "280" + ], + "nozzle_temperature_range_low": [ + "220" + ], + "temperature_vitrification": [ + "127" + ], + "version": "2.3.1.10", + + + "activate_air_filtration": [ + "0" + ], + "activate_chamber_temp_control": [ + "0" + ], + "adaptive_pressure_advance": [ + "0" + ], + "adaptive_pressure_advance_bridges": [ + "0" + ], + "adaptive_pressure_advance_model": [ + "0,0,0\n0,0,0" + ], + "adaptive_pressure_advance_overhangs": [ + "0" + ], + "additional_cooling_fan_speed": [ + "0" + ], + "chamber_temperature": [ + "0" + ], + "close_fan_the_first_x_layers": [ + "3" + ], + "compatible_printers": [ + "iQ TiQ2 0.4 Nozzle" + ], + "compatible_printers_condition": "", + "compatible_prints_condition": "", + "complete_print_exhaust_fan_speed": [ + "80" + ], + "cool_plate_temp": [ + "105" + ], + "cool_plate_temp_initial_layer": [ + "105" + ], + "default_filament_colour": [ + "#000000" + ], + "dont_slow_down_outer_wall": [ + "0" + ], + "during_print_exhaust_fan_speed": [ + "60" + ], + "enable_overhang_bridge_fan": [ + "1" + ], + "enable_pressure_advance": [ + "0" + ], + "eng_plate_temp": [ + "105" + ], + "eng_plate_temp_initial_layer": [ + "105" + ], + "fan_cooling_layer_time": [ + "30" + ], + "fan_max_speed": [ + "80" + ], + "fan_min_speed": [ + "10" + ], + "filament_cooling_final_speed": [ + "3.5" + ], + "filament_cooling_initial_speed": [ + "10" + ], + "filament_cooling_moves": [ + "2" + ], + "filament_deretraction_speed": [ + "nil" + ], + "filament_diameter": [ + "1.75" + ], + "filament_is_support": [ + "0" + ], + "filament_loading_speed": [ + "10" + ], + "filament_loading_speed_start": [ + "50" + ], + "filament_long_retractions_when_cut": [ + "nil" + ], + "filament_max_volumetric_speed": [ + "12" + ], + "filament_minimal_purge_on_wipe_tower": [ + "15" + ], + "filament_multitool_ramming": [ + "1" + ], + "filament_multitool_ramming_flow": [ + "40" + ], + "filament_multitool_ramming_volume": [ + "10" + ], + "filament_notes": [ + "" + ], + "filament_ramming_parameters": [ + "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" + ], + "filament_retract_before_wipe": [ + "nil" + ], + "filament_retract_lift_above": [ + "nil" + ], + "filament_retract_lift_below": [ + "nil" + ], + "filament_retract_lift_enforce": [ + "nil" + ], + "filament_retract_restart_extra": [ + "nil" + ], + "filament_retract_when_changing_layer": [ + "nil" + ], + "filament_retraction_distances_when_cut": [ + "nil" + ], + "filament_retraction_length": [ + "4" + ], + "filament_retraction_minimum_travel": [ + "nil" + ], + "filament_retraction_speed": [ + "40" + ], + "filament_soluble": [ + "0" + ], + "filament_stamping_distance": [ + "45" + ], + "filament_stamping_loading_speed": [ + "29" + ], + "filament_toolchange_delay": [ + "0" + ], + "filament_unloading_speed": [ + "100" + ], + "filament_unloading_speed_start": [ + "100" + ], + "filament_vendor": [ + "iQ Materials" + ], + "filament_wipe": [ + "nil" + ], + "filament_wipe_distance": [ + "nil" + ], + "filament_z_hop": [ + "nil" + ], + "filament_z_hop_types": [ + "nil" + ], + "full_fan_speed_layer": [ + "0" + ], + "internal_bridge_fan_speed": [ + "-1" + ], + "overhang_fan_speed": [ + "80" + ], + "overhang_fan_threshold": [ + "25%" + ], + "pellet_flow_coefficient": [ + "0.4157" + ], + "pressure_advance": [ + "0.02" + ], + "reduce_fan_stop_start_freq": [ + "1" + ], + "required_nozzle_HRC": [ + "0" + ], + "slow_down_for_layer_cooling": [ + "1" + ], + "slow_down_layer_time": [ + "3" + ], + "slow_down_min_speed": [ + "10" + ], + "supertack_plate_temp": [ + "35" + ], + "supertack_plate_temp_initial_layer": [ + "35" + ], + "support_material_interface_fan_speed": [ + "-1" + ], + "textured_cool_plate_temp": [ + "40" + ], + "textured_cool_plate_temp_initial_layer": [ + "40" + ], + "textured_plate_temp": [ + "105" + ], + "textured_plate_temp_initial_layer": [ + "105" + ] +} diff --git a/resources/profiles/iQ/filament/Polymaker PETG Polymax black P1 @iQ TiQ2 0.4 Nozzle.json b/resources/profiles/iQ/filament/Polymaker PETG Polymax black P1 @iQ TiQ2 0.4 Nozzle.json index 457b37f8cd..054350acfc 100644 --- a/resources/profiles/iQ/filament/Polymaker PETG Polymax black P1 @iQ TiQ2 0.4 Nozzle.json +++ b/resources/profiles/iQ/filament/Polymaker PETG Polymax black P1 @iQ TiQ2 0.4 Nozzle.json @@ -30,9 +30,6 @@ "chamber_temperature": [ "0" ], - "close_fan_the_first_x_layers": [ - "3" - ], "compatible_printers": [ "iQ TiQ2 0.4 Nozzle" ], @@ -89,6 +86,9 @@ "filament_cooling_moves": [ "4" ], + "close_fan_the_first_x_layers": [ + "1000" + ], "filament_cost": [ "29.99" ], @@ -162,7 +162,7 @@ "nil" ], "filament_retraction_length": [ - "0.2" + "0.4" ], "filament_retraction_minimum_travel": [ "nil" @@ -222,7 +222,7 @@ "0" ], "hot_plate_temp": [ - "80" + "70" ], "hot_plate_temp_initial_layer": [ "80" @@ -237,7 +237,7 @@ "-1" ], "nozzle_temperature": [ - "250" + "240" ], "nozzle_temperature_initial_layer": [ "250" @@ -261,7 +261,7 @@ "0.02" ], "reduce_fan_stop_start_freq": [ - "1" + "0" ], "required_nozzle_HRC": [ "3" diff --git a/resources/profiles/iQ/process/0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle).json b/resources/profiles/iQ/process/0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle).json new file mode 100644 index 0000000000..0a542fe938 --- /dev/null +++ b/resources/profiles/iQ/process/0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle).json @@ -0,0 +1,70 @@ +{ + "type": "process", + "inherits": "fdm_process_tiq_common", + "from": "system", + "instantiation": "true", + "default_acceleration": "1500", + "enable_extra_bridge_layer": "apply_to_all", + "enable_prime_tower": "0", + "initial_layer_infill_speed": "100", + "inner_wall_acceleration": "1500", + "inner_wall_speed": "100", + "is_custom_defined": "0", + "name": "0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)", + "notes": "Pre-Select: FBA Time Delay: 0 EPC Factor: 0\n\nDeutsch P1 HPP4GF25\n\n1. Überprüfen Sie, dass sich das Grauts HPP4GF25 im linken Extruder befindet. Halten Sie das Filament trocken! Detailierte Trocknungsanleitung, siehe unten.\n\n2. Überprüfen Sie, dass sich eine 0,4 mm Wolfram-Kupfer Düse im linken Extruder befindet.\n\n3. Verwenden Sie Magigoo Kleber für PPGF auf der PET-Folie, um eine bessere Haftung zu gewährleisten, im Singledruck in der Regel auf PET-Folie nicht erforderlich.\n\n4. Reinigen Sie ggf. die Düse mit einer Messing-Drahtbürste.\nNun sind sie bereit, um Ihren Druck zu starten.\n\n\nTipp: Am besten lässt sich das Bauteil bei einer Druckplattentemperatur von 80°C entfernen, da dann der Kleber weich wird.\n\n\nEnglish P1 HPP4GF25\n\n1. Check Left extruder filament: Grauts HPP4GF25 - Keep the filament dry!! Detailed drying instruction below.\n\n2. Check left extruder nozzle: 0.4mm Wolfram\n\n3. Check bed: PET with Magigoo glue for PPGF\n\n4. Check nozzle: Clean it with brush\n\nWELLDONE! YOU ARE READY NOW TO START YOUR PRINT JOB!\n\n\nTip: The component is best removed at a printing plate temperature of 80°C, as this softens the adhesive.", + "outer_wall_acceleration": "1500", + "outer_wall_speed": "80", + "print_settings_id": "0.20mm Standard @iQ TiQ2 P1 - HPP4GF25 Grauts (0.4 Nozzle)", + "sparse_infill_speed": "100", + "support_angle": "0", + "support_base_pattern": "default", + "support_interface_bottom_layers": "0", + "support_interface_top_layers": "3", + "support_object_first_layer_gap": "0.3", + "support_object_xy_distance": "0.35", + "support_on_build_plate_only": "0", + "support_speed": "100", + "support_style": "snug", + "support_top_z_distance": "0.2", + "support_type": "normal(auto)", + "top_surface_acceleration": "1500", + "top_surface_speed": "80", + "travel_acceleration": "1500", + "version": "2.3.1.10", + + "bridge_flow": "1.07", + "bridge_speed": "25", + "brim_type": "no_brim", + "enable_support": "1", + "exclude_object": "0", + "gcode_label_objects": "0", + "compatible_printers": [ + "iQ TiQ2 0.4 Nozzle" + ], + "internal_bridge_speed": "50%", + "internal_solid_infill_speed": "60", + "ironing_pattern": "concentric", + "prime_tower_width": "80", + "layer_height": "0.2", + "reduce_crossing_wall": "1", + "skirt_height": "1", + "skirt_loops": "2", + "small_perimeter_speed": "30%", + "small_perimeter_threshold": "5", + "sparse_infill_density": "30%", + "sparse_infill_pattern": "triangles", + "support_base_pattern_spacing": "1", + "support_bottom_interface_spacing": "0.3", + "support_bottom_z_distance": "0.24", + "support_expansion": "0.5", + "support_filament": "1", + "support_interface_filament": "1", + "support_interface_pattern": "rectilinear_interlaced", + "support_interface_spacing": "0", + "top_shell_thickness": "0", + "top_solid_infill_flow_ratio": "0.98", + "tree_support_branch_diameter_angle": "10", + "tree_support_branch_diameter_organic": "3", + "tree_support_tip_diameter": "2", + "wall_loops": "2" +} diff --git a/resources/profiles/iQ/process/0.20mm Standard @iQ TiQ2 P1 - PETG Polymax Polymaker (0.4 Nozzle).json b/resources/profiles/iQ/process/0.20mm Standard @iQ TiQ2 P1 - PETG Polymax Polymaker (0.4 Nozzle).json index 096eb82e13..1093c7c1c7 100644 --- a/resources/profiles/iQ/process/0.20mm Standard @iQ TiQ2 P1 - PETG Polymax Polymaker (0.4 Nozzle).json +++ b/resources/profiles/iQ/process/0.20mm Standard @iQ TiQ2 P1 - PETG Polymax Polymaker (0.4 Nozzle).json @@ -20,6 +20,9 @@ "enable_overhang_speed": "0", "enable_prime_tower": "0", "gap_infill_speed": "50", + "thick_internal_bridges": "0", + "enable_extra_bridge_layer": "apply_to_all", + "bottom_shell_thickness": "0.8", "initial_layer_infill_speed": "25", "initial_layer_speed": "25", "initial_layer_travel_speed": "50%", @@ -63,10 +66,11 @@ "tree_support_wall_count": "2", "wall_direction": "ccw", "wall_loops": "3", - "wall_sequence": "inner-outer-inner wall", + "wall_sequence": "inner wall/outer wall", "support_base_pattern": "rectilinear-grid", "support_interface_pattern": "rectilinear_interlaced", "support_interface_spacing": "0", - "small_perimeter_speed": "30%", + "small_perimeter_speed": "50", + "support_interface_speed": "50", "brim_type": "no_brim" } \ No newline at end of file diff --git a/resources/web/flush/WipingDialog.html b/resources/web/flush/WipingDialog.html index efaea1c8ea..249ee03449 100644 --- a/resources/web/flush/WipingDialog.html +++ b/resources/web/flush/WipingDialog.html @@ -432,10 +432,11 @@ return (0.299 * r + 0.587 * g + 0.114 * b) / 255; } - function updateVolumeRange(min_volume,max_volume){ + // Orca: "Typical" guidance only unlinked from upper bound in the slicer. + const TYPICAL_MAX_FLUSH_VOLUME = 900; const panel = document.getElementById('volume_range_panel'); - panel.innerText = panel.innerText.replace(/\[.*\]/, `[${min_volume}, ${max_volume}]`); + panel.innerText = panel.innerText.replace(/\[.*\]/, `[${min_volume}, ${TYPICAL_MAX_FLUSH_VOLUME}]`); } function updateMultiplierRange(min_multiplier,max_multiplier){ diff --git a/scripts/flatpak/io.github.softfever.OrcaSlicer.metainfo.xml b/scripts/flatpak/io.github.softfever.OrcaSlicer.metainfo.xml index 96fd4c3ad7..c63f02d96b 100755 --- a/scripts/flatpak/io.github.softfever.OrcaSlicer.metainfo.xml +++ b/scripts/flatpak/io.github.softfever.OrcaSlicer.metainfo.xml @@ -11,7 +11,7 @@ Get even more perfect prints! SoftFever https://github.com/OrcaSlicer/OrcaSlicer - https://github.com/OrcaSlicer/OrcaSlicer/wiki + https://www.orcaslicer.com/wiki https://github.com/OrcaSlicer/OrcaSlicer/issues/ https://ko-fi.com/SoftFever 0BSD diff --git a/scripts/run_unit_tests.sh b/scripts/run_unit_tests.sh index 081467b300..292c6c9d3f 100755 --- a/scripts/run_unit_tests.sh +++ b/scripts/run_unit_tests.sh @@ -9,4 +9,4 @@ ROOT_DIR="$(dirname "$0")/.." cd "${ROOT_DIR}" || exit 1 -ctest --test-dir build/tests --output-junit "$(pwd)/ctest_results.xml" --output-on-failure -j +ctest --test-dir build/tests -L "Http|PlaceholderParser" --output-junit "$(pwd)/ctest_results.xml" --output-on-failure -j diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0e30500e42..a123be1fab 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,8 +6,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # Include dev-utils for encoding check and other utilities add_subdirectory(dev-utils) -# Clipper2 math utils -add_subdirectory(clipper2) # add_subdirectory(avrdude) # Note: semver and hints are now included from deps_src/CMakeLists.txt diff --git a/src/libslic3r/AppConfig.cpp b/src/libslic3r/AppConfig.cpp index f96d68cc10..c9ce68e3e0 100644 --- a/src/libslic3r/AppConfig.cpp +++ b/src/libslic3r/AppConfig.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -134,6 +135,25 @@ void AppConfig::set_defaults() if (!get("use_legacy_opengl").empty()) erase("app", "use_legacy_opengl"); + // Migrate legacy_networking boolean to network_plugin_version string + std::string legacy_networking = get("legacy_networking"); + std::string network_version = get("network_plugin_version"); + + if (!legacy_networking.empty()) { + // Old legacy_networking setting exists - migrate it + bool was_legacy = (legacy_networking == "true" || legacy_networking == "1"); + + if (was_legacy && network_version.empty()) { + // User had legacy mode enabled - set to legacy version number + BOOST_LOG_TRIVIAL(info) << "Migrating legacy_networking=true to network_plugin_version=01.10.01.01"; + set_network_plugin_version(BAMBU_NETWORK_AGENT_VERSION_LEGACY); + } + // Note: If was_legacy=false, we leave the version empty and let the GUI layer set it to the latest version + + // Remove the old setting + erase("app", "legacy_networking"); + } + #ifdef __APPLE__ if (get("use_retina_opengl").empty()) set_bool("use_retina_opengl", true); @@ -280,9 +300,6 @@ void AppConfig::set_defaults() if (get("allow_abnormal_storage").empty()) { set_bool("allow_abnormal_storage", false); } - if (get("legacy_networking").empty()) { - set_bool("legacy_networking", false); - } if(get("check_stable_update_only").empty()) { set_bool("check_stable_update_only", false); @@ -317,10 +334,18 @@ void AppConfig::set_defaults() set("auto_calculate_flush","all"); } + if (get("show_canvas_zoom_button").empty()) { + set_bool("show_canvas_zoom_button", true); + } + if (get("remember_printer_config").empty()) { set_bool("remember_printer_config", true); } + if (get("group_filament_presets").empty()) { + set("group_filament_presets", "1"); // All "0" / None "1" / By Type "2" / By Vendor "3" + } + if (get("enable_high_low_temp_mixed_printing").empty()){ set_bool("enable_high_low_temp_mixed_printing", false); } @@ -1435,6 +1460,82 @@ std::string AppConfig::get_nozzle_volume_types_from_config(const std::string& pr return nozzle_volume_types; } +std::string AppConfig::get_network_plugin_version() const +{ + return get(SETTING_NETWORK_PLUGIN_VERSION); +} + +void AppConfig::set_network_plugin_version(const std::string& version) +{ + set(SETTING_NETWORK_PLUGIN_VERSION, version); +} + +std::vector AppConfig::get_skipped_network_versions() const +{ + std::vector result; + std::string skipped = get(SETTING_NETWORK_PLUGIN_SKIPPED_VERSIONS); + if (skipped.empty()) + return result; + + std::stringstream ss(skipped); + std::string version; + while (std::getline(ss, version, ';')) { + if (!version.empty()) + result.push_back(version); + } + return result; +} + +void AppConfig::add_skipped_network_version(const std::string& version) +{ + auto skipped = get_skipped_network_versions(); + if (std::find(skipped.begin(), skipped.end(), version) == skipped.end()) { + skipped.push_back(version); + std::string joined; + for (size_t i = 0; i < skipped.size(); ++i) { + if (i > 0) joined += ";"; + joined += skipped[i]; + } + set(SETTING_NETWORK_PLUGIN_SKIPPED_VERSIONS, joined); + } +} + +bool AppConfig::is_network_version_skipped(const std::string& version) const +{ + auto skipped = get_skipped_network_versions(); + return std::find(skipped.begin(), skipped.end(), version) != skipped.end(); +} + +void AppConfig::clear_skipped_network_versions() +{ + set(SETTING_NETWORK_PLUGIN_SKIPPED_VERSIONS, ""); +} + +bool AppConfig::is_network_update_prompt_disabled() const +{ + return get_bool(SETTING_NETWORK_PLUGIN_UPDATE_DISABLED); +} + +void AppConfig::set_network_update_prompt_disabled(bool disabled) +{ + set_bool(SETTING_NETWORK_PLUGIN_UPDATE_DISABLED, disabled); +} + +bool AppConfig::should_remind_network_update_later() const +{ + return get_bool(SETTING_NETWORK_PLUGIN_REMIND_LATER); +} + +void AppConfig::set_remind_network_update_later(bool remind) +{ + set_bool(SETTING_NETWORK_PLUGIN_REMIND_LATER, remind); +} + +void AppConfig::clear_remind_network_update_later() +{ + set_bool(SETTING_NETWORK_PLUGIN_REMIND_LATER, false); +} + void AppConfig::reset_selections() { auto it = m_storage.find("presets"); diff --git a/src/libslic3r/AppConfig.hpp b/src/libslic3r/AppConfig.hpp index 9307877552..b521410ce9 100644 --- a/src/libslic3r/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -24,6 +24,12 @@ using namespace nlohmann; #define OPTION_PROJECT_LOAD_BEHAVIOUR_ALWAYS_ASK "always_ask" #define OPTION_PROJECT_LOAD_BEHAVIOUR_LOAD_GEOMETRY "load_geometry_only" +#define SETTING_NETWORK_PLUGIN_VERSION "network_plugin_version" +#define SETTING_NETWORK_PLUGIN_SKIPPED_VERSIONS "network_plugin_skipped_versions" +#define SETTING_NETWORK_PLUGIN_UPDATE_DISABLED "network_plugin_update_prompts_disabled" +#define SETTING_NETWORK_PLUGIN_REMIND_LATER "network_plugin_remind_later" +#define BAMBU_NETWORK_AGENT_VERSION_LEGACY "01.10.01.01" + #define SUPPORT_DARK_MODE //#define _MSW_DARK_MODE @@ -347,6 +353,21 @@ public: static const std::string SECTION_MATERIALS; static const std::string SECTION_EMBOSS_STYLE; + std::string get_network_plugin_version() const; + void set_network_plugin_version(const std::string& version); + + std::vector get_skipped_network_versions() const; + void add_skipped_network_version(const std::string& version); + bool is_network_version_skipped(const std::string& version) const; + void clear_skipped_network_versions(); + + bool is_network_update_prompt_disabled() const; + void set_network_update_prompt_disabled(bool disabled); + + bool should_remind_network_update_later() const; + void set_remind_network_update_later(bool remind); + void clear_remind_network_update_later(); + private: template bool get_3dmouse_device_numeric_value(const std::string &device_name, const char *parameter_name, T &out) const diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index d21ed2e544..35d971a465 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -1,5 +1,3 @@ -#include "clipper/clipper_z.hpp" - #include "ClipperUtils.hpp" #include "EdgeGrid.hpp" #include "Layer.hpp" @@ -10,8 +8,8 @@ #include "MaterialType.hpp" #include "Model.hpp" #include -#include -#include +#include +#include #include #include @@ -54,16 +52,63 @@ static void append_and_translate(Polygons &dst, const Polygons &src, const Print dst[dst_idx].translate(instance_shift); } -static float max_brim_width(const ConstPrintObjectPtrsAdaptor &objects) +//ORCA: Brim can follow the post-EFC outline when enabled. +static bool use_brim_efc_outline(const PrintObject &object) { - assert(!objects.empty()); - return float(std::accumulate(objects.begin(), objects.end(), 0., - [](double partial_result, const PrintObject *object) { - return std::max(partial_result, object->config().brim_type == btNoBrim ? 0. : object->config().brim_width.value); - })); + return object.config().brim_use_efc_outline.value + && object.config().elefant_foot_compensation.value > 0. + && object.config().elefant_foot_compensation_layers.value > 0 + && object.config().raft_layers.value == 0; } -// Returns ExPolygons of the bottom layer of the print object after elephant foot compensation. +//ORCA: Helper for snapping painted ears to the EFC outline. +static bool closest_point_on_expolygons(const ExPolygons &polygons, const Point &from, Point &closest_out) +{ + double min_dist2 = std::numeric_limits::max(); + bool found = false; + + for (const ExPolygon &poly : polygons) { + for (int i = 0; i < poly.num_contours(); ++i) { + const Point *candidate = poly.contour_or_hole(i).closest_point(from); + if (candidate == nullptr) + continue; + const int64_t dx = int64_t(candidate->x()) - int64_t(from.x()); + const int64_t dy = int64_t(candidate->y()) - int64_t(from.y()); + const double dist2 = double(dx * dx + dy * dy); + if (dist2 < min_dist2) { + min_dist2 = dist2; + closest_out = *candidate; + found = true; + } + } + } + return found; +} + +//ORCA: Helper for matching painted ears to their original island before EFC snapping. +static int find_containing_expolygon_index(const ExPolygons &polygons, const Point &from) +{ + for (size_t idx = 0; idx < polygons.size(); ++idx) { + if (polygons[idx].contains(from)) + return int(idx); + } + return -1; +} + +//ORCA: Keep painted ear snapping on the matching island when using EFC outline. +static bool closest_point_on_matching_island(const ExPolygons &raw_outline, const ExPolygons &efc_outline, const Point &from, Point &closest_out) +{ + const int island_idx = find_containing_expolygon_index(raw_outline, from); + if (island_idx >= 0) { + ExPolygons island_outline = intersection_ex(efc_outline, raw_outline[island_idx]); + if (!island_outline.empty()) + return closest_point_on_expolygons(island_outline, from, closest_out); + } + return closest_point_on_expolygons(efc_outline, from, closest_out); +} +//ORCA: Use post-processed first-layer slices (including EFC) for brim outline. +// Returns ExPolygons of the bottom layer after all first-layer modifiers +// (including elephant foot compensation, if enabled) have been applied. static ExPolygons get_print_object_bottom_layer_expolygons(const PrintObject &print_object) { ExPolygons ex_polygons; @@ -71,506 +116,6 @@ static ExPolygons get_print_object_bottom_layer_expolygons(const PrintObject &pr Slic3r::append(ex_polygons, closing_ex(region->slices.surfaces, float(SCALED_EPSILON))); return ex_polygons; } - -// Returns ExPolygons of bottom layer for every print object in Print after elephant foot compensation. -static std::vector get_print_bottom_layers_expolygons(const Print &print) -{ - std::vector bottom_layers_expolygons; - bottom_layers_expolygons.reserve(print.objects().size()); - for (const PrintObject *object : print.objects()) - bottom_layers_expolygons.emplace_back(get_print_object_bottom_layer_expolygons(*object)); - - return bottom_layers_expolygons; -} - -static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print, const std::vector &bottom_layers_expolygons) -{ - assert(print.objects().size() == bottom_layers_expolygons.size()); - Polygons islands; - ConstPrintObjectPtrs island_to_object; - for(size_t print_object_idx = 0; print_object_idx < print.objects().size(); ++print_object_idx) { - const PrintObject *object = print.objects()[print_object_idx]; - Polygons islands_object; - islands_object.reserve(bottom_layers_expolygons[print_object_idx].size()); - for (const ExPolygon &ex_poly : bottom_layers_expolygons[print_object_idx]) - islands_object.emplace_back(ex_poly.contour); - - islands.reserve(islands.size() + object->instances().size() * islands_object.size()); - for (const PrintInstance& instance : object->instances()) { - Point instance_shift = instance.shift_without_plate_offset(); - for (Polygon& poly : islands_object) { - islands.emplace_back(poly); - islands.back().translate(instance_shift); - island_to_object.emplace_back(object); - } - } - } - assert(islands.size() == island_to_object.size()); - - ClipperLib_Z::Paths islands_clip; - islands_clip.reserve(islands.size()); - for (const Polygon &poly : islands) { - islands_clip.emplace_back(); - ClipperLib_Z::Path &island_clip = islands_clip.back(); - island_clip.reserve(poly.points.size()); - int island_idx = int(&poly - &islands.front()); - // The Z coordinate carries index of the island used to get the pointer to the object. - for (const Point &pt : poly.points) - island_clip.emplace_back(pt.x(), pt.y(), island_idx + 1); - } - - // Init Clipper - ClipperLib_Z::Clipper clipper; - // Assign the maximum Z from four points. This values is valid index of the island - clipper.ZFillFunction([](const ClipperLib_Z::IntPoint &e1bot, const ClipperLib_Z::IntPoint &e1top, const ClipperLib_Z::IntPoint &e2bot, - const ClipperLib_Z::IntPoint &e2top, ClipperLib_Z::IntPoint &pt) { - pt.z() = std::max(std::max(e1bot.z(), e1top.z()), std::max(e2bot.z(), e2top.z())); - }); - // Add islands - clipper.AddPaths(islands_clip, ClipperLib_Z::ptSubject, true); - // Execute union operation to construct polytree - ClipperLib_Z::PolyTree islands_polytree; - //FIXME likely pftNonZero or ptfPositive would be better. Why are we using ptfEvenOdd for Unions? - clipper.Execute(ClipperLib_Z::ctUnion, islands_polytree, ClipperLib_Z::pftEvenOdd, ClipperLib_Z::pftEvenOdd); - - std::unordered_set processed_objects_idx; - ConstPrintObjectPtrs top_level_objects_with_brim; - for (int i = 0; i < islands_polytree.ChildCount(); ++i) { - for (const ClipperLib_Z::IntPoint &point : islands_polytree.Childs[i]->Contour) { - if (point.z() != 0 && processed_objects_idx.find(island_to_object[point.z() - 1]->id().id) == processed_objects_idx.end()) { - top_level_objects_with_brim.emplace_back(island_to_object[point.z() - 1]); - processed_objects_idx.insert(island_to_object[point.z() - 1]->id().id); - } - } - } - return top_level_objects_with_brim; -} - -static Polygons top_level_outer_brim_islands(const ConstPrintObjectPtrs &top_level_objects_with_brim, const double scaled_resolution) -{ - Polygons islands; - for (const PrintObject *object : top_level_objects_with_brim) { - if (!object->has_brim()) - continue; - - //FIXME how about the brim type? - auto brim_object_gap = float(scale_(object->config().brim_object_gap.value)); - Polygons islands_object; - for (const ExPolygon &ex_poly : get_print_object_bottom_layer_expolygons(*object)) { - Polygons contour_offset = offset(ex_poly.contour, brim_object_gap, ClipperLib::jtSquare); - for (Polygon &poly : contour_offset) - poly.douglas_peucker(scaled_resolution); - - polygons_append(islands_object, std::move(contour_offset)); - } - - if (!object->support_layers().empty()) { - for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) { - Polygons contour_offset = offset(support_contour, brim_object_gap, ClipperLib::jtSquare); - for (Polygon& poly : contour_offset) - poly.douglas_peucker(scaled_resolution); - - polygons_append(islands_object, std::move(contour_offset)); - } - } - - for (const PrintInstance &instance : object->instances()) - append_and_translate(islands, islands_object, instance); - } - return islands; -} - -static ExPolygons top_level_outer_brim_area(const Print &print, - const ConstPrintObjectPtrs &top_level_objects_with_brim, - const std::vector &bottom_layers_expolygons, - const float no_brim_offset, - // BBS - double& brim_width_max, - std::map& brim_width_map) -{ - const auto scaled_resolution = scaled(print.config().resolution.value); - - assert(print.objects().size() == bottom_layers_expolygons.size()); - std::unordered_set top_level_objects_idx; - top_level_objects_idx.reserve(top_level_objects_with_brim.size()); - for (const PrintObject *object : top_level_objects_with_brim) - top_level_objects_idx.insert(object->id().id); - - ExPolygons brim_area; - ExPolygons no_brim_area; - brim_width_max = 0; - for(size_t print_object_idx = 0; print_object_idx < print.objects().size(); ++print_object_idx) { - const PrintObject *object = print.objects()[print_object_idx]; - const BrimType brim_type = object->config().brim_type.value; - const float brim_object_gap = scale_(object->config().brim_object_gap.value); - // recording the autoAssigned brimWidth and corresponding objs - double brimWidthAuto = object->config().brim_width.value; - double flowWidth = print.brim_flow().scaled_spacing() * SCALING_FACTOR; - brimWidthAuto = floor(brimWidthAuto / flowWidth / 2) * flowWidth * 2; - brim_width_map.insert(std::make_pair(object->id(), brimWidthAuto)); - brim_width_max = std::max(brim_width_max, brimWidthAuto); - const float brim_width = scale_(brimWidthAuto); - const bool is_top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); - - ExPolygons brim_area_object; - ExPolygons no_brim_area_object; - for (const ExPolygon &ex_poly : bottom_layers_expolygons[print_object_idx]) { - if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) && is_top_outer_brim) - append(brim_area_object, diff_ex(offset(ex_poly.contour, brim_width + brim_object_gap, ClipperLib::jtRound, scaled_resolution), offset(ex_poly.contour, brim_object_gap, ClipperLib::jtSquare))); - - // After 7ff76d07684858fd937ef2f5d863f105a10f798e offset and shrink don't work with CW polygons (holes), so let's make it CCW. - Polygons ex_poly_holes_reversed = ex_poly.holes; - polygons_reverse(ex_poly_holes_reversed); - if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, shrink_ex(ex_poly_holes_reversed, no_brim_offset, ClipperLib::jtSquare)); - - if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset, ClipperLib::jtSquare), ex_poly_holes_reversed)); - - if (brim_type != BrimType::btNoBrim) - append(no_brim_area_object, offset_ex(ExPolygon(ex_poly.contour), brim_object_gap, ClipperLib::jtSquare)); - - no_brim_area_object.emplace_back(ex_poly.contour); - } - - if (!object->support_layers().empty()) { - for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) { - if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) && is_top_outer_brim) - append(brim_area_object, diff_ex(offset(support_contour, brim_width + brim_object_gap, ClipperLib::jtRound, scaled_resolution), offset(support_contour, brim_object_gap))); - - if (brim_type != BrimType::btNoBrim) - append(no_brim_area_object, offset_ex(ExPolygon(support_contour), brim_object_gap)); - - no_brim_area_object.emplace_back(support_contour); - } - } - - for (const PrintInstance &instance : object->instances()) { - append_and_translate(brim_area, brim_area_object, instance); - append_and_translate(no_brim_area, no_brim_area_object, instance); - } - } - - return diff_ex(brim_area, no_brim_area); -} - -// BBS: the brims of different objs will not overlapped with each other, and are stored by objs and by extruders -static ExPolygons top_level_outer_brim_area(const Print& print, const ConstPrintObjectPtrs& top_level_objects_with_brim, - const float no_brim_offset, double& brim_width_max, std::map& brim_width_map, - std::map& brimAreaMap, - std::map& supportBrimAreaMap, std::vector>& objPrintVec) -{ - std::unordered_set top_level_objects_idx; - top_level_objects_idx.reserve(top_level_objects_with_brim.size()); - for (const PrintObject* object : top_level_objects_with_brim) - top_level_objects_idx.insert(object->id().id); - - unsigned int support_material_extruder = 1; - if (print.has_support_material()) { - assert(top_level_objects_with_brim.front()->config().support_filament >= 0); - if (top_level_objects_with_brim.front()->config().support_filament > 0) - support_material_extruder = top_level_objects_with_brim.front()->config().support_filament; - } - - ExPolygons brim_area; - ExPolygons no_brim_area; - brim_width_max = 0; - struct brimWritten { - bool obj; - bool sup; - }; - std::map brimToWrite; - for (const auto& objectWithExtruder : objPrintVec) - brimToWrite.insert({ objectWithExtruder.first, {true,true} }); - - for (unsigned int extruderNo : print.extruders()) { - ++extruderNo; - for (const auto &objectWithExtruder : objPrintVec) { - const PrintObject* object = print.get_object(objectWithExtruder.first); - const BrimType brim_type = object->config().brim_type.value; - const float brim_offset = scale_(object->config().brim_object_gap.value); - // recording the autoAssigned brimWidth and corresponding objs - double brimWidthAuto = object->config().brim_width.value; - double flowWidth = print.brim_flow().scaled_spacing() * SCALING_FACTOR; - brimWidthAuto = floor(brimWidthAuto / flowWidth / 2) * flowWidth * 2; - brim_width_map.insert(std::make_pair(object->id(), brimWidthAuto)); - brim_width_max = std::max(brim_width_max, brimWidthAuto); - const float brim_width = scale_(brimWidthAuto); - const bool is_top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); - - ExPolygons nullBrim; - brimAreaMap.insert(std::make_pair(object->id(), nullBrim)); - ExPolygons brim_area_object; - ExPolygons brim_area_support; - ExPolygons no_brim_area_object; - ExPolygons no_brim_area_support; - if (objectWithExtruder.second == extruderNo && brimToWrite.at(object->id()).obj) { - for (const ExPolygon& ex_poly : object->layers().front()->lslices) { - if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) && is_top_outer_brim) { - append(brim_area_object, diff_ex(offset_ex(ex_poly.contour, brim_width + brim_offset, jtRound, SCALED_RESOLUTION), - offset_ex(ex_poly.contour, brim_offset))); - } - if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, offset_ex(ex_poly.holes, -no_brim_offset)); - - if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset), ex_poly.holes)); - - if (brim_type != BrimType::btNoBrim) - append(no_brim_area_object, offset_ex(ExPolygon(ex_poly.contour), brim_offset)); - - no_brim_area_object.emplace_back(ex_poly.contour); - } - brimToWrite.at(object->id()).obj = false; - for (const PrintInstance& instance : object->instances()) { - if (!brim_area_object.empty()) - append_and_translate(brim_area, brim_area_object, instance, print, brimAreaMap); - append_and_translate(no_brim_area, no_brim_area_object, instance); - } - if (brimAreaMap.find(object->id()) != brimAreaMap.end()) - expolygons_append(brim_area, brimAreaMap[object->id()]); - } - if (support_material_extruder == extruderNo && brimToWrite.at(object->id()).sup) { - if (!object->support_layers().empty()) { - for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) { - //BBS: no brim offset for supports - if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) && is_top_outer_brim) - append(brim_area_support, diff_ex(offset(support_contour, brim_width, jtRound, SCALED_RESOLUTION), offset(support_contour, 0))); - - if (brim_type != BrimType::btNoBrim) - append(no_brim_area_support, offset_ex(support_contour, 0)); - - no_brim_area_support.emplace_back(support_contour); - } - } - - brimToWrite.at(object->id()).sup = false; - for (const PrintInstance& instance : object->instances()) { - if (!brim_area_support.empty()) - append_and_translate(brim_area, brim_area_support, instance, print, supportBrimAreaMap); - append_and_translate(no_brim_area, no_brim_area_support, instance); - } - if (supportBrimAreaMap.find(object->id()) != supportBrimAreaMap.end()) - expolygons_append(brim_area, supportBrimAreaMap[object->id()]); - } - } - } - for (const PrintObject* object : print.objects()) { - if (brimAreaMap.find(object->id()) != brimAreaMap.end()) - brimAreaMap[object->id()] = diff_ex(brimAreaMap[object->id()], no_brim_area); - if (supportBrimAreaMap.find(object->id()) != supportBrimAreaMap.end()) - supportBrimAreaMap[object->id()] = diff_ex(supportBrimAreaMap[object->id()], no_brim_area); - } - return diff_ex(std::move(brim_area), no_brim_area); -} -static ExPolygons inner_brim_area(const Print &print, - const ConstPrintObjectPtrs &top_level_objects_with_brim, - const std::vector &bottom_layers_expolygons, - const float no_brim_offset) -{ - assert(print.objects().size() == bottom_layers_expolygons.size()); - std::unordered_set top_level_objects_idx; - top_level_objects_idx.reserve(top_level_objects_with_brim.size()); - for (const PrintObject *object : top_level_objects_with_brim) - top_level_objects_idx.insert(object->id().id); - - ExPolygons brim_area; - ExPolygons no_brim_area; - Polygons holes; - for(size_t print_object_idx = 0; print_object_idx < print.objects().size(); ++print_object_idx) { - const PrintObject *object = print.objects()[print_object_idx]; - const BrimType brim_type = object->config().brim_type.value; - const float brim_object_gap = scale_(object->config().brim_object_gap.value); - double flowWidth = print.brim_flow().scaled_spacing() * SCALING_FACTOR; - const float brim_width = scale_(floor(object->config().brim_width.value / flowWidth / 2) * flowWidth * 2); - const bool top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); - - ExPolygons brim_area_object; - ExPolygons no_brim_area_object; - Polygons holes_object; - for (const ExPolygon &ex_poly : bottom_layers_expolygons[print_object_idx]) { - if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) { - if (top_outer_brim) - no_brim_area_object.emplace_back(ex_poly); - else - append(brim_area_object, diff_ex(offset(ex_poly.contour, brim_width + brim_object_gap, ClipperLib::jtSquare), offset(ex_poly.contour, brim_object_gap, ClipperLib::jtSquare))); - } - - // After 7ff76d07684858fd937ef2f5d863f105a10f798e offset and shrink don't work with CW polygons (holes), so let's make it CCW. - Polygons ex_poly_holes_reversed = ex_poly.holes; - polygons_reverse(ex_poly_holes_reversed); - if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) - append(brim_area_object, diff_ex(shrink_ex(ex_poly_holes_reversed, brim_object_gap, ClipperLib::jtSquare), shrink_ex(ex_poly_holes_reversed, brim_width + brim_object_gap, ClipperLib::jtSquare))); - - if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset, ClipperLib::jtSquare), ex_poly_holes_reversed)); - - if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, diff_ex(ExPolygon(ex_poly.contour), shrink_ex(ex_poly_holes_reversed, no_brim_offset, ClipperLib::jtSquare))); - - append(holes_object, ex_poly_holes_reversed); - } - append(no_brim_area_object, offset_ex(bottom_layers_expolygons[print_object_idx], brim_object_gap, ClipperLib::jtSquare)); - - for (const PrintInstance &instance : object->instances()) { - append_and_translate(brim_area, brim_area_object, instance); - append_and_translate(no_brim_area, no_brim_area_object, instance); - append_and_translate(holes, holes_object, instance); - } - } - - return diff_ex(intersection_ex(to_polygons(std::move(brim_area)), holes), no_brim_area); -} - -// BBS: the brims of different objs will not overlapped with each other, and are stored by objs and by extruders -static ExPolygons inner_brim_area(const Print& print, const ConstPrintObjectPtrs& top_level_objects_with_brim, - const float no_brim_offset, std::map& brimAreaMap, - std::map& supportBrimAreaMap, - std::vector>& objPrintVec) -{ - std::unordered_set top_level_objects_idx; - top_level_objects_idx.reserve(top_level_objects_with_brim.size()); - for (const PrintObject* object : top_level_objects_with_brim) - top_level_objects_idx.insert(object->id().id); - - unsigned int support_material_extruder = 1; - if (print.has_support_material()) { - assert(top_level_objects_with_brim.front()->config().support_filament >= 0); - if (top_level_objects_with_brim.front()->config().support_filament > 0) - support_material_extruder = top_level_objects_with_brim.front()->config().support_filament; - } - - ExPolygons brim_area; - ExPolygons no_brim_area; - Polygons holes; - Polygon bedShape(get_bed_shape(print.config())); - holes.emplace_back(get_bed_shape(print.config())); - std::map innerBrimAreaMap; - std::map innerSupportBrimAreaMap; - - struct brimWritten { - bool obj; - bool sup; - }; - std::map brimToWrite; - for (const auto& objectWithExtruder : objPrintVec) - brimToWrite.insert({ objectWithExtruder.first, {true,true} }); - - - for (unsigned int extruderNo : print.extruders()) { - ++extruderNo; - for (const auto& objectWithExtruder : objPrintVec) { - const PrintObject* object = print.get_object(objectWithExtruder.first); - const BrimType brim_type = object->config().brim_type.value; - const float brim_offset = scale_(object->config().brim_object_gap.value); - double flowWidth = print.brim_flow().scaled_spacing() * SCALING_FACTOR; - const float brim_width = scale_(floor(object->config().brim_width.value / flowWidth / 2) * flowWidth * 2); - const bool top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end(); - - ExPolygons brim_area_object; - ExPolygons no_brim_area_object; - ExPolygons brim_area_support; - ExPolygons no_brim_area_support; - Polygons holes_object; - Polygons holes_support; - if (objectWithExtruder.second == extruderNo && brimToWrite.at(object->id()).obj) { - for (const ExPolygon& ex_poly : object->layers().front()->lslices) { - if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) { - if (top_outer_brim) - no_brim_area_object.emplace_back(ex_poly); - else - append(brim_area_object, diff_ex(offset_ex(ex_poly.contour, brim_width + brim_offset, jtRound, SCALED_RESOLUTION), offset_ex(ex_poly.contour, brim_offset))); - } - if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btOuterAndInner) - append(brim_area_object, diff_ex(offset_ex(ex_poly.holes, -brim_offset), offset_ex(ex_poly.holes, -brim_width - brim_offset))); - if (brim_type == BrimType::btInnerOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset), ex_poly.holes)); - if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btNoBrim) - append(no_brim_area_object, offset_ex(ex_poly.holes, -no_brim_offset)); - append(holes_object, ex_poly.holes); - } - append(no_brim_area_object, offset_ex(object->layers().front()->lslices, brim_offset)); - brimToWrite.at(object->id()).obj = false; - for (const PrintInstance& instance : object->instances()) { - if (!brim_area_object.empty()) - append_and_translate(brim_area, brim_area_object, instance, print, innerBrimAreaMap); - append_and_translate(no_brim_area, no_brim_area_object, instance); - append_and_translate(holes, holes_object, instance); - } - if (innerBrimAreaMap.find(object->id()) != innerBrimAreaMap.end()) - expolygons_append(brim_area, innerBrimAreaMap[object->id()]); - } - if (support_material_extruder == extruderNo && brimToWrite.at(object->id()).sup) { - if (!object->support_layers().empty()) { - for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) { - if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner || brim_type == BrimType::btAutoBrim) { - if (!top_outer_brim) - append(brim_area_support, diff_ex(offset_ex(support_contour, brim_width + brim_offset, jtRound, SCALED_RESOLUTION), offset_ex(support_contour, brim_offset))); - } - if (brim_type != BrimType::btNoBrim) - append(no_brim_area_support, offset_ex(support_contour, 0)); - no_brim_area_support.emplace_back(support_contour); - } - } - } - brimToWrite.at(object->id()).sup = false; - for (const PrintInstance& instance : object->instances()) { - if (!brim_area_support.empty()) - append_and_translate(brim_area, brim_area_support, instance, print, innerSupportBrimAreaMap); - append_and_translate(no_brim_area, no_brim_area_support, instance); - append_and_translate(holes, holes_support, instance); - } - if (innerSupportBrimAreaMap.find(object->id()) != innerSupportBrimAreaMap.end()) - expolygons_append(brim_area, innerSupportBrimAreaMap[object->id()]); - } - } - for (const PrintObject* object : print.objects()) { - if (innerBrimAreaMap.find(object->id()) != innerBrimAreaMap.end()) { - innerBrimAreaMap[object->id()] = intersection_ex(to_polygons(innerBrimAreaMap[object->id()]), holes); - append(brimAreaMap[object->id()], innerBrimAreaMap[object->id()]); - } - if (innerSupportBrimAreaMap.find(object->id()) != innerSupportBrimAreaMap.end()) { - innerSupportBrimAreaMap[object->id()] = intersection_ex(to_polygons(innerSupportBrimAreaMap[object->id()]), holes); - append(supportBrimAreaMap[object->id()], innerSupportBrimAreaMap[object->id()]); - } - } - for (const PrintObject* object : print.objects()) { - if (brimAreaMap.find(object->id()) != brimAreaMap.end()) - brimAreaMap[object->id()] = diff_ex(brimAreaMap[object->id()], no_brim_area); - if (supportBrimAreaMap.find(object->id()) != supportBrimAreaMap.end()) - supportBrimAreaMap[object->id()] = diff_ex(supportBrimAreaMap[object->id()], no_brim_area); - } - brim_area = intersection_ex(to_polygons(brim_area), holes); - append(no_brim_area, brim_area); - return no_brim_area; -} - -//BBS maximum temperature difference from print object class -double getTemperatureFromExtruder(const PrintObject* printObject) { - auto print = printObject->print(); - std::vector extrudersFirstLayer; - auto firstLayerRegions = printObject->layers().front()->regions(); - if (!firstLayerRegions.empty()) { - for (const LayerRegion* regionPtr : firstLayerRegions) { - if (regionPtr->has_extrusions()) - extrudersFirstLayer.push_back(regionPtr->region().extruder(frExternalPerimeter)); - } - } - - const PrintConfig& config = print->config(); - int curr_bed_type = config.option("curr_bed_type")->getInt(); - const ConfigOptionInts* bed_temp_1st_layer_opt = config.option(get_bed_temp_1st_layer_key((BedType)curr_bed_type)); - - double maxDeltaTemp = 0; - for (auto extruderID : extrudersFirstLayer) { - int bedTemp = bed_temp_1st_layer_opt->get_at(extruderID - 1); - if (bedTemp > maxDeltaTemp) - maxDeltaTemp = bedTemp; - } - - return maxDeltaTemp; -} //BBS adhesion coefficients from print object class double getadhesionCoeff(const PrintObject* printObject) { @@ -711,50 +256,6 @@ bool compSecondMoment(const ExPolygons& expolys, double& smExpolysX, double& smE return true; } - - - -//BBS: config brimwidth by volumes -double configBrimWidthByVolumes(double deltaT, double adhesion, double maxSpeed, const ModelVolume* modelVolumePtr, const ExPolygons& expolys) -{ - // height of a volume - double height = 0; - if (modelVolumePtr->is_model_part()) { - auto rawBoundingbox = modelVolumePtr->mesh().transformed_bounding_box(modelVolumePtr->get_matrix()); - auto bbox = modelVolumePtr->get_object()->instances.front()->transform_bounding_box(rawBoundingbox); - auto bbox_size = bbox.size(); - height = bbox_size(2); - } - - // sencond moment of the expolygons of the first layer of the volume - double Ixx = -1.e30, Iyy = -1.e30; - if (!expolys.empty()) { - if (!compSecondMoment(expolys, Ixx, Iyy)) - Ixx = Iyy = -1.e30; - } - Ixx = Ixx * SCALING_FACTOR * SCALING_FACTOR * SCALING_FACTOR * SCALING_FACTOR; - Iyy = Iyy * SCALING_FACTOR * SCALING_FACTOR * SCALING_FACTOR * SCALING_FACTOR; - - // bounding box of the expolygons of the first layer of the volume - BoundingBox bbox2; - for (const auto& expoly : expolys) - bbox2.merge(get_extents(expoly.contour)); - const double& bboxX = bbox2.size()(0); - const double& bboxY = bbox2.size()(1); - double thermalLength = sqrt(bboxX * bboxX + bboxY * bboxY) * SCALING_FACTOR; - double thermalLengthRef = Model::getThermalLength(modelVolumePtr); - - double height_to_area = std::max(height / Ixx * (bbox2.size()(1) * SCALING_FACTOR), height / Iyy * (bbox2.size()(0) * SCALING_FACTOR)); - double brim_width = adhesion * std::min(std::min(std::max(height_to_area * maxSpeed / 24, thermalLength * 8. / thermalLengthRef * std::min(height, 30.) / 30.), 18.), 1.5 * thermalLength); - // small brims are omitted - if (brim_width < 5 && brim_width < 1.5 * thermalLength) - brim_width = 0; - // large brims are omitted - if (brim_width > 18) brim_width = 18.; - - return brim_width; -} - //BBS: config brimwidth by group of volumes double configBrimWidthByVolumeGroups(double adhesion, double maxSpeed, const std::vector modelVolumePtrs, const ExPolygons& expolys, double &groupHeight) { @@ -857,6 +358,14 @@ static ExPolygons make_brim_ears(const PrintObject* object, const double& flowWi if (brim_ear_points.size() <= 0) { return mouse_ears_ex; } + //ORCA: Painted ears can snap to the EFC-adjusted outline when enabled. + const bool use_efc_outline = use_brim_efc_outline(*object); + const ExPolygons &raw_outline = object->layers().front()->lslices; + //ORCA: Lazily computed EFC-adjusted bottom outline. + //Stored separately so we can avoid recomputation unless EFC snapping is used. + ExPolygons efc_outline_storage; + const ExPolygons* efc_outline = nullptr; + const Geometry::Transformation& trsf = object->model_object()->instances[0]->get_transformation(); Transform3d model_trsf = trsf.get_matrix_no_offset(); const Point ¢er_offset = object->center_offset(); @@ -880,6 +389,29 @@ static ExPolygons make_brim_ears(const PrintObject* object, const double& flowWi Vec3f pos = pt.transform(model_trsf); int32_t pt_x = scale_(pos.x()); int32_t pt_y = scale_(pos.y()); + + //ORCA: Snap painted ears to the EFC-adjusted outline when enabled. + if (use_efc_outline) { + if (efc_outline == nullptr) { + //ORCA: Compute EFC-adjusted outline lazily for painted ear snapping. + efc_outline_storage = get_print_object_bottom_layer_expolygons(*object); + efc_outline = &efc_outline_storage; + } + + if (!efc_outline->empty()) { + Point closest_point; + //ORCA: Snap within the matching island to avoid drifting to another island. + if (closest_point_on_matching_island( + raw_outline, + *efc_outline, + Point(pt_x, pt_y), + closest_point)) { + pt_x = closest_point.x(); + pt_y = closest_point.y(); + } + } + } + mouse_ears_ex.back().contour.translate(Point(pt_x, pt_y)); } return mouse_ears_ex; @@ -926,6 +458,14 @@ static ExPolygons outer_inner_brim_area(const Print& print, const bool has_outer_brim = brim_type == btOuterOnly || brim_type == btOuterAndInner || brim_type == btAutoBrim || use_auto_brim_ears || use_brim_ears; coord_t ear_detection_length = scale_(object->config().brim_ears_detection_length.value); coordf_t brim_ears_max_angle = object->config().brim_ears_max_angle.value; + //ORCA: Select brim base slices from EFC-compensated outline when enabled. + const bool use_efc_outline = use_brim_efc_outline(*object); + ExPolygons brim_slices_storage; + const ExPolygons* brim_slices = nullptr; + //ORCA: Select EFC-adjusted bottom outline when enabled. + if (use_efc_outline) + brim_slices_storage = get_print_object_bottom_layer_expolygons(*object); + brim_slices = use_efc_outline ? &brim_slices_storage : &object->layers().front()->lslices; ExPolygons brim_area_object; ExPolygons no_brim_area_object; @@ -961,64 +501,72 @@ static ExPolygons outer_inner_brim_area(const Print& print, double brimWidthRaw = configBrimWidthByVolumeGroups(adhesion, maxSpeed, groupVolumePtrs, volumeGroup.slices, groupHeight); brim_width = scale_(floor(brimWidthRaw / flowWidth / 2) * flowWidth * 2); } - for (const ExPolygon& ex_poly : volumeGroup.slices) { - // BBS: additional brim width will be added if part's adhesion area is too small and brim is not generated - float brim_width_mod; - if (brim_width < scale_(5.) && has_brim_auto && groupHeight > 10.) { - brim_width_mod = ex_poly.area() / ex_poly.contour.length() < scaled_half_min_adh_length - && brim_width < scaled_flow_width ? brim_width + scaled_additional_brim_width : brim_width; - } - else { - brim_width_mod = brim_width; - } - //BBS: brim width should be limited to the 1.5*boundingboxSize of a single polygon. - if (has_brim_auto) { - BoundingBox bbox2 = ex_poly.contour.bounding_box(); - brim_width_mod = std::min(brim_width_mod, float(std::max(bbox2.size()(0), bbox2.size()(1)))); - } - brim_width_mod = floor(brim_width_mod / scaled_flow_width / 2) * scaled_flow_width * 2; - - Polygons ex_poly_holes_reversed = ex_poly.holes; - polygons_reverse(ex_poly_holes_reversed); - - if (has_outer_brim) { - // BBS: inner and outer boundary are offset from the same polygon incase of round off error. - auto innerExpoly = offset_ex(ex_poly.contour, brim_offset, jtRound, SCALED_RESOLUTION); - ExPolygons outerExpoly; - if (use_brim_ears) { - outerExpoly = make_brim_ears(object, flowWidth, brim_offset, flow, true); - //outerExpoly = offset_ex(outerExpoly, brim_width_mod, jtRound, SCALED_RESOLUTION); - } else if (use_auto_brim_ears) { - coord_t size_ear = (brim_width_mod - brim_offset - flow.scaled_spacing()); - outerExpoly = make_brim_ears_auto(innerExpoly, size_ear, ear_detection_length, brim_ears_max_angle, true); - }else { - outerExpoly = offset_ex(innerExpoly, brim_width_mod, jtRound, SCALED_RESOLUTION); - } - append(brim_area_object, diff_ex(outerExpoly, innerExpoly)); - } - if (has_inner_brim) { - ExPolygons outerExpoly; - auto innerExpoly = offset_ex(ex_poly_holes_reversed, -brim_width - brim_offset); - if (use_brim_ears) { - outerExpoly = make_brim_ears(object, flowWidth, brim_offset, flow, false); - } else if (use_auto_brim_ears) { - coord_t size_ear = (brim_width - brim_offset - flow.scaled_spacing()); - outerExpoly = make_brim_ears_auto(offset_ex(ex_poly_holes_reversed, -brim_offset), size_ear, ear_detection_length, brim_ears_max_angle, false); - }else { - outerExpoly = offset_ex(ex_poly_holes_reversed, -brim_offset); - } - append(brim_area_object, intersection_ex(diff_ex(outerExpoly, innerExpoly), ex_poly_holes_reversed)); - } - if (!has_inner_brim) { - // BBS: brim should be apart from holes - append(no_brim_area_object, diff_ex(ex_poly_holes_reversed, offset_ex(ex_poly_holes_reversed, -no_brim_offset))); - } - if (!has_outer_brim) - append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset), ex_poly_holes_reversed)); - append(holes_object, ex_poly_holes_reversed); + ExPolygons volume_group_slices_efc; + const ExPolygons* volume_group_slices = &volumeGroup.slices; + if (use_efc_outline) { + //ORCA: When using EFC outline, restrict per-volume-group slices to the + // EFC-adjusted bottom footprint to keep brim width heuristics consistent. + volume_group_slices_efc = intersection_ex(*brim_slices, volumeGroup.slices); + volume_group_slices = &volume_group_slices_efc; } - } - auto objectIsland = offset_ex(object->layers().front()->lslices, brim_offset, jtRound, SCALED_RESOLUTION); + for (const ExPolygon& ex_poly : *volume_group_slices) { + // BBS: additional brim width will be added if part's adhesion area is too small and brim is not generated + float brim_width_mod; + if (brim_width < scale_(5.) && has_brim_auto && groupHeight > 10.) { + brim_width_mod = ex_poly.area() / ex_poly.contour.length() < scaled_half_min_adh_length + && brim_width < scaled_flow_width ? brim_width + scaled_additional_brim_width : brim_width; + } + else { + brim_width_mod = brim_width; + } + //BBS: brim width should be limited to the 1.5*boundingboxSize of a single polygon. + if (has_brim_auto) { + BoundingBox bbox2 = ex_poly.contour.bounding_box(); + brim_width_mod = std::min(brim_width_mod, float(std::max(bbox2.size()(0), bbox2.size()(1)))); + } + brim_width_mod = floor(brim_width_mod / scaled_flow_width / 2) * scaled_flow_width * 2; + + Polygons ex_poly_holes_reversed = ex_poly.holes; + polygons_reverse(ex_poly_holes_reversed); + + if (has_outer_brim) { + // BBS: inner and outer boundary are offset from the same polygon incase of round off error. + auto innerExpoly = offset_ex(ex_poly.contour, brim_offset, jtRound, SCALED_RESOLUTION); + ExPolygons outerExpoly; + if (use_brim_ears) { + outerExpoly = make_brim_ears(object, flowWidth, brim_offset, flow, true); + //outerExpoly = offset_ex(outerExpoly, brim_width_mod, jtRound, SCALED_RESOLUTION); + } else if (use_auto_brim_ears) { + coord_t size_ear = (brim_width_mod - brim_offset - flow.scaled_spacing()); + outerExpoly = make_brim_ears_auto(innerExpoly, size_ear, ear_detection_length, brim_ears_max_angle, true); + }else { + outerExpoly = offset_ex(innerExpoly, brim_width_mod, jtRound, SCALED_RESOLUTION); + } + append(brim_area_object, diff_ex(outerExpoly, innerExpoly)); + } + if (has_inner_brim) { + ExPolygons outerExpoly; + auto innerExpoly = offset_ex(ex_poly_holes_reversed, -brim_width - brim_offset); + if (use_brim_ears) { + outerExpoly = make_brim_ears(object, flowWidth, brim_offset, flow, false); + } else if (use_auto_brim_ears) { + coord_t size_ear = (brim_width - brim_offset - flow.scaled_spacing()); + outerExpoly = make_brim_ears_auto(offset_ex(ex_poly_holes_reversed, -brim_offset), size_ear, ear_detection_length, brim_ears_max_angle, false); + }else { + outerExpoly = offset_ex(ex_poly_holes_reversed, -brim_offset); + } + append(brim_area_object, intersection_ex(diff_ex(outerExpoly, innerExpoly), ex_poly_holes_reversed)); + } + if (!has_inner_brim) { + // BBS: brim should be apart from holes + append(no_brim_area_object, diff_ex(ex_poly_holes_reversed, offset_ex(ex_poly_holes_reversed, -no_brim_offset))); + } + if (!has_outer_brim) + append(no_brim_area_object, diff_ex(offset(ex_poly.contour, no_brim_offset), ex_poly_holes_reversed)); + append(holes_object, ex_poly_holes_reversed); + } + } + auto objectIsland = offset_ex(*brim_slices, brim_offset, jtRound, SCALED_RESOLUTION); append(no_brim_area_object, objectIsland); brimToWrite.at(object->id()).obj = false; @@ -1261,393 +809,8 @@ static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_ return std::move(polylines); } - -// BBS: this function is used to generate brim for inner island inside holes -// Collect island + brim area to be minused when generating inner brim for holes -static void make_inner_island_brim(const Print& print, const ConstPrintObjectPtrs& top_level_objects_with_brim, - ExtrusionEntityCollection &brim, ExPolygons &islands_area_ex) -{ - const auto scaled_resolution = scaled(print.config().resolution.value); - - auto save_polygon_if_is_inner_island = [scaled_resolution](const Polygons& holes_area, Polygon& contour, std::map& hole_island_pair) { - for (size_t i = 0; i < holes_area.size(); i++) { - Polygons contour_polys; - contour_polys.push_back(contour); - if (diff_ex(contour_polys, { holes_area[i] }).empty()) { - // BBS: this is an inner island inside holes_area[i], save - contour.douglas_peucker(scaled_resolution); - hole_island_pair[i].push_back(contour); - break; - } - } - }; - - Flow flow = print.brim_flow(); - for (const PrintObject* object : top_level_objects_with_brim) { - const BrimType brim_type = object->config().brim_type.value; - // BBS: don't need to handle this object if hasn't enabled outer_brim - if (brim_type == BrimType::btNoBrim) - continue; - - //BBS: 1 collect holes area which is used to limit the brim of inner island - Polygons holes_area; - for (const ExPolygon& ex_poly : object->layers().front()->lslices) - polygons_append(holes_area, ex_poly.holes); - - - //BBS: 2 get the island polygons inside holes, saved as map - std::map hole_island_pair; - for (const ExPolygon& ex_poly : object->layers().front()->lslices) { - Polygon counter = ex_poly.contour; - save_polygon_if_is_inner_island(holes_area, counter, hole_island_pair); - } - - if (!object->support_layers().empty()) { - for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) { - Polygon counter = support_contour; - save_polygon_if_is_inner_island(holes_area, counter, hole_island_pair); - } - } - - //BBS: 3 generate loops, only save part of loop which inside hole - const float brim_offset = scale_(object->config().brim_object_gap.value); - const float brim_width = scale_(object->config().brim_width.value); - if (brim_type == BrimType::btInnerOnly) { - // If brim_type is btInnerOnly, we actually doesn't generate loops for inner island. - // Only update islands_area_ex and return - for (auto it = hole_island_pair.begin(); it != hole_island_pair.end(); it++) { - ExPolygons islands_area_ex_object = intersection_ex(offset(it->second, brim_offset), offset(holes_area[it->first], -brim_offset)); - for (const PrintInstance& instance : object->instances()) - append_and_translate(islands_area_ex, islands_area_ex_object, instance); - } - } - else { - size_t num_loops = size_t(floor(brim_width / float(flow.scaled_spacing()))); - for (auto it = hole_island_pair.begin(); it != hole_island_pair.end(); it++) { - Polygons loops; - Polygons inner_islands = offset(it->second, brim_offset); - Polygons brimable_area = offset(holes_area[it->first], -brim_offset); //offset to keep away from hole - Polygons contour = inner_islands; - for (size_t i = 0; i < num_loops; ++i) { - contour = offset(contour, float(flow.scaled_spacing()), jtSquare); - for (Polygon& poly : contour) - poly.douglas_peucker(scaled_resolution); - polygons_append(loops, offset(contour, -0.5f * float(flow.scaled_spacing()))); - } - // BBS: to be checked. - //loops = union_pt_chained_outside_in(loops, false); - loops = union_pt_chained_outside_in(loops); - - std::vector loops_pl_by_levels; - { - Polylines loops_pl = to_polylines(loops); - loops_pl_by_levels.assign(loops_pl.size(), Polylines()); - tbb::parallel_for(tbb::blocked_range(0, loops_pl.size()), - [&loops_pl_by_levels, &loops_pl, &brimable_area](const tbb::blocked_range& range) { - for (size_t i = range.begin(); i < range.end(); ++i) { - loops_pl_by_levels[i] = chain_polylines(intersection_pl({ std::move(loops_pl[i]) }, brimable_area)); - } - }); - } - - // BBS: Reduce down to the ordered list of polylines. - Polylines all_loops_object; - for (Polylines& polylines : loops_pl_by_levels) - append(all_loops_object, std::move(polylines)); - loops_pl_by_levels.clear(); - - optimize_polylines_by_reversing(&all_loops_object); - all_loops_object = connect_brim_lines(std::move(all_loops_object), offset(inner_islands, float(SCALED_EPSILON)), float(flow.scaled_spacing()) * 2.f); - - Polylines final_loops; - for (const PrintInstance& instance : object->instances()) { - size_t dst_idx = final_loops.size(); - final_loops.insert(final_loops.end(), all_loops_object.begin(), all_loops_object.end()); - Point instance_shift = instance.shift_without_plate_offset(); - for (; dst_idx < final_loops.size(); ++dst_idx) - final_loops[dst_idx].translate(instance_shift); - - } - extrusion_entities_append_loops_and_paths(brim.entities, std::move(final_loops), - erBrim, float(flow.mm3_per_mm()), float(flow.width()), - float(print.skirt_first_layer_height())); - - //BBS: save all inner island and inner island brim area here, which is necesary if generate inner brim for holes - //Inner brim of holes must not occupy this area - ExPolygons islands_area_ex_object = intersection_ex(contour, brimable_area); - for (const PrintInstance& instance : object->instances()) - append_and_translate(islands_area_ex, islands_area_ex_object, instance); - } - } - } -} - -//BBS: the brim are generated one by one, and sorted by objs/supports and extruders -static void make_inner_island_brim(const Print& print, const ConstPrintObjectPtrs& top_level_objects_with_brim, - std::map& innerbrimAreaMap, - std::map& innerSupportBrimAreaMap, - ExPolygons& islands_area_ex, ExPolygons& NobrimArea, - std::vector>& objPrintVec) -{ - auto save_polygon_if_is_inner_island = [](const Polygons& holes_area, Polygon& counter, std::map& hole_island_pair) { - for (size_t i = 0; i < holes_area.size(); i++) { - if (diff_ex(Polygons{ counter }, { holes_area[i] }).empty()) { - // BBS: this is an inner island inside holes_area[i], save - counter.douglas_peucker(SCALED_RESOLUTION); - hole_island_pair[i].push_back(counter); - break; - } - } - }; - - unsigned int support_material_extruder = 1; - if (print.has_support_material()) { - assert(top_level_objects_with_brim.front()->config().support_filament >= 0); - if (top_level_objects_with_brim.front()->config().support_filament > 0) - support_material_extruder = top_level_objects_with_brim.front()->config().support_filament; - } - - std::unordered_set top_level_objects_idx; - top_level_objects_idx.reserve(top_level_objects_with_brim.size()); - for (const PrintObject* object : top_level_objects_with_brim) - top_level_objects_idx.insert(object->id().id); - - struct brimWritten { - bool obj; - bool sup; - }; - std::map brimToWrite; - for (const auto& objectWithExtruder : objPrintVec) - if (top_level_objects_idx.find(objectWithExtruder.first.id) != top_level_objects_idx.end()) - brimToWrite.insert({ objectWithExtruder.first, {true,true} }); - - Flow flow = print.brim_flow(); - for (unsigned int extruderNo : print.extruders()) { - ++extruderNo; - for (const auto& objectWithExtruder : objPrintVec) { - if (top_level_objects_idx.find(objectWithExtruder.first.id) != top_level_objects_idx.end()) { - const PrintObject* object = print.get_object(objectWithExtruder.first); - const BrimType brim_type = object->config().brim_type.value; - // BBS: don't need to handle this object if hasn't enabled outer_brim - if (brim_type == BrimType::btNoBrim) - continue; - - //BBS: 1 collect holes area which is used to limit the brim of inner island - Polygons holes_area; - for (const ExPolygon& ex_poly : object->layers().front()->lslices) - polygons_append(holes_area, ex_poly.holes); - - - //BBS: 2 get the island polygons inside holes, saved as map - std::map hole_island_pair; - for (const ExPolygon& ex_poly : object->layers().front()->lslices) { - Polygon counter = ex_poly.contour; - save_polygon_if_is_inner_island(holes_area, counter, hole_island_pair); - } - std::map hole_island_pair_supports; - if (!object->support_layers().empty()) { - for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing()) { - Polygon counter = support_contour; - save_polygon_if_is_inner_island(holes_area, counter, hole_island_pair_supports); - } - } - - //BBS: 3 generate loops, only save part of loop which inside hole - const float brim_offset = scale_(object->config().brim_object_gap.value); - const float brim_width = floor(scale_(object->config().brim_width.value) / 2 / flow.scaled_spacing()) * 2 * flow.scaled_spacing(); - if (objectWithExtruder.second == extruderNo && brimToWrite.at(object->id()).obj) { - if (brim_type == BrimType::btInnerOnly) { - // If brim_type is btInnerOnly, we actually doesn't generate loops for inner island. - // Only update islands_area_ex and return - for (auto it = hole_island_pair.begin(); it != hole_island_pair.end(); it++) { - ExPolygons islands_area_ex_object = intersection_ex(offset(it->second, brim_offset), offset(holes_area[it->first], -brim_offset)); - for (const PrintInstance& instance : object->instances()) - append_and_translate(islands_area_ex, islands_area_ex_object, instance); - } - brimToWrite.at(object->id()).obj = false; - } - else { - for (auto it = hole_island_pair.begin(); it != hole_island_pair.end(); it++) { - Polygons loops; - Polygons inner_islands = offset(it->second, brim_offset); - Polygons brimable_area = offset(holes_area[it->first], -brim_offset); //offset to keep away from hole - Polygons contour = offset(inner_islands, brim_offset + brim_width, jtRound, SCALED_RESOLUTION); - for (Polygon& poly : contour) - poly.douglas_peucker(SCALED_RESOLUTION); - - - //BBS: save all inner island and inner island brim area here, which is necesary if generate inner brim for holes - //Inner brim of holes must not occupy this area - ExPolygons islands_area_ex_object = intersection_ex(contour, brimable_area); - ExPolygons inner_islands_exp = offset_ex(inner_islands, 0.); - islands_area_ex_object = diff_ex(islands_area_ex_object, inner_islands_exp); - for (const PrintInstance& instance : object->instances()) - append_and_translate(islands_area_ex, islands_area_ex_object, instance, print, innerbrimAreaMap); - } - brimToWrite.at(object->id()).obj = false; - } - if (innerbrimAreaMap.find(object->id()) != innerbrimAreaMap.end()) - expolygons_append(islands_area_ex, innerbrimAreaMap[object->id()]); - } - - - if (support_material_extruder == extruderNo && brimToWrite.at(object->id()).sup) { - if (brim_type == BrimType::btInnerOnly) { - // If brim_type is btInnerOnly, we actually doesn't generate loops for inner island. - // Only update islands_area_ex and return - for (auto it = hole_island_pair_supports.begin(); it != hole_island_pair_supports.end(); it++) { - ExPolygons islands_area_ex_support = intersection_ex(offset(it->second, 0), offset(holes_area[it->first], 0)); - for (const PrintInstance& instance : object->instances()) - append_and_translate(islands_area_ex, islands_area_ex_support, instance); - } - brimToWrite.at(object->id()).sup = false; - } - else { - for (auto it = hole_island_pair_supports.begin(); it != hole_island_pair_supports.end(); it++) { - Polygons loops; - Polygons inner_islands = offset(it->second, 0); - Polygons brimable_area = offset(holes_area[it->first], -float(flow.scaled_spacing())); //offset to keep away from hole - Polygons contour = offset(inner_islands, brim_width, jtRound, SCALED_RESOLUTION); - for (Polygon& poly : contour) - poly.douglas_peucker(SCALED_RESOLUTION); - - - //BBS: save all inner island and inner island brim area here, which is necesary if generate inner brim for holes - //Inner brim of holes must not occupy this area - ExPolygons islands_area_ex_support = intersection_ex(contour, brimable_area); - ExPolygons inner_islands_exp = offset_ex(inner_islands, 0.); - islands_area_ex_support = diff_ex(islands_area_ex_support, inner_islands_exp); - for (const PrintInstance& instance : object->instances()) - append_and_translate(islands_area_ex, islands_area_ex_support, instance, print, innerSupportBrimAreaMap); - - } - brimToWrite.at(object->id()).sup = false; - } - if (innerSupportBrimAreaMap.find(object->id()) != innerSupportBrimAreaMap.end()) - expolygons_append(islands_area_ex, innerSupportBrimAreaMap[object->id()]); - } - } - } - } - islands_area_ex = diff_ex(islands_area_ex, NobrimArea); - for (const PrintObject* object : print.objects()) { - if (innerbrimAreaMap.find(object->id()) != innerbrimAreaMap.end()) - innerbrimAreaMap[object->id()] = diff_ex(innerbrimAreaMap[object->id()], NobrimArea); - if (innerSupportBrimAreaMap.find(object->id()) != innerSupportBrimAreaMap.end()) - innerSupportBrimAreaMap[object->id()] = diff_ex(innerSupportBrimAreaMap[object->id()], NobrimArea); - } -} -static void make_inner_brim(const Print &print, - const ConstPrintObjectPtrs &top_level_objects_with_brim, - const std::vector &bottom_layers_expolygons, - ExtrusionEntityCollection &brim) -{ - assert(print.objects().size() == bottom_layers_expolygons.size()); - const auto scaled_resolution = scaled(print.config().resolution.value); - - //BBS: generate brim for inner island first - ExPolygons inner_islands_ex; - make_inner_island_brim(print, top_level_objects_with_brim, brim, inner_islands_ex); - -#ifdef INNER_ISLAND_BRIM_DEBUG_TO_SVG - static int irun = 0; - BoundingBox bbox_svg; - bbox_svg.merge(get_extents(inner_islands_ex)); - { - std::stringstream stri; - stri << "inner_island_and_brim_area_" << irun << ".svg"; - SVG svg(stri.str(), bbox_svg); - svg.draw(to_polylines(inner_islands_ex), "blue"); - svg.Close(); - } - ++ irun; -#endif - - Flow flow = print.brim_flow(); - ExPolygons islands_ex = inner_brim_area(print, top_level_objects_with_brim, bottom_layers_expolygons, float(flow.scaled_spacing())); - //BBS: brim of hole must not overlap with inner island and inner island brim - if (!inner_islands_ex.empty()) { - islands_ex = diff_ex(islands_ex, inner_islands_ex); - } - - Polygons loops; - islands_ex = offset_ex(islands_ex, -0.5f * float(flow.scaled_spacing()));// jtSquare seems not working when expandign the holes - for (size_t i = 0; !islands_ex.empty(); ++i) { - for (ExPolygon &poly_ex : islands_ex) - poly_ex.douglas_peucker(scaled_resolution); - polygons_append(loops, to_polygons(islands_ex));// jtSquare seems not working when expandign the holes - islands_ex = offset_ex(islands_ex, -1.3f * float(flow.scaled_spacing())); - islands_ex = offset_ex(islands_ex, .3f * float(flow.scaled_spacing())); - } - - loops = union_pt_chained_outside_in(loops); - std::reverse(loops.begin(), loops.end()); - extrusion_entities_append_loops(brim.entities, std::move(loops), erBrim, float(flow.mm3_per_mm()), - float(flow.width()), float(print.skirt_first_layer_height())); -} - -// BBS: generate inner brim by objs -static void make_inner_brim(const Print& print, const ConstPrintObjectPtrs& top_level_objects_with_brim, - std::map& brimAreaMap, std::map& supportBrimAreaMap, - std::vector>& objPrintVec) -{ - //BBS: generate brim for inner island first - - -#ifdef INNER_ISLAND_BRIM_DEBUG_TO_SVG - static int irun = 0; - BoundingBox bbox_svg; - bbox_svg.merge(get_extents(inner_islands_ex)); - { - std::stringstream stri; - stri << "inner_island_and_brim_area_" << irun << ".svg"; - SVG svg(stri.str(), bbox_svg); - svg.draw(to_polylines(inner_islands_ex), "blue"); - svg.Close(); - } - ++irun; -#endif - - Flow flow = print.brim_flow(); - ExPolygons NoBrim = inner_brim_area(print, top_level_objects_with_brim, - float(flow.scaled_spacing()), brimAreaMap, supportBrimAreaMap, objPrintVec); - - ExPolygons inner_islands_ex; - std::map innerBrimAreaMap; - std::map innerSupportBrimAreaMap; - /*make_inner_island_brim(print, top_level_objects_with_brim, innerBrimAreaMap, innerSupportBrimAreaMap, - inner_islands_ex, NoBrim, objPrintVec);*/ - - //BBS: brim of hole must not overlap with inner island and inner island brim - if (!inner_islands_ex.empty()) { - if (brimAreaMap.size() > 0) { - for (auto iter = brimAreaMap.begin(); iter != brimAreaMap.end(); ++iter) { - if (!iter->second.empty()) { - iter->second = diff_ex(iter->second, inner_islands_ex); - }; - } - } - if (supportBrimAreaMap.size() > 0) { - for (auto iter = supportBrimAreaMap.begin(); iter != supportBrimAreaMap.end(); ++iter) { - if (!iter->second.empty()) { - iter->second = diff_ex(iter->second, inner_islands_ex); - }; - } - } - for (const PrintObject* object : print.objects()) { - if (innerBrimAreaMap.find(object->id()) != innerBrimAreaMap.end()) { - append(brimAreaMap[object->id()], innerBrimAreaMap[object->id()]); - } - if (innerSupportBrimAreaMap.find(object->id()) != innerSupportBrimAreaMap.end()) { - append(supportBrimAreaMap[object->id()], innerSupportBrimAreaMap[object->id()]); - } - } - } -} - - //BBS: generate out brim by offseting ExPolygons 'islands_area_ex' -Polygons tryExPolygonOffset(const ExPolygons islandAreaEx, const Print& print) +Polygons tryExPolygonOffset(const ExPolygons& islandAreaEx, const Print& print) { const auto scaled_resolution = scaled(print.config().resolution.value); Polygons loops; @@ -1718,8 +881,6 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ std::vector> &objPrintVec, std::vector& printExtruders) { - - double brim_width_max = 0; std::map brim_width_map; std::map brimAreaMap; std::map supportBrimAreaMap; @@ -1732,7 +893,10 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ for (const ObjectID printObjID : print.print_object_ids()) { BoundingBox bbx; PrintObject* object = const_cast(print.get_object(printObjID)); - for (const ExPolygon& ex_poly : object->layers().front()->lslices) + //ORCA: Use EFC-compensated outline for brim bounding box when enabled. + const ExPolygons brim_slices = use_brim_efc_outline(*object) ? + get_print_object_bottom_layer_expolygons(*object) : object->layers().front()->lslices; + for (const ExPolygon& ex_poly : brim_slices) for (const PrintInstance& instance : object->instances()) { auto ex_poly_translated = ex_poly; ex_poly_translated.translate(instance.shift_without_plate_offset()); @@ -1774,9 +938,6 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ supportBrimMap.insert(std::make_pair(iter->first, makeBrimInfill(iter->second, print, islands_area))); }; } - - size_t num_loops = size_t(floor(brim_width_max / flow.spacing())); - BOOST_LOG_TRIVIAL(debug) << "brim_width_max, num_loops: " << brim_width_max << ", " << num_loops; } } // namespace Slic3r diff --git a/src/libslic3r/Clipper2Utils.cpp b/src/libslic3r/Clipper2Utils.cpp index 9f1f678a9c..12fd867500 100644 --- a/src/libslic3r/Clipper2Utils.cpp +++ b/src/libslic3r/Clipper2Utils.cpp @@ -35,6 +35,11 @@ Clipper2Lib::Paths64 Slic3rPoints_to_Paths64(const Container& in) return out; } +Clipper2Lib::Paths64 Slic3rPolylines_to_Paths64(const Polylines& in) +{ + return Slic3rPoints_to_Paths64(in); +} + Points Path64ToPoints(const Clipper2Lib::Path64& path64) { Points points; diff --git a/src/libslic3r/Clipper2Utils.hpp b/src/libslic3r/Clipper2Utils.hpp index c5485ad1bd..54b48d6bd7 100644 --- a/src/libslic3r/Clipper2Utils.hpp +++ b/src/libslic3r/Clipper2Utils.hpp @@ -4,9 +4,12 @@ #include "ExPolygon.hpp" #include "Polygon.hpp" #include "Polyline.hpp" +#include "clipper2/clipper.h" namespace Slic3r { +Clipper2Lib::Paths64 Slic3rPolylines_to_Paths64(const Slic3r::Polylines& in); +Slic3r::Polylines Paths64_to_polylines(const Clipper2Lib::Paths64& in); Slic3r::Polylines intersection_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip); Slic3r::Polylines diff_pl_2(const Slic3r::Polylines& subject, const Slic3r::Polygons& clip); ExPolygons union_ex_2(const Polygons &expolygons); diff --git a/src/libslic3r/Feature/FuzzySkin/FuzzySkin.cpp b/src/libslic3r/Feature/FuzzySkin/FuzzySkin.cpp index 2e6f7efd9d..a9b5099383 100644 --- a/src/libslic3r/Feature/FuzzySkin/FuzzySkin.cpp +++ b/src/libslic3r/Feature/FuzzySkin/FuzzySkin.cpp @@ -162,8 +162,8 @@ void fuzzy_extrusion_line(Arachne::ExtrusionJunctions& ext_lines, coordf_t slice } if (ext_lines.back().p == ext_lines.front().p) { // Connect endpoints. - out.front().p = out.back().p; - out.front().w = out.back().w; + out.back().p = out.front().p; + out.back().w = out.front().w; } if (out.size() >= 3) diff --git a/src/libslic3r/Fill/Fill3DHoneycomb.cpp b/src/libslic3r/Fill/Fill3DHoneycomb.cpp index 34a1ff1b50..de4aaeacd3 100644 --- a/src/libslic3r/Fill/Fill3DHoneycomb.cpp +++ b/src/libslic3r/Fill/Fill3DHoneycomb.cpp @@ -200,6 +200,10 @@ void Fill3DHoneycomb::_fill_surface_single( if (std::abs(infill_angle) >= EPSILON) expolygon.rotate(-infill_angle); BoundingBox bb = expolygon.contour.bounding_box(); + // Expand the bounding box to avoid artifacts at the edges + coord_t expand = 5 * (scale_(this->spacing)); + bb.offset(expand); + // Note: with equally-scaled X/Y/Z, the pattern will create a vertically-stretched // truncated octahedron; so Z is pre-adjusted first by scaling by sqrt(2) coordf_t zScale = sqrt(2); diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp index ed3bfcf0a0..344bb529f0 100644 --- a/src/libslic3r/Fill/FillAdaptive.cpp +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -1371,42 +1371,47 @@ void Filler::_fill_surface_single( all_polylines.reserve(lines.size()); std::transform(lines.begin(), lines.end(), std::back_inserter(all_polylines), [](const Line& l) { return Polyline{ l.a, l.b }; }); - // Apply multiline offset if needed - multiline_fill(all_polylines, params, spacing); + // Apply multiline offset if needed + multiline_fill(all_polylines, params, spacing); // Crop all polylines all_polylines = intersection_pl(std::move(all_polylines), expolygon); #endif } - // After intersection_pl some polylines with only one line are split into more lines - for (Polyline &polyline : all_polylines) { - //FIXME assert that all the points are collinear and in between the start and end point. - if (polyline.points.size() > 2) - polyline.points.erase(polyline.points.begin() + 1, polyline.points.end() - 1); - } -// assert(has_no_collinear_lines(all_polylines)); + if (params.multiline == 1) { + // After intersection_pl some polylines with only one line are split into more lines + for (Polyline& polyline : all_polylines) { + // FIXME assert that all the points are collinear and in between the start and end point. + if (polyline.points.size() > 2) + polyline.points.erase(polyline.points.begin() + 1, polyline.points.end() - 1); + } + // assert(has_no_collinear_lines(all_polylines)); #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT - { - static int iRun = 0; - export_infill_lines_to_svg(expolygon, all_polylines, debug_out_path("FillAdaptive-initial-%d.svg", iRun++)); - } + { + static int iRun = 0; + export_infill_lines_to_svg(expolygon, all_polylines, debug_out_path("FillAdaptive-initial-%d.svg", iRun++)); + } #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ - const auto hook_length = coordf_t(std::min(std::numeric_limits::max(), scale_(params.anchor_length))); - const auto hook_length_max = coordf_t(std::min(std::numeric_limits::max(), scale_(params.anchor_length_max))); + const auto hook_length = coordf_t(std::min(std::numeric_limits::max(), scale_(params.anchor_length))); + const auto hook_length_max = coordf_t(std::min(std::numeric_limits::max(), scale_(params.anchor_length_max))); Polylines all_polylines_with_hooks = all_polylines.size() > 1 ? connect_lines_using_hooks(std::move(all_polylines), expolygon, this->spacing, hook_length, hook_length_max) : std::move(all_polylines); #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT - { - static int iRun = 0; - export_infill_lines_to_svg(expolygon, all_polylines_with_hooks, debug_out_path("FillAdaptive-hooks-%d.svg", iRun++)); - } + { + static int iRun = 0; + export_infill_lines_to_svg(expolygon, all_polylines_with_hooks, debug_out_path("FillAdaptive-hooks-%d.svg", iRun++)); + } #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ - chain_or_connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params); + chain_or_connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params); + } else { + // if multiline is > 1 infill is ready to connect + chain_or_connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params); + } #ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT { @@ -1443,6 +1448,17 @@ static std::vector make_cubes_properties(double max_cube_edge_le if (edge_length > max_cube_edge_length) break; } + // Orca: Ensure at least 2 levels so build_octree() will insert triangles. + // Fixes scenario where adaptive fill is disconnected from walls on low densities + if (cubes_properties.size() == 1) { + CubeProperties p = cubes_properties.back(); + p.edge_length *= 2.0; + p.height = p.edge_length * sqrt(3); + p.diagonal_length = p.edge_length * sqrt(2); + p.line_z_distance = p.edge_length / sqrt(3); + p.line_xy_distance = p.edge_length / sqrt(6); + cubes_properties.push_back(p); + } return cubes_properties; } diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 3a9412119f..eff83efe3e 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -3,6 +3,7 @@ #include #include "../ClipperUtils.hpp" +#include "../Clipper2Utils.hpp" #include "../EdgeGrid.hpp" #include "../Geometry.hpp" #include "../Geometry/Circle.hpp" @@ -1706,6 +1707,12 @@ void Fill::connect_infill(Polylines &&infill_ordered, const std::vectorcontour_idx]; + + // Orca: If multiline infill is requested, skip connections that are too short. + if (params.multiline > 1 && arc.arc_length < scale_(spacing) * params.multiline) { + continue; + } + const std::vector &contour_params = graph.boundary_params[cp1->contour_idx]; if (polyline_idx1 != polyline_idx2) { Polyline &polyline1 = infill_ordered[polyline_idx1]; @@ -2699,60 +2706,77 @@ void Fill::connect_base_support(Polylines &&infill_ordered, const Polygons &boun connect_base_support(std::move(infill_ordered), polygons_src, bbox, polylines_out, spacing, params); } -//Fill Multiline +// Fill Multiline -Clipper2 version void multiline_fill(Polylines& polylines, const FillParams& params, float spacing) { - if (params.multiline > 1) { - const int n_lines = params.multiline; - const int n_polylines = static_cast(polylines.size()); - Polylines all_polylines; - all_polylines.reserve(n_lines * n_polylines); + if (params.multiline <= 1) + return; - const float center = (n_lines - 1) / 2.0f; + const int n_lines = params.multiline; + const int n_polylines = static_cast(polylines.size()); + Polylines all_polylines; + all_polylines.reserve(n_lines * n_polylines); - for (int line = 0; line < n_lines; ++line) { - float offset = scale_((static_cast(line) - center) * spacing); + // Remove invalid polylines + polylines.erase(std::remove_if(polylines.begin(), polylines.end(), + [](const Polyline& p) { return p.size() < 2; }), + polylines.end()); - for (const Polyline& pl : polylines) { - const size_t n = pl.points.size(); - if (n < 2) { - all_polylines.emplace_back(pl); - continue; - } + if (polylines.empty()) + return; + // Convert source polylines to Clipper2 paths + Clipper2Lib::Paths64 subject_paths = Slic3rPolylines_to_Paths64(polylines); - Points new_points; - new_points.reserve(n); - for (size_t i = 0; i < n; ++i) { - Vec2f tangent; - // For the first and last point, if the polyline is a - // closed loop, get the tangent from the points on either - // side of the join, otherwise just use the first or last - // line. - if (i == 0) { - if (pl.points[0] == pl.points[n-1]) { - tangent = (pl.points[1] - pl.points[n-2]).template cast().normalized(); - } else { - tangent = (pl.points[1] - pl.points[0]).template cast().normalized(); - } - } else if (i == n - 1) { - if (pl.points[0] == pl.points[n-1]) { - tangent = (pl.points[1] - pl.points[n-2]).template cast().normalized(); - } else { - tangent = (pl.points[n-1] - pl.points[n-2]).template cast().normalized(); - } - } else - tangent = (pl.points[i+1] - pl.points[i-1]).template cast().normalized(); - Vec2f normal(-tangent.y(), tangent.x()); + const double miter_limit = 2.0; + const int rings = n_lines / 2; - Point p = pl.points[i] + (normal * offset).template cast(); - new_points.push_back(p); - } + // Compute offsets (in units of spacing) + std::vector offsets; + offsets.reserve(n_lines); - all_polylines.emplace_back(std::move(new_points)); - } - } - polylines = std::move(all_polylines); + if (n_lines % 2 != 0) { + // Odd: center line at offset = 0 + offsets.push_back(0.0); + + for (int i = 1; i <= rings; ++i) + offsets.push_back(i * spacing); + } else { + // Even: no center, start at 0.5 * spacing + double start = 0.5 * spacing; + for (int i = 0; i < rings; ++i) + offsets.push_back(start + i * spacing); } + + // Process each offset + Clipper2Lib::ClipperOffset offsetter(miter_limit); + offsetter.AddPaths(subject_paths, Clipper2Lib::JoinType::Round, Clipper2Lib::EndType::Round); + + for (double t : offsets) { + if (t == 0.0) { + // Center line (only applies when n_lines is odd) + all_polylines.insert(all_polylines.end(), polylines.begin(), polylines.end()); + continue; + } + + // ClipperOffset with current offset distance (union is not needed here) + Clipper2Lib::Paths64 offset_paths; + offsetter.Execute(scale_(t), offset_paths); + if (offset_paths.empty()) + continue; + + // Convert back to polylines + Polylines new_polylines = Paths64_to_polylines(offset_paths); + + for (Polyline& pl : new_polylines) { + if (pl.points.size() < 3) + continue; + if (pl.points.front() != pl.points.back()) + pl.points.push_back(pl.points.front()); + all_polylines.emplace_back(std::move(pl)); + } + } + + polylines = std::move(all_polylines); } } // namespace Slic3r diff --git a/src/libslic3r/Fill/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp index 93a54a0739..4f2a0b8970 100644 --- a/src/libslic3r/Fill/FillConcentric.cpp +++ b/src/libslic3r/Fill/FillConcentric.cpp @@ -19,7 +19,7 @@ void FillConcentric::_fill_surface_single( // no rotation is supported for this infill pattern BoundingBox bounding_box = expolygon.contour.bounding_box(); - coord_t min_spacing = scale_(this->spacing); + coord_t min_spacing = scale_(this->spacing) * params.multiline; coord_t distance = coord_t(min_spacing / params.density); if (params.density > 0.9999f && !params.dont_adjust) { @@ -27,8 +27,12 @@ void FillConcentric::_fill_surface_single( this->spacing = unscale(distance); } - Polygons loops = to_polygons(expolygon); - ExPolygons last { std::move(expolygon) }; + // Contract surface polygon by half line width to avoid excesive overlap with perimeter + ExPolygons contracted = offset_ex(expolygon, -float(scale_(0.5 * (params.multiline - 1) * this->spacing ))); + + Polygons loops = to_polygons(contracted); + + ExPolygons last { std::move(contracted) }; while (! last.empty()) { last = offset2_ex(last, -(distance + min_spacing/2), +min_spacing/2); append(loops, to_polygons(last)); @@ -46,6 +50,9 @@ void FillConcentric::_fill_surface_single( last_pos = polylines_out.back().last_point(); } + // Apply multiline offset if needed + multiline_fill(polylines_out, params, spacing); + // clip the paths to prevent the extruder from getting exactly on the first point of the loop // Keep valid paths only. size_t j = iPathFirst; diff --git a/src/libslic3r/Fill/FillHoneycomb.cpp b/src/libslic3r/Fill/FillHoneycomb.cpp index e750425a82..a595cdb664 100644 --- a/src/libslic3r/Fill/FillHoneycomb.cpp +++ b/src/libslic3r/Fill/FillHoneycomb.cpp @@ -74,7 +74,7 @@ void FillHoneycomb::_fill_surface_single( } } // Apply multiline offset if needed - multiline_fill(all_polylines, params, 1.1 * spacing); + multiline_fill(all_polylines, params, spacing); all_polylines = intersection_pl(std::move(all_polylines), expolygon); chain_or_connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params); diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp index 6044ba43a2..b4681d05f9 100644 --- a/src/libslic3r/Fill/FillPlanePath.cpp +++ b/src/libslic3r/Fill/FillPlanePath.cpp @@ -81,6 +81,9 @@ void FillPlanePath::_fill_surface_single( BoundingBox snug_bounding_box = get_extents(expolygon).inflated(SCALED_EPSILON); + // Expand the bounding box to avoid artifacts at the edges + snug_bounding_box.offset(scale_(this->spacing)*params.multiline); + // Rotated bounding box of the area to fill in with the pattern. BoundingBox bounding_box = align ? // Sparse infill needs to be aligned across layers. Align infill across layers using the object's bounding box. @@ -97,7 +100,7 @@ void FillPlanePath::_fill_surface_single( Polyline polyline; { - auto distance_between_lines = scaled(this->spacing) / params.density; + auto distance_between_lines = scaled(this->spacing) * params.multiline / params.density; auto min_x = coord_t(ceil(coordf_t(bounding_box.min.x()) / distance_between_lines)); auto min_y = coord_t(ceil(coordf_t(bounding_box.min.y()) / distance_between_lines)); auto max_x = coord_t(ceil(coordf_t(bounding_box.max.x()) / distance_between_lines)); @@ -117,8 +120,13 @@ void FillPlanePath::_fill_surface_single( } } + Polylines polylines = {polyline}; + + // Apply multiline offset if needed + multiline_fill(polylines, params, spacing); + if (polyline.size() >= 2) { - Polylines polylines = intersection_pl(polyline, expolygon); + polylines = intersection_pl(std::move(polylines), expolygon); if (!polylines.empty()) { Polylines chained; if (params.dont_connect() || params.density > 0.5) { diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp index cfb9c32300..775b3e8b42 100644 --- a/src/libslic3r/Fill/FillRectilinear.cpp +++ b/src/libslic3r/Fill/FillRectilinear.cpp @@ -3000,7 +3000,7 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar params.density /= double(sweep_params.size()); assert(params.density > 0.0001f && params.density <= 1.f); - ExPolygonWithOffset poly_with_offset_base(surface->expolygon, 0, float(scale_(this->overlap - 0.5 * this->spacing))); + ExPolygonWithOffset poly_with_offset_base(surface->expolygon, 0, float(scale_(this->overlap + 0.5 * params.multiline * this->spacing)));//increase offset to crop infill lines when using multiline infill if (poly_with_offset_base.n_contours == 0) // Not a single infill line fits. return true; @@ -3012,19 +3012,24 @@ bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillPar for (const SweepParams &sweep : sweep_params) { // Rotate polygons so that we can work with vertical lines here float angle = rotate_vector.first + sweep.angle_base; - //Fill Multiline - for (int i = 0; i < params.multiline; ++i) { - coord_t group_offset = i * line_spacing; - coord_t internal_offset = (i - (params.multiline - 1) / 2.0f) * line_width; - coord_t total_offset = group_offset + internal_offset; - coord_t pattern_shift = scale_(sweep.pattern_shift + unscale_(total_offset)); - make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, -angle), rotate_vector.second.rotated(-angle), angle, - line_width + coord_t(SCALED_EPSILON), line_spacing, pattern_shift, fill_lines); - } + make_fill_lines(ExPolygonWithOffset(poly_with_offset_base, -angle), rotate_vector.second.rotated(-angle), angle, + line_width + coord_t(SCALED_EPSILON), line_spacing, coord_t(scale_(sweep.pattern_shift)), fill_lines); } + + // Apply multiline offset if needed + multiline_fill(fill_lines, params, spacing); + + // Contract surface polygon by half line width to avoid excesive overlap with perimeter + ExPolygons contracted = offset_ex(surface->expolygon, -float(scale_(0.5 * this->spacing))); + + // if contraction results in empty polygon, use original surface + const ExPolygon &intersection_surface = contracted.empty() ? surface->expolygon : contracted.front(); -if ((params.pattern == ipLateralLattice || params.pattern == ipLateralHoneycomb ) && params.multiline >1 ) + // Intersect polylines with perimeter + fill_lines = intersection_pl(std::move(fill_lines), intersection_surface); + + if ((params.pattern == ipLateralLattice || params.pattern == ipLateralHoneycomb ) && params.multiline >1 ) remove_overlapped(fill_lines, line_width); if (!fill_lines.empty()) { @@ -3033,7 +3038,260 @@ if ((params.pattern == ipLateralLattice || params.pattern == ipLateralHoneycomb fill_lines = chain_polylines(std::move(fill_lines)); append(polylines_out, std::move(fill_lines)); } else - connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params); + connect_infill(std::move(fill_lines), intersection_surface, polylines_out, this->spacing, params); + } + + return true; +} + +bool FillRectilinear::fill_surface_trapezoidal( + const Surface* surface, + FillParams params, + const std::initializer_list& sweep_params, + Polylines& polylines_out, + int Pattern_type) // 0=grid, 1=triangular +{ + assert(params.multiline > 1); + + Polylines polylines; + + // Common parameters + const coord_t d1 = coord_t(scale_(this->spacing)) * params.multiline; // Infill total wall thickness + + // Pattern-specific parameters + coord_t period; + double base_angle; + std::pair rotate_vector = this->_infill_direction(surface); + + if (Pattern_type == 0) { + // Grid pattern parameters + period = coord_t((2.0 * d1 / params.density) * std::sqrt(2.0)); + base_angle = rotate_vector.first + M_PI_4; // 45 + } else { + // Triangular pattern parameters + period = coord_t(( 2.0 * d1 / params.density) * std::sqrt(3.0)); + base_angle = rotate_vector.first + M_PI_2; //90 + } + + // Obtain the expolygon and rotate to align with pattern base angle + ExPolygon expolygon = surface->expolygon; + if (std::abs(base_angle) >= EPSILON) { + expolygon.rotate(-base_angle, rotate_vector.second); + } + + // Use extended object bounding box for consistent pattern across layers + BoundingBox bb = this->extended_object_bounding_box(); + + switch (Pattern_type) { + case 0: // Grid / Trapezoidal + { + // Generate a non-crossing trapezoidal pattern to avoid overextrusion at intersections when `multiline > 1`. + // P1--P2 + // / \ + // P0/ \P3__P4 + // + // P1x-P2x=P3x-P4x=d1 + // P0y-P1y=P2y-P3y=d2 + + const coord_t d2 = coord_t(0.5 * period - d1); + + // Align bounding box to the grid + bb.merge(align_to_grid(bb.min, Point(period, period))); + const coord_t xmin = bb.min.x(); + const coord_t xmax = bb.max.x(); + const coord_t ymin = bb.min.y(); + const coord_t ymax = bb.max.y(); + + // Create the two base row patterns once + Polyline base_row_normal; + base_row_normal.points.reserve(((xmax - xmin) / period + 1) * 5); // 5 points per trapezoid + Polyline base_row_flipped; + base_row_flipped.points.reserve(((xmax - xmin) / period + 1) * 5); // 5 points per trapezoid + + // Build complete rows from xmin to xmax + for (coord_t x = xmin; x < xmax; x += period) { + // Normal row + base_row_normal.points.emplace_back(Point(x, d1 / 2)); // P0 + base_row_normal.points.emplace_back(Point(x + d1, d1 / 2)); // P1 + base_row_normal.points.emplace_back(Point(x + d1 + d2, d1 / 2 + d2)); // P2 + base_row_normal.points.emplace_back(Point(x + 2 * d1 + d2, d1 / 2 + d2)); // P3 + base_row_normal.points.emplace_back(Point(x + 2 * d1 + 2 * d2, d1 / 2)); // P4 + } + + // Flipped row (mirrored vertically) + base_row_flipped.points = base_row_normal.points; + for (auto& p : base_row_flipped.points) { + p.y() = period / 2 - p.y(); + } + + // Pre-allocate polylines + const size_t estimated_rows = ((ymax - ymin) / (period / 2) + 1); + polylines.reserve(estimated_rows); + + bool flip_vertical = false; + + // Now just copy and translate vertically + for (coord_t y = ymin; y < ymax; y += period / 2) { + Polyline pl_row = flip_vertical ? base_row_flipped : base_row_normal; + + // Translate all points vertically + for (Point& p : pl_row.points) { + p.y() += y; + } + + polylines.emplace_back(std::move(pl_row)); + flip_vertical = !flip_vertical; + } + + // transpose points for odd layers + if (layer_id % 2 == 1) { + for (Polyline& pl : polylines) { + for (Point& p : pl.points) { + std::swap(p.x(), p.y()); + p.x() += d1 / 2; + p.y() -= d1 / 2; + } + } + } + break; + } + + case 1: // Triangular + { + // Generate a non-crossing trapezoidal pattern with a base line below. + // P1-P2 + // / \ + // P0/ \P3_P4 + // ---------------- + // P1x-P2x=P3x-P4x=d2 + // P0y-P1y=P2y-P3y=h-2d1 + // + + // Triangular pattern density adjustment: + const coord_t d2_tri = coord_t(2.0 / std::sqrt(3.0) * d1); + const coord_t h = coord_t(0.5 * std::sqrt(3.0) * period); // height of triangle + + // Align bounding box to the grid + bb.merge(align_to_grid(bb.center(), Point(period,h))); + const int layer_mod = layer_id % 3; + const double angle = layer_mod * 2.0 * M_PI / 3.0; + + const Point rotation_center = bb.center(); + const coord_t half_w = bb.size().x() / 2; + const coord_t half_h = bb.size().y() / 2; + + // Compute how many full periods fit in each direction + const coord_t num_periods_x = coord_t(std::ceil(half_w / double(period))); + coord_t num_periods_y =coord_t(std::ceil(half_h / double(h))); + // Ensure an even number of rows so the pattern stays centered + if ((num_periods_y % 2) != 0) + ++num_periods_y; + + // Compute aligned limits (symmetric around the origin) + const coord_t x_min_aligned = -num_periods_x * period; + const coord_t x_max_aligned = num_periods_x * period; + const coord_t y_min_aligned = -num_periods_y * h; + const coord_t y_max_aligned = num_periods_y * h; + + // Pre-allocate estimated number of polylines + const size_t estimated_rows = (y_max_aligned - y_min_aligned) / h + 2; + const size_t estimated_polylines = (estimated_rows + 1) * 2; // base line + trapezoid line per row + polylines.reserve(estimated_polylines); + + // Create the two base row templates once + Polyline base_line_template; + base_line_template.points.reserve(2); // 2 points for base line + Polyline trapezoid_row_normal; + trapezoid_row_normal.points.reserve(((x_max_aligned - x_min_aligned) / period + 1) * 5); // 5 points per trapezoid + Polyline trapezoid_row_shifted; + trapezoid_row_shifted.points.reserve(((x_max_aligned - x_min_aligned) / period + 1) * 5); // 5 points per trapezoid + // Build base line template (from x_min_aligned to x_max_aligned) + base_line_template.points.emplace_back(Point(x_min_aligned, 0)); + base_line_template.points.emplace_back(Point(x_max_aligned, 0)); + + // Build complete trapezoid rows once + // Normal row (no shift) + for (coord_t x = x_min_aligned; x < x_max_aligned; x += period) { + trapezoid_row_normal.points.emplace_back(Point(x + d2_tri / 2, d1)); // P0 + trapezoid_row_normal.points.emplace_back(Point(x + period / 2 - d2_tri / 2, h - d1)); // P1 + trapezoid_row_normal.points.emplace_back(Point(x + period / 2 + d2_tri / 2, h - d1)); // P2 + trapezoid_row_normal.points.emplace_back(Point(x + period - d2_tri / 2, d1)); // P3 + trapezoid_row_normal.points.emplace_back(Point(x + period, d1)); // P4 + } + + // Shifted row (mirrored vertically) + trapezoid_row_shifted.points = trapezoid_row_normal.points; + for (auto& p : trapezoid_row_shifted.points) + p.y() = h - p.y(); + + bool shift_row = false; + + // Generate pattern by copying and translating templates vertically + for (coord_t y = y_min_aligned; y < y_max_aligned; y += h) { + // Base line - copy and translate + Polyline base_line = base_line_template; + for (Point& p : base_line.points) { + p.y() += y; + } + polylines.emplace_back(std::move(base_line)); + + // Trapezoid line - copy and translate the appropriate template + Polyline trapezoid_line = shift_row ? trapezoid_row_shifted : trapezoid_row_normal; + for (Point& p : trapezoid_line.points) { + p.y() += y; + } + + if (!trapezoid_line.points.empty()) { + polylines.emplace_back(std::move(trapezoid_line)); + } + + shift_row = !shift_row; + } + + // Rotate around origin (0,0) + if (layer_mod) + for (auto& pl : polylines) + pl.rotate(angle, Point(0,0)); + + break; + } + + default: + // Handle unknown pattern type + break; + } + + // Apply multiline fill + multiline_fill(polylines, params, spacing); + + // Contract surface polygon by half line width to avoid excesive overlap with perimeter + ExPolygons contracted = offset_ex(expolygon, -float(scale_(0.5 * this->spacing))); + + // if contraction results in empty polygon, use original surface + const ExPolygon &intersection_surface = contracted.empty() ? expolygon : contracted.front(); + + // Intersect polylines with offset expolygon + polylines = intersection_pl(std::move(polylines), intersection_surface); + + // Remove very short segments that may cause connection issues + const double minlength = scale_(0.8 * this->spacing); + if (minlength > 0 && !polylines.empty()) { + polylines.erase(std::remove_if(polylines.begin(), polylines.end(), + [minlength](const Polyline& pl) { return pl.length() < minlength; }), + polylines.end()); + } + + // Connect infill lines using offset expolygon + int infill_start_idx = polylines_out.size(); + if (!polylines.empty()) { + Slic3r::Fill::chain_or_connect_infill(std::move(polylines), intersection_surface, polylines_out, this->spacing, params); + + // Rotate back the infill lines to original orientation + if (std::abs(base_angle) >= EPSILON) { + for (auto it = polylines_out.begin() + infill_start_idx; it != polylines_out.end(); ++it) { + it->rotate(base_angle, rotate_vector.second); + } + } } return true; @@ -3077,15 +3335,27 @@ Polylines FillMonotonicLine::fill_surface(const Surface* surface, const FillPara Polylines FillGrid::fill_surface(const Surface *surface, const FillParams ¶ms) { Polylines polylines_out; - if (! this->fill_surface_by_multilines( - surface, params, - { { 0.f, 0.f }, { float(M_PI / 2.), 0.f } }, - polylines_out)) - BOOST_LOG_TRIVIAL(error) << "FillGrid::fill_surface() failed to fill a region."; - if (this->layer_id % 2 == 1) - for (int i = 0; i < polylines_out.size(); i++) - std::reverse(polylines_out[i].begin(), polylines_out[i].end()); + if (params.multiline > 1) { + // Experimental trapezoidal grid + if (!this->fill_surface_trapezoidal( + surface, params, + { { 0.f, 0.f }, { float(M_PI / 2.), 0.f } }, + polylines_out,0)) + BOOST_LOG_TRIVIAL(error) << "FillGrid::fill_surface_trapezoidal() failed."; + + } else { + if (!this->fill_surface_by_multilines( + surface, params, + { { 0.f, 0.f }, { float(M_PI / 2.), 0.f } }, + polylines_out)) + BOOST_LOG_TRIVIAL(error) << "FillGrid::fill_surface() failed to fill a region."; + + + if (this->layer_id % 2 == 1) + for (int i = 0; i < polylines_out.size(); i++) + std::reverse(polylines_out[i].begin(), polylines_out[i].end()); + } return polylines_out; } @@ -3108,12 +3378,23 @@ Polylines FillLateralLattice::fill_surface(const Surface *surface, const FillPar Polylines FillTriangles::fill_surface(const Surface *surface, const FillParams ¶ms){ Polylines polylines_out; + if (params.multiline > 1) { + // Experimental trapezoidal grid + if (!this->fill_surface_trapezoidal( + surface, params, + { { 0.f, 0.f }, { float(M_PI / 2.), 0.f } }, + polylines_out,1)) + BOOST_LOG_TRIVIAL(error) << "FillGrid::fill_surface_trapezoidal() failed."; + + } else { if (! this->fill_surface_by_multilines( surface, params, { { 0.f, 0.f }, { float(M_PI / 3.), 0.f }, { float(2. * M_PI / 3.), 0. } }, polylines_out)) BOOST_LOG_TRIVIAL(error) << "FillTriangles::fill_surface() failed to fill a region."; + } return polylines_out; + } Polylines FillStars::fill_surface(const Surface *surface, const FillParams ¶ms) @@ -3144,8 +3425,8 @@ Polylines FillQuarterCubic::fill_surface(const Surface* surface, const FillParam using namespace boost::math::float_constants; Polylines polylines_out; - coord_t line_width = coord_t(scale_(this->spacing)); - coord_t period = coord_t(scale_(this->spacing) / params.density) * 4; + coord_t line_width = coord_t(scale_(this->spacing)) * params.multiline; + coord_t period = coord_t(scale_(this->spacing) *params.multiline / params.density) * 4; // First half tetrahedral fill double pattern_z_shift = 0.0; diff --git a/src/libslic3r/Fill/FillRectilinear.hpp b/src/libslic3r/Fill/FillRectilinear.hpp index 3e4f3cf92f..126cbe3a15 100644 --- a/src/libslic3r/Fill/FillRectilinear.hpp +++ b/src/libslic3r/Fill/FillRectilinear.hpp @@ -29,6 +29,7 @@ protected: float pattern_shift; }; bool fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list &sweep_params, Polylines &polylines_out); + bool fill_surface_trapezoidal(const Surface *surface, FillParams params, const std::initializer_list &sweep_params, Polylines &polylines_out,int Pattern_type); // The extended bounding box of the whole object that covers any rotation of every layer. BoundingBox extended_object_bounding_box() const; diff --git a/src/libslic3r/FlushVolCalc.cpp b/src/libslic3r/FlushVolCalc.cpp index 675732d767..9bdbc1737d 100644 --- a/src/libslic3r/FlushVolCalc.cpp +++ b/src/libslic3r/FlushVolCalc.cpp @@ -10,7 +10,8 @@ namespace Slic3r { const int g_min_flush_volume_from_support = 700; const int g_flush_volume_to_support = 230; -const int g_max_flush_volume = 900; +const int g_max_flush_volume = 20000; //Orca: increase limit to 20k vs 900 in upstream BBS code. + // Retain a clamp to guard against extreme values entered in the UI static float to_radians(float degree) { diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index a27208ef1b..2d1940e448 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2725,8 +2725,8 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato auto probe_dist_x = std::max(1., m_config.bed_mesh_probe_distance.value.x()); auto probe_dist_y = std::max(1., m_config.bed_mesh_probe_distance.value.y()); - int probe_count_x = std::max(3, (int) std::ceil(mesh_bbox.size().x() / probe_dist_x)); - int probe_count_y = std::max(3, (int) std::ceil(mesh_bbox.size().y() / probe_dist_y)); + int probe_count_x = std::max(3, (int) std::ceil(mesh_bbox.size().x() / probe_dist_x) + 1); + int probe_count_y = std::max(3, (int) std::ceil(mesh_bbox.size().y() / probe_dist_y) + 1); auto bed_mesh_algo = "bicubic"; if (probe_count_x * probe_count_y <= 6) { // lagrange needs up to a total of 6 mesh points bed_mesh_algo = "lagrange"; @@ -3082,10 +3082,11 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_sorted_layer_filaments.emplace_back(lt.extruders); } - // Orca: finish tracking power lost recovery + // Orca: disable power loss recovery if it was enabled earlier { - if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) { - file.write(m_writer.enable_power_loss_recovery(false)); + const auto plr_mode = print.config().enable_power_loss_recovery.value; + if (m_second_layer_things_done && plr_mode == PowerLossRecoveryMode::Enable) { + file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable)); } } ++ finished_objects; @@ -3163,9 +3164,9 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato m_sorted_layer_filaments.emplace_back(lt.extruders); } - // Orca: finish tracking power lost recovery - if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == true) { - file.write(m_writer.enable_power_loss_recovery(false)); + // Orca: disable power loss recovery + if (m_second_layer_things_done && print.config().enable_power_loss_recovery.value == PowerLossRecoveryMode::Enable) { + file.write(m_writer.enable_power_loss_recovery(PowerLossRecoveryMode::Disable)); } if (m_wipe_tower) // Purge the extruder, pull out the active filament. @@ -4249,8 +4250,8 @@ LayerResult GCode::process_layer( bool is_multi_extruder = m_config.nozzle_diameter.size() > 1; bool need_insert_timelapse_gcode_for_traditional = false; - if (!m_wipe_tower || !m_wipe_tower->enable_timelapse_print()) { - need_insert_timelapse_gcode_for_traditional = ((is_i3_printer && !m_spiral_vase)|| is_multi_extruder); + if ((!m_wipe_tower || !m_wipe_tower->enable_timelapse_print()) && (is_BBL_Printer() || !m_config.time_lapse_gcode.value.empty())) { + need_insert_timelapse_gcode_for_traditional = ((is_i3_printer && !m_spiral_vase) || is_multi_extruder); } bool has_insert_timelapse_gcode = false; @@ -4266,19 +4267,18 @@ LayerResult GCode::process_layer( gcode += this->change_layer(print_z); // this will increase m_layer_index m_layer = &layer; m_object_layer_over_raft = false; - if(is_BBL_Printer()){ - } else { - if (!m_config.time_lapse_gcode.value.empty()) { - DynamicConfig config; - config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); - config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); - config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); - gcode += this->placeholder_parser_process("timelapse_gcode", print.config().time_lapse_gcode.value, m_writer.filament()->id(), - &config) + - "\n"; - } + + if (!m_config.time_lapse_gcode.value.empty() && !is_BBL_Printer()) { + DynamicConfig config; + config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); + config.set_key_value("layer_z", new ConfigOptionFloat(print_z)); + config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z)); + gcode += this->placeholder_parser_process("timelapse_gcode", + print.config().time_lapse_gcode.value, m_writer.filament()->id(), &config) + + "\n"; } - if (! m_config.layer_change_gcode.value.empty()) { + + if (!m_config.layer_change_gcode.value.empty()) { DynamicConfig config; config.set_key_value("most_used_physical_extruder_id", new ConfigOptionInt(m_config.physical_extruder_map.get_at(most_used_extruder))); config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); @@ -4380,10 +4380,9 @@ LayerResult GCode::process_layer( } if (!first_layer && !m_second_layer_things_done) { - // Orca: start tracking power lost recovery - if (print.config().enable_power_loss_recovery.value == true) { - gcode += m_writer.enable_power_loss_recovery(true); - } + // Orca: set power loss recovery + const auto plr_mode = print.config().enable_power_loss_recovery.value; + gcode += m_writer.enable_power_loss_recovery(plr_mode); if (print.is_BBL_printer()) { // BBS: open first layer inspection at second layer @@ -4727,7 +4726,7 @@ LayerResult GCode::process_layer( auto timelapse_pos=m_timelapse_pos_picker.pick_pos(ctx); - std::string timepals_gcode; + std::string timelapse_gcode; if (!print.config().time_lapse_gcode.value.empty()) { DynamicConfig config; config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index)); @@ -4738,17 +4737,18 @@ LayerResult GCode::process_layer( config.set_key_value("timelapse_pos_x", new ConfigOptionInt((int)timelapse_pos.x())); config.set_key_value("timelapse_pos_y", new ConfigOptionInt((int)timelapse_pos.y())); config.set_key_value("has_timelapse_safe_pos", new ConfigOptionBool(timelapse_pos != DefaultTimelapsePos)); - timepals_gcode = this->placeholder_parser_process("timelapse_gcode", print.config().time_lapse_gcode.value, m_writer.filament()->id(), &config) + "\n"; + timelapse_gcode = this->placeholder_parser_process("timelapse_gcode", print.config().time_lapse_gcode.value, m_writer.filament()->id(), &config) + "\n"; } - if (!timepals_gcode.empty()) { - m_writer.set_current_position_clear(false); - double temp_z_after_tool_change; - if (GCodeProcessor::get_last_z_from_gcode(timepals_gcode, temp_z_after_tool_change)) { - Vec3d pos = m_writer.get_position(); - pos(2) = temp_z_after_tool_change; - m_writer.set_position(pos); - } + if (!timelapse_gcode.empty()) { + m_writer.set_current_position_clear(false); + + double temp_z_after_tool_change; + if (GCodeProcessor::get_last_z_from_gcode(timelapse_gcode, temp_z_after_tool_change)) { + Vec3d pos = m_writer.get_position(); + pos(2) = temp_z_after_tool_change; + m_writer.set_position(pos); + } } // (layer_object_label_ids.size() < 64) this restriction comes from _encode_label_ids_to_base64() @@ -4769,13 +4769,13 @@ LayerResult GCode::process_layer( std::string end_str = std::string("; object ids of this layer") + std::to_string(m_layer_index + 1) + (" end: ") + oss.str() + "\n"; end_str += "M625\n"; - timepals_gcode = start_str + timepals_gcode + end_str; + timelapse_gcode = start_str + timelapse_gcode + end_str; } - return timepals_gcode; + return timelapse_gcode; }; - if (!need_insert_timelapse_gcode_for_traditional) { // Equivalent to the timelapse gcode placed in layer_change_gcode + if (!need_insert_timelapse_gcode_for_traditional && is_BBL_Printer()) { // Equivalent to the timelapse gcode placed in layer_change_gcode if (FILAMENT_CONFIG(retract_when_changing_layer)) { gcode += this->retract(false, false, auto_lift_type, true); } @@ -4871,10 +4871,12 @@ LayerResult GCode::process_layer( gcode_toolchange = this->set_extruder(extruder_id, print_z); } + if (!gcode_toolchange.empty()) { // Disable vase mode for layers that has toolchange result.spiral_vase_enable = false; } + gcode += std::move(gcode_toolchange); // let analyzer tag generator aware of a role type change @@ -6182,10 +6184,16 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description, ); } - // if still in avoidance mode and under “max”, clamp to “min” - if (m_resonance_avoidance - && speed <= m_config.max_resonance_avoidance_speed.value) { - speed = std::min(speed, m_config.min_resonance_avoidance_speed.value); + // if still in avoidance mode and under "max", adjust speed: + // - speeds in lower half of range: clamp down to "min" + // - speeds in upper half of range: boost up to "max" + if (m_resonance_avoidance && speed < m_config.max_resonance_avoidance_speed.value) { + if (speed < m_config.min_resonance_avoidance_speed.value + + ((m_config.max_resonance_avoidance_speed.value - m_config.min_resonance_avoidance_speed.value) / 2)) { + speed = std::min(speed, m_config.min_resonance_avoidance_speed.value); + } else { + speed = m_config.max_resonance_avoidance_speed.value; + } } // reset flag for next segment diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 7237779533..b2047bd3aa 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -97,7 +97,8 @@ public: m_enable_timelapse_print(print_config.timelapse_type.value == TimelapseType::tlSmooth), m_enable_wrapping_detection(print_config.enable_wrapping_detection && (print_config.wrapping_exclude_area.values.size() > 2) && (slice_used_filaments.size() <= 1)), m_is_first_print(true), - m_print_config(&print_config) + m_print_config(&print_config), + m_last_wipe_tower_print_z(print_config.z_offset.value) { // initialize with the extruder offset of master extruder id m_extruder_offsets.resize(print_config.filament_map.size(), print_config.extruder_offset.get_at(print_config.master_extruder_id.value - 1)); @@ -143,7 +144,7 @@ private: // Current layer index. int m_layer_idx; int m_tool_change_idx; - double m_last_wipe_tower_print_z = 0.f; + double m_last_wipe_tower_print_z; // BBS Vec3d m_plate_origin; diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp index 25decc4fc2..d772d1d341 100644 --- a/src/libslic3r/GCode/GCodeProcessor.cpp +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -1893,7 +1893,7 @@ void GCodeProcessor::apply_config(const PrintConfig& config) // sanity check if(m_preheat_steps < 1) m_preheat_steps = 1; - m_result.backtrace_enabled = m_preheat_time > 0 && (m_is_XL_printer || (!m_single_extruder_multi_material && filament_count > 1)); + m_result.backtrace_enabled = config.ooze_prevention && m_preheat_time > 0 && (m_is_XL_printer || (!m_single_extruder_multi_material && filament_count > 1)); assert(config.nozzle_volume.size() == config.nozzle_diameter.size()); m_nozzle_volume.resize(config.nozzle_volume.size()); diff --git a/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.cpp b/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.cpp index e472b20794..20377cfe8d 100644 --- a/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.cpp +++ b/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.cpp @@ -15,7 +15,6 @@ #include "../PrintConfig.hpp" #include "SmallAreaInfillFlowCompensator.hpp" -#include "spline/spline.h" #include namespace Slic3r { @@ -47,37 +46,43 @@ SmallAreaInfillFlowCompensator::SmallAreaInfillFlowCompensator(const Slic3r::GCo } } catch (...) { std::stringstream ss; - ss << "Error parsing data point in small area infill compensation model:" << line << std::endl; + ss << "Small Area Flow Compensation: Error parsing data point in small area infill compensation model:" << line << std::endl; throw Slic3r::InvalidArgument(ss.str()); } } } - for (int i = 0; i < eLengths.size(); i++) { + for (size_t i = 0; i < eLengths.size(); i++) { if (i == 0) { if (!nearly_equal(eLengths[i], 0.0)) { - throw Slic3r::InvalidArgument("First extrusion length for small area infill compensation model must be 0"); + throw Slic3r::InvalidArgument("Small Area Flow Compensation: First extrusion length for small area infill compensation model must be 0"); } } else { if (nearly_equal(eLengths[i], 0.0)) { - throw Slic3r::InvalidArgument("Only the first extrusion length for small area infill compensation model can be 0"); + throw Slic3r::InvalidArgument("Small Area Flow Compensation: Only the first extrusion length for small area infill compensation model can be 0"); } if (eLengths[i] <= eLengths[i - 1]) { - throw Slic3r::InvalidArgument("Extrusion lengths for subsequent points must be increasing"); + throw Slic3r::InvalidArgument("Small Area Flow Compensation: Extrusion lengths for subsequent points must be increasing"); } } } - if (!flowComps.empty() && !nearly_equal(flowComps.back(), 1.0)) { - throw Slic3r::InvalidArgument("Final compensation factor for small area infill flow compensation model must be 1.0"); + for (size_t i = 1; i < flowComps.size(); ++i) { + if (flowComps[i] <= flowComps[i - 1]) { + throw Slic3r::InvalidArgument("Small Area Flow Compensation: Flow compensation factors must strictly increase with extrusion length"); + } } - flowModel = std::make_unique(); - flowModel->set_points(eLengths, flowComps); + if (!flowComps.empty() && !nearly_equal(flowComps.back(), 1.0)) { + throw Slic3r::InvalidArgument("Small Area Flow Compensation: Final compensation factor for small area infill flow compensation model must be 1.0"); + } + + flowModel = std::make_unique(eLengths, flowComps); } catch (std::exception& e) { BOOST_LOG_TRIVIAL(error) << "Error parsing small area infill compensation model: " << e.what(); + throw; } } @@ -92,7 +97,7 @@ double SmallAreaInfillFlowCompensator::flow_comp_model(const double line_length) return 1.0; } - return (*flowModel)(line_length); + return flowModel->interpolate(line_length); } double SmallAreaInfillFlowCompensator::modify_flow(const double line_length, const double dE, const ExtrusionRole role) diff --git a/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.hpp b/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.hpp index 1bfa5149f7..de1df98170 100644 --- a/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.hpp +++ b/src/libslic3r/GCode/SmallAreaInfillFlowCompensator.hpp @@ -4,12 +4,9 @@ #include "../libslic3r.h" #include "../PrintConfig.hpp" #include "../ExtrusionEntity.hpp" +#include "PchipInterpolatorHelper.hpp" #include -namespace tk { -class spline; -} // namespace tk - namespace Slic3r { class SmallAreaInfillFlowCompensator @@ -26,8 +23,7 @@ private: std::vector eLengths; std::vector flowComps; - // TODO: Cubic Spline - std::unique_ptr flowModel; + std::unique_ptr flowModel; double flow_comp_model(const double line_length); diff --git a/src/libslic3r/GCode/WipeTower2.cpp b/src/libslic3r/GCode/WipeTower2.cpp index cf5a68b436..19e98e4a09 100644 --- a/src/libslic3r/GCode/WipeTower2.cpp +++ b/src/libslic3r/GCode/WipeTower2.cpp @@ -1215,6 +1215,10 @@ WipeTower::ToolChangeResult WipeTower2::construct_tcr(WipeTowerWriter2& writer, result.extrusions = std::move(writer.extrusions()); result.wipe_path = std::move(writer.wipe_path()); result.is_finish_first = is_finish; + // ORCA: Always initialize the tool_change_start_pos with a valid position + // to avoid undefined variable travel on X in Gcode.cpp function std::string WipeTowerIntegration::post_process_wipe_tower_moves + result.tool_change_start_pos = result.start_pos; // always valid fallback + return result; } @@ -2032,7 +2036,11 @@ WipeTower::ToolChangeResult WipeTower2::finish_layer() // brim (first layer only) if (first_layer) { writer.append("; WIPE_TOWER_BRIM_START\n"); - size_t loops_num = (m_wipe_tower_brim_width + spacing/2.f) / spacing; + float brim_width = m_wipe_tower_brim_width; + if (brim_width < 0.f) + brim_width = WipeTower::get_auto_brim_by_height(m_wipe_tower_height); + + size_t loops_num = (brim_width + spacing / 2.f) / spacing; for (size_t i = 0; i < loops_num; ++ i) { poly = offset(poly, scale_(spacing)).front(); diff --git a/src/libslic3r/GCode/WipeTower2.hpp b/src/libslic3r/GCode/WipeTower2.hpp index 3dbc066634..6242b634a8 100644 --- a/src/libslic3r/GCode/WipeTower2.hpp +++ b/src/libslic3r/GCode/WipeTower2.hpp @@ -58,10 +58,18 @@ public: std::vector> get_z_and_depth_pairs() const; float get_brim_width() const { return m_wipe_tower_brim_width_real; } float get_wipe_tower_height() const { return m_wipe_tower_height; } - - - - + // ORCA: Match WipeTower API used by Print skirt/brim planning. + // Returned bounding box is in WIPE-TOWER-LOCAL coordinates (before placement on the bed). + // Include brim and y-shift to match what WT gcode actually prints. + BoundingBoxf get_bbx() const{ + const float brim = m_wipe_tower_brim_width_real; + const Vec2d min(-brim, -brim + double(m_y_shift)); + const Vec2d max(double(m_wipe_tower_width) + brim, double(m_wipe_tower_depth) + brim + double(m_y_shift)); + return BoundingBoxf(min, max); + } + // WT2 doesn't currently compute a rib-origin compensation like WipeTower (m_rib_offset), + // so expose a zero offset for consistency purposes (to maintain API parity). + Vec2f get_rib_offset() const { return Vec2f::Zero(); } // Switch to a next layer. void set_layer( diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp index f3d218750b..1008e5eab1 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -444,23 +444,28 @@ std::string GCodeWriter::reset_e(bool force) } } -std::string GCodeWriter::enable_power_loss_recovery(bool enable) +std::string GCodeWriter::enable_power_loss_recovery(PowerLossRecoveryMode mode) { std::ostringstream gcode; - + + if (mode == PowerLossRecoveryMode::PrinterConfiguration) + return std::string(); + + const bool enable = mode == PowerLossRecoveryMode::Enable; + if (m_is_bbl_printers) { - gcode << "; start tracking Power Loss Recovery https://wiki.bambulab.com/en/knowledge-sharing/power-loss-recovery\n"; - gcode << "M1003 S" << (enable ? "1" : "0") << "\n"; + gcode << "M1003 S" << (enable ? "1" : "0"); } else if (FLAVOR_IS(gcfMarlinFirmware)) { - gcode << "; start tracking Power-loss Recovery https://marlinfw.org/docs/gcode/M413.html\n"; - gcode << "M413 S" << (enable ? "1" : "0") << "\n"; + gcode << "M413 S" << (enable ? "1" : "0"); + } else { + return std::string(); } - + if (GCodeWriter::full_gcode_comment) gcode << " ; set Power-loss Recovery"; + gcode << "\n"; return gcode.str(); } - std::string GCodeWriter::update_progress(unsigned int num, unsigned int tot, bool allow_100) const { if (FLAVOR_IS_NOT(gcfMakerWare) && FLAVOR_IS_NOT(gcfSailfish)) diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 32e737164d..dbc64694e2 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -61,7 +61,7 @@ public: std::string set_input_shaping(char axis, float damp, float freq, std::string type) const; std::string reset_e(bool force = false); std::string update_progress(unsigned int num, unsigned int tot, bool allow_100 = false) const; - std::string enable_power_loss_recovery(bool enable); + std::string enable_power_loss_recovery(PowerLossRecoveryMode mode); // return false if this extruder was already selected bool need_toolchange(unsigned int filament_id) const; std::string set_extruder(unsigned int filament_id); diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp index 92e4210f3c..f03a5cee38 100644 --- a/src/libslic3r/PlaceholderParser.cpp +++ b/src/libslic3r/PlaceholderParser.cpp @@ -1045,8 +1045,8 @@ namespace client case coFloatOrPercent: { std::string opt_key(opt.it_range.begin(), opt.it_range.end()); - if (boost::ends_with(opt_key, "extrusion_width")) { - // Extrusion width supports defaults and a complex graph of dependencies. + if (boost::ends_with(opt_key, "line_width")) { + // Line width supports defaults and a complex graph of dependencies. output.set_d(Flow::extrusion_width(opt_key, *ctx, static_cast(ctx->current_extruder_id))); } else if (! static_cast(opt.opt)->percent) { // Not a percent, just return the value. @@ -1060,8 +1060,8 @@ namespace client const ConfigOption *opt_parent = opt_def->ratio_over.empty() ? nullptr : ctx->resolve_symbol(opt_def->ratio_over); if (opt_parent == nullptr) ctx->throw_exception("FloatOrPercent variable failed to resolve the \"ratio_over\" dependencies", opt.it_range); - if (boost::ends_with(opt_def->ratio_over, "extrusion_width")) { - // Extrusion width supports defaults and a complex graph of dependencies. + if (boost::ends_with(opt_def->ratio_over, "line_width")) { + // Line width supports defaults and a complex graph of dependencies. assert(opt_parent->type() == coFloatOrPercent); v *= Flow::extrusion_width(opt_def->ratio_over, static_cast(opt_parent), *ctx, static_cast(ctx->current_extruder_id)); break; @@ -2197,9 +2197,8 @@ namespace client initializer_list(_r1)[px::bind(&MyContext::vector_variable_new_from_initializer_list, _r1, _a, _b, _1)] // Process it before conditional_expression, as conditional_expression requires a vector reference to be augmented with an index. // Only process such variable references, which return a naked vector variable. - // Orca todo: following code cause strange build errors with MSVC C++17 - // | eps(px::bind(&MyContext::could_be_vector_variable_reference, _b)) >> - // variable_reference(_r1)[px::val(qi::_pass) = px::bind(&MyContext::vector_variable_new_from_copy, _r1, _a, _b, _1)] + | eps(px::bind(&MyContext::could_be_vector_variable_reference, _b)) >> + variable_reference(_r1)[qi::_pass = px::bind(&MyContext::vector_variable_new_from_copy, _r1, _a, _b, _1)] // Would NOT consume '(' conditional_expression ')' because such value was consumed with the expression above. | conditional_expression(_r1) [px::bind(&MyContext::scalar_variable_new_from_scalar_expression, _r1, _a, _b, _1)] diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 3ca75d28f3..4e78b31b46 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -904,7 +904,7 @@ static std::vector s_Preset_print_options { "top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap", "support_interface_speed", "bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", "outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height","single_loop_draft_shield", "draft_shield", - "brim_width", "brim_object_gap", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers", + "brim_width", "brim_object_gap", "brim_use_efc_outline", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers", "raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion", "support_base_pattern", "support_base_pattern_spacing", "support_expansion", "support_style", // BBS diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index c123cf53d0..b3efae168f 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -2751,6 +2751,8 @@ Preset *PresetBundle::get_similar_printer_preset(std::string printer_model, std: { if (printer_model.empty()) printer_model = printers.get_selected_preset().config.opt_string("printer_model"); + if (printer_model.empty()) // ORCA ensure a compatible model exist. fixes switches to blank preset if preset has no inherited value + return nullptr; auto printer_variant_old = printers.get_selected_preset().config.opt_string("printer_variant"); std::map printer_presets; for (auto &preset : printers.m_presets) { @@ -2761,7 +2763,8 @@ Preset *PresetBundle::get_similar_printer_preset(std::string printer_model, std: } if (printer_presets.empty()) return nullptr; - auto prefer_printer = printers.get_selected_preset().name; + auto prefer_printer = printers.get_selected_preset().alias; //.name ORCA use alias instead "name" for calling system presets. otherwise nozzle combo will not change printer presets if they custom named + if (!printer_variant.empty()) boost::replace_all(prefer_printer, printer_variant_old, printer_variant); else if (auto n = prefer_printer.find(printer_variant_old); n != std::string::npos) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 330b489141..7a0a6dd867 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -3333,6 +3333,8 @@ void Print::_make_wipe_tower() m_wipe_tower_data.z_and_depth_pairs = wipe_tower.get_z_and_depth_pairs(); m_wipe_tower_data.brim_width = wipe_tower.get_brim_width(); m_wipe_tower_data.height = wipe_tower.get_wipe_tower_height(); + m_wipe_tower_data.bbx = wipe_tower.get_bbx(); + m_wipe_tower_data.rib_offset = wipe_tower.get_rib_offset(); // Unload the current filament over the purge tower. coordf_t layer_height = m_objects.front()->config().layer_height.value; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 6287e77ceb..7549eb821d 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -161,6 +161,14 @@ static t_config_enum_values s_keys_map_BedTempFormula { }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BedTempFormula) +// Orca +static t_config_enum_values s_keys_map_PowerLossRecoveryMode { + { "printer_configuration", int(PowerLossRecoveryMode::PrinterConfiguration) }, + { "enable", int(PowerLossRecoveryMode::Enable) }, + { "disable", int(PowerLossRecoveryMode::Disable) } +}; +CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(PowerLossRecoveryMode) + static t_config_enum_values s_keys_map_FuzzySkinType { { "none", int(FuzzySkinType::None) }, { "external", int(FuzzySkinType::External) }, @@ -1562,6 +1570,16 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloat(0.)); + def = this->add("brim_use_efc_outline", coBool); + def->label = L("Brim follows compensated outline"); + def->category = L("Support"); + def->tooltip = L("When enabled, the brim is aligned with the first-layer perimeter geometry after Elephant Foot Compensation is applied.\n" + "This option is intended for cases where Elephant Foot Compensation significantly alters the first-layer footprint.\n" + "\n" + "If your current setup already works well, enabling it may be unnecessary and can cause the brim to fuse with upper layers." ); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("brim_ears", coBool); def->label = L("Brim ears"); def->category = L("Support"); @@ -2733,7 +2751,7 @@ void PrintConfigDef::init_fff_params() def->label = L("Fill Multiline"); def->tooltip = L("Using multiple lines for the infill pattern, if supported by infill pattern."); def->min = 1; - def->max = 5; // Maximum number of lines for infill pattern + def->max = 10; // Maximum number of lines for infill pattern def->set_default_value(new ConfigOptionInt(1)); def = this->add("sparse_infill_pattern", coEnum); @@ -3366,11 +3384,18 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionBool(false)); // Orca - def = this->add("enable_power_loss_recovery", coBool); - def->label = L("Turn on Power Loss Recovery"); - def->tooltip = L("Enable this to insert power loss recovery commands in generated G-code.(Only for Bambu Lab printers and Marlin firmware based printers)"); + def = this->add("enable_power_loss_recovery", coEnum); + def->label = L("Power Loss Recovery"); + def->tooltip = L("Choose how to control power loss recovery. When set to Printer configuration, the slicer will not emit power loss recovery G-code and will leave the printer's configuration unchanged. Applicable to Bambu Lab or Marlin 2 firmware based printers."); def->mode = comAdvanced; - def->set_default_value(new ConfigOptionBool(false)); + def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); + def->enum_values.push_back("printer_configuration"); + def->enum_values.push_back("enable"); + def->enum_values.push_back("disable"); + def->enum_labels.push_back(L("Printer configuration")); + def->enum_labels.push_back(L("Enable")); + def->enum_labels.push_back(L("Disable")); + def->set_default_value(new ConfigOptionEnum(PowerLossRecoveryMode::PrinterConfiguration)); //BBS // def = this->add("spaghetti_detector", coBool); @@ -7432,6 +7457,13 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va else if (opt_key == "extruder_type") { ReplaceString(value, "DirectDrive", "Direct Drive"); } + else if (opt_key == "enable_power_loss_recovery") { + if (value == "1" || boost::iequals(value, "true")) { + value = "enable"; + } else if (value == "0" || boost::iequals(value, "false")) { + value = "disable"; + } + } else if(opt_key == "ensure_vertical_shell_thickness") { if(value == "1") { value = "ensure_all"; @@ -7646,6 +7678,9 @@ std::set filament_options_with_variant = { "filament_retraction_length", "filament_z_hop", "filament_z_hop_types", + "filament_retract_lift_above", + "filament_retract_lift_below", + "filament_retract_lift_enforce", "filament_retract_restart_extra", "filament_retraction_speed", "filament_deretraction_speed", @@ -7664,7 +7699,11 @@ std::set filament_options_with_variant = { "filament_flush_volumetric_speed", "filament_flush_temp", "volumetric_speed_coefficients", - "filament_adaptive_volumetric_speed" + "filament_adaptive_volumetric_speed", + "filament_ironing_flow", + "filament_ironing_spacing", + "filament_ironing_inset", + "filament_ironing_speed" }; // Parameters that are the same as the number of extruders diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 3e34a8362b..998764f292 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -102,6 +102,13 @@ enum class BedTempFormula { count, }; +// Orca +enum class PowerLossRecoveryMode { + PrinterConfiguration, + Enable, + Disable, +}; + // BBS enum class WallSequence { InnerOuter, @@ -507,6 +514,7 @@ CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PrintHostType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(AuthorizationType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(WipeTowerWallType) CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PerimeterGeneratorType) +CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(PowerLossRecoveryMode) #undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS @@ -874,6 +882,7 @@ PRINT_CONFIG_CLASS_DEFINE( PrintObjectConfig, ((ConfigOptionFloat, brim_object_gap)) + ((ConfigOptionBool, brim_use_efc_outline)) ((ConfigOptionEnum, brim_type)) ((ConfigOptionFloat, brim_width)) ((ConfigOptionFloat, brim_ears_detection_length)) @@ -1271,7 +1280,7 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionIntsNullable, filament_flush_temp)) // BBS ((ConfigOptionBool, scan_first_layer)) - ((ConfigOptionBool, enable_power_loss_recovery)) + ((ConfigOptionEnum, enable_power_loss_recovery)) ((ConfigOptionBool, enable_wrapping_detection)) ((ConfigOptionInt, wrapping_detection_layers)) ((ConfigOptionPoints, wrapping_exclude_area)) diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 7cc98209cf..4b4237dca1 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1006,6 +1006,7 @@ bool PrintObject::invalidate_state_by_config_options( for (const t_config_option_key &opt_key : opt_keys) { if ( opt_key == "brim_width" || opt_key == "brim_object_gap" + || opt_key == "brim_use_efc_outline" || opt_key == "brim_type" || opt_key == "brim_ears_max_angle" || opt_key == "brim_ears_detection_length" diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 20629c7496..051b5e5519 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -458,6 +458,8 @@ set(SLIC3R_GUI_SOURCES GUI/UnsavedChangesDialog.hpp GUI/UpdateDialogs.cpp GUI/UpdateDialogs.hpp + GUI/NetworkPluginDialog.cpp + GUI/NetworkPluginDialog.hpp GUI/UpgradePanel.cpp GUI/UpgradePanel.hpp GUI/UserManager.cpp @@ -494,6 +496,8 @@ set(SLIC3R_GUI_SOURCES GUI/Widgets/ErrorMsgStaticText.hpp GUI/Widgets/FanControl.cpp GUI/Widgets/FanControl.hpp + GUI/Widgets/HyperLink.cpp + GUI/Widgets/HyperLink.hpp GUI/Widgets/ImageSwitchButton.cpp GUI/Widgets/ImageSwitchButton.hpp GUI/Widgets/Label.cpp @@ -705,8 +709,16 @@ source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SLIC3R_GUI_SOURCES}) encoding_check(libslic3r_gui) + +if(APPLE AND CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + set(_opengl_link_lib "") +else() + set(_opengl_link_lib OpenGL::GL) +endif() + target_link_libraries(libslic3r_gui libslic3r cereal::cereal imgui imguizmo minilzo libvgcode GLEW::GLEW OpenGL::GL hidapi ${wxWidgets_LIBRARIES} glfw libcurl OpenSSL::SSL OpenSSL::Crypto noise::noise) + if (MSVC) target_link_libraries(libslic3r_gui Setupapi.lib) elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") @@ -723,7 +735,11 @@ elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux") ${CURL_LIBRARIES} ) elseif (APPLE) - target_link_libraries(libslic3r_gui ${DISKARBITRATION_LIBRARY} "-framework Security") + if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0") + target_link_libraries(libslic3r_gui ${DISKARBITRATION_LIBRARY} "-framework Security" "-framework OpenGL") + else() + target_link_libraries(libslic3r_gui ${DISKARBITRATION_LIBRARY} "-framework Security") + endif() endif() if (SLIC3R_STATIC) diff --git a/src/slic3r/GUI/AMSMaterialsSetting.cpp b/src/slic3r/GUI/AMSMaterialsSetting.cpp index a649f6b833..19a32c2d21 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.cpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.cpp @@ -298,11 +298,7 @@ void AMSMaterialsSetting::create_panel_kn(wxWindow* parent) if (language.find("zh") == 0) region = "zh"; wxString link_url = wxString::Format("https://wiki.bambulab.com/%s/software/bambu-studio/calibration_pa", region); - m_wiki_ctrl = new wxHyperlinkCtrl(parent, wxID_ANY, "Wiki", link_url); - m_wiki_ctrl->SetNormalColour(*wxBLUE); - m_wiki_ctrl->SetHoverColour(wxColour(0, 0, 200)); - m_wiki_ctrl->SetVisitedColour(*wxBLUE); - m_wiki_ctrl->SetFont(Label::Head_14); + m_wiki_ctrl = new HyperLink(parent, "Wiki Guide", link_url); cali_title_sizer->Add(m_ratio_text, 0, wxALIGN_CENTER_VERTICAL); cali_title_sizer->Add(m_wiki_ctrl, 0, wxALIGN_CENTER_VERTICAL); diff --git a/src/slic3r/GUI/AMSMaterialsSetting.hpp b/src/slic3r/GUI/AMSMaterialsSetting.hpp index c678ec0717..84688896e6 100644 --- a/src/slic3r/GUI/AMSMaterialsSetting.hpp +++ b/src/slic3r/GUI/AMSMaterialsSetting.hpp @@ -14,8 +14,8 @@ #include "Widgets/CheckBox.hpp" #include "Widgets/ComboBox.hpp" #include "Widgets/TextInput.hpp" +#include "Widgets/HyperLink.hpp" #include "slic3r/Utils/CalibUtils.hpp" -#include #define AMS_MATERIALS_SETTING_DEF_COLOUR wxColour(255, 255, 255) #define AMS_MATERIALS_SETTING_GREY900 wxColour(38, 46, 48) @@ -174,7 +174,7 @@ protected: wxPanel * m_panel_kn; wxStaticText* m_ratio_text; - wxHyperlinkCtrl * m_wiki_ctrl; + HyperLink * m_wiki_ctrl; wxStaticText* m_k_param; TextInput* m_input_k_val; wxStaticText* m_n_param; diff --git a/src/slic3r/GUI/BindDialog.cpp b/src/slic3r/GUI/BindDialog.cpp index 7610fbe820..3847f8f2f1 100644 --- a/src/slic3r/GUI/BindDialog.cpp +++ b/src/slic3r/GUI/BindDialog.cpp @@ -98,18 +98,8 @@ PingCodeBindDialog::PingCodeBindDialog(Plater* plater /*= nullptr*/) m_status_text->Wrap(FromDIP(440)); m_status_text->SetForegroundColour(wxColour(38, 46, 48)); - m_link_show_ping_code_wiki = new wxStaticText(request_bind_panel, wxID_ANY, _L("Can't find Pin Code?")); - m_link_show_ping_code_wiki->SetFont(Label::Body_14); - m_link_show_ping_code_wiki->SetBackgroundColour(*wxWHITE); - m_link_show_ping_code_wiki->SetForegroundColour(wxColour(31, 142, 234)); - - m_link_show_ping_code_wiki->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_link_show_ping_code_wiki->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); - - m_link_show_ping_code_wiki->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { - m_ping_code_wiki = "https://wiki.bambulab.com/en/bambu-studio/manual/pin-code"; - wxLaunchDefaultBrowser(m_ping_code_wiki); - }); + // ORCA standardized HyperLink + m_link_show_ping_code_wiki = new HyperLink(request_bind_panel, _L("Can't find Pin Code?"), "https://wiki.bambulab.com/en/bambu-studio/manual/pin-code"); m_text_input_title = new wxStaticText(request_bind_panel, wxID_ANY, _L("Pin Code")); m_text_input_title->SetFont(Label::Body_14); @@ -453,11 +443,11 @@ PingCodeBindDialog::~PingCodeBindDialog() { m_st_privacy_title->SetFont(Label::Body_13); m_st_privacy_title->SetForegroundColour(wxColour(38, 46, 48)); - auto m_link_Terms_title = new Label(m_panel_agreement, _L("Terms and Conditions")); + // ORCA standardized HyperLink + auto m_link_Terms_title = new HyperLink(m_panel_agreement, _L("Terms and Conditions")); m_link_Terms_title->SetFont(Label::Head_13); m_link_Terms_title->SetMaxSize(wxSize(FromDIP(450), -1)); m_link_Terms_title->Wrap(FromDIP(450)); - m_link_Terms_title->SetForegroundColour(wxColour("#009688")); m_link_Terms_title->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { wxString txt = _L("Thank you for purchasing a Bambu Lab device. Before using your Bambu Lab device, please read the terms and conditions. " "By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy Policy and Terms of Use (collectively, the \"Terms\"). " @@ -467,18 +457,16 @@ PingCodeBindDialog::~PingCodeBindDialog() { confirm_dlg.CenterOnParent(); confirm_dlg.on_show(); }); - m_link_Terms_title->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_link_Terms_title->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); auto m_st_and_title = new Label(m_panel_agreement, _L("and")); m_st_and_title->SetFont(Label::Body_13); m_st_and_title->SetForegroundColour(wxColour(38, 46, 48)); - auto m_link_privacy_title = new Label(m_panel_agreement, _L("Privacy Policy")); + // ORCA standardized HyperLink + auto m_link_privacy_title = new HyperLink(m_panel_agreement, _L("Privacy Policy")); m_link_privacy_title->SetFont(Label::Head_13); m_link_privacy_title->SetMaxSize(wxSize(FromDIP(450), -1)); m_link_privacy_title->Wrap(FromDIP(450)); - m_link_privacy_title->SetForegroundColour(wxColour("#009688")); m_link_privacy_title->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { std::string url; std::string country_code = Slic3r::GUI::wxGetApp().app_config->get_country_code(); @@ -491,8 +479,6 @@ PingCodeBindDialog::~PingCodeBindDialog() { } wxLaunchDefaultBrowser(url); }); - m_link_privacy_title->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND);}); - m_link_privacy_title->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW);}); sizere_notice_agreement->Add(0, 0, 0, wxTOP, FromDIP(4)); sizer_privacy_agreement->Add(m_st_privacy_title, 0, wxALIGN_CENTER, 0); @@ -514,13 +500,11 @@ PingCodeBindDialog::~PingCodeBindDialog() { m_st_notice_title->SetFont(Label::Body_13); m_st_notice_title->SetForegroundColour(wxColour(38, 46, 48)); - auto m_link_notice_title = new Label(m_panel_agreement, notice_link_title); + // ORCA standardized HyperLink + auto m_link_notice_title = new HyperLink(m_panel_agreement, notice_link_title); m_link_notice_title->SetFont(Label::Head_13); m_link_notice_title->SetMaxSize(wxSize(FromDIP(450), -1)); m_link_notice_title->Wrap(FromDIP(450)); - m_link_notice_title->SetForegroundColour(wxColour("#009688")); - m_link_notice_title->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_link_notice_title->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); m_link_notice_title->Bind(wxEVT_LEFT_DOWN, [this](auto& e) { wxString txt = _L("In the 3D Printing community, we learn from each other's successes and failures to adjust " "our own slicing parameters and settings. %s follows the same principle and uses machine " @@ -580,13 +564,8 @@ PingCodeBindDialog::~PingCodeBindDialog() { wxBoxSizer* m_sizer_bind_failed_info = new wxBoxSizer(wxVERTICAL); m_sw_bind_failed_info->SetSizer( m_sizer_bind_failed_info ); - m_link_network_state = new wxHyperlinkCtrl(m_sw_bind_failed_info, wxID_ANY,_L("Check the status of current system services"),""); - m_link_network_state->SetFont(::Label::Body_12); - m_link_network_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check(); }); - m_link_network_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_HAND); }); - m_link_network_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_ARROW); }); - - + // ORCA standardized HyperLink + m_link_network_state = new HyperLink(m_sw_bind_failed_info, _L("Check the status of current system services"), wxGetApp().link_to_network_check()); wxBoxSizer* sizer_error_code = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL); diff --git a/src/slic3r/GUI/BindDialog.hpp b/src/slic3r/GUI/BindDialog.hpp index a4ffd8fbff..b809bc523b 100644 --- a/src/slic3r/GUI/BindDialog.hpp +++ b/src/slic3r/GUI/BindDialog.hpp @@ -17,13 +17,13 @@ #include #include #include -#include #include "wxExtensions.hpp" #include "Widgets/StepCtrl.hpp" #include "Widgets/ProgressDialog.hpp" #include "Widgets/Button.hpp" #include "Widgets/ProgressBar.hpp" #include "Widgets/RoundedRectangle.hpp" +#include "Widgets/HyperLink.hpp" #include "Jobs/BindJob.hpp" #include "BBLStatusBar.hpp" #include "BBLStatusBarBind.hpp" @@ -56,7 +56,7 @@ private: Label* m_status_text; wxStaticText* m_text_input_title; - wxStaticText* m_link_show_ping_code_wiki; + HyperLink* m_link_show_ping_code_wiki; // ORCA TextInput* m_text_input_single_code[PING_CODE_LENGTH]; Button* m_button_bind; Button* m_button_cancel; @@ -70,7 +70,7 @@ private: Label* m_st_txt_error_code{ nullptr }; Label* m_st_txt_error_desc{ nullptr }; Label* m_st_txt_extra_info{ nullptr }; - wxHyperlinkCtrl* m_link_network_state{ nullptr }; + HyperLink* m_link_network_state{ nullptr }; wxString m_result_info; wxString m_result_extra; wxString m_ping_code_wiki; @@ -114,7 +114,7 @@ private: Label* m_st_txt_error_code{ nullptr }; Label* m_st_txt_error_desc{ nullptr }; Label* m_st_txt_extra_info{ nullptr }; - wxHyperlinkCtrl* m_link_network_state{ nullptr }; + HyperLink* m_link_network_state{ nullptr }; wxString m_result_info; wxString m_result_extra; bool m_show_error_info_state = true; diff --git a/src/slic3r/GUI/CalibrationPanel.cpp b/src/slic3r/GUI/CalibrationPanel.cpp index 055cbe905d..12162615aa 100644 --- a/src/slic3r/GUI/CalibrationPanel.cpp +++ b/src/slic3r/GUI/CalibrationPanel.cpp @@ -269,7 +269,7 @@ void SelectMObjectPopup::Popup(wxWindow* WXUNUSED(focus)) } } - wxPostEvent(this, wxTimerEvent()); + wxPostEvent(this, wxTimerEvent(*m_refresh_timer)); PopupWindow::Popup(); } @@ -505,7 +505,7 @@ void CalibrationPanel::init_timer() m_refresh_timer = new wxTimer(); m_refresh_timer->SetOwner(this); m_refresh_timer->Start(REFRESH_INTERVAL); - wxPostEvent(this, wxTimerEvent()); + wxPostEvent(this, wxCommandEvent(wxEVT_TIMER)); } void CalibrationPanel::on_timer(wxTimerEvent& event) { @@ -634,7 +634,7 @@ bool CalibrationPanel::Show(bool show) { m_refresh_timer->Stop(); m_refresh_timer->SetOwner(this); m_refresh_timer->Start(REFRESH_INTERVAL); - wxPostEvent(this, wxTimerEvent()); + wxPostEvent(this, wxCommandEvent(wxEVT_TIMER)); DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (dev) { diff --git a/src/slic3r/GUI/CalibrationWizardPage.cpp b/src/slic3r/GUI/CalibrationWizardPage.cpp index 3da543e79d..13e7023190 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.cpp +++ b/src/slic3r/GUI/CalibrationWizardPage.cpp @@ -466,21 +466,12 @@ void CaliPageCaption::init_bitmaps() { void CaliPageCaption::create_wiki(wxWindow* parent) { - m_wiki_text = new Label(parent, _L("Wiki")); - m_wiki_text->SetFont(Label::Head_14); - m_wiki_text->SetForegroundColour({ 0, 88, 220 }); - m_wiki_text->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_HAND); - }); - m_wiki_text->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { - e.Skip(); - SetCursor(wxCURSOR_ARROW); - }); + // ORCA standardized HyperLink + m_wiki_text = new HyperLink(parent, _L("Wiki Guide")); m_wiki_text->Bind(wxEVT_LEFT_UP, [this](wxMouseEvent& e) { if (!m_wiki_url.empty()) wxLaunchDefaultBrowser(m_wiki_url); - }); + }); } void CaliPageCaption::show_prev_btn(bool show) diff --git a/src/slic3r/GUI/CalibrationWizardPage.hpp b/src/slic3r/GUI/CalibrationWizardPage.hpp index d03979cd55..524b1a6029 100644 --- a/src/slic3r/GUI/CalibrationWizardPage.hpp +++ b/src/slic3r/GUI/CalibrationWizardPage.hpp @@ -7,6 +7,7 @@ #include "Widgets/TextInput.hpp" #include "Widgets/AMSControl.hpp" #include "Widgets/ProgressBar.hpp" +#include "Widgets/HyperLink.hpp" #include "wxExtensions.hpp" #include "PresetComboBoxes.hpp" @@ -140,7 +141,7 @@ private: void init_bitmaps(); void create_wiki(wxWindow* parent); - Label* m_wiki_text; + HyperLink* m_wiki_text; // ORCA wxString m_wiki_url; ScalableBitmap m_prev_bmp_normal; ScalableBitmap m_prev_bmp_hover; diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 60828cedcf..90944e673e 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -604,8 +604,8 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co // Infill patterns that support multiline infill. InfillPattern pattern = config->opt_enum("sparse_infill_pattern"); - bool have_multiline_infill_pattern = pattern == ipGyroid || pattern == ipGrid || pattern == ipRectilinear || pattern == ipTpmsD || pattern == ipTpmsFK || pattern == ipCrossHatch || pattern == ipHoneycomb || pattern == ipLateralLattice || pattern == ipLateralHoneycomb || - pattern == ipCubic || pattern == ipStars || pattern == ipAlignedRectilinear || pattern == ipLightning || pattern == ip3DHoneycomb || pattern == ipAdaptiveCubic || pattern == ipSupportCubic; + bool have_multiline_infill_pattern = pattern == ipGyroid || pattern == ipGrid || pattern == ipRectilinear || pattern == ipTpmsD || pattern == ipTpmsFK || pattern == ipCrossHatch || pattern == ipHoneycomb || pattern == ipLateralLattice || pattern == ipLateralHoneycomb || pattern == ipConcentric || + pattern == ipCubic || pattern == ipStars || pattern == ipAlignedRectilinear || pattern == ipLightning || pattern == ip3DHoneycomb || pattern == ipAdaptiveCubic || pattern == ipSupportCubic|| pattern == ipTriangles || pattern == ipQuarterCubic|| pattern == ipArchimedeanChords || pattern == ipHilbertCurve || pattern == ipOctagramSpiral; // If there is infill, enable/disable fill_multiline according to whether the pattern supports multiline infill. if (have_infill) { @@ -705,6 +705,7 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co bool have_brim = (config->opt_enum("brim_type") != btNoBrim); toggle_field("brim_object_gap", have_brim); + toggle_field("brim_use_efc_outline", have_brim); bool have_brim_width = (config->opt_enum("brim_type") != btNoBrim) && config->opt_enum("brim_type") != btAutoBrim && config->opt_enum("brim_type") != btPainted; toggle_field("brim_width", have_brim_width); @@ -774,10 +775,11 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co // Orca: Force solid support interface when using support ironing toggle_field("support_interface_spacing", have_support_material && have_support_interface && !has_support_ironing); - bool have_skirt_height = have_skirt && - (config->opt_int("skirt_height") > 1 || config->opt_enum("draft_shield") != dsEnabled); - toggle_line("support_speed", have_support_material || have_skirt_height); - toggle_line("support_interface_speed", have_support_material && have_support_interface); +// see issue #10915 +// bool have_skirt_height = have_skirt && +// (config->opt_int("skirt_height") > 1 || config->opt_enum("draft_shield") != dsEnabled); +// toggle_line("support_speed", have_support_material || have_skirt_height); +// toggle_line("support_interface_speed", have_support_material && have_support_interface); // BBS //toggle_field("support_material_synchronize_layers", have_support_soluble); @@ -934,12 +936,15 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig *config, co bool lattice_options = config->opt_enum("sparse_infill_pattern") == InfillPattern::ipLateralLattice; for (auto el : { "lateral_lattice_angle_1", "lateral_lattice_angle_2"}) toggle_line(el, lattice_options); + + // Adaptative Cubic and support cubic infill patterns do not support infill rotation. + bool FillAdaptive = (pattern == InfillPattern::ipAdaptiveCubic || pattern == InfillPattern::ipSupportCubic); - //Orca: disable infill_direction/solid_infill_direction if sparse_infill_rotate_template/solid_infill_rotate_template is not empty value - toggle_field("infill_direction", config->opt_string("sparse_infill_rotate_template") == ""); + //Orca: disable infill_direction/solid_infill_direction if sparse_infill_rotate_template/solid_infill_rotate_template is not empty value and adaptive cubic/support cubic infill pattern is not selected + toggle_field("sparse_infill_rotate_template", !FillAdaptive); + toggle_field("infill_direction", config->opt_string("sparse_infill_rotate_template") == "" && !FillAdaptive); toggle_field("solid_infill_direction", config->opt_string("solid_infill_rotate_template") == ""); - - + toggle_line("infill_overhang_angle", config->opt_enum("sparse_infill_pattern") == InfillPattern::ipLateralHoneycomb); std::string printer_type = wxGetApp().preset_bundle->printers.get_edited_preset().get_printer_type(wxGetApp().preset_bundle); diff --git a/src/slic3r/GUI/CreatePresetsDialog.cpp b/src/slic3r/GUI/CreatePresetsDialog.cpp index 7eb3beda82..269cd6ed12 100644 --- a/src/slic3r/GUI/CreatePresetsDialog.cpp +++ b/src/slic3r/GUI/CreatePresetsDialog.cpp @@ -17,6 +17,7 @@ #include "Tab.hpp" #include "MainFrame.hpp" #include "libslic3r_version.h" +#include "Widgets/HyperLink.hpp" // ORCA #define NAME_OPTION_COMBOBOX_SIZE wxSize(FromDIP(200), FromDIP(24)) #define FILAMENT_PRESET_COMBOBOX_SIZE wxSize(FromDIP(300), FromDIP(24)) @@ -5027,8 +5028,8 @@ wxPanel *PresetTree::get_child_item(wxPanel *parent, std::shared_ptr pre bool base_id_error = false; if (preset->inherits() == "" && preset->base_id != "") base_id_error = true; if (base_id_error) { - std::string wiki_url = "https://wiki.bambulab.com/en/software/bambu-studio/custom-filament-issue"; - wxHyperlinkCtrl *m_download_hyperlink = new wxHyperlinkCtrl(panel, wxID_ANY, _L("[Delete Required]"), wiki_url, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); + // ORCA standardized HyperLink + HyperLink *m_download_hyperlink = new HyperLink(panel, _L("[Delete Required]"), "https://wiki.bambulab.com/en/software/bambu-studio/custom-filament-issue"); m_download_hyperlink->SetFont(Label::Body_10); sizer->Add(m_download_hyperlink, 0, wxEXPAND | wxALL, 5); } diff --git a/src/slic3r/GUI/DeviceCore/DevManager.cpp b/src/slic3r/GUI/DeviceCore/DevManager.cpp index d19f1aa0dd..5c32f42c2b 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.cpp +++ b/src/slic3r/GUI/DeviceCore/DevManager.cpp @@ -90,6 +90,25 @@ namespace Slic3r userMachineList.clear(); } + void DeviceManager::set_agent(NetworkAgent* agent) + { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": updating agent for " + << localMachineList.size() << " local and " + << userMachineList.size() << " user machines"; + m_agent = agent; + + std::lock_guard lock(listMutex); + for (auto& it : localMachineList) { + if (it.second) { + it.second->set_agent(agent); + } + } + for (auto& it : userMachineList) { + if (it.second) { + it.second->set_agent(agent); + } + } + } void DeviceManager::EnableMultiMachine(bool enable) { diff --git a/src/slic3r/GUI/DeviceCore/DevManager.h b/src/slic3r/GUI/DeviceCore/DevManager.h index fbc30c0050..5ecb77401d 100644 --- a/src/slic3r/GUI/DeviceCore/DevManager.h +++ b/src/slic3r/GUI/DeviceCore/DevManager.h @@ -40,7 +40,7 @@ public: public: NetworkAgent* get_agent() const { return m_agent; } - void set_agent(NetworkAgent* agent) { m_agent = agent; } + void set_agent(NetworkAgent* agent); void start_refresher(); void stop_refresher(); diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 112b514ab3..f4362cc3f7 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -135,6 +135,8 @@ public: MachineObject(DeviceManager* manager, NetworkAgent* agent, std::string name, std::string id, std::string ip); ~MachineObject(); + void set_agent(NetworkAgent* agent) { m_agent = agent; } + public: enum ActiveState { NotActive, diff --git a/src/slic3r/GUI/DownloadProgressDialog.cpp b/src/slic3r/GUI/DownloadProgressDialog.cpp index 1c4f7a9bfb..7ded82037e 100644 --- a/src/slic3r/GUI/DownloadProgressDialog.cpp +++ b/src/slic3r/GUI/DownloadProgressDialog.cpp @@ -19,10 +19,13 @@ //#include "ConfigWizard.hpp" #include "wxExtensions.hpp" #include "slic3r/GUI/MainFrame.hpp" +#include "slic3r/GUI/MsgDialog.hpp" #include "GUI_App.hpp" #include "Jobs/BoostThreadWorker.hpp" #include "Jobs/PlaterWorker.hpp" +#include "Widgets/HyperLink.hpp" // ORCA + #define DESIGN_INPUT_SIZE wxSize(FromDIP(100), -1) namespace Slic3r { @@ -72,7 +75,8 @@ DownloadProgressDialog::DownloadProgressDialog(wxString title) sizer_download_failed->Add(m_statictext_download_failed, 0, wxALIGN_CENTER | wxALL, 5); - auto m_download_hyperlink = new wxHyperlinkCtrl(m_panel_download_failed, wxID_ANY, _L("click here to see more info"), download_failed_url, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); + // ORCA standardized HyperLink + auto m_download_hyperlink = new HyperLink(m_panel_download_failed, _L("click here to see more info"), download_failed_url); sizer_download_failed->Add(m_download_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); @@ -93,7 +97,8 @@ DownloadProgressDialog::DownloadProgressDialog(wxString title) sizer_install_failed->Add(m_statictext_install_failed, 0, wxALIGN_CENTER | wxALL, 5); - auto m_install_hyperlink = new wxHyperlinkCtrl(m_panel_install_failed, wxID_ANY, _L("click here to see more info"), install_failed_url, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); + // ORCA standardized HyperLink + auto m_install_hyperlink = new HyperLink(m_panel_install_failed, _L("click here to see more info"), install_failed_url); sizer_install_failed->Add(m_install_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); @@ -203,6 +208,16 @@ void DownloadProgressDialog::update_release_note(std::string release_note, std:: std::unique_ptr DownloadProgressDialog::make_job() { return std::make_unique(); } -void DownloadProgressDialog::on_finish() { wxGetApp().restart_networking(); } +void DownloadProgressDialog::on_finish() +{ + if (wxGetApp().hot_reload_network_plugin()) { + return; + } + + MessageDialog dlg(nullptr, + _L("The network plugin was installed but could not be loaded. Please restart the application."), + _L("Restart Required"), wxOK | wxICON_INFORMATION); + dlg.ShowModal(); +} }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/FilamentGroupPopup.cpp b/src/slic3r/GUI/FilamentGroupPopup.cpp index 89c9dbd8de..df78e69a80 100644 --- a/src/slic3r/GUI/FilamentGroupPopup.cpp +++ b/src/slic3r/GUI/FilamentGroupPopup.cpp @@ -147,15 +147,10 @@ FilamentGroupPopup::FilamentGroupPopup(wxWindow *parent) : PopupWindow(parent, w { wxBoxSizer *button_sizer = new wxBoxSizer(wxHORIZONTAL); - const std::string wiki_path = Slic3r::resources_dir() + "/wiki/filament_group_wiki_zh.html"; + const std::string wiki_path = Slic3r::resources_dir() + "/wiki/filament_group_wiki_zh.html"; // NEEDFIX this link is broken auto* wiki_sizer = new wxBoxSizer(wxHORIZONTAL); - wiki_link = new wxStaticText(this, wxID_ANY, _L("Learn more")); - wiki_link->SetBackgroundColour(BackGroundColor); - wiki_link->SetForegroundColour(GreenColor); - wiki_link->SetFont(Label::Body_12.Underlined()); - wiki_link->SetCursor(wxCursor(wxCURSOR_HAND)); - wiki_link->Bind(wxEVT_LEFT_DOWN, [wiki_path](wxMouseEvent &) { wxLaunchDefaultBrowser(wxString(wiki_path.c_str())); }); + wiki_link = new HyperLink(this, _L("Wiki Guide"), wxString(wiki_path.c_str())); // ORCA wiki_sizer->Add(wiki_link, 0, wxALIGN_CENTER | wxALL, FromDIP(3)); button_sizer->Add(wiki_sizer, 0, wxLEFT, horizontal_margin); diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 34babf8e66..aa31e0b4f3 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -804,17 +804,13 @@ void GCodeViewer::init(ConfigOptionMode mode, PresetBundle* preset_bundle) msg_dlg.ShowModal(); } - if (preset_bundle) - m_nozzle_nums = preset_bundle->get_printer_extruder_count(); - - // set to color print by default if use multi extruders - if (m_nozzle_nums > 1) { - m_view_type_sel = std::distance(view_type_items.begin(),std::find(view_type_items.begin(), view_type_items.end(), libvgcode::EViewType::Summary)); - set_view_type(libvgcode::EViewType::Summary); - } else { - m_view_type_sel = std::distance(view_type_items.begin(),std::find(view_type_items.begin(), view_type_items.end(), libvgcode::EViewType::ColorPrint)); - set_view_type(libvgcode::EViewType::ColorPrint); - } + // Orca: + // Default view type at first slice. + // May be overridden in load() once we know how many tools are actually used in the G-code. + m_nozzle_nums = preset_bundle ? preset_bundle->get_printer_extruder_count() : 1; + auto it = std::find(view_type_items.begin(), view_type_items.end(), EViewType::FeatureType); + m_view_type_sel = (it != view_type_items.end()) ? std::distance(view_type_items.begin(), it) : 0; + set_view_type(EViewType::FeatureType); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": finished"); } @@ -1087,6 +1083,22 @@ void GCodeViewer::load_as_gcode(const GCodeProcessorResult& gcode_result, const m_max_print_height = gcode_result.printable_height; m_z_offset = gcode_result.z_offset; + load_toolpaths(gcode_result, build_volume, exclude_bounding_box); + + // ORCA: Only show filament/color print preview if more than one tool/extruder is actually used in the toolpaths. + // Only reset back to Toolpaths (FeatureType) if we are currently in ColorPrint and this load is single-tool. + if (m_extruder_ids.size() > 1) { + auto it = std::find(view_type_items.begin(), view_type_items.end(), EViewType::ColorPrint); + if (it != view_type_items.end()) + m_view_type_sel = std::distance(view_type_items.begin(), it); + set_view_type(EViewType::ColorPrint); + } else if (m_view_type == EViewType::ColorPrint) { + auto it = std::find(view_type_items.begin(), view_type_items.end(), EViewType::FeatureType); + if (it != view_type_items.end()) + m_view_type_sel = std::distance(view_type_items.begin(), it); + set_view_type(EViewType::FeatureType); + } + // BBS: data for rendering color arrangement recommendation m_nozzle_nums = print.config().option("nozzle_diameter")->values.size(); // Orca hack: Hide filament group for non-bbl printers diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 0c14826057..fe9b60ea93 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5879,6 +5879,7 @@ static const float cameraProjection[16] = {1.f, 0.f, 0.f, 0.f, 0.f, 1.f, 0.f, 0. void GLCanvas3D::_render_3d_navigator() { if (!wxGetApp().show_3d_navigator()) { + m_canvas_toolbar_pos[0] = 0; return; } @@ -5925,7 +5926,7 @@ void GLCanvas3D::_render_3d_navigator() } const float size = 128 * sc; - m_axis_button_pos[0] = size - 10; + m_canvas_toolbar_pos[0] = size; const auto result = ImGuizmo::ViewManipulate(cameraView, cameraProjection, ImGuizmo::OPERATION::ROTATE, ImGuizmo::MODE::WORLD, nullptr, camDistance, ImVec2(viewManipulateLeft, viewManipulateTop - size), ImVec2(size, size), 0x00101010); @@ -5961,7 +5962,6 @@ void GLCanvas3D::_render_3d_navigator() request_extra_frame(); } - _render_camera_toolbar(); } #define ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT 0 @@ -7815,6 +7815,8 @@ void GLCanvas3D::_render_overlays() m_labels.render(sorted_instances); _render_3d_navigator(); + + _render_canvas_toolbar(); } void GLCanvas3D::_render_style_editor() @@ -8453,47 +8455,169 @@ void GLCanvas3D::_render_return_toolbar() const imgui.end(); } -void GLCanvas3D::_render_camera_toolbar() +void GLCanvas3D::_render_canvas_toolbar() { - float font_size = ImGui::GetFontSize(); - float sc = get_scale(); - ImVec2 button_icon_size = ImVec2(font_size * 2.5, font_size * 2.5); + ImGuiWrapper &imgui = *wxGetApp().imgui(); + float sc = get_scale(); - ImGuiWrapper &imgui = *wxGetApp().imgui(); - float window_width = button_icon_size.x + imgui.scaled(2.0f); - float window_height = button_icon_size.y + imgui.scaled(2.0f); + #ifdef WIN32 + const int dpi = get_dpi_for_window(wxGetApp().GetTopWindow()); + sc *= (float) dpi / (float) DPI_DEFAULT; + #endif // WIN32 - Size cnv_size = get_canvas_size(); - m_axis_button_pos[1] = cnv_size.get_height() - button_icon_size[1] - 20 * sc; - imgui.set_next_window_pos(m_axis_button_pos[0], m_axis_button_pos[1], ImGuiCond_Always, 0, 0); -#ifdef __WINDOWS__ - imgui.set_next_window_size(window_width, window_height, ImGuiCond_Always); -#endif + ImVec2 btn_size = ImVec2(36.f, 36.f) * sc; + ImVec2 margin = ImVec2(m_canvas_toolbar_pos[0] > 0 ? 0.f : (10.f * sc), 10.f * sc); + ImVec2 spacing = ImVec2(6.f, 6.f) * sc; + ImVec2 padding = ImVec2(2.f, 2.f) * sc; + Vec2i32 pos = { + m_canvas_toolbar_pos[0] + margin.x, + get_canvas_size().get_height() - margin.y + }; + bool zoom_btn = wxGetApp().show_canvas_zoom_button(); - imgui.begin(_L("Toggle Axis"), ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMove | + imgui.set_next_window_pos(pos[0], pos[1], ImGuiCond_Always, 0, 1); // pivot bottom-left + + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0 ); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding , {0,0}); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing , {0,0}); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding , padding); // without padding images clipping + + imgui.begin(_L("Canvas Toolbar"), ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse);// - ImTextureID normal_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE_DARK : GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE); - ImTextureID hover_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE_DARK_HOVER : GLGizmosManager::MENU_ICON_NAME::IC_AXIS_TOGGLE_HOVER); + ImTextureID m_normal_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU_DARK : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU); + ImTextureID m_hover_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU_DARK_HOVER : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_MENU_HOVER); - ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 0.0f); - ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, {0, 0}); - - if (ImGui::ImageButton3(normal_id, hover_id, button_icon_size, ImVec2(0, 0), ImVec2(1, 1), -1, - ImVec4(0, 0, 0, 0), ImVec4(1, 1, 1, 1), ImVec2(10, 0))) { - //select_view("plate"); - - if (m_canvas_type == ECanvasType::CanvasView3D || m_canvas_type == ECanvasType::CanvasPreview) { - toggle_world_axes_visibility(false); + if (ImGui::ImageButton3(m_normal_id, m_hover_id, btn_size)) { + if(!ImGui::IsPopupOpen("CanvasToolbarMenu")){ + ImGui::SetNextWindowPos(ImVec2(pos[0] + padding.x, pos[1] - padding.y - (zoom_btn ? (btn_size.y + spacing.y) : 0.f)), ImGuiCond_Always, ImVec2(0, 1)); // pivot bottom-left + ImGui::OpenPopup("CanvasToolbarMenu"); } + } + + if(zoom_btn){ + ImGui::Dummy({ 0, spacing.y}); + ImTextureID z_normal_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM_DARK : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM); + ImTextureID z_hover_id = m_gizmos.get_icon_texture_id(m_is_dark ? GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM_DARK_HOVER : GLGizmosManager::MENU_ICON_NAME::IC_CANVAS_ZOOM_HOVER); + + if (ImGui::ImageButton3(z_normal_id, z_hover_id, btn_size)) { + select_view("plate"); + if (m_selection.is_empty()) { + if (m_canvas_type == ECanvasType::CanvasAssembleView) + zoom_to_volumes(); + else + zoom_to_bed(); + } else { + zoom_to_selection(); + } + } else if (ImGui::IsItemHovered()) { + auto tooltip = _L("Fit camera to scene or selected object."); + auto width = ImGui::CalcTextSize(tooltip.c_str()).x + imgui.scaled(2.0f); + imgui.tooltip(tooltip, width); + } } - if (ImGui::IsItemHovered()) { - auto temp_tooltip = _L("Toggle Axis"); - auto width = ImGui::CalcTextSize(temp_tooltip.c_str()).x + imgui.scaled(2.0f); - imgui.tooltip(temp_tooltip, width); + + ImGui::PopStyleVar(4); // Window + + ImGui::PushStyleColor(ImGuiCol_PopupBg , m_is_dark ? ImGuiWrapper::COL_TOOLBAR_BG_DARK : ImGuiWrapper::COL_TOOLBAR_BG); + ImGui::PushStyleColor(ImGuiCol_Separator , m_is_dark ? ImVec4(1, 1, 1, .20f) : ImVec4(0, 0, 0, .2f)); + ImGui::PushStyleColor(ImGuiCol_Text , m_is_dark ? ImVec4(1, 1, 1, .88f) : ImVec4(50 / 255.f, 58 / 255.f, 61 / 255.f, 1.f)); + ImGui::PushStyleColor(ImGuiCol_TextDisabled , m_is_dark ? ImVec4(1, 1, 1, .44f) : ImVec4(50 / 255.f, 58 / 255.f, 61 / 255.f, .5f)); + ImGui::PushStyleColor(ImGuiCol_HeaderHovered , ImVec4(0, 0, 0, 0.f)); // bg color for menu item + ImGui::PushStyleColor(ImGuiCol_BorderActive , ImGuiWrapper::COL_ORCA); + ImGui::PushStyleVar(ImGuiStyleVar_PopupBorderSize, 0.f ); + ImGui::PushStyleVar(ImGuiStyleVar_PopupRounding , 8.f * sc); + ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.f * sc); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding , 2.f * sc); + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding , ImVec2(4.f, 10.f) * sc); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing , ImVec2(0.f, 8.f ) * sc); + + if (ImGui::BeginPopup("CanvasToolbarMenu")) { + ImGui::PushItemFlag(ImGuiItemFlags_SelectableDontClosePopup, true); + + Plater* p = wxGetApp().plater(); + AppConfig* cfg = wxGetApp().app_config; + + auto create_menu_item = [this, sc]( + const std::string& name, + bool enable, + bool condition, + const std::function& action + ) { + ImGui::Dummy({2.f * sc,0}); + ImGui::SameLine(); + if (ImGui::BBLMenuItem((" " + _u8L(name)).c_str(), nullptr, false, enable, ImGui::CalcTextSize(_u8L(name).c_str()).y)) + action(); + ImGui::SameLine(12.f * sc); + ImGui::TextColored(enable ? ImVec4(1,1,1,1) : ImGui::GetStyleColorVec4(ImGuiCol_TextDisabled), "%s", into_u8(condition ? ImGui::VisibleIcon : ImGui::HiddenIcon).c_str()); + }; + + create_menu_item( "3D Navigator", + m_canvas_type != ECanvasType::CanvasAssembleView, // not work on assembly + wxGetApp().show_3d_navigator(), + [this]{ + wxGetApp().toggle_show_3d_navigator(); + ImGui::CloseCurrentPopup(); // Close popup to show changes on UI + } + ); + + create_menu_item( "Zoom button", + true, // work on all + wxGetApp().show_canvas_zoom_button(), + [this]{ + wxGetApp().toggle_canvas_zoom_button(); + ImGui::CloseCurrentPopup(); // Close popup to show changes on UI + } + ); + + ImGui::Separator(); + + create_menu_item( "Overhangs", + m_canvas_type == ECanvasType::CanvasView3D, // work only on prepare + p->is_view3D_overhang_shown(), + [this, p]{p->show_view3D_overhang(!p->is_view3D_overhang_shown());} + ); + + create_menu_item( "Outline", + m_canvas_type != ECanvasType::CanvasPreview, // not work on preview + wxGetApp().show_outline(), + [this]{wxGetApp().toggle_show_outline();} + ); + + ImGui::Separator(); + + create_menu_item( "Perspective", + true, // work on all + cfg->get_bool("use_perspective_camera"), + [this, &cfg]{ + cfg->set_bool("use_perspective_camera", !(cfg->get_bool("use_perspective_camera"))); + wxGetApp().update_ui_from_settings(); + } + ); + + ImGui::Separator(); + + create_menu_item( "Axes", + m_canvas_type != ECanvasType::CanvasAssembleView, // not work on assembly + m_show_world_axes, + [this]{toggle_world_axes_visibility(false);} + ); + + // will add an option for gridlines in here + + create_menu_item( "Labels", + m_canvas_type == ECanvasType::CanvasView3D, // work only on prepare + p->are_view3D_labels_shown(), + [this, p]{p->show_view3D_labels(!p->are_view3D_labels_shown());} + ); + + ImGui::PopItemFlag(); + ImGui::EndPopup(); } - ImGui::PopStyleVar(2); + + ImGui::PopStyleColor(6); + ImGui::PopStyleVar(6); imgui.end(); } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index b3f6f106ea..17a388c731 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -538,7 +538,7 @@ private: mutable IMToolbar m_sel_plate_toolbar; mutable GLToolbar m_assemble_view_toolbar; mutable IMReturnToolbar m_return_toolbar; - mutable Vec2i32 m_axis_button_pos = {128, 5}; + mutable Vec2i32 m_canvas_toolbar_pos = {140, 5}; mutable float m_sc{1}; mutable float m_paint_toolbar_width; @@ -1255,7 +1255,7 @@ private: void _render_imgui_select_plate_toolbar(); void _render_assemble_view_toolbar() const; void _render_return_toolbar() const; - void _render_camera_toolbar(); + void _render_canvas_toolbar(); void _render_separator_toolbar_right() const; void _render_separator_toolbar_left() const; void _render_collapse_toolbar() const; diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp index ce0c24d08a..d133720c7e 100644 --- a/src/slic3r/GUI/GUI.cpp +++ b/src/slic3r/GUI/GUI.cpp @@ -108,7 +108,12 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt try{ if (config.def()->get(opt_key)->type == coBools && config.def()->get(opt_key)->nullable) { - auto vec_new = std::make_unique(1, boost::any_cast(value) ); + const auto v = boost::any_cast(value); + auto vec_new = std::make_unique(1, v); + if (v == ConfigOptionBoolsNullable::nil_value()) { + vec_new->set_at_to_nil(0); + } + config.option(opt_key)->set_at(vec_new.get(), opt_index, 0); return; } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 092bed49ae..01961271c6 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -98,6 +99,7 @@ #include "UnsavedChangesDialog.hpp" #include "SavePresetDialog.hpp" #include "PrintHostDialogs.hpp" +#include "NetworkPluginDialog.hpp" #include "DesktopIntegrationDialog.hpp" #include "SendSystemInfoDialog.hpp" #include "ParamsDialog.hpp" @@ -959,15 +961,7 @@ void GUI_App::post_init() m_show_gcode_window = app_config->get_bool("show_gcode_window"); if (m_networking_need_update) { - //updating networking - int ret = updating_bambu_networking(); - if (!ret) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__<<":networking plugin updated successfully"; - //restart_networking(); - } - else { - BOOST_LOG_TRIVIAL(error) << __FUNCTION__<<":networking plugin updated failed"; - } + show_network_plugin_download_dialog(false); } // Start preset sync after project opened, otherwise we could have preset change during project opening which could cause crash @@ -1177,12 +1171,20 @@ std::string GUI_App::get_plugin_url(std::string name, std::string country_code) { std::string url = get_http_url(country_code); - std::string curr_version = NetworkAgent::use_legacy_network ? BAMBU_NETWORK_AGENT_VERSION_LEGACY : BAMBU_NETWORK_AGENT_VERSION; + std::string curr_version; + if (NetworkAgent::use_legacy_network) { + curr_version = BAMBU_NETWORK_AGENT_VERSION_LEGACY; + } else if (name == "plugins" && app_config) { + std::string user_version = app_config->get_network_plugin_version(); + curr_version = user_version.empty() ? BBL::get_latest_network_version() : user_version; + } else { + curr_version = BBL::get_latest_network_version(); + } + std::string using_version = curr_version.substr(0, 9) + "00"; if (name == "cameratools") using_version = curr_version.substr(0, 6) + "00.00"; url += (boost::format("?slicer/%1%/cloud=%2%") % name % using_version).str(); - //url += (boost::format("?slicer/plugins/cloud=%1%") % "01.01.00.00").str(); return url; } @@ -1413,6 +1415,32 @@ int GUI_App::install_plugin(std::string name, std::string package_name, InstallP return InstallStatusUnzipFailed; } + boost::filesystem::path legacy_lib_path, legacy_lib_backup; + bool had_existing_legacy = false; + if (name == "plugins") { +#if defined(_MSC_VER) || defined(_WIN32) + legacy_lib_path = plugin_folder / (std::string(BAMBU_NETWORK_LIBRARY) + ".dll"); +#elif defined(__WXMAC__) + legacy_lib_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".dylib"); +#else + legacy_lib_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".so"); +#endif + legacy_lib_backup = legacy_lib_path; + legacy_lib_backup += ".backup"; + + if (boost::filesystem::exists(legacy_lib_path)) { + had_existing_legacy = true; + boost::system::error_code ec; + boost::filesystem::rename(legacy_lib_path, legacy_lib_backup, ec); + if (ec) { + BOOST_LOG_TRIVIAL(warning) << "[install_plugin] failed to backup existing legacy library: " << ec.message(); + had_existing_legacy = false; + } else { + BOOST_LOG_TRIVIAL(info) << "[install_plugin] backed up existing legacy library"; + } + } + } + mz_uint num_entries = mz_zip_reader_get_num_files(&archive); mz_zip_archive_file_stat stat; BOOST_LOG_TRIVIAL(error) << boost::format("[install_plugin]: %1%, got %2% files")%__LINE__ %num_entries; @@ -1487,6 +1515,47 @@ int GUI_App::install_plugin(std::string name, std::string package_name, InstallP } close_zip_reader(&archive); + + if (name == "plugins") { + std::string config_version = app_config->get_network_plugin_version(); + if (config_version.empty()) { + config_version = BBL::get_latest_network_version(); + BOOST_LOG_TRIVIAL(info) << "[install_plugin] config_version was empty, using latest: " << config_version; + app_config->set_network_plugin_version(config_version); + GUI::wxGetApp().CallAfter([this] { + if (app_config) + app_config->save(); + }); + } + if (!config_version.empty() && boost::filesystem::exists(legacy_lib_path)) { +#if defined(_MSC_VER) || defined(_WIN32) + auto versioned_lib = plugin_folder / (std::string(BAMBU_NETWORK_LIBRARY) + "_" + config_version + ".dll"); +#elif defined(__WXMAC__) + auto versioned_lib = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_" + config_version + ".dylib"); +#else + auto versioned_lib = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_" + config_version + ".so"); +#endif + BOOST_LOG_TRIVIAL(info) << "[install_plugin] renaming newly extracted " << legacy_lib_path.string() << " to " << versioned_lib.string(); + boost::system::error_code ec; + if (boost::filesystem::exists(versioned_lib)) { + boost::filesystem::remove(versioned_lib, ec); + } + boost::filesystem::rename(legacy_lib_path, versioned_lib, ec); + if (ec) { + BOOST_LOG_TRIVIAL(error) << "[install_plugin] failed to rename to versioned: " << ec.message(); + } + } + + if (had_existing_legacy && boost::filesystem::exists(legacy_lib_backup)) { + BOOST_LOG_TRIVIAL(info) << "[install_plugin] restoring backed up legacy library"; + boost::system::error_code ec; + boost::filesystem::rename(legacy_lib_backup, legacy_lib_path, ec); + if (ec) { + BOOST_LOG_TRIVIAL(warning) << "[install_plugin] failed to restore legacy library backup: " << ec.message(); + } + } + } + { fs::path dir_path(plugin_folder); if (fs::exists(dir_path) && fs::is_directory(dir_path)) { @@ -1519,6 +1588,8 @@ int GUI_App::install_plugin(std::string name, std::string package_name, InstallP } } } + + if (pro_fn) pro_fn(InstallStatusInstallCompleted, 100, cancel); if (name == "plugins") @@ -1572,6 +1643,247 @@ void GUI_App::restart_networking() BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(" exit, m_agent=%1%")%m_agent; } +// Network plugin hot reload timeout constants (in milliseconds) +namespace { + constexpr int CALLBACK_DRAIN_TIMEOUT_MS = 200; // Time to drain pending CallAfter callbacks + constexpr int NETWORK_IDLE_TIMEOUT_MS = 500; // Max wait for network operations to complete + constexpr int FINAL_DRAIN_TIMEOUT_MS = 100; // Final event processing before destruction + constexpr int POLL_INTERVAL_MS = 50; // Polling interval for state checks + constexpr int MAX_YIELD_ITERATIONS = 20; // Maximum wxYield calls per drain cycle +} + +// Process pending wx events with bounded iteration count +void GUI_App::drain_pending_events(int timeout_ms) +{ + const auto deadline = std::chrono::steady_clock::now() + + std::chrono::milliseconds(timeout_ms); + int yield_count = 0; + + while (std::chrono::steady_clock::now() < deadline) { + // Process pending events + if (wxTheApp) { + wxTheApp->ProcessPendingEvents(); + } + + // Bounded wxYield to prevent infinite loops + if (yield_count < MAX_YIELD_ITERATIONS) { + wxYield(); + ++yield_count; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(POLL_INTERVAL_MS)); + } +} + +// Wait for network operations to complete with state verification +bool GUI_App::wait_for_network_idle(int timeout_ms) +{ + const auto deadline = std::chrono::steady_clock::now() + + std::chrono::milliseconds(timeout_ms); + + while (std::chrono::steady_clock::now() < deadline) { + if (!m_agent) { + return true; // Agent already gone + } + + // Verify all operations completed + bool server_disconnected = !m_agent->is_server_connected(); + + if (server_disconnected) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": network is idle"; + return true; + } + + // Process events while waiting + if (wxTheApp) { + wxTheApp->ProcessPendingEvents(); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(POLL_INTERVAL_MS)); + } + + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": timeout after " << timeout_ms + << "ms, server_connected=" << (m_agent ? m_agent->is_server_connected() : false); + return false; +} + +bool GUI_App::hot_reload_network_plugin() +{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": starting hot reload"; + + wxBusyCursor busy; + wxBusyInfo info(_L("Reloading network plugin..."), mainframe); + wxYield(); + wxWindowDisabler disabler; + + if (mainframe) { + int current_tab = mainframe->m_tabpanel->GetSelection(); + if (current_tab == MainFrame::TabPosition::tpMonitor) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": navigating away from Monitor tab before unload"; + mainframe->m_tabpanel->SetSelection(MainFrame::TabPosition::tp3DEditor); + } + } + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": stopping sync thread before unload"; + if (m_user_sync_token) { + m_user_sync_token.reset(); + } + if (m_sync_update_thread.joinable()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": waiting for sync thread to finish"; + m_sync_update_thread.join(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": sync thread finished"; + } + + if (m_agent) { + // Phase 1: Clear all callbacks (stops new invocations) + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Phase 1 - clearing callbacks"; + m_agent->set_on_ssdp_msg_fn(nullptr); + m_agent->set_on_user_login_fn(nullptr); + m_agent->set_on_printer_connected_fn(nullptr); + m_agent->set_on_server_connected_fn(nullptr); + m_agent->set_on_http_error_fn(nullptr); + m_agent->set_on_subscribe_failure_fn(nullptr); + m_agent->set_on_message_fn(nullptr); + m_agent->set_on_user_message_fn(nullptr); + m_agent->set_on_local_connect_fn(nullptr); + m_agent->set_on_local_message_fn(nullptr); + m_agent->set_queue_on_main_fn(nullptr); + + // Phase 2: Drain pending CallAfter callbacks (bounded) + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Phase 2 - draining callbacks"; + drain_pending_events(CALLBACK_DRAIN_TIMEOUT_MS); + + // Phase 3: Stop operations and verify return values + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Phase 3 - stopping operations"; + bool discovery_stopped = m_agent->start_discovery(false, false); + int disconnect_result = m_agent->disconnect_printer(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": discovery_stopped=" << discovery_stopped + << ", disconnect_result=" << disconnect_result; + + // Phase 4: Wait for idle with state verification + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Phase 4 - waiting for idle"; + bool became_idle = wait_for_network_idle(NETWORK_IDLE_TIMEOUT_MS); + if (!became_idle) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": proceeding despite timeout"; + } + + // Phase 5: Final bounded drain before destruction + drain_pending_events(FINAL_DRAIN_TIMEOUT_MS); + + // Phase 6: Destroy agent + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Phase 6 - destroying agent"; + delete m_agent; + m_agent = nullptr; + } + + // Phase 7: Unload module + if (Slic3r::NetworkAgent::is_network_module_loaded()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Phase 7 - unloading module"; + drain_pending_events(FINAL_DRAIN_TIMEOUT_MS); + int unload_result = Slic3r::NetworkAgent::unload_network_module(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": unload_result=" << unload_result; + } + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": calling restart_networking"; + restart_networking(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": restart_networking returned"; + + std::string loaded_version = Slic3r::NetworkAgent::get_version(); + bool success = m_agent != nullptr && !loaded_version.empty() && loaded_version != "00.00.00.00"; + bool user_logged_in = m_agent && m_agent->is_user_login(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": after restart_networking, is_user_login = " << user_logged_in + << ", m_agent = " << (m_agent ? "valid" : "null") + << ", version = " << loaded_version; + + if (success && m_agent && m_device_manager) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": connecting to cloud server"; + m_agent->connect_server(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": re-subscribing to cloud printers"; + m_device_manager->add_user_subscribe(); + } + + if (mainframe && mainframe->m_monitor) { + mainframe->m_monitor->update_network_version_footer(); + mainframe->m_monitor->set_default(); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": reset monitor panel"; + } + + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": hot reload " << (success ? "successful" : "failed"); + return success; +} + +std::string GUI_App::get_latest_network_version() const +{ + return BBL::get_latest_network_version(); +} + +bool GUI_App::has_network_update_available() const +{ + std::string current = Slic3r::NetworkAgent::get_version(); + std::string latest = get_latest_network_version(); + + if (current.empty() || current == "00.00.00.00") + return false; + + return current.substr(0, 8) != latest.substr(0, 8); +} + +void GUI_App::show_network_plugin_download_dialog(bool is_update) +{ + auto load_error = Slic3r::NetworkAgent::get_load_error(); + + NetworkPluginDownloadDialog::Mode mode; + if (load_error.has_error) { + mode = NetworkPluginDownloadDialog::Mode::CorruptedPlugin; + } else if (is_update) { + mode = NetworkPluginDownloadDialog::Mode::UpdateAvailable; + } else { + mode = NetworkPluginDownloadDialog::Mode::MissingPlugin; + } + + std::string current_version = Slic3r::NetworkAgent::get_version(); + + NetworkPluginDownloadDialog dlg(mainframe, mode, current_version, + load_error.message, load_error.technical_details); + + int result = dlg.ShowModal(); + + switch (result) { + case NetworkPluginDownloadDialog::RESULT_DOWNLOAD: + { + std::string selected = dlg.get_selected_version(); + app_config->set_network_plugin_version(selected); + app_config->save(); + + DownloadProgressDialog download_dlg(_L("Downloading Network Plugin")); + download_dlg.ShowModal(); + } + break; + + case NetworkPluginDownloadDialog::RESULT_REMIND_LATER: + app_config->set_remind_network_update_later(true); + app_config->save(); + break; + + case NetworkPluginDownloadDialog::RESULT_SKIP_VERSION: + { + std::string latest = get_latest_network_version(); + app_config->add_skipped_network_version(latest); + app_config->save(); + } + break; + + case NetworkPluginDownloadDialog::RESULT_DONT_ASK: + app_config->set_network_update_prompt_disabled(true); + app_config->save(); + break; + + case NetworkPluginDownloadDialog::RESULT_SKIP: + default: + break; + } +} + void GUI_App::remove_old_networking_plugins() { std::string data_dir_str = data_dir(); @@ -1601,8 +1913,20 @@ bool GUI_App::check_networking_version() if (!network_ver.empty()) { BOOST_LOG_TRIVIAL(info) << "get_network_agent_version=" << network_ver; } - std::string studio_ver = NetworkAgent::use_legacy_network ? BAMBU_NETWORK_AGENT_VERSION_LEGACY : BAMBU_NETWORK_AGENT_VERSION; - if (network_ver.length() >= 8) { + + std::string studio_ver; + if (NetworkAgent::use_legacy_network) { + studio_ver = BAMBU_NETWORK_AGENT_VERSION_LEGACY; + } else if (app_config) { + std::string user_version = app_config->get_network_plugin_version(); + studio_ver = user_version.empty() ? BBL::get_latest_network_version() : user_version; + } else { + studio_ver = BBL::get_latest_network_version(); + } + + BOOST_LOG_TRIVIAL(info) << "check_networking_version: network_ver=" << network_ver << ", expected=" << studio_ver; + + if (network_ver.length() >= 8 && studio_ver.length() >= 8) { if (network_ver.substr(0,8) == studio_ver.substr(0,8)) { m_networking_compatible = true; return true; @@ -2072,7 +2396,13 @@ void GUI_App::init_app_config() } // Change current dirtory of application - [[maybe_unused]] auto unused_result = chdir(encode_path((Slic3r::data_dir() + "/log").c_str()).c_str()); + +#ifdef _WIN32 + [[maybe_unused]] auto unused_result = _chdir(encode_path((Slic3r::data_dir() + "/log").c_str()).c_str()); +#else + [[maybe_unused]] auto unused_result = chdir(encode_path((Slic3r::data_dir() + "/log").c_str()).c_str()); +#endif + } else { m_datadir_redefined = true; } @@ -2669,8 +2999,11 @@ bool GUI_App::on_init_inner() std::map extra_headers = get_extra_header(); Slic3r::Http::set_extra_headers(extra_headers); - // Orca: select network plugin version - NetworkAgent::use_legacy_network = app_config->get_bool("legacy_networking"); + // Orca: select network plugin version based on configured version string + std::string configured_version = app_config->get_network_plugin_version(); + NetworkAgent::use_legacy_network = (configured_version == BAMBU_NETWORK_AGENT_VERSION_LEGACY); + BOOST_LOG_TRIVIAL(info) << "Network plugin mode: " + << (NetworkAgent::use_legacy_network ? ("legacy (version: " + std::string(BAMBU_NETWORK_AGENT_VERSION_LEGACY) + ")") : ("modern (version: " + configured_version + ")")); // Force legacy network plugin if debugger attached // See https://github.com/bambulab/BambuStudio/issues/6726 /* if (!NetworkAgent::use_legacy_network) { @@ -2858,78 +3191,103 @@ void GUI_App::copy_network_if_available() { if (app_config->get("update_network_plugin") != "true") return; - std::string network_library, player_library, live555_library, network_library_dst, player_library_dst, live555_library_dst; + std::string data_dir_str = data_dir(); boost::filesystem::path data_dir_path(data_dir_str); auto plugin_folder = data_dir_path / "plugins"; auto cache_folder = data_dir_path / "ota"; std::string changelog_file = cache_folder.string() + "/network_plugins.json"; + + std::string cached_version; + if (boost::filesystem::exists(changelog_file)) { + try { + boost::nowide::ifstream ifs(changelog_file); + json j; + ifs >> j; + if (j.contains("version")) + cached_version = j["version"]; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": cached_version = " << cached_version; + } catch (nlohmann::detail::parse_error& err) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": parse " << changelog_file << " failed: " << err.what(); + } + } + + if (cached_version.empty()) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": no version found in changelog, aborting copy"; + app_config->set("update_network_plugin", "false"); + return; + } + + std::string network_library, player_library, live555_library, network_library_dst, player_library_dst, live555_library_dst; #if defined(_MSC_VER) || defined(_WIN32) network_library = cache_folder.string() + "/bambu_networking.dll"; - player_library = cache_folder.string() + "/BambuSource.dll"; - live555_library = cache_folder.string() + "/live555.dll"; - network_library_dst = plugin_folder.string() + "/bambu_networking.dll"; - player_library_dst = plugin_folder.string() + "/BambuSource.dll"; + player_library = cache_folder.string() + "/BambuSource.dll"; + live555_library = cache_folder.string() + "/live555.dll"; + network_library_dst = plugin_folder.string() + "/" + std::string(BAMBU_NETWORK_LIBRARY) + "_" + cached_version + ".dll"; + player_library_dst = plugin_folder.string() + "/BambuSource.dll"; live555_library_dst = plugin_folder.string() + "/live555.dll"; #elif defined(__WXMAC__) network_library = cache_folder.string() + "/libbambu_networking.dylib"; player_library = cache_folder.string() + "/libBambuSource.dylib"; live555_library = cache_folder.string() + "/liblive555.dylib"; - network_library_dst = plugin_folder.string() + "/libbambu_networking.dylib"; + network_library_dst = plugin_folder.string() + "/lib" + std::string(BAMBU_NETWORK_LIBRARY) + "_" + cached_version + ".dylib"; player_library_dst = plugin_folder.string() + "/libBambuSource.dylib"; live555_library_dst = plugin_folder.string() + "/liblive555.dylib"; #else network_library = cache_folder.string() + "/libbambu_networking.so"; - player_library = cache_folder.string() + "/libBambuSource.so"; - live555_library = cache_folder.string() + "/liblive555.so"; - network_library_dst = plugin_folder.string() + "/libbambu_networking.so"; - player_library_dst = plugin_folder.string() + "/libBambuSource.so"; + player_library = cache_folder.string() + "/libBambuSource.so"; + live555_library = cache_folder.string() + "/liblive555.so"; + network_library_dst = plugin_folder.string() + "/lib" + std::string(BAMBU_NETWORK_LIBRARY) + "_" + cached_version + ".so"; + player_library_dst = plugin_folder.string() + "/libBambuSource.so"; live555_library_dst = plugin_folder.string() + "/liblive555.so"; #endif - BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< ": checking network_library " << network_library << ", player_library " << player_library; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": checking network_library " << network_library << ", player_library " << player_library; if (!boost::filesystem::exists(plugin_folder)) { - BOOST_LOG_TRIVIAL(info)<< __FUNCTION__ << ": create directory "<set(SETTING_NETWORK_PLUGIN_VERSION, cached_version); + app_config->save(); } if (boost::filesystem::exists(player_library)) { CopyFileResult cfr = copy_file(player_library, player_library_dst, error_message, false); if (cfr != CopyFileResult::SUCCESS) { - BOOST_LOG_TRIVIAL(error) << __FUNCTION__<< ": Copying failed(" << cfr << "): " << error_message; + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": Copying failed(" << cfr << "): " << error_message; return; } static constexpr const auto perms = fs::owner_read | fs::owner_write | fs::group_read | fs::others_read; fs::permissions(player_library_dst, perms); fs::remove(player_library); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< ": Copying player library from" << player_library << " to " << player_library_dst<<" successfully."; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Copying player library from " << player_library << " to " << player_library_dst << " successfully."; } if (boost::filesystem::exists(live555_library)) { CopyFileResult cfr = copy_file(live555_library, live555_library_dst, error_message, false); if (cfr != CopyFileResult::SUCCESS) { - BOOST_LOG_TRIVIAL(error) << __FUNCTION__<< ": Copying failed(" << cfr << "): " << error_message; + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": Copying failed(" << cfr << "): " << error_message; return; } static constexpr const auto perms = fs::owner_read | fs::owner_write | fs::group_read | fs::others_read; fs::permissions(live555_library_dst, perms); fs::remove(live555_library); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< ": Copying live555 library from" << live555_library << " to " << live555_library_dst<<" successfully."; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": Copying live555 library from " << live555_library << " to " << live555_library_dst << " successfully."; } if (boost::filesystem::exists(changelog_file)) fs::remove(changelog_file); @@ -2940,13 +3298,39 @@ bool GUI_App::on_init_network(bool try_backup) { bool create_network_agent = false; auto should_load_networking_plugin = app_config->get_bool("installed_networking"); + + std::string config_version = app_config->get_network_plugin_version(); + if(!should_load_networking_plugin) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "Don't load plugin as installed_networking is false"; } else { - int load_agent_dll = Slic3r::NetworkAgent::initialize_network_module(); + if (config_version.empty()) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": no version configured, need to download"; + m_networking_need_update = true; + + if (!m_device_manager) + m_device_manager = new Slic3r::DeviceManager(); + if (!m_user_manager) + m_user_manager = new Slic3r::UserManager(); + + return false; + } + int load_agent_dll = Slic3r::NetworkAgent::initialize_network_module(false, config_version); __retry: if (!load_agent_dll) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": on_init_network, load dll ok"; + + std::string loaded_version = Slic3r::NetworkAgent::get_version(); + if (app_config && !loaded_version.empty() && loaded_version != "00.00.00.00") { + std::string config_version = app_config->get_network_plugin_version(); + std::string config_base = BBL::extract_base_version(config_version); + if (config_base != loaded_version) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": syncing config version from " << config_version << " to loaded " << loaded_version; + app_config->set(SETTING_NETWORK_PLUGIN_VERSION, loaded_version); + app_config->save(); + } + } + if (check_networking_version()) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": on_init_network, compatibility version"; auto bambu_source = Slic3r::NetworkAgent::get_bambu_source_entry(); @@ -2963,7 +3347,7 @@ __retry: if (try_backup) { int result = Slic3r::NetworkAgent::unload_network_module(); BOOST_LOG_TRIVIAL(info) << "on_init_network, version mismatch, unload_network_module, result = " << result; - load_agent_dll = Slic3r::NetworkAgent::initialize_network_module(true); + load_agent_dll = Slic3r::NetworkAgent::initialize_network_module(true, config_version); try_backup = false; goto __retry; } @@ -3042,6 +3426,24 @@ __retry: m_user_manager = new Slic3r::UserManager(); } + if (create_network_agent && m_networking_compatible && !NetworkAgent::use_legacy_network) { + app_config->clear_remind_network_update_later(); + + if (has_network_update_available()) { + std::string latest = get_latest_network_version(); + + bool should_prompt = !app_config->is_network_update_prompt_disabled() + && !app_config->is_network_version_skipped(latest) + && !app_config->should_remind_network_update_later(); + + if (should_prompt) { + CallAfter([this]() { + show_network_plugin_download_dialog(true); + }); + } + } + } + return true; } @@ -3415,7 +3817,7 @@ void GUI_App::set_side_menu_popup_status(bool status) m_side_popup_status = status; } -void GUI_App::link_to_network_check() +std::string GUI_App::link_to_network_check() { std::string url; std::string country_code = app_config->get_country_code(); @@ -3430,10 +3832,11 @@ void GUI_App::link_to_network_check() else { url = "https://status.bambulab.com"; } - wxLaunchDefaultBrowser(url); + //wxLaunchDefaultBrowser(url); + return url; // ORCA } -void GUI_App::link_to_lan_only_wiki() +std::string GUI_App::link_to_lan_only_wiki() { std::string url; std::string country_code = app_config->get_country_code(); @@ -3447,7 +3850,8 @@ void GUI_App::link_to_lan_only_wiki() else { url = "https://wiki.bambulab.com/en/knowledge-sharing/enable-lan-mode"; } - wxLaunchDefaultBrowser(url); + //wxLaunchDefaultBrowser(url); + return url; // ORCA } bool GUI_App::tabs_as_menu() const @@ -4880,7 +5284,84 @@ void GUI_App::check_new_version_sf(bool show_tips, int by_user) bool GUI_App::process_network_msg(std::string dev_id, std::string msg) { if (dev_id.empty()) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << msg; + if (msg == "wait_info") { + BOOST_LOG_TRIVIAL(info) << "process_network_msg, wait_info"; + Slic3r::DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); + if (!dev) + return true; + MachineObject* obj = dev->get_selected_machine(); + if (obj && m_agent) + m_agent->install_device_cert(obj->get_dev_id(), obj->is_lan_mode_printer()); + if (!m_show_error_msgdlg) { + MessageDialog msg_dlg(nullptr, _L("Retrieving printer information, please try again later."), "", wxAPPLY | wxOK); + m_show_error_msgdlg = true; + msg_dlg.ShowModal(); + m_show_error_msgdlg = false; + } + return true; + } + else if (msg == "update_studio") { + BOOST_LOG_TRIVIAL(info) << "process_network_msg, update_studio"; + if (!m_show_error_msgdlg) { + MessageDialog msg_dlg(nullptr, _L("Please try updating OrcaSlicer and then try again."), "", wxAPPLY | wxOK); + m_show_error_msgdlg = true; + msg_dlg.ShowModal(); + m_show_error_msgdlg = false; + } + return true; + } + else if (msg == "update_fixed_studio") { + BOOST_LOG_TRIVIAL(info) << "process_network_msg, update_fixed_studio"; + if (!m_show_error_msgdlg) { + MessageDialog msg_dlg(nullptr, _L("Please try updating OrcaSlicer and then try again."), "", wxAPPLY | wxOK); + m_show_error_msgdlg = true; + msg_dlg.ShowModal(); + m_show_error_msgdlg = false; + } + return true; + } + else if (msg == "cert_expired") { + BOOST_LOG_TRIVIAL(info) << "process_network_msg, cert_expired"; + if (!m_show_error_msgdlg) { + MessageDialog msg_dlg(nullptr, _L("The certificate has expired. Please check the time settings or update OrcaSlicer and try again."), "", wxAPPLY | wxOK); + m_show_error_msgdlg = true; + msg_dlg.ShowModal(); + m_show_error_msgdlg = false; + } + return true; + } + else if (msg == "cert_revoked") { + BOOST_LOG_TRIVIAL(info) << "process_network_msg, cert_revoked"; + if (!m_show_error_msgdlg) { + MessageDialog msg_dlg(nullptr, _L("The certificate is no longer valid and the printing functions are unavailable."), "", wxAPPLY | wxOK); + m_show_error_msgdlg = true; + msg_dlg.ShowModal(); + m_show_error_msgdlg = false; + } + return true; + } + else if (msg == "update_firmware_studio") { + BOOST_LOG_TRIVIAL(info) << "process_network_msg, firmware internal error"; + if (!m_show_error_msgdlg) { + MessageDialog msg_dlg(nullptr, _L("Internal error. Please try upgrading the firmware and OrcaSlicer version. If the issue persists, contact support."), "", wxAPPLY | wxOK); + m_show_error_msgdlg = true; + msg_dlg.ShowModal(); + m_show_error_msgdlg = false; + } + return true; + } + else if (msg == "unsigned_studio") { + BOOST_LOG_TRIVIAL(info) << "process_network_msg, unsigned_studio"; + MessageDialog msg_dlg(nullptr, + _L("Bambu Lab has implemented a signature verification check in their network plugin that restricts " + "third-party software from communicating with your printer.\n\n" + "As a result, some printing functions are unavailable in OrcaSlicer."), + _L("Network Plugin Restriction"), wxAPPLY | wxOK); + m_show_error_msgdlg = true; + msg_dlg.ShowModal(); + m_show_error_msgdlg = false; + return true; + } } else if (msg == "device_cert_installed") { BOOST_LOG_TRIVIAL(info) << "process_network_msg, device_cert_installed"; @@ -4889,7 +5370,6 @@ bool GUI_App::process_network_msg(std::string dev_id, std::string msg) obj->update_device_cert_state(true); } } - return true; } else if (msg == "device_cert_uninstalled") { @@ -4899,7 +5379,6 @@ bool GUI_App::process_network_msg(std::string dev_id, std::string msg) obj->update_device_cert_state(false); } } - return true; } diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index f3900f6128..b84dc97c54 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -312,6 +312,7 @@ private: bool m_adding_script_handler { false }; bool m_side_popup_status{false}; bool m_show_http_errpr_msgdlg{false}; + bool m_show_error_msgdlg{false}; wxString m_info_dialog_content; HttpServer m_http_server; bool m_show_gcode_window{true}; @@ -355,6 +356,9 @@ public: bool show_3d_navigator() const { return app_config->get_bool("show_3d_navigator"); } void toggle_show_3d_navigator() const { app_config->set_bool("show_3d_navigator", !show_3d_navigator()); } + bool show_canvas_zoom_button() const { return app_config->get_bool("show_canvas_zoom_button"); } + void toggle_canvas_zoom_button() const { app_config->set_bool("show_canvas_zoom_button", !show_canvas_zoom_button()); } + bool show_outline() const { return app_config->get_bool("show_outline"); } void toggle_show_outline() const { app_config->set_bool("show_outline", !show_outline()); } @@ -403,8 +407,8 @@ public: //update side popup status bool get_side_menu_popup_status(); void set_side_menu_popup_status(bool status); - void link_to_network_check(); - void link_to_lan_only_wiki(); + std::string link_to_network_check(); // ORCA + std::string link_to_lan_only_wiki(); // ORCA const wxColour& get_label_clr_modified() { return m_color_label_modified; } const wxColour& get_label_clr_sys() { return m_color_label_sys; } @@ -686,6 +690,11 @@ public: void restart_networking(); void check_config_updates_from_updater() { check_updates(false); } + void show_network_plugin_download_dialog(bool is_update = false); + bool hot_reload_network_plugin(); + std::string get_latest_network_version() const; + bool has_network_update_available() const; + private: int updating_bambu_networking(); bool on_init_inner(); @@ -694,6 +703,8 @@ private: void init_networking_callbacks(); void init_app_config(); void remove_old_networking_plugins(); + void drain_pending_events(int timeout_ms); + bool wait_for_network_idle(int timeout_ms); //BBS set extra header for http request std::map get_extra_header(); void init_http_extra_header(); @@ -712,6 +723,7 @@ private: bool m_init_app_config_from_older { false }; bool m_datadir_redefined { false }; std::string m_older_data_dir_path; + bool m_unsigned_plugin_warning_shown { false }; boost::optional m_last_config_version; bool m_config_corrupted { false }; std::string m_open_method; diff --git a/src/slic3r/GUI/GUI_Factories.cpp b/src/slic3r/GUI/GUI_Factories.cpp index e7520b5b51..44dd7b8f6e 100644 --- a/src/slic3r/GUI/GUI_Factories.cpp +++ b/src/slic3r/GUI/GUI_Factories.cpp @@ -87,14 +87,14 @@ std::map> SettingsFactory::OBJECT_C {"precise_z_height", "",10} }}, - { L("Support"), {{"brim_type", "",1},{"brim_width", "",2},{"brim_object_gap", "",3}, - {"enable_support", "",4},{"support_type", "",5},{"support_threshold_angle", "",6}, {"support_threshold_overlap", "",6}, {"support_on_build_plate_only", "",7}, - {"support_filament", "",8},{"support_interface_filament", "",9},{"support_expansion", "",24},{"support_style", "",25}, - {"tree_support_brim_width", "",26}, {"tree_support_branch_angle", "",10},{"tree_support_branch_angle_organic","",10}, {"tree_support_wall_count", "",11},{"tree_support_branch_diameter_angle", "",11},//tree support - {"support_top_z_distance", "",13},{"support_bottom_z_distance", "",12},{"support_base_pattern", "",14},{"support_base_pattern_spacing", "",15}, - {"support_interface_top_layers", "",16},{"support_interface_bottom_layers", "",17},{"support_interface_spacing", "",18},{"support_bottom_interface_spacing", "",19}, - {"support_object_xy_distance", "",20}, {"bridge_no_support", "",21},{"max_bridge_length", "",22},{"support_critical_regions_only", "",23},{"support_remove_small_overhang","",27}, - {"support_object_first_layer_gap","",28} + { L("Support"), {{"brim_type", "",1},{"brim_width", "",2},{"brim_object_gap", "",3},{"brim_use_efc_outline", "",4}, + {"enable_support", "",5},{"support_type", "",6},{"support_threshold_angle", "",7}, {"support_threshold_overlap", "",8}, {"support_on_build_plate_only", "",9}, + {"support_filament", "",10},{"support_interface_filament", "",11},{"support_expansion", "",12},{"support_style", "",13}, + {"tree_support_brim_width", "",14}, {"tree_support_branch_angle", "",15},{"tree_support_branch_angle_organic","",16}, {"tree_support_wall_count", "",17},{"tree_support_branch_diameter_angle", "",18},//tree support + {"support_bottom_z_distance", "",19},{"support_top_z_distance", "",20},{"support_base_pattern", "",21},{"support_base_pattern_spacing", "",22}, + {"support_interface_top_layers", "",23},{"support_interface_bottom_layers", "",24},{"support_interface_spacing", "",25},{"support_bottom_interface_spacing", "",26}, + {"support_object_xy_distance", "",27}, {"bridge_no_support", "",28},{"max_bridge_length", "",29},{"support_critical_regions_only", "",30},{"support_remove_small_overhang","",31}, + {"support_object_first_layer_gap","",32} }}, { L("Speed"), {{"support_speed", "",12}, {"support_interface_speed", "",13} }} diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp index 04e65fc88a..0ca62d849a 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -281,23 +281,43 @@ bool GLGizmosManager::init_icon_textures() else return false; - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle.svg", 64, 64, texture_id)) - icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE, texture_id)); + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_MENU, texture_id)); else return false; - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle_hover.svg", 64, 64, texture_id)) - icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE_HOVER, texture_id)); + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu_hover.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_MENU_HOVER, texture_id)); else return false; - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle_dark.svg", 64, 64, texture_id)) - icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE_DARK, texture_id)); + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu_dark.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_MENU_DARK, texture_id)); else return false; - if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/axis_toggle_hover_dark.svg", 64, 64, texture_id)) - icon_list.insert(std::make_pair((int) IC_AXIS_TOGGLE_DARK_HOVER, texture_id)); + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_menu_dark_hover.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_MENU_DARK_HOVER, texture_id)); + else + return false; + + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM, texture_id)); + else + return false; + + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom_hover.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM_HOVER, texture_id)); + else + return false; + + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom_dark.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM_DARK, texture_id)); + else + return false; + + if (IMTexture::load_from_svg_file(Slic3r::resources_dir() + "/images/canvas_zoom_dark_hover.svg", 72, 72, texture_id)) + icon_list.insert(std::make_pair((int) IC_CANVAS_ZOOM_DARK_HOVER, texture_id)); else return false; diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index ba7d5afdb9..5897c2a512 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp @@ -170,10 +170,14 @@ public: IC_TOOLBAR_TOOLTIP, IC_TOOLBAR_TOOLTIP_HOVER, IC_NAME_COUNT, - IC_AXIS_TOGGLE, - IC_AXIS_TOGGLE_HOVER, - IC_AXIS_TOGGLE_DARK, - IC_AXIS_TOGGLE_DARK_HOVER, + IC_CANVAS_MENU, + IC_CANVAS_MENU_HOVER, + IC_CANVAS_MENU_DARK, + IC_CANVAS_MENU_DARK_HOVER, + IC_CANVAS_ZOOM, + IC_CANVAS_ZOOM_HOVER, + IC_CANVAS_ZOOM_DARK, + IC_CANVAS_ZOOM_DARK_HOVER, }; explicit GLGizmosManager(GLCanvas3D& parent); diff --git a/src/slic3r/GUI/ImageDPIFrame.cpp b/src/slic3r/GUI/ImageDPIFrame.cpp index 06c3f59c3f..2133f18784 100644 --- a/src/slic3r/GUI/ImageDPIFrame.cpp +++ b/src/slic3r/GUI/ImageDPIFrame.cpp @@ -29,6 +29,14 @@ ImageDPIFrame::ImageDPIFrame() #ifdef __APPLE__ SetWindowStyleFlag(GetWindowStyleFlag() | wxSTAY_ON_TOP); #endif + + // ORCA add border + Bind(wxEVT_PAINT, [this](wxPaintEvent& evt) { + wxPaintDC dc(this); + dc.SetPen(StateColor::darkModeColorFor(wxColour("#DBDBDB"))); + dc.SetBrush(*wxTRANSPARENT_BRUSH); + dc.DrawRoundedRectangle(0, 0, GetSize().x, GetSize().y, 0); + }); m_sizer_main = new wxBoxSizer(wxVERTICAL); diff --git a/src/slic3r/GUI/Jobs/EmbossJob.cpp b/src/slic3r/GUI/Jobs/EmbossJob.cpp index 032ed288dd..856864d5c1 100644 --- a/src/slic3r/GUI/Jobs/EmbossJob.cpp +++ b/src/slic3r/GUI/Jobs/EmbossJob.cpp @@ -427,16 +427,18 @@ void UpdateJob::update_volume(ModelVolume *volume, TriangleMesh &&mesh, const Da volume->set_new_unique_id(); volume->calculate_convex_hull(); - // write data from base into volume - base.write(*volume); - GUI_App &app = wxGetApp(); // may be move to input + if (volume->name != base.volume_name) { - volume->name = base.volume_name; + // write data from base into volume + base.write(*volume); const ObjectList *obj_list = app.obj_list(); if (obj_list != nullptr) update_name_in_list(*obj_list, *volume); + } else { + // write data from base into volume + base.write(*volume); } ModelObject *object = volume->get_object(); diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp index c1ff0b4584..711228c0bc 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.cpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp @@ -342,7 +342,7 @@ void FillBedJob::finalize(bool canceled, std::exception_ptr &eptr) //model_object->ensure_on_bed(); //BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << ": model_object->ensure_on_bed()"; - if (m_instances && wxGetApp().app_config->get("auto_arrange") == "true") { + if (m_instances) {// && wxGetApp().app_config->get("auto_arrange") == "true") { m_plater->set_prepare_state(Job::PREPARE_STATE_MENU); m_plater->arrange(); } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 717d2c666f..ba98bfc470 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -3113,7 +3113,7 @@ void MainFrame::init_menubar_as_editor() // help append_menu_item(m_topbar->GetCalibMenu(), wxID_ANY, _L("Tutorial"), _L("Calibration help"), [this](wxCommandEvent&) { - std::string url = "https://github.com/OrcaSlicer/OrcaSlicer/wiki/Calibration"; + std::string url = "https://www.orcaslicer.com/wiki/Calibration"; if (const std::string country_code = wxGetApp().app_config->get_country_code(); country_code == "CN") { // Use gitee mirror for China users url = "https://gitee.com/n0isyfox/orca-slicer-docs/wikis/%E6%A0%A1%E5%87%86/%E6%89%93%E5%8D%B0%E5%8F%82%E6%95%B0%E6%A0%A1%E5%87%86"; @@ -3229,7 +3229,7 @@ void MainFrame::init_menubar_as_editor() [this]() {return m_plater->is_view3D_shown();; }, this); // help append_menu_item(calib_menu, wxID_ANY, _L("Tutorial"), _L("Calibration help"), - [this](wxCommandEvent&) { wxLaunchDefaultBrowser("https://github.com/OrcaSlicer/OrcaSlicer/wiki/Calibration", wxBROWSER_NEW_WINDOW); }, "", nullptr, + [this](wxCommandEvent&) { wxLaunchDefaultBrowser("https://www.orcaslicer.com/wiki/Calibration", wxBROWSER_NEW_WINDOW); }, "", nullptr, [this]() {return m_plater->is_view3D_shown();; }, this); m_menubar->Append(calib_menu,wxString::Format("&%s", _L("Calibration"))); diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 7869662d7c..c412b5585a 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -769,7 +769,7 @@ bool MediaPlayCtrl::start_stream_service(bool *need_install) auto file_dll = tools_dir + dll; auto file_dll2 = plugins_dir + dll; if (!boost::filesystem::exists(file_dll) || boost::filesystem::last_write_time(file_dll) != boost::filesystem::last_write_time(file_dll2)) - boost::filesystem::copy_file(file_dll2, file_dll, boost::filesystem::copy_option::overwrite_if_exists); + boost::filesystem::copy_file(file_dll2, file_dll, boost::filesystem::copy_options::overwrite_existing); } boost::process::child process_source(file_source, file_url2.ToStdWstring(), boost::process::start_dir(tools_dir), boost::process::windows::create_no_window, diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index aa1e3e2ea8..02b2306ff3 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -1,6 +1,8 @@ #include "Tab.hpp" #include "libslic3r/Utils.hpp" #include "libslic3r/Model.hpp" +#include "libslic3r/AppConfig.hpp" +#include "slic3r/Utils/bambu_networking.hpp" #include #include @@ -195,6 +197,11 @@ void MonitorPanel::init_tabpanel() m_hms_panel = new HMSPanel(m_tabpanel); m_tabpanel->AddPage(m_hms_panel, _L("Assistant(HMS)"), "", false); + std::string network_ver = Slic3r::NetworkAgent::get_version(); + if (!network_ver.empty()) { + m_tabpanel->SetFooterText(wxString::Format("Network plugin v%s", network_ver)); + } + m_initialized = true; show_status((int)MonitorStatus::MONITOR_NO_PRINTER); } @@ -407,6 +414,7 @@ bool MonitorPanel::Show(bool show) DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager(); if (show) { start_update(); + update_network_version_footer(); m_refresh_timer->Stop(); m_refresh_timer->SetOwner(this); @@ -517,5 +525,25 @@ void MonitorPanel::jump_to_LiveView() m_status_info_panel->get_media_play_ctrl()->jump_to_play(); } +void MonitorPanel::update_network_version_footer() +{ + std::string binary_version = Slic3r::NetworkAgent::get_version(); + if (binary_version.empty()) + return; + + std::string configured_version = wxGetApp().app_config->get_network_plugin_version(); + std::string suffix = BBL::extract_suffix(configured_version); + std::string configured_base = BBL::extract_base_version(configured_version); + + wxString footer_text; + if (!suffix.empty() && configured_base == binary_version) { + footer_text = wxString::Format("Network plugin v%s (%s)", binary_version, suffix); + } else { + footer_text = wxString::Format("Network plugin v%s", binary_version); + } + + m_tabpanel->SetFooterText(footer_text); +} + } // GUI } // Slic3r diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp index a7f7126534..b7502b9d51 100644 --- a/src/slic3r/GUI/Monitor.hpp +++ b/src/slic3r/GUI/Monitor.hpp @@ -157,6 +157,7 @@ public: void jump_to_HMS(); void jump_to_LiveView(); + void update_network_version_footer(); }; diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index 0e6e1a324d..049a6b00f2 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -586,7 +586,8 @@ wxBoxSizer *Newer3mfVersionDialog::get_msg_sizer() if (file_version_newer) { text1 = new wxStaticText(this, wxID_ANY, _L("The 3MF file version is in Beta and it is newer than the current OrcaSlicer version.")); wxStaticText * text2 = new wxStaticText(this, wxID_ANY, _L("If you would like to try Orca Slicer Beta, you may click to")); - wxHyperlinkCtrl *github_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Download Beta Version"), "https://github.com/bambulab/BambuStudio/releases"); + // ORCA standardized HyperLink + HyperLink * github_link = new HyperLink(this, _L("Download Beta Version"), "https://github.com/SoftFever/OrcaSlicer/releases"); horizontal_sizer->Add(text2, 0, wxEXPAND, 0); horizontal_sizer->Add(github_link, 0, wxEXPAND | wxLEFT, 5); @@ -672,11 +673,9 @@ NetworkErrorDialog::NetworkErrorDialog(wxWindow* parent) wxBoxSizer* sizer_link = new wxBoxSizer(wxVERTICAL); - m_link_server_state = new wxHyperlinkCtrl(this, wxID_ANY, _L("Check the status of current system services"), ""); + // ORCA standardized HyperLink + m_link_server_state = new HyperLink(this, _L("Check the status of current system services"), wxGetApp().link_to_network_check()); m_link_server_state->SetFont(::Label::Body_13); - m_link_server_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check(); }); - m_link_server_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_link_server_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); sizer_link->Add(m_link_server_state, 0, wxALL, 0); @@ -690,11 +689,9 @@ NetworkErrorDialog::NetworkErrorDialog(wxWindow* parent) m_text_proposal->SetFont(::Label::Body_14); m_text_proposal->SetForegroundColour(0x323A3C); - m_text_wiki = new wxHyperlinkCtrl(this, wxID_ANY, _L("How to use LAN only mode"), ""); + // ORCA standardized HyperLink + m_text_wiki = new HyperLink(this, _L("How to use LAN only mode"), wxGetApp().link_to_lan_only_wiki()); m_text_wiki->SetFont(::Label::Body_13); - m_text_wiki->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_lan_only_wiki(); }); - m_text_wiki->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_HAND); }); - m_text_wiki->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {SetCursor(wxCURSOR_ARROW); }); sizer_help->Add(m_text_proposal, 0, wxEXPAND, 0); sizer_help->Add(m_text_wiki, 0, wxALL, 0); diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp index 7b4eb71612..bb3abde75c 100644 --- a/src/slic3r/GUI/MsgDialog.hpp +++ b/src/slic3r/GUI/MsgDialog.hpp @@ -14,6 +14,7 @@ #include "Widgets/Button.hpp" #include "Widgets/CheckBox.hpp" #include "Widgets/TextInput.hpp" +#include "Widgets/HyperLink.hpp" #include "BBLStatusBar.hpp" #include "BBLStatusBarSend.hpp" #include "libslic3r/Semver.hpp" @@ -424,9 +425,9 @@ public: private: Label* m_text_basic; - wxHyperlinkCtrl* m_link_server_state; + HyperLink* m_link_server_state; // ORCA Label* m_text_proposal; - wxHyperlinkCtrl* m_text_wiki; + HyperLink* m_text_wiki; // ORCA Button * m_button_confirm; public: diff --git a/src/slic3r/GUI/MultiMachineManagerPage.cpp b/src/slic3r/GUI/MultiMachineManagerPage.cpp index 3956f89072..5b0ca791b7 100644 --- a/src/slic3r/GUI/MultiMachineManagerPage.cpp +++ b/src/slic3r/GUI/MultiMachineManagerPage.cpp @@ -653,7 +653,7 @@ void MultiMachineManagerPage::start_timer() m_flipping_timer->SetOwner(this); m_flipping_timer->Start(1000); - wxPostEvent(this, wxTimerEvent()); + wxPostEvent(this, wxTimerEvent(*m_flipping_timer)); } void MultiMachineManagerPage::update_page_number() diff --git a/src/slic3r/GUI/MultiMachinePage.cpp b/src/slic3r/GUI/MultiMachinePage.cpp index f7cb05a80e..b9b71ad670 100644 --- a/src/slic3r/GUI/MultiMachinePage.cpp +++ b/src/slic3r/GUI/MultiMachinePage.cpp @@ -61,7 +61,7 @@ bool MultiMachinePage::Show(bool show) m_refresh_timer->Stop(); m_refresh_timer->SetOwner(this); m_refresh_timer->Start(2000); - wxPostEvent(this, wxTimerEvent()); + wxPostEvent(this, wxTimerEvent(*m_refresh_timer)); } else { m_refresh_timer->Stop(); @@ -96,7 +96,7 @@ void MultiMachinePage::init_timer() m_refresh_timer = new wxTimer(); //m_refresh_timer->SetOwner(this); //m_refresh_timer->Start(8000); - //wxPostEvent(this, wxTimerEvent()); + //wxPostEvent(this, wxTimerEvent(*m_refresh_timer)); } void MultiMachinePage::on_timer(wxTimerEvent& event) @@ -482,7 +482,7 @@ bool MultiMachinePickPage::Show(bool show) //m_refresh_timer->Stop(); //m_refresh_timer->SetOwner(this); //m_refresh_timer->Start(4000); - //wxPostEvent(this, wxTimerEvent()); + //wxPostEvent(this, wxTimerEvent(*m_refresh_timer)); } else { //m_refresh_timer->Stop(); diff --git a/src/slic3r/GUI/MultiTaskManagerPage.cpp b/src/slic3r/GUI/MultiTaskManagerPage.cpp index 37321063f8..0b0b422eb4 100644 --- a/src/slic3r/GUI/MultiTaskManagerPage.cpp +++ b/src/slic3r/GUI/MultiTaskManagerPage.cpp @@ -1402,7 +1402,7 @@ void CloudTaskManagerPage::start_timer() m_flipping_timer->SetOwner(this); m_flipping_timer->Start(1000); - wxPostEvent(this, wxTimerEvent()); + wxPostEvent(this, wxTimerEvent(*m_flipping_timer)); } void CloudTaskManagerPage::on_timer(wxTimerEvent& event) diff --git a/src/slic3r/GUI/NetworkPluginDialog.cpp b/src/slic3r/GUI/NetworkPluginDialog.cpp new file mode 100644 index 0000000000..5c1e158748 --- /dev/null +++ b/src/slic3r/GUI/NetworkPluginDialog.cpp @@ -0,0 +1,377 @@ +#include "NetworkPluginDialog.hpp" +#include "I18N.hpp" +#include "GUI_App.hpp" +#include "MainFrame.hpp" +#include "MsgDialog.hpp" +#include "Widgets/Label.hpp" +#include "BitmapCache.hpp" +#include "wxExtensions.hpp" +#include "slic3r/Utils/bambu_networking.hpp" + +#include +#include +#include + +namespace Slic3r { +namespace GUI { + +NetworkPluginDownloadDialog::NetworkPluginDownloadDialog(wxWindow* parent, Mode mode, + const std::string& current_version, + const std::string& error_message, + const std::string& error_details) + : DPIDialog(parent, wxID_ANY, mode == Mode::UpdateAvailable ? + _L("Network Plugin Update Available") : _L("Bambu Network Plugin Required"), + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) + , m_mode(mode) + , m_error_message(error_message) + , m_error_details(error_details) +{ + SetBackgroundColour(*wxWHITE); + + wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); + + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + main_sizer->Add(m_line_top, 0, wxEXPAND, 0); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(20)); + + SetSizer(main_sizer); + + if (mode == Mode::UpdateAvailable) { + create_update_available_ui(current_version); + } else { + create_missing_plugin_ui(); + } + Layout(); + Fit(); + CentreOnParent(); + wxGetApp().UpdateDlgDarkUI(this); +} + +void NetworkPluginDownloadDialog::create_missing_plugin_ui() +{ + wxBoxSizer* main_sizer = static_cast(GetSizer()); + + auto* desc = new wxStaticText(this, wxID_ANY, + m_mode == Mode::CorruptedPlugin ? + _L("The Bambu Network Plugin is corrupted or incompatible. Please reinstall it.") : + _L("The Bambu Network Plugin is required for cloud features, printer discovery, and remote printing.")); + desc->SetFont(::Label::Body_13); + desc->Wrap(FromDIP(400)); + main_sizer->Add(desc, 0, wxLEFT | wxRIGHT, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(15)); + + if (!m_error_message.empty()) { + auto* error_label = new wxStaticText(this, wxID_ANY, + wxString::Format(_L("Error: %s"), wxString::FromUTF8(m_error_message))); + error_label->SetFont(::Label::Body_13); + error_label->SetForegroundColour(wxColour(208, 93, 93)); + error_label->Wrap(FromDIP(400)); + main_sizer->Add(error_label, 0, wxLEFT | wxRIGHT, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(10)); + + if (!m_error_details.empty()) { + m_details_pane = new wxCollapsiblePane(this, wxID_ANY, _L("Show details")); + auto* pane = m_details_pane->GetPane(); + auto* pane_sizer = new wxBoxSizer(wxVERTICAL); + + auto* details_text = new wxStaticText(pane, wxID_ANY, wxString::FromUTF8(m_error_details)); + details_text->SetFont(wxGetApp().code_font()); + details_text->Wrap(FromDIP(380)); + pane_sizer->Add(details_text, 0, wxALL, FromDIP(10)); + + pane->SetSizer(pane_sizer); + main_sizer->Add(m_details_pane, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(10)); + } + } + + auto* version_label = new wxStaticText(this, wxID_ANY, _L("Version to install:")); + version_label->SetFont(::Label::Body_13); + main_sizer->Add(version_label, 0, wxLEFT | wxRIGHT, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(5)); + + setup_version_selector(); + main_sizer->Add(m_version_combo, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(20)); + + auto* btn_sizer = new wxBoxSizer(wxHORIZONTAL); + btn_sizer->Add(0, 0, 1, wxEXPAND, 0); + + StateColor btn_bg_green( + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + + StateColor btn_bg_white( + std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + auto* btn_download = new Button(this, _L("Download and Install")); + btn_download->SetBackgroundColor(btn_bg_green); + btn_download->SetBorderColor(*wxWHITE); + btn_download->SetTextColor(*wxWHITE); + btn_download->SetFont(::Label::Body_12); + btn_download->SetMinSize(wxSize(FromDIP(120), FromDIP(24))); + btn_download->Bind(wxEVT_BUTTON, &NetworkPluginDownloadDialog::on_download, this); + btn_sizer->Add(btn_download, 0, wxRIGHT, FromDIP(10)); + + auto* btn_skip = new Button(this, _L("Skip for Now")); + btn_skip->SetBackgroundColor(btn_bg_white); + btn_skip->SetBorderColor(wxColour(38, 46, 48)); + btn_skip->SetFont(::Label::Body_12); + btn_skip->SetMinSize(wxSize(FromDIP(100), FromDIP(24))); + btn_skip->Bind(wxEVT_BUTTON, &NetworkPluginDownloadDialog::on_skip, this); + btn_sizer->Add(btn_skip, 0, wxRIGHT, FromDIP(10)); + + main_sizer->Add(btn_sizer, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(20)); + main_sizer->Add(0, 0, 0, wxBOTTOM, FromDIP(20)); +} + +void NetworkPluginDownloadDialog::create_update_available_ui(const std::string& current_version) +{ + wxBoxSizer* main_sizer = static_cast(GetSizer()); + + auto* desc = new wxStaticText(this, wxID_ANY, + _L("A new version of the Bambu Network Plugin is available.")); + desc->SetFont(::Label::Body_13); + desc->Wrap(FromDIP(400)); + main_sizer->Add(desc, 0, wxLEFT | wxRIGHT, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(15)); + + auto* version_text = new wxStaticText(this, wxID_ANY, + wxString::Format(_L("Current version: %s"), wxString::FromUTF8(current_version))); + version_text->SetFont(::Label::Body_13); + main_sizer->Add(version_text, 0, wxLEFT | wxRIGHT, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(10)); + + auto* update_label = new wxStaticText(this, wxID_ANY, _L("Update to version:")); + update_label->SetFont(::Label::Body_13); + main_sizer->Add(update_label, 0, wxLEFT | wxRIGHT, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(5)); + + setup_version_selector(); + main_sizer->Add(m_version_combo, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(25)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(20)); + + auto* btn_sizer = new wxBoxSizer(wxHORIZONTAL); + btn_sizer->Add(0, 0, 1, wxEXPAND, 0); + + StateColor btn_bg_green( + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + + StateColor btn_bg_white( + std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + auto* btn_download = new Button(this, _L("Update Now")); + btn_download->SetBackgroundColor(btn_bg_green); + btn_download->SetBorderColor(*wxWHITE); + btn_download->SetTextColor(*wxWHITE); + btn_download->SetFont(::Label::Body_12); + btn_download->SetMinSize(wxSize(FromDIP(100), FromDIP(24))); + btn_download->Bind(wxEVT_BUTTON, &NetworkPluginDownloadDialog::on_download, this); + btn_sizer->Add(btn_download, 0, wxRIGHT, FromDIP(10)); + + auto* btn_remind = new Button(this, _L("Remind Later")); + btn_remind->SetBackgroundColor(btn_bg_white); + btn_remind->SetBorderColor(wxColour(38, 46, 48)); + btn_remind->SetFont(::Label::Body_12); + btn_remind->SetMinSize(wxSize(FromDIP(100), FromDIP(24))); + btn_remind->Bind(wxEVT_BUTTON, &NetworkPluginDownloadDialog::on_remind_later, this); + btn_sizer->Add(btn_remind, 0, wxRIGHT, FromDIP(10)); + + auto* btn_skip = new Button(this, _L("Skip Version")); + btn_skip->SetBackgroundColor(btn_bg_white); + btn_skip->SetBorderColor(wxColour(38, 46, 48)); + btn_skip->SetFont(::Label::Body_12); + btn_skip->SetMinSize(wxSize(FromDIP(100), FromDIP(24))); + btn_skip->Bind(wxEVT_BUTTON, &NetworkPluginDownloadDialog::on_skip_version, this); + btn_sizer->Add(btn_skip, 0, wxRIGHT, FromDIP(10)); + + auto* btn_dont_ask = new Button(this, _L("Don't Ask Again")); + btn_dont_ask->SetBackgroundColor(btn_bg_white); + btn_dont_ask->SetBorderColor(wxColour(38, 46, 48)); + btn_dont_ask->SetFont(::Label::Body_12); + btn_dont_ask->SetMinSize(wxSize(FromDIP(110), FromDIP(24))); + btn_dont_ask->Bind(wxEVT_BUTTON, &NetworkPluginDownloadDialog::on_dont_ask, this); + btn_sizer->Add(btn_dont_ask, 0, wxRIGHT, FromDIP(10)); + + main_sizer->Add(btn_sizer, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(20)); + main_sizer->Add(0, 0, 0, wxBOTTOM, FromDIP(20)); +} + +void NetworkPluginDownloadDialog::setup_version_selector() +{ + m_version_combo = new ComboBox(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxSize(FromDIP(380), FromDIP(28)), 0, nullptr, wxCB_READONLY); + m_version_combo->SetFont(::Label::Body_13); + + m_available_versions = BBL::get_all_available_versions(); + for (size_t i = 0; i < m_available_versions.size(); ++i) { + const auto& ver = m_available_versions[i]; + wxString label; + if (!ver.suffix.empty()) { + label = wxString::FromUTF8("\xE2\x94\x94 ") + wxString::FromUTF8(ver.display_name); + } else { + label = wxString::FromUTF8(ver.display_name); + if (ver.is_latest) { + label += wxString(" ") + _L("(Latest)"); + } + } + m_version_combo->Append(label); + } + + m_version_combo->SetSelection(0); +} + +std::string NetworkPluginDownloadDialog::get_selected_version() const +{ + if (!m_version_combo) { + return ""; + } + + int selection = m_version_combo->GetSelection(); + if (selection < 0 || selection >= static_cast(m_available_versions.size())) { + return ""; + } + + return m_available_versions[selection].version; +} + +void NetworkPluginDownloadDialog::on_download(wxCommandEvent& evt) +{ + int selection = m_version_combo ? m_version_combo->GetSelection() : 0; + if (selection >= 0 && selection < static_cast(m_available_versions.size())) { + const std::string& warning = m_available_versions[selection].warning; + if (!warning.empty()) { + MessageDialog warn_dlg(this, wxString::FromUTF8(warning), _L("Warning"), wxOK | wxCANCEL | wxICON_WARNING); + if (warn_dlg.ShowModal() != wxID_OK) { + return; + } + } + } + EndModal(RESULT_DOWNLOAD); +} + +void NetworkPluginDownloadDialog::on_skip(wxCommandEvent& evt) +{ + EndModal(RESULT_SKIP); +} + +void NetworkPluginDownloadDialog::on_remind_later(wxCommandEvent& evt) +{ + EndModal(RESULT_REMIND_LATER); +} + +void NetworkPluginDownloadDialog::on_skip_version(wxCommandEvent& evt) +{ + EndModal(RESULT_SKIP_VERSION); +} + +void NetworkPluginDownloadDialog::on_dont_ask(wxCommandEvent& evt) +{ + EndModal(RESULT_DONT_ASK); +} + +void NetworkPluginDownloadDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + Layout(); + Fit(); +} + +NetworkPluginRestartDialog::NetworkPluginRestartDialog(wxWindow* parent) + : DPIDialog(parent, wxID_ANY, _L("Restart Required"), + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE) +{ + SetBackgroundColour(*wxWHITE); + + wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); + + auto m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1)); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + main_sizer->Add(m_line_top, 0, wxEXPAND, 0); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(20)); + + auto* icon_sizer = new wxBoxSizer(wxHORIZONTAL); + auto* icon_bitmap = new wxStaticBitmap(this, wxID_ANY, + create_scaled_bitmap("info", nullptr, 64)); + icon_sizer->Add(icon_bitmap, 0, wxALL, FromDIP(10)); + + auto* text_sizer = new wxBoxSizer(wxVERTICAL); + + auto* desc = new wxStaticText(this, wxID_ANY, + _L("The Bambu Network Plugin has been installed successfully.")); + desc->SetFont(::Label::Body_14); + desc->Wrap(FromDIP(350)); + text_sizer->Add(desc, 0, wxTOP, FromDIP(10)); + text_sizer->Add(0, 0, 0, wxTOP, FromDIP(10)); + + auto* restart_msg = new wxStaticText(this, wxID_ANY, + _L("A restart is required to load the new plugin. Would you like to restart now?")); + restart_msg->SetFont(::Label::Body_13); + restart_msg->Wrap(FromDIP(350)); + text_sizer->Add(restart_msg, 0, wxBOTTOM, FromDIP(10)); + + icon_sizer->Add(text_sizer, 1, wxEXPAND | wxRIGHT, FromDIP(20)); + main_sizer->Add(icon_sizer, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(15)); + main_sizer->Add(0, 0, 0, wxTOP, FromDIP(20)); + + auto* btn_sizer = new wxBoxSizer(wxHORIZONTAL); + btn_sizer->Add(0, 0, 1, wxEXPAND, 0); + + StateColor btn_bg_green( + std::pair(wxColour(0, 137, 123), StateColor::Pressed), + std::pair(wxColour(38, 166, 154), StateColor::Hovered), + std::pair(wxColour(0, 150, 136), StateColor::Normal)); + + StateColor btn_bg_white( + std::pair(wxColour(206, 206, 206), StateColor::Pressed), + std::pair(wxColour(238, 238, 238), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + + auto* btn_restart = new Button(this, _L("Restart Now")); + btn_restart->SetBackgroundColor(btn_bg_green); + btn_restart->SetBorderColor(*wxWHITE); + btn_restart->SetTextColor(*wxWHITE); + btn_restart->SetFont(::Label::Body_12); + btn_restart->SetMinSize(wxSize(FromDIP(100), FromDIP(24))); + btn_restart->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { + m_restart_now = true; + EndModal(wxID_OK); + }); + btn_sizer->Add(btn_restart, 0, wxRIGHT, FromDIP(10)); + + auto* btn_later = new Button(this, _L("Restart Later")); + btn_later->SetBackgroundColor(btn_bg_white); + btn_later->SetBorderColor(wxColour(38, 46, 48)); + btn_later->SetFont(::Label::Body_12); + btn_later->SetMinSize(wxSize(FromDIP(100), FromDIP(24))); + btn_later->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { + m_restart_now = false; + EndModal(wxID_CANCEL); + }); + btn_sizer->Add(btn_later, 0, wxRIGHT, FromDIP(10)); + + main_sizer->Add(btn_sizer, 0, wxLEFT | wxRIGHT | wxEXPAND, FromDIP(20)); + main_sizer->Add(0, 0, 0, wxBOTTOM, FromDIP(20)); + + SetSizer(main_sizer); + Layout(); + Fit(); + CentreOnParent(); + wxGetApp().UpdateDlgDarkUI(this); +} + +void NetworkPluginRestartDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + Layout(); + Fit(); +} + +} +} diff --git a/src/slic3r/GUI/NetworkPluginDialog.hpp b/src/slic3r/GUI/NetworkPluginDialog.hpp new file mode 100644 index 0000000000..88d4a3813c --- /dev/null +++ b/src/slic3r/GUI/NetworkPluginDialog.hpp @@ -0,0 +1,76 @@ +#ifndef slic3r_GUI_NetworkPluginDialog_hpp_ +#define slic3r_GUI_NetworkPluginDialog_hpp_ + +#include "GUI_Utils.hpp" +#include "MsgDialog.hpp" +#include "Widgets/ComboBox.hpp" +#include "Widgets/Button.hpp" +#include "slic3r/Utils/bambu_networking.hpp" +#include + +namespace Slic3r { +namespace GUI { + +class NetworkPluginDownloadDialog : public DPIDialog +{ +public: + enum class Mode { + MissingPlugin, + UpdateAvailable, + CorruptedPlugin + }; + + NetworkPluginDownloadDialog(wxWindow* parent, Mode mode, + const std::string& current_version = "", + const std::string& error_message = "", + const std::string& error_details = ""); + + std::string get_selected_version() const; + + enum ResultCode { + RESULT_DOWNLOAD = wxID_OK, + RESULT_SKIP = wxID_CANCEL, + RESULT_REMIND_LATER = wxID_APPLY, + RESULT_SKIP_VERSION = wxID_IGNORE, + RESULT_DONT_ASK = wxID_ABORT + }; + +protected: + void on_dpi_changed(const wxRect& suggested_rect) override; + +private: + void create_missing_plugin_ui(); + void create_update_available_ui(const std::string& current_version); + void setup_version_selector(); + void on_download(wxCommandEvent& evt); + void on_skip(wxCommandEvent& evt); + void on_remind_later(wxCommandEvent& evt); + void on_skip_version(wxCommandEvent& evt); + void on_dont_ask(wxCommandEvent& evt); + + Mode m_mode; + ComboBox* m_version_combo{nullptr}; + wxCollapsiblePane* m_details_pane{nullptr}; + std::string m_error_message; + std::string m_error_details; + std::vector m_available_versions; +}; + +class NetworkPluginRestartDialog : public DPIDialog +{ +public: + NetworkPluginRestartDialog(wxWindow* parent); + + bool should_restart_now() const { return m_restart_now; } + +protected: + void on_dpi_changed(const wxRect& suggested_rect) override; + +private: + bool m_restart_now{false}; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GUI_NetworkPluginDialog_hpp_ diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp index 9abf49323a..c9bb132f68 100644 --- a/src/slic3r/GUI/NotificationManager.hpp +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -980,7 +980,7 @@ private: NotificationData{NotificationType::BBLUserPresetExceedLimit, NotificationLevel::WarningNotificationLevel, BBL_NOTICE_MAX_INTERVAL, _u8L("The number of user presets cached in the cloud has exceeded the upper limit, newly created user presets can only be used locally."), - _u8L("Wiki"), + _u8L("Wiki Guide"), [](wxEvtHandler* evnthndlr) { wxLaunchDefaultBrowser("https://wiki.bambulab.com/en/software/bambu-studio/3rd-party-printer-profile#cloud-user-presets-limit"); return false; diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp index 8be287fd3d..331d4a5db8 100644 --- a/src/slic3r/GUI/OG_CustomCtrl.cpp +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -53,7 +53,7 @@ OG_CustomCtrl::OG_CustomCtrl( wxWindow* parent, // BBS: new font m_font = Label::Body_14; SetFont(m_font); - m_em_unit = em_unit(m_parent); + m_em_unit = em_unit(m_parent); m_v_gap = lround(1.2 * m_em_unit); m_v_gap2 = lround(0.8 * m_em_unit); m_h_gap = lround(0.2 * m_em_unit); @@ -597,7 +597,7 @@ void OG_CustomCtrl::msw_rescale() SetFont(m_font); m_em_unit = em_unit(m_parent); m_v_gap = lround(1.2 * m_em_unit); - m_v_gap2 = lround(0.8 * m_em_unit); + m_v_gap2 = lround(0.8 * m_em_unit); m_h_gap = lround(0.2 * m_em_unit); //m_bmp_mode_sz = create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12).GetSize(); @@ -992,7 +992,7 @@ wxPoint OG_CustomCtrl::CtrlLine::draw_act_bmps(wxDC& dc, wxPoint pos, const wxBi pos.y += lround((height - get_bitmap_size(bmp_undo).GetHeight()) / 2); } #endif - wxCoord h_pos = pos.x; + wxCoord h_pos = pos.x - ctrl->m_h_gap; // Orca: adjust position to the left wxCoord v_pos = pos.y; #ifndef DISABLE_UNDO_SYS diff --git a/src/slic3r/GUI/ObjColorDialog.cpp b/src/slic3r/GUI/ObjColorDialog.cpp index 6d3b277c03..7575777507 100644 --- a/src/slic3r/GUI/ObjColorDialog.cpp +++ b/src/slic3r/GUI/ObjColorDialog.cpp @@ -47,14 +47,7 @@ wxBoxSizer* ObjColorDialog::create_btn_sizer(long flags,bool exist_error) auto btn_sizer = new wxBoxSizer(wxHORIZONTAL); if (!exist_error) { btn_sizer->AddSpacer(FromDIP(25)); - wxStaticText *tips = new wxStaticText(this, wxID_ANY, _L("Open Wiki for more information >")); - /* wxFont font(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false); - font.SetUnderlined(true); - tips->SetFont(font);*/ - auto font = tips->GetFont(); - font.SetUnderlined(true); - tips->SetFont(font); - tips->SetForegroundColour(wxColour("#009687")); + auto *tips = new HyperLink(this, _L("Wiki Guide")); // ORCA tips->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &e) { bool is_zh = wxGetApp().app_config->get("language") == "zh_CN"; if (is_zh) { diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 3d0318f663..5b4f9d3504 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -1312,7 +1312,7 @@ wxString OptionsGroup::get_url(const std::string& path_end) str = str.Left(pos) + anchor; } // Orca: point to sf wiki for seam parameters - return wxString::Format(L"https://github.com/OrcaSlicer/OrcaSlicer/wiki/%s", from_u8(path_end)); + return wxString::Format(L"https://www.orcaslicer.com/wiki/%s", from_u8(path_end)); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3f34af3246..5b40d2feeb 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -220,9 +220,14 @@ wxDEFINE_EVENT(EVT_NOTICE_FULL_SCREEN_CHANGED, IntEvent); static string get_diameter_string(float diameter) { - std::ostringstream stream; - stream << std::fixed << std::setprecision(1) << diameter; - return stream.str(); + std::ostringstream stream; // ORCA ensure 0.25 returned as 0.25. previous code returned as 0.2 because of std::setprecision(1) + stream << std::fixed << std::setprecision(2) << diameter; // Use 2 decimals to capture 0.25 / 0.15 reliably + std::string s = stream.str(); + if (s.find('.') != std::string::npos) { // Remove trailing zeros, but keep at least one decimal if needed + s.erase(s.find_last_not_of('0') + 1); + if (s.back() == '.') s += '0'; // Ensure "1." → "1.0" + } + return s; } bool Plater::has_illegal_filename_characters(const wxString& wxs_name) @@ -574,7 +579,9 @@ void Sidebar::priv::layout_printer(bool isBBL, bool isDual) // ORCA show plate type combo box only when its supported PresetBundle &preset_bundle = *wxGetApp().preset_bundle; auto cfg = preset_bundle.printers.get_edited_preset().config; - panel_printer_bed->Show(isBBL || cfg.opt_bool("support_multi_bed_types")); + // Orca: we use preset_bundle.is_bbl_vendor() instead of isBBL to determine if the plate type combo box should be shown + // ref: https://github.com/OrcaSlicer/OrcaSlicer/pull/11610#discussion_r2607411847 + panel_printer_bed->Show(preset_bundle.is_bbl_vendor() || cfg.opt_bool("support_multi_bed_types")); extruder_dual_sizer->Show(isDual); @@ -1230,7 +1237,8 @@ bool Sidebar::priv::switch_diameter(bool single) } auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, diameter.ToStdString()); if (preset == nullptr) { - MessageDialog dlg(this->plater, "", ""); + // ORCA add a text. this appears when user tries to change nozzle value but config doesnt have a inherited or compatible preset + MessageDialog dlg(this->plater, _L("Configuration incompatible"), _L("Warning"), wxICON_WARNING | wxOK); dlg.ShowModal(); return false; } @@ -2536,9 +2544,18 @@ void Sidebar::update_presets(Preset::Type preset_type) p->layout_printer(preset_bundle.use_bbl_network(), isBBL && is_dual_extruder); auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer(); auto diameter = printer_preset.config.opt_string("printer_variant"); - auto update_extruder_diameter = [&diameters, &diameter](ExtruderGroup & extruder) { + auto update_extruder_diameter = [&diameters, &diameter, &nozzle_diameter](int extruder_index,ExtruderGroup & extruder) { extruder.combo_diameter->Clear(); int select = -1; + // ORCA if user defined a custom nozzle in printer config select it instead inherited one. this will show correct nozzle diameter in combobox if its exist in nozzle diameters list + auto nozzle_dia = get_diameter_string(nozzle_diameter->values[extruder_index]); + if(nozzle_dia != diameter && std::find(diameters.begin(), diameters.end(), nozzle_dia) != diameters.end()) + diameter = nozzle_dia; + // ORCA try to add nozzle diameter from config if list is empty. fixes blank nozzle combo box when preset has no alias + if(diameters[0].empty() && !nozzle_dia.empty()){ + diameters[0] = nozzle_dia; + diameter = nozzle_dia; + } for (size_t i = 0; i < diameters.size(); ++i) { if (diameters[i] == diameter) select = extruder.combo_diameter->GetCount(); @@ -2552,14 +2569,14 @@ void Sidebar::update_presets(Preset::Type preset_type) AMSCountPopupWindow::UpdateAMSCount(0, p->left_extruder); AMSCountPopupWindow::UpdateAMSCount(1, p->right_extruder); //if (!p->is_switching_diameter) { - update_extruder_diameter(*p->left_extruder); - update_extruder_diameter(*p->right_extruder); + update_extruder_diameter(0, *p->left_extruder); + update_extruder_diameter(1, *p->right_extruder); //} p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, PRINTER_THUMBNAIL_SIZE.GetHeight())); } else { AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder); //if (!p->is_switching_diameter) - update_extruder_diameter(*p->single_extruder); + update_extruder_diameter(0, *p->single_extruder); // ORCA sync unified nozzle combo box p->combo_nozzle_dia->Clear(); @@ -4651,7 +4668,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) "extruder_clearance_radius", "extruder_clearance_height_to_lid", "extruder_clearance_height_to_rod", "nozzle_height", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", - "brim_width", "brim_object_gap", "brim_type", "nozzle_diameter", "single_extruder_multi_material", "preferred_orientation", + "brim_width", "brim_object_gap", "brim_use_efc_outline", "brim_type", "nozzle_diameter", "single_extruder_multi_material", "preferred_orientation", "enable_prime_tower", "wipe_tower_x", "wipe_tower_y", "prime_tower_width", "prime_tower_brim_width", "prime_tower_skip_points", "prime_tower_enable_framework", "prime_tower_infill_gap", "prime_volume", "extruder_colour", "filament_colour", "filament_type", "material_colour", "printable_height", "extruder_printable_height", "printer_model", "printer_technology", @@ -14095,10 +14112,10 @@ void Plater::increase_instances(size_t num) p->selection_changed(); this->p->schedule_background_process(); - if (wxGetApp().app_config->get("auto_arrange") == "true") { - this->set_prepare_state(Job::PREPARE_STATE_MENU); - this->arrange(); - } + //if (wxGetApp().app_config->get("auto_arrange") == "true") { + // this->set_prepare_state(Job::PREPARE_STATE_MENU); + // this->arrange(); + //} } void Plater::decrease_instances(size_t num) @@ -14126,10 +14143,10 @@ void Plater::decrease_instances(size_t num) p->selection_changed(); this->p->schedule_background_process(); - if (wxGetApp().app_config->get("auto_arrange") == "true") { - this->set_prepare_state(Job::PREPARE_STATE_MENU); - this->arrange(); - } + //if (wxGetApp().app_config->get("auto_arrange") == "true") { + // this->set_prepare_state(Job::PREPARE_STATE_MENU); + // this->arrange(); + //} } static long GetNumberFromUser( const wxString& msg, diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp index db330f84c8..0dedacb9d0 100644 --- a/src/slic3r/GUI/Preferences.cpp +++ b/src/slic3r/GUI/Preferences.cpp @@ -14,6 +14,8 @@ #include "NetworkTestDialog.hpp" #include "Widgets/StaticLine.hpp" #include "Widgets/RadioGroup.hpp" +#include "slic3r/Utils/bambu_networking.hpp" +#include "DownloadProgressDialog.hpp" #ifdef __WINDOWS__ #ifdef _MSW_DARK_MODE @@ -78,7 +80,7 @@ std::tuple PreferencesDialog::create_item_combobox_base( return {m_sizer_combox, combobox}; } -wxBoxSizer* PreferencesDialog::create_item_combobox(wxString title, wxString tooltip, std::string param, std::vector vlist) +wxBoxSizer* PreferencesDialog::create_item_combobox(wxString title, wxString tooltip, std::string param, std::vector vlist, std::function onchange) { unsigned int current_index = 0; @@ -90,8 +92,10 @@ wxBoxSizer* PreferencesDialog::create_item_combobox(wxString title, wxString too auto [sizer, combobox] = create_item_combobox_base(title, tooltip, param, vlist, current_index); //// save config - combobox->GetDropDown().Bind(wxEVT_COMBOBOX, [this, param](wxCommandEvent& e) { + combobox->GetDropDown().Bind(wxEVT_COMBOBOX, [this, param, onchange](wxCommandEvent& e) { app_config->set(param, std::to_string(e.GetSelection())); + if (onchange) + onchange(std::to_string(e.GetSelection())); e.Skip(); }); @@ -882,7 +886,6 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxString too if (pbool) { GUI::wxGetApp().CallAfter([] { GUI::wxGetApp().ShowDownNetPluginDlg(); }); } - if (m_legacy_networking_ckeckbox != nullptr) { m_legacy_networking_ckeckbox->Enable(pbool); } } #endif // __WXMSW__ @@ -910,7 +913,7 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxString too if (param == "enable_high_low_temp_mixed_printing") { if (checkbox->GetValue()) { const wxString warning_title = _L("Bed Temperature Difference Warning"); - const wxString warning_message = + const wxString warning_message = _L("Using filaments with significantly different temperatures may cause:\n" "• Extruder clogging\n" "• Nozzle damage\n" @@ -950,11 +953,6 @@ wxBoxSizer *PreferencesDialog::create_item_checkbox(wxString title, wxString too //// for debug mode if (param == "developer_mode") { m_developer_mode_ckeckbox = checkbox; } if (param == "internal_developer_mode") { m_internal_developer_mode_ckeckbox = checkbox; } - if (param == "legacy_networking") { - m_legacy_networking_ckeckbox = checkbox; - bool pbool = app_config->get_bool("installed_networking"); - checkbox->Enable(pbool); - } return m_sizer_checkbox; } @@ -1289,6 +1287,10 @@ void PreferencesDialog::create_items() auto item_remember_printer = create_item_checkbox(_L("Remember printer configuration"), _L("If enabled, Orca will remember and switch filament/process configuration for each printer automatically."), "remember_printer_config"); g_sizer->Add(item_remember_printer); + auto item_filament_preset_grouping = create_item_combobox(_L("Group user filament presets"), _L("Group user filament presets based on selection"), + "group_filament_presets", {_L("All"), _L("None"), _L("By type"), _L("By vendor")}, [](wxString value) {wxGetApp().plater()->sidebar().update_presets(Preset::TYPE_FILAMENT);}); + g_sizer->Add(item_filament_preset_grouping); + //// GENERAL > Features g_sizer->Add(create_item_title(_L("Features")), 1, wxEXPAND); @@ -1414,9 +1416,113 @@ void PreferencesDialog::create_items() auto item_enable_plugin = create_item_checkbox(_L("Enable network plugin"), "", "installed_networking"); g_sizer->Add(item_enable_plugin); - - auto item_legacy_network = create_item_checkbox(_L("Use legacy network plugin"), _L("Disable to use latest network plugin that supports new BambuLab firmwares."), "legacy_networking", _L("(Requires restart)")); - g_sizer->Add(item_legacy_network); + + m_network_version_sizer = new wxBoxSizer(wxHORIZONTAL); + m_network_version_sizer->AddSpacer(FromDIP(DESIGN_LEFT_MARGIN)); + + auto version_title = new wxStaticText(m_parent, wxID_ANY, _L("Network plugin version"), wxDefaultPosition, DESIGN_TITLE_SIZE, wxST_NO_AUTORESIZE); + version_title->SetForegroundColour(DESIGN_GRAY900_COLOR); + version_title->SetFont(::Label::Body_14); + version_title->SetToolTip(_L("Select the network plugin version to use")); + version_title->Wrap(DESIGN_TITLE_SIZE.x); + m_network_version_sizer->Add(version_title, 0, wxALIGN_CENTER); + + m_network_version_combo = new ::ComboBox(m_parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(FromDIP(180), -1), 0, nullptr, wxCB_READONLY); + m_network_version_combo->SetFont(::Label::Body_14); + m_network_version_combo->GetDropDown().SetFont(::Label::Body_14); + + std::string current_version = app_config->get_network_plugin_version(); + if (current_version.empty()) { + current_version = BBL::get_latest_network_version(); + } + int current_selection = 0; + + m_available_versions = BBL::get_all_available_versions(); + + for (size_t i = 0; i < m_available_versions.size(); i++) { + const auto& ver = m_available_versions[i]; + wxString label; + + if (!ver.suffix.empty()) { + label = wxString::FromUTF8("\xE2\x94\x94 ") + wxString::FromUTF8(ver.display_name); + } else { + label = wxString::FromUTF8(ver.display_name); + } + + if (ver.is_latest) { + label += " " + _L("(Latest)"); + } + m_network_version_combo->Append(label); + if (current_version == ver.version) { + current_selection = i; + } + } + + m_network_version_combo->SetSelection(current_selection); + m_network_version_sizer->Add(m_network_version_combo, 0, wxALIGN_CENTER | wxLEFT, FromDIP(5)); + + m_network_version_combo->GetDropDown().Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& e) { + int selection = e.GetSelection(); + if (selection >= 0 && selection < (int)m_available_versions.size()) { + const auto& selected_ver = m_available_versions[selection]; + std::string new_version = selected_ver.version; + std::string old_version = app_config->get_network_plugin_version(); + if (old_version.empty()) { + old_version = BBL::get_latest_network_version(); + } + + app_config->set(SETTING_NETWORK_PLUGIN_VERSION, new_version); + app_config->save(); + + if (new_version != old_version) { + BOOST_LOG_TRIVIAL(info) << "Network plugin version changed from " << old_version << " to " << new_version; + + // Update the use_legacy_network flag immediately + bool is_legacy = (new_version == BAMBU_NETWORK_AGENT_VERSION_LEGACY); + bool was_legacy = (old_version == BAMBU_NETWORK_AGENT_VERSION_LEGACY); + if (is_legacy != was_legacy) { + Slic3r::NetworkAgent::use_legacy_network = is_legacy; + BOOST_LOG_TRIVIAL(info) << "Updated use_legacy_network flag to " << is_legacy; + } + + if (!selected_ver.warning.empty()) { + MessageDialog warn_dlg(this, wxString::FromUTF8(selected_ver.warning), _L("Warning"), wxOK | wxCANCEL | wxICON_WARNING); + if (warn_dlg.ShowModal() != wxID_OK) { + app_config->set(SETTING_NETWORK_PLUGIN_VERSION, old_version); + app_config->save(); + Slic3r::NetworkAgent::use_legacy_network = was_legacy; + e.Skip(); + return; + } + } + + // Check if the selected version already exists on disk + if (Slic3r::NetworkAgent::versioned_library_exists(new_version)) { + BOOST_LOG_TRIVIAL(info) << "Version " << new_version << " already exists on disk, triggering hot reload"; + if (wxGetApp().hot_reload_network_plugin()) { + MessageDialog dlg(this, _L("Network plugin switched successfully."), _L("Success"), wxOK | wxICON_INFORMATION); + dlg.ShowModal(); + } else { + MessageDialog dlg(this, _L("Failed to load network plugin. Please restart the application."), _L("Restart Required"), wxOK | wxICON_WARNING); + dlg.ShowModal(); + } + } else { + wxString msg = wxString::Format( + _L("You've selected network plugin version %s.\n\nWould you like to download and install this version now?\n\nNote: The application may need to restart after installation."), + wxString::FromUTF8(new_version)); + + MessageDialog dlg(this, msg, _L("Download Network Plugin"), wxYES_NO | wxICON_QUESTION); + if (dlg.ShowModal() == wxID_YES) { + DownloadProgressDialog progress_dlg(_L("Downloading Network Plugin")); + progress_dlg.ShowModal(); + } + } + } + } + e.Skip(); + }); + + g_sizer->Add(m_network_version_sizer); g_sizer->AddSpacer(FromDIP(10)); sizer_page->Add(g_sizer, 0, wxEXPAND); @@ -1487,6 +1593,18 @@ void PreferencesDialog::create_items() auto loglevel_combox = create_item_loglevel_combobox(_L("Log Level"), _L("Log Level"), log_level_list); g_sizer->Add(loglevel_combox); + g_sizer->Add(create_item_title(_L("Network Plugin")), 1, wxEXPAND); + auto item_reload_plugin = create_item_button(_L("Network plugin"), _L("Reload"), _L("Reload the network plugin without restarting the application"), "", [this]() { + if (wxGetApp().hot_reload_network_plugin()) { + MessageDialog dlg(this, _L("Network plugin reloaded successfully."), _L("Reload"), wxOK | wxICON_INFORMATION); + dlg.ShowModal(); + } else { + MessageDialog dlg(this, _L("Failed to reload network plugin. Please restart the application."), _L("Reload Failed"), wxOK | wxICON_ERROR); + dlg.ShowModal(); + } + }); + g_sizer->Add(item_reload_plugin); + //// DEVELOPER > Debug #if !BBL_RELEASE_TO_PUBLIC g_sizer->Add(create_item_title(_L("Debug")), 1, wxEXPAND); @@ -1687,7 +1805,7 @@ wxBoxSizer* PreferencesDialog::create_debug_page() bSizer->Add(enable_ssl_for_mqtt, 0, wxTOP, FromDIP(3)); bSizer->Add(enable_ssl_for_ftp, 0, wxTOP, FromDIP(3)); bSizer->Add(item_internal_developer, 0, wxTOP, FromDIP(3)); - bSizer->Add(title_host, 0, wxEXPAND); + bSizer->Add(title_host, 0, wxEXPAND | wxTOP, FromDIP(10)); bSizer->Add(radio_group, 0, wxEXPAND | wxLEFT, FromDIP(DESIGN_LEFT_MARGIN)); bSizer->Add(debug_button, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, FromDIP(15)); diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp index ecd591e089..892c1ec35c 100644 --- a/src/slic3r/GUI/Preferences.hpp +++ b/src/slic3r/GUI/Preferences.hpp @@ -13,6 +13,7 @@ #include "Widgets/CheckBox.hpp" #include "Widgets/TextInput.hpp" #include "Widgets/TabCtrl.hpp" +#include "slic3r/Utils/bambu_networking.hpp" namespace Slic3r { namespace GUI { @@ -67,7 +68,9 @@ public: ::CheckBox * m_internal_developer_mode_ckeckbox = {nullptr}; ::CheckBox * m_dark_mode_ckeckbox = {nullptr}; ::TextInput *m_backup_interval_textinput = {nullptr}; - ::CheckBox * m_legacy_networking_ckeckbox = {nullptr}; + ::ComboBox * m_network_version_combo = {nullptr}; + wxBoxSizer * m_network_version_sizer = {nullptr}; + std::vector m_available_versions; wxString m_developer_mode_def; wxString m_internal_developer_mode_def; @@ -77,7 +80,7 @@ public: std::vector f_sizers; wxBoxSizer *create_item_title(wxString title); - wxBoxSizer *create_item_combobox(wxString title, wxString tooltip, std::string param, std::vector vlist); + wxBoxSizer *create_item_combobox(wxString title, wxString tooltip, std::string param, std::vector vlist, std::function onchange = {}); wxBoxSizer *create_item_combobox(wxString title, wxString tooltip, std::string param, std::vector vlist, std::vector config_name_index); wxBoxSizer *create_item_region_combobox(wxString title, wxString tooltip); wxBoxSizer *create_item_language_combobox(wxString title, wxString tooltip); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 5006c5eab0..2e5f83c211 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -1132,6 +1132,7 @@ void PlaterPresetComboBox::update() std::map preset_descriptions; std::map preset_filament_vendors; std::map preset_filament_types; + std::map preset_filament_names; // ORCA //BBS: move system to the end wxString selected_system_preset; wxString selected_user_preset; @@ -1174,7 +1175,8 @@ void PlaterPresetComboBox::update() bitmap_key += single_bar ? filament_rgb : filament_rgb + extruder_rgb; #endif - if (preset.is_system) { + // ORCA allow caching vendor and type values for all presets instead just system ones + // if (preset.is_system) { if (!preset.is_compatible && preset_filament_vendors.count(name) > 0) continue; else if (preset.is_compatible && preset_filament_vendors.count(name) > 0) @@ -1183,7 +1185,8 @@ void PlaterPresetComboBox::update() if (preset_filament_vendors[name] == "Bambu Lab") preset_filament_vendors[name] = "Bambu"; preset_filament_types[name] = preset.config.option("filament_type")->values.at(0); - } + preset_filament_names[name] = name.ToStdString(); // ORCA + //} } wxBitmap* bmp = get_bmp(preset); assert(bmp); @@ -1251,7 +1254,7 @@ void PlaterPresetComboBox::update() "Bambu PLA Galaxy", "Bambu PLA Metal", "Bambu PLA Marble", "Bambu PETG-CF", "Bambu PETG Translucent", "Bambu ABS-GF"}; std::vector first_vendors = {"", "Bambu", "Generic"}; // Empty vendor for non-system presets std::vector first_types = {"PLA", "PETG", "ABS", "TPU"}; - auto add_presets = [this, &preset_descriptions, &filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &first_types, &selected_in_ams] + auto add_presets = [this, &preset_descriptions, &filament_orders, &preset_filament_vendors, &first_vendors, &preset_filament_types, &preset_filament_names, &first_types, &selected_in_ams] (std::map const &presets, wxString const &selected, std::string const &group, wxString const &groupName) { if (!presets.empty()) { set_label_marker(Append(_L(group), wxNullBitmap, DD_ITEM_STYLE_SPLIT_ITEM)); @@ -1285,9 +1288,31 @@ void PlaterPresetComboBox::update() } return l->first < r->first; }); + // ORCA add sorting support for vendor / type for user presets. also non grouped items + if (groupName == "by_vendor" || groupName == "by_type" || groupName == ""){ + auto by = groupName == "by_vendor" ? preset_filament_vendors + : groupName == "by_type" ? preset_filament_types + : preset_filament_names; + std::sort(list.begin(), list.end(), [&by](auto *l, auto *r) { + auto get_key = [&](auto* item) -> std::pair { + std::string str = by.count(item->first) ? by.at(item->first) : ""; + std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::tolower(c);}); + return {!str.empty(), str}; // is_valid, lower_case + }; + auto [l_valid, l_lower] = get_key(l); + auto [r_valid, r_lower] = get_key(r); + return (l_valid != r_valid) ? l_valid > r_valid + : (l_lower != r_lower) ? l_lower < r_lower + : l->first < r->first; + }); + } bool unsupported = group == "Unsupported presets"; for (auto it : list) { - auto groupName2 = groupByGroup ? groupName : preset_filament_vendors[it->first]; + // ORCA add sorting support for vendor / type for user presets + auto groupName2 = groupName == "by_type" ? (preset_filament_types[it->first].empty() ? _L("Unspecified") : preset_filament_types[it->first]) + : groupName == "by_vendor" ? (preset_filament_vendors[it->first].empty() ? _L("Unspecified") : preset_filament_vendors[it->first]) + : groupByGroup ? groupName + : preset_filament_vendors[it->first]; int index = Append(it->first, *it->second, groupName2, nullptr, unsupported ? DD_ITEM_STYLE_DISABLED : 0); if (unsupported) set_label_marker(index, LABEL_ITEM_DISABLED); @@ -1311,7 +1336,13 @@ void PlaterPresetComboBox::update() //BBS: add project embedded preset logic add_presets(project_embedded_presets, selected_user_preset, L("Project-inside presets"), _L("Project") + " "); - add_presets(nonsys_presets, selected_user_preset, L("User presets"), _L("Custom") + " "); + // ORCA add sorting support for vendor / type for user presets + auto group_filament_presets = wxGetApp().app_config->get("group_filament_presets"); + auto group_filament_presets_by = group_filament_presets == "0" ? (_L("Custom") + " ") // Append all to "Custom" sub menu + : group_filament_presets == "2" ? "by_type" // Create sub menus with filament type + : group_filament_presets == "3" ? "by_vendor" // Create sub menus with filament vendor + : ""; // Use without sub menu + add_presets(nonsys_presets, selected_user_preset, L("User presets"), group_filament_presets_by); // BBS: move system to the end add_presets(system_presets, selected_system_preset, L("System presets"), _L("System")); add_presets(uncompatible_presets, {}, L("Unsupported presets"), _L("Unsupported") + " "); diff --git a/src/slic3r/GUI/PrintOptionsDialog.cpp b/src/slic3r/GUI/PrintOptionsDialog.cpp index 02329a36b7..56cc764356 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.cpp +++ b/src/slic3r/GUI/PrintOptionsDialog.cpp @@ -1153,11 +1153,8 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) change_nozzle_tips->SetFont(Label::Body_13); change_nozzle_tips->SetForegroundColour(STATIC_TEXT_CAPTION_COL); - m_wiki_link = new Label(single_panel, _L("View wiki")); + m_wiki_link = new HyperLink(single_panel, _L("Wiki Guide")); // ORCA m_wiki_link->SetFont(Label::Body_13); - m_wiki_link->SetForegroundColour(wxColour("#009688")); - m_wiki_link->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { SetCursor(wxCURSOR_HAND); }); - m_wiki_link->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { SetCursor(wxCURSOR_ARROW); }); m_wiki_link->Bind(wxEVT_LEFT_DOWN, &PrinterPartsDialog::OnWikiClicked, this); h_tips_sizer->Add(change_nozzle_tips, 0, wxLEFT); @@ -1267,11 +1264,8 @@ PrinterPartsDialog::PrinterPartsDialog(wxWindow* parent) multiple_change_nozzle_tips->SetFont(Label::Body_13); multiple_change_nozzle_tips->SetForegroundColour(STATIC_TEXT_CAPTION_COL); - multiple_wiki_link = new Label(multiple_panel, _L("View wiki")); + multiple_wiki_link = new HyperLink(multiple_panel, _L("Wiki Guide")); // ORCA multiple_wiki_link->SetFont(Label::Body_13); - multiple_wiki_link->SetForegroundColour(wxColour("#009688")); - multiple_wiki_link->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) { SetCursor(wxCURSOR_HAND); }); - multiple_wiki_link->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) { SetCursor(wxCURSOR_ARROW); }); multiple_wiki_link->Bind(wxEVT_LEFT_DOWN, &PrinterPartsDialog::OnWikiClicked, this); wxSizer* multiple_change_tips_sizer = new wxBoxSizer(wxHORIZONTAL); diff --git a/src/slic3r/GUI/PrintOptionsDialog.hpp b/src/slic3r/GUI/PrintOptionsDialog.hpp index d555c8237b..9918cfb80e 100644 --- a/src/slic3r/GUI/PrintOptionsDialog.hpp +++ b/src/slic3r/GUI/PrintOptionsDialog.hpp @@ -16,6 +16,7 @@ #include "Widgets/CheckBox.hpp" #include "Widgets/StaticLine.hpp" #include "Widgets/ComboBox.hpp" +#include "Widgets/HyperLink.hpp" // Previous definitions class SwitchBoard; @@ -33,7 +34,7 @@ protected: Label* nozzle_flow_type_label; ComboBox* nozzle_flow_type_checkbox; Label *change_nozzle_tips; - Label* m_wiki_link; + HyperLink* m_wiki_link; Button* m_single_update_nozzle_button; Button* m_multiple_update_nozzle_button; @@ -46,7 +47,7 @@ protected: ComboBox *multiple_right_nozzle_flow_checkbox; Label *multiple_change_nozzle_tips; - Label* multiple_wiki_link; + HyperLink* multiple_wiki_link; wxPanel *single_panel; wxPanel *multiple_panel; diff --git a/src/slic3r/GUI/ReleaseNote.cpp b/src/slic3r/GUI/ReleaseNote.cpp index 2dd0a7baf2..9b156c5228 100644 --- a/src/slic3r/GUI/ReleaseNote.cpp +++ b/src/slic3r/GUI/ReleaseNote.cpp @@ -1510,7 +1510,8 @@ InputIpAddressDialog::InputIpAddressDialog(wxWindow *parent) m_tip4->SetMinSize(wxSize(FromDIP(355), -1)); m_tip4->SetMaxSize(wxSize(FromDIP(355), -1)); - m_trouble_shoot = new wxHyperlinkCtrl(this, wxID_ANY, "How to trouble shooting", ""); + // ORCA standardized HyperLink + m_trouble_shoot = new HyperLink(this, "How to trouble shooting"); m_img_help = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("input_access_code_x1_en", this, 198), wxDefaultPosition, wxSize(FromDIP(355), -1), 0); diff --git a/src/slic3r/GUI/ReleaseNote.hpp b/src/slic3r/GUI/ReleaseNote.hpp index 838df0efd5..37b7c58935 100644 --- a/src/slic3r/GUI/ReleaseNote.hpp +++ b/src/slic3r/GUI/ReleaseNote.hpp @@ -326,7 +326,7 @@ public: wxStaticBitmap* m_img_step1{ nullptr }; wxStaticBitmap* m_img_step2{ nullptr }; wxStaticBitmap* m_img_step3{ nullptr }; - wxHyperlinkCtrl* m_trouble_shoot{ nullptr }; + HyperLink* m_trouble_shoot{ nullptr }; // ORCA wxTimer* closeTimer{ nullptr }; int closeCount{3}; bool m_show_access_code{ false }; diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 56ecd56ce2..eeb472e98a 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -688,12 +688,9 @@ SelectMachineDialog::SelectMachineDialog(Plater *plater) sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0); sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0); - - m_link_network_state = new wxHyperlinkCtrl(m_sw_print_failed_info, wxID_ANY,_L("Check the status of current system services"),""); + // ORCA standardized HyperLink + m_link_network_state = new HyperLink(m_sw_print_failed_info, _L("Check the status of current system services"), wxGetApp().link_to_network_check()); m_link_network_state->SetFont(::Label::Body_12); - m_link_network_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check();}); - m_link_network_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_HAND);}); - m_link_network_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_ARROW);}); sizer_print_failed_info->Add(m_link_network_state, 0, wxLEFT, 5); sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 42bf251b7c..302b37b553 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -42,6 +42,7 @@ #include "Widgets/ComboBox.hpp" #include "Widgets/ScrolledWindow.hpp" #include "Widgets/PopupWindow.hpp" +#include "Widgets/HyperLink.hpp" // ORCA #include #include @@ -371,7 +372,7 @@ protected: Label* m_st_txt_error_desc{nullptr}; Label* m_st_txt_extra_info{nullptr}; Label* m_ams_backup_tip{nullptr}; - wxHyperlinkCtrl* m_link_network_state{ nullptr }; + HyperLink* m_link_network_state{ nullptr }; // ORCA wxSimplebook* m_rename_switch_panel{nullptr}; wxSimplebook* m_simplebook{nullptr}; wxStaticText* m_rename_text{nullptr}; diff --git a/src/slic3r/GUI/SelectMachinePop.cpp b/src/slic3r/GUI/SelectMachinePop.cpp index aef994d067..ddca6df8a7 100644 --- a/src/slic3r/GUI/SelectMachinePop.cpp +++ b/src/slic3r/GUI/SelectMachinePop.cpp @@ -596,8 +596,9 @@ void SelectMachinePopup::update_other_devices() m_placeholder_panel = new wxWindow(m_scrolledWindow, wxID_ANY, wxDefaultPosition, wxSize(-1,FromDIP(26))); wxBoxSizer* placeholder_sizer = new wxBoxSizer(wxVERTICAL); - m_hyperlink = new wxHyperlinkCtrl(m_placeholder_panel, wxID_ANY, _L("Can't find my devices?"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); - m_hyperlink->SetNormalColour(StateColor::darkModeColorFor("#009789")); + // ORCA standardized HyperLink + m_hyperlink = new HyperLink(m_placeholder_panel, _L("Can't find my devices?"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer")); + m_hyperlink->SetFont(::Label::Body_12); placeholder_sizer->Add(m_hyperlink, 0, wxALIGN_CENTER | wxALL, 5); diff --git a/src/slic3r/GUI/SelectMachinePop.hpp b/src/slic3r/GUI/SelectMachinePop.hpp index d1a34f9b3a..757cb08ed5 100644 --- a/src/slic3r/GUI/SelectMachinePop.hpp +++ b/src/slic3r/GUI/SelectMachinePop.hpp @@ -180,7 +180,7 @@ private: PinCodePanel* m_panel_ping_code{nullptr}; PinCodePanel* m_panel_direct_connection{nullptr}; wxWindow* m_placeholder_panel{nullptr}; - wxHyperlinkCtrl* m_hyperlink{nullptr}; + HyperLink* m_hyperlink{nullptr}; // ORCA Label* m_ping_code_text{nullptr}; wxStaticBitmap* m_img_ping_code{nullptr}; wxBoxSizer * m_sizer_body{nullptr}; diff --git a/src/slic3r/GUI/SendMultiMachinePage.cpp b/src/slic3r/GUI/SendMultiMachinePage.cpp index 1060dc253c..3578e4047c 100644 --- a/src/slic3r/GUI/SendMultiMachinePage.cpp +++ b/src/slic3r/GUI/SendMultiMachinePage.cpp @@ -801,7 +801,7 @@ bool SendMultiMachinePage::Show(bool show) m_refresh_timer->Stop(); m_refresh_timer->SetOwner(this); m_refresh_timer->Start(4000); - wxPostEvent(this, wxTimerEvent()); + wxPostEvent(this, wxTimerEvent(*m_refresh_timer)); } else { m_refresh_timer->Stop(); diff --git a/src/slic3r/GUI/SendToPrinter.cpp b/src/slic3r/GUI/SendToPrinter.cpp index 5f5cf9925e..670a8bcad4 100644 --- a/src/slic3r/GUI/SendToPrinter.cpp +++ b/src/slic3r/GUI/SendToPrinter.cpp @@ -446,11 +446,9 @@ SendToPrinterDialog::SendToPrinterDialog(Plater *plater) sizer_extra_info->Add(st_title_extra_info_doc, 0, wxALL, 0); sizer_extra_info->Add(m_st_txt_extra_info, 0, wxALL, 0); - m_link_network_state = new wxHyperlinkCtrl(m_sw_print_failed_info, wxID_ANY,_L("Check the status of current system services"),""); + // ORCA standardized HyperLink + m_link_network_state = new HyperLink(m_sw_print_failed_info, _L("Check the status of current system services"), wxGetApp().link_to_network_check()); m_link_network_state->SetFont(::Label::Body_12); - m_link_network_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check(); }); - m_link_network_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_HAND); }); - m_link_network_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_ARROW); }); sizer_print_failed_info->Add(m_link_network_state, 0, wxLEFT, 5); sizer_print_failed_info->Add(sizer_error_code, 0, wxLEFT, 5); diff --git a/src/slic3r/GUI/SendToPrinter.hpp b/src/slic3r/GUI/SendToPrinter.hpp index de284e31d6..14493a1f20 100644 --- a/src/slic3r/GUI/SendToPrinter.hpp +++ b/src/slic3r/GUI/SendToPrinter.hpp @@ -110,7 +110,7 @@ private: Label* m_st_txt_error_code{ nullptr }; Label* m_st_txt_error_desc{ nullptr }; Label* m_st_txt_extra_info{ nullptr }; - wxHyperlinkCtrl* m_link_network_state{ nullptr }; + HyperLink* m_link_network_state{ nullptr }; StateColor btn_bg_enable; wxBoxSizer* rename_sizer_v{ nullptr }; wxBoxSizer* rename_sizer_h{ nullptr }; diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index dc717aca39..8a85e556de 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -2503,6 +2503,8 @@ StatusPanel::~StatusPanel() void StatusPanel::init_scaled_buttons() { + if (!m_project_task_panel) return; + m_project_task_panel->init_scaled_buttons(); m_bpButton_z_10->SetMinSize(Z_BUTTON_SIZE); m_bpButton_z_10->SetCornerRadius(0); diff --git a/src/slic3r/GUI/StepMeshDialog.cpp b/src/slic3r/GUI/StepMeshDialog.cpp index db281a8ebf..196c0ff8e0 100644 --- a/src/slic3r/GUI/StepMeshDialog.cpp +++ b/src/slic3r/GUI/StepMeshDialog.cpp @@ -117,14 +117,11 @@ StepMeshDialog::StepMeshDialog(wxWindow* parent, Slic3r::Step& file, double line wxBoxSizer* tips_sizer = new wxBoxSizer(wxVERTICAL); wxStaticText* info = new wxStaticText(this, wxID_ANY, _L("Smaller linear and angular deflections result in higher-quality transformations but increase the processing time.")); info->SetForegroundColour(StateColor::darkModeColorFor(FONT_COLOR)); - wxStaticText *tips = new wxStaticText(this, wxID_ANY, _L("View Wiki for more information")); - wxFont font(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false); - font.SetUnderlined(true); - tips->SetForegroundColour(StateColor::darkModeColorFor(wxColour(0, 151, 137))); - tips->SetFont(font); - tips->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& e) { - wxLaunchDefaultBrowser("https://github.com/OrcaSlicer/OrcaSlicer/wiki/stl-transformation"); - }); + + // ORCA standardized HyperLink + HyperLink *tips = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/stl-transformation"); + tips->SetFont(::Label::Body_12); + info->Wrap(FromDIP(400)); tips_sizer->Add(info, 0, wxALIGN_LEFT); tips_sizer->Add(tips, 0, wxALIGN_LEFT); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 1f3d73751b..d4d31a3573 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -353,9 +353,9 @@ void Tab::create_preset_tab() }); - m_undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(); })); - //m_undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent) { on_roll_back_value(true); })); - /* m_search_btn->Bind(wxEVT_BUTTON, [](wxCommandEvent) { wxGetApp().plater()->search(false); });*/ + m_undo_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent&) { on_roll_back_value(); })); + //m_undo_to_sys_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent&) { on_roll_back_value(true); })); + /* m_search_btn->Bind(wxEVT_BUTTON, [](wxCommandEvent&) { wxGetApp().plater()->search(false); });*/ // Colors for ui "decoration" m_sys_label_clr = wxGetApp().get_label_clr_sys(); @@ -540,14 +540,14 @@ void Tab::create_preset_tab() m_hsizer->Add(m_page_view, 1, wxEXPAND | wxLEFT, 5);*/ //m_btn_compare_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { compare_preset(); })); - m_btn_save_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { save_preset(); })); - m_btn_delete_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { delete_preset(); })); + m_btn_save_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e) { save_preset(); })); + m_btn_delete_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e) { delete_preset(); })); /*m_btn_hide_incompatible_presets->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { toggle_show_hide_incompatible(); })); if (m_btn_edit_ph_printer) - m_btn_edit_ph_printer->Bind(wxEVT_BUTTON, [this](wxCommandEvent e) { + m_btn_edit_ph_printer->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { if (m_preset_bundle->physical_printers.has_selection()) m_presets_choice->edit_physical_printer(); else @@ -892,7 +892,8 @@ void Tab::decorate() void Tab::filter_diff_option(std::vector &options) { for (auto &opt : options) { - if (opt.find_last_of('#') == std::string::npos) continue; + const auto hash_pos = opt.find_last_of('#'); + if (hash_pos == std::string::npos) continue; bool found = false; for (auto page : m_pages) { if (auto iter = page->m_opt_id_map.find(opt); iter != page->m_opt_id_map.end()) { @@ -901,7 +902,7 @@ void Tab::filter_diff_option(std::vector &options) break; } } - if (!found) opt.clear(); + if (!found) opt = opt.substr(0, hash_pos); } options.erase(std::remove(options.begin(), options.end(), ""), options.end()); } @@ -912,7 +913,7 @@ void Tab::update_changed_ui() if (m_postpone_update_ui) return; - const bool deep_compare = (m_type == Preset::TYPE_PRINTER || m_type == Preset::TYPE_PRINT + const bool deep_compare = (m_type == Preset::TYPE_PRINTER || m_type == Preset::TYPE_PRINT || m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL || m_type == Preset::TYPE_MODEL); auto dirty_options = m_presets->current_dirty_options(deep_compare); auto nonsys_options = m_presets->current_different_from_parent_options(deep_compare); @@ -2662,6 +2663,7 @@ void TabPrint::build() optgroup->append_single_option_line("brim_type", "others_settings_brim#type"); optgroup->append_single_option_line("brim_width", "others_settings_brim#width"); optgroup->append_single_option_line("brim_object_gap", "others_settings_brim#brim-object-gap"); + optgroup->append_single_option_line("brim_use_efc_outline", "others_settings_brim#brim-use-efc-outline"); optgroup->append_single_option_line("brim_ears_max_angle", "others_settings_brim#ear-max-angle"); optgroup->append_single_option_line("brim_ears_detection_length", "others_settings_brim#ear-detection-radius"); @@ -3559,7 +3561,7 @@ void TabFilament::add_filament_overrides_page() auto append_retraction_option = [this, retraction_optgroup](const std::string& opt_key, int opt_index) { Line line {"",""}; - line = retraction_optgroup->create_single_option_line(retraction_optgroup->get_option(opt_key)); + line = retraction_optgroup->create_single_option_line(retraction_optgroup->get_option(opt_key, opt_index)); line.near_label_widget = [this, optgroup_wk = ConfigOptionsGroupWkp(retraction_optgroup), opt_key, opt_index](wxWindow* parent) { auto check_box = new ::CheckBox(parent); // ORCA modernize checkboxes @@ -3581,6 +3583,7 @@ void TabFilament::add_filament_overrides_page() } } } + evt.Skip(); }, check_box->GetId()); m_overrides_options[opt_key] = check_box; @@ -3616,7 +3619,7 @@ void TabFilament::add_filament_overrides_page() auto append_ironing_option = [this, ironing_optgroup](const std::string& opt_key, int opt_index) { Line line {"",""}; - line = ironing_optgroup->create_single_option_line(ironing_optgroup->get_option(opt_key)); + line = ironing_optgroup->create_single_option_line(ironing_optgroup->get_option(opt_key, opt_index)); line.near_label_widget = [this, optgroup_wk = ConfigOptionsGroupWkp(ironing_optgroup), opt_key, opt_index](wxWindow* parent) { auto check_box = new ::CheckBox(parent); // ORCA modernize checkboxes @@ -3682,6 +3685,7 @@ void TabFilament::add_filament_overrides_page() } } } + evt.Skip(); }, check_box->GetId()); m_overrides_options[opt_key] = check_box; @@ -3888,8 +3892,8 @@ void TabFilament::build() optgroup = page->new_optgroup(L("Print temperature"), L"param_extruder_temp"); line = { L("Nozzle"), L("Nozzle temperature when printing") }; line.label_path = "material_temperatures#nozzle"; - line.append_option(optgroup->get_option("nozzle_temperature_initial_layer")); - line.append_option(optgroup->get_option("nozzle_temperature")); + line.append_option(optgroup->get_option("nozzle_temperature_initial_layer", 0)); + line.append_option(optgroup->get_option("nozzle_temperature", 0)); optgroup->append_line(line); optgroup = page->new_optgroup(L("Bed temperature"), L"param_bed_temp"); @@ -3968,7 +3972,7 @@ void TabFilament::build() //BBS optgroup = page->new_optgroup(L("Volumetric speed limitation"), L"param_volumetric_speed"); optgroup->append_single_option_line("filament_adaptive_volumetric_speed", "material_volumetric_speed_limitation#adaptive-volumetric-speed", 0); - optgroup->append_single_option_line("filament_max_volumetric_speed", "material_volumetric_speed_limitation#max-volumetric-speed"); + optgroup->append_single_option_line("filament_max_volumetric_speed", "material_volumetric_speed_limitation#max-volumetric-speed", 0); //line = { "", "" }; //line.full_width = 1; @@ -4140,6 +4144,9 @@ void TabFilament::reload_config() this->compatible_widget_reload(m_compatible_printers); this->compatible_widget_reload(m_compatible_prints); Tab::reload_config(); + + // Recompute derived override UI from the newly loaded config + update_filament_overrides_page(&m_preset_bundle->printers.get_edited_preset().config); } //void TabFilament::update_volumetric_flow_preset_hints() @@ -6698,18 +6705,18 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep this->update_changed_ui(); }; - deps.checkbox_title->Bind(wxEVT_LEFT_DOWN,([this, &deps, on_toggle](wxMouseEvent e) { + deps.checkbox_title->Bind(wxEVT_LEFT_DOWN,([this, &deps, on_toggle](wxMouseEvent& e) { if (e.GetEventType() == wxEVT_LEFT_DCLICK) return; on_toggle(!deps.checkbox->GetValue()); e.Skip(); })); - deps.checkbox_title->Bind(wxEVT_LEFT_DCLICK,([this, &deps, on_toggle](wxMouseEvent e) { + deps.checkbox_title->Bind(wxEVT_LEFT_DCLICK,([this, &deps, on_toggle](wxMouseEvent& e) { on_toggle(!deps.checkbox->GetValue()); e.Skip(); })); - deps.checkbox->Bind(wxEVT_TOGGLEBUTTON, ([this, on_toggle](wxCommandEvent e) { + deps.checkbox->Bind(wxEVT_TOGGLEBUTTON, ([this, on_toggle](wxCommandEvent& e) { on_toggle(e.IsChecked()); e.Skip(); }), deps.checkbox->GetId()); @@ -6734,7 +6741,7 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep } */ - deps.btn->Bind(wxEVT_BUTTON, ([this, parent, &deps](wxCommandEvent e) + deps.btn->Bind(wxEVT_BUTTON, ([this, parent, &deps](wxCommandEvent& e) { // Collect names of non-default non-external profiles. PrinterTechnology printer_technology = m_preset_bundle->printers.get_edited_preset().printer_technology(); @@ -6816,7 +6823,7 @@ wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent) auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL); - btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { + btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e) { bool is_configed_by_BBL = PresetUtils::system_printer_bed_model(m_preset_bundle->printers.get_edited_preset()).size() > 0; BedShapeDialog dlg(this); dlg.build_dialog(m_config->option("printable_area")->values, diff --git a/src/slic3r/GUI/Tabbook.cpp b/src/slic3r/GUI/Tabbook.cpp index ce26f3c658..db8cd3ba10 100644 --- a/src/slic3r/GUI/Tabbook.cpp +++ b/src/slic3r/GUI/Tabbook.cpp @@ -197,6 +197,20 @@ void TabButtonsListCtrl::SetPaddingSize(const wxSize& size) { } } +void TabButtonsListCtrl::SetFooterText(const wxString& text) +{ + if (!m_footer_text) { + m_footer_text = new wxStaticText(this, wxID_ANY, text); + m_footer_text->SetForegroundColour(wxColour(128, 128, 128)); + m_footer_text->SetFont(Label::Body_10); + int em = em_unit(this); + m_sizer->Add(m_footer_text, 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM, em / 2); + } else { + m_footer_text->SetLabel(text); + } + m_sizer->Layout(); +} + //#endif // _WIN32 diff --git a/src/slic3r/GUI/Tabbook.hpp b/src/slic3r/GUI/Tabbook.hpp index 7dd19389de..0cea1b8326 100644 --- a/src/slic3r/GUI/Tabbook.hpp +++ b/src/slic3r/GUI/Tabbook.hpp @@ -32,6 +32,7 @@ public: wxString GetPageText(size_t n) const; const wxSize& GetPaddingSize(size_t n); void SetPaddingSize(const wxSize& size); + void SetFooterText(const wxString& text); TabButton* pageButton; private: @@ -43,6 +44,7 @@ private: int m_selection {-1}; int m_btn_margin; int m_line_margin; + wxStaticText* m_footer_text {nullptr}; }; class Tabbook: public wxBookCtrlBase @@ -261,6 +263,11 @@ public: GetBtnsListCtrl()->Rescale(); } + void SetFooterText(const wxString& text) + { + GetBtnsListCtrl()->SetFooterText(text); + } + void OnNavigationKey(wxNavigationKeyEvent& event) { if (event.IsWindowChange()) { diff --git a/src/slic3r/GUI/WebUserLoginDialog.cpp b/src/slic3r/GUI/WebUserLoginDialog.cpp index fba6547f65..2522efbf4f 100644 --- a/src/slic3r/GUI/WebUserLoginDialog.cpp +++ b/src/slic3r/GUI/WebUserLoginDialog.cpp @@ -25,6 +25,7 @@ #include #include +#include // ORCA using namespace std; using namespace nlohmann; @@ -57,11 +58,12 @@ ZUserLogin::ZUserLogin() : wxDialog((wxWindow *) (wxGetApp().mainframe), wxID_AN m_message->SetForegroundColour(*wxBLACK); m_message->Wrap(FromDIP(360)); - auto m_download_hyperlink = new wxHyperlinkCtrl(this, wxID_ANY, _L("Click here to download it."), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); - m_download_hyperlink->Bind(wxEVT_HYPERLINK, [this](wxCommandEvent& event) { + // ORCA standardized HyperLink + auto m_download_hyperlink = new HyperLink(this, _L("Click here to download it.")); + m_download_hyperlink->Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent& event) { this->Close(); wxGetApp().ShowDownNetPluginDlg(); - }); + }); m_sizer_main->Add(m_message, 0, wxALIGN_CENTER | wxALL, FromDIP(15)); m_sizer_main->Add(m_download_hyperlink, 0, wxALIGN_CENTER | wxALL, FromDIP(10)); m_sizer_main->Add(0, 0, 1, wxBOTTOM, 10); diff --git a/src/slic3r/GUI/Widgets/HyperLink.cpp b/src/slic3r/GUI/Widgets/HyperLink.cpp new file mode 100644 index 0000000000..7fdb236199 --- /dev/null +++ b/src/slic3r/GUI/Widgets/HyperLink.cpp @@ -0,0 +1,49 @@ +#include "HyperLink.hpp" +#include "Label.hpp" + +namespace Slic3r { namespace GUI { + +HyperLink::HyperLink(wxWindow* parent, const wxString& label, const wxString& url, long style) + : wxStaticText(parent, wxID_ANY, label) + , m_url(url) + , m_normalColor(wxColour("#009687")) // used slightly different color otherwise automatically uses ColorForDark that not visible enough + , m_hoverColor(wxColour("#26A69A")) +{ + SetForegroundColour(m_normalColor); + HyperLink::SetFont(Label::Head_14); + SetCursor(wxCursor(wxCURSOR_HAND)); + + if (!m_url.IsEmpty()) + SetToolTip(m_url); + + Bind(wxEVT_LEFT_DOWN, ([this](wxMouseEvent& e) { + if (!m_url.IsEmpty()) + wxLaunchDefaultBrowser(m_url); + })); + + Bind(wxEVT_ENTER_WINDOW, ([this](wxMouseEvent& e) { + SetForegroundColour(m_hoverColor); + Refresh(); + })); + Bind(wxEVT_LEAVE_WINDOW, ([this](wxMouseEvent& e) { + SetForegroundColour(m_normalColor); + Refresh(); + })); +} + +bool HyperLink::SetFont(const wxFont& font) +{ // ensure it stays underlined + wxFont f = font; + f.SetUnderlined(true); + return wxStaticText::SetFont(f); +} + +void HyperLink::SetURL(const wxString& url) +{ + m_url = url; + SetToolTip(m_url); +} + +wxString HyperLink::GetURL() const { return m_url; } + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Widgets/HyperLink.hpp b/src/slic3r/GUI/Widgets/HyperLink.hpp new file mode 100644 index 0000000000..48e2245e3b --- /dev/null +++ b/src/slic3r/GUI/Widgets/HyperLink.hpp @@ -0,0 +1,26 @@ +#ifndef slic3r_GUI_HyperLink_hpp_ +#define slic3r_GUI_HyperLink_hpp_ + +#include +#include + +namespace Slic3r { namespace GUI { + +class HyperLink : public wxStaticText +{ +public: + HyperLink(wxWindow* parent, const wxString& label = wxEmptyString, const wxString& url = wxEmptyString, const long style = 0); + + void SetURL(const wxString& url); + wxString GetURL() const; + + bool SetFont(const wxFont& font); + +private: + wxString m_url; + wxColour m_normalColor; + wxColour m_hoverColor; +}; + +}} // namespace Slic3r::GUI +#endif // !slic3r_GUI_HyperLink_hpp_ diff --git a/src/slic3r/GUI/Widgets/LabeledStaticBox.cpp b/src/slic3r/GUI/Widgets/LabeledStaticBox.cpp index 93e4596aa5..c8e054593f 100644 --- a/src/slic3r/GUI/Widgets/LabeledStaticBox.cpp +++ b/src/slic3r/GUI/Widgets/LabeledStaticBox.cpp @@ -160,7 +160,7 @@ void LabeledStaticBox::DrawBorderAndLabel(wxDC& dc) wxSize wSz = GetSize(); dc.SetBrush(*wxTRANSPARENT_BRUSH); - dc.SetPen(wxPen(border_color.colorForStates(state_handler.states()), m_border_width, wxSOLID)); + dc.SetPen(wxPen(border_color.colorForStates(state_handler.states()), m_border_width, wxPENSTYLE_SOLID)); dc.DrawRoundedRectangle( // Border std::max(0, m_pos.x), std::max(0, m_pos.y) + m_label_height * .5, diff --git a/src/slic3r/GUI/Widgets/SideTools.cpp b/src/slic3r/GUI/Widgets/SideTools.cpp index 4288647e53..377253e707 100644 --- a/src/slic3r/GUI/Widgets/SideTools.cpp +++ b/src/slic3r/GUI/Widgets/SideTools.cpp @@ -274,8 +274,8 @@ SideTools::SideTools(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxBoxSizer* connection_sizer_V = new wxBoxSizer(wxVERTICAL); wxBoxSizer* connection_sizer_H = new wxBoxSizer(wxHORIZONTAL); - m_hyperlink = new wxHyperlinkCtrl(m_connection_info, wxID_ANY, _L("Failed to connect to the server"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer"), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); - m_hyperlink->SetBackgroundColour(wxColour(255, 111, 0)); + // ORCA standardized HyperLink + m_hyperlink = new HyperLink(m_connection_info, _L("Failed to connect to the server"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer")); m_more_err_open = ScalableBitmap(this, "monitir_err_open", 16); m_more_err_close = ScalableBitmap(this, "monitir_err_close", 16); @@ -328,13 +328,10 @@ SideTools::SideTools(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxBoxSizer* sizer_error_desc = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* sizer_extra_info = new wxBoxSizer(wxHORIZONTAL); - m_link_network_state = new wxHyperlinkCtrl(m_side_error_panel, wxID_ANY,_L("Check the status of current system services"),"",wxDefaultPosition,wxDefaultSize, wxHL_ALIGN_CENTRE |wxST_ELLIPSIZE_END); - m_link_network_state->SetMinSize(wxSize(FromDIP(220), -1)); + // ORCA standardized HyperLink + m_link_network_state = new HyperLink(m_side_error_panel, _L("Check the status of current system services"), wxGetApp().link_to_network_check(), wxST_ELLIPSIZE_END); m_link_network_state->SetMaxSize(wxSize(FromDIP(220), -1)); m_link_network_state->SetFont(::Label::Body_12); - m_link_network_state->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {wxGetApp().link_to_network_check(); }); - m_link_network_state->Bind(wxEVT_ENTER_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_HAND); }); - m_link_network_state->Bind(wxEVT_LEAVE_WINDOW, [this](auto& e) {m_link_network_state->SetCursor(wxCURSOR_ARROW); }); auto st_title_error_code = new wxStaticText(m_side_error_panel, wxID_ANY, _L("code"), wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END); auto st_title_error_code_doc = new wxStaticText(m_side_error_panel, wxID_ANY, ": "); diff --git a/src/slic3r/GUI/Widgets/SideTools.hpp b/src/slic3r/GUI/Widgets/SideTools.hpp index 4f1cf7c667..24cbae4fd2 100644 --- a/src/slic3r/GUI/Widgets/SideTools.hpp +++ b/src/slic3r/GUI/Widgets/SideTools.hpp @@ -4,9 +4,9 @@ #include #include #include -#include #include "Button.hpp" #include "Label.hpp" +#include "HyperLink.hpp" // ORCA #include "../GUI/Tabbook.hpp" #include "../DeviceManager.hpp" #include "../wxExtensions.hpp" @@ -99,13 +99,13 @@ public: private: SideToolsPanel* m_side_tools{ nullptr }; Tabbook* m_tabpanel{ nullptr }; - wxHyperlinkCtrl* m_link_network_state{ nullptr }; + HyperLink* m_link_network_state{ nullptr }; // ORCA Label* m_st_txt_error_code{ nullptr }; Label* m_st_txt_error_desc{ nullptr }; Label* m_st_txt_extra_info{ nullptr }; wxWindow* m_side_error_panel{ nullptr }; Button* m_connection_info{ nullptr }; - wxHyperlinkCtrl* m_hyperlink{ nullptr }; + HyperLink* m_hyperlink{ nullptr }; // ORCA ScalableButton* m_more_button{ nullptr }; ScalableBitmap m_more_err_open; ScalableBitmap m_more_err_close; diff --git a/src/slic3r/GUI/calib_dlg.cpp b/src/slic3r/GUI/calib_dlg.cpp index 24eb46b4a5..79735f6901 100644 --- a/src/slic3r/GUI/calib_dlg.cpp +++ b/src/slic3r/GUI/calib_dlg.cpp @@ -5,6 +5,7 @@ #include #include "MainFrame.hpp" #include "Widgets/DialogButtons.hpp" +#include "Widgets/HyperLink.hpp" #include #include #include "libslic3r/PrintConfig.hpp" @@ -173,22 +174,14 @@ PA_Calibration_Dlg::PA_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plater* v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - // Help links - auto help_sizer = new wxBoxSizer(wxVERTICAL); - auto help_link_pa = new wxHyperlinkCtrl(this, wxID_ANY, _L("Pressure Advance Guide"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/pressure-advance-calib"); - help_link_pa->SetForegroundColour(wxColour("#1890FF")); - help_sizer->Add(help_link_pa, 0, wxALL, FromDIP(5)); - - auto help_link_apa = new wxHyperlinkCtrl(this, wxID_ANY, _L("Adaptive Pressure Advance Guide"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/adaptive-pressure-advance-calib"); - help_link_apa->SetForegroundColour(wxColour("#1890FF")); - help_sizer->Add(help_link_apa, 0, wxALL, FromDIP(5)); - - v_sizer->Add(help_sizer, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/pressure-advance-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &PA_Calibration_Dlg::on_start, this); @@ -399,13 +392,14 @@ Temp_Calibration_Dlg::Temp_Calibration_Dlg(wxWindow* parent, wxWindowID id, Plat v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - auto help_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide: Temperature Calibration"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/temp-calib"); - help_link->SetForegroundColour(wxColour("#1890FF")); - v_sizer->Add(help_link, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/temp-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &Temp_Calibration_Dlg::on_start, this); @@ -578,13 +572,14 @@ MaxVolumetricSpeed_Test_Dlg::MaxVolumetricSpeed_Test_Dlg(wxWindow* parent, wxWin v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - auto help_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide: Volumetric Speed Calibration"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/volumetric-speed-calib"); - help_link->SetForegroundColour(wxColour("#1890FF")); - v_sizer->Add(help_link, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/volumetric-speed-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &MaxVolumetricSpeed_Test_Dlg::on_start, this); @@ -684,13 +679,14 @@ VFA_Test_Dlg::VFA_Test_Dlg(wxWindow* parent, wxWindowID id, Plater* plater) v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - auto help_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide: VFA"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/vfa-calib"); - help_link->SetForegroundColour(wxColour("#1890FF")); - v_sizer->Add(help_link, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/vfa-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &VFA_Test_Dlg::on_start, this); @@ -791,13 +787,14 @@ Retraction_Test_Dlg::Retraction_Test_Dlg(wxWindow* parent, wxWindowID id, Plater v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - auto help_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide: Retraction Calibration"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/retraction-calib"); - help_link->SetForegroundColour(wxColour("#1890FF")); - v_sizer->Add(help_link, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/retraction-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &Retraction_Test_Dlg::on_start, this); @@ -968,13 +965,14 @@ Input_Shaping_Freq_Test_Dlg::Input_Shaping_Freq_Test_Dlg(wxWindow* parent, wxWin v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - auto help_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide: Input Shaping Calibration"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/input-shaping-calib"); - help_link->SetForegroundColour(wxColour("#1890FF")); - v_sizer->Add(help_link, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/input-shaping-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &Input_Shaping_Freq_Test_Dlg::on_start, this); @@ -1165,13 +1163,14 @@ Input_Shaping_Damp_Test_Dlg::Input_Shaping_Damp_Test_Dlg(wxWindow* parent, wxWin v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - auto help_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide: Input Shaping Calibration"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/input-shaping-calib"); - help_link->SetForegroundColour(wxColour("#1890FF")); - v_sizer->Add(help_link, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/input-shaping-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &Input_Shaping_Damp_Test_Dlg::on_start, this); @@ -1356,13 +1355,14 @@ Cornering_Test_Dlg::Cornering_Test_Dlg(wxWindow* parent, wxWindowID id, Plater* v_sizer->Add(settings_sizer, 0, wxTOP | wxRIGHT | wxLEFT | wxEXPAND, FromDIP(10)); v_sizer->AddSpacer(FromDIP(5)); - auto help_link = new wxHyperlinkCtrl(this, wxID_ANY, _L("Wiki Guide: Cornering Calibration"), - "https://github.com/OrcaSlicer/OrcaSlicer/wiki/cornering-calib"); - help_link->SetForegroundColour(wxColour("#1890FF")); - v_sizer->Add(help_link, 0, wxALL, FromDIP(10)); - auto dlg_btns = new DialogButtons(this, {"OK"}); - v_sizer->Add(dlg_btns , 0, wxEXPAND); + + auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/cornering-calib"); + bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); + bottom_sizer->AddStretchSpacer(); + bottom_sizer->Add(dlg_btns, 0, wxEXPAND); + v_sizer->Add(bottom_sizer, 0, wxEXPAND); dlg_btns->GetOK()->Bind(wxEVT_BUTTON, &Cornering_Test_Dlg::on_start, this); diff --git a/src/slic3r/Utils/NetworkAgent.cpp b/src/slic3r/Utils/NetworkAgent.cpp index 5f19e8f4e2..8220105f10 100644 --- a/src/slic3r/Utils/NetworkAgent.cpp +++ b/src/slic3r/Utils/NetworkAgent.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #if defined(_MSC_VER) || defined(_WIN32) #include #else @@ -27,6 +29,7 @@ static void* source_module = NULL; #endif bool NetworkAgent::use_legacy_network = true; +NetworkLibraryLoadError NetworkAgent::s_load_error = {}; typedef int (*func_start_print_legacy)(void *agent, PrintParams_Legacy params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn); typedef int (*func_start_local_print_with_record_legacy)(void *agent, PrintParams_Legacy params, OnUpdateStatusFn update_fn, WasCancelledFn cancel_fn, OnWaitFn wait_fn); @@ -219,10 +222,128 @@ std::string NetworkAgent::get_libpath_in_current_directory(std::string library_n return lib_path; } - -int NetworkAgent::initialize_network_module(bool using_backup) +std::string NetworkAgent::get_versioned_library_path(const std::string& version) { - //int ret = -1; + std::string data_dir_str = data_dir(); + boost::filesystem::path data_dir_path(data_dir_str); + auto plugin_folder = data_dir_path / "plugins"; + +#if defined(_MSC_VER) || defined(_WIN32) + return (plugin_folder / (std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + ".dll")).string(); +#elif defined(__WXMAC__) + return (plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + ".dylib")).string(); +#else + return (plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + ".so")).string(); +#endif +} + +bool NetworkAgent::versioned_library_exists(const std::string& version) +{ + if (version.empty()) return false; + std::string path = get_versioned_library_path(version); + + // Check if versioned library exists + if (boost::filesystem::exists(path)) return true; + + // For legacy version, also check if unversioned legacy library exists + // (it will be auto-migrated to versioned format when loaded) + if (version == BAMBU_NETWORK_AGENT_VERSION_LEGACY) { + return legacy_library_exists(); + } + + return false; +} + +bool NetworkAgent::legacy_library_exists() +{ + std::string data_dir_str = data_dir(); + boost::filesystem::path data_dir_path(data_dir_str); + auto plugin_folder = data_dir_path / "plugins"; + +#if defined(_MSC_VER) || defined(_WIN32) + auto legacy_path = plugin_folder / (std::string(BAMBU_NETWORK_LIBRARY) + ".dll"); +#elif defined(__WXMAC__) + auto legacy_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".dylib"); +#else + auto legacy_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".so"); +#endif + return boost::filesystem::exists(legacy_path); +} + +void NetworkAgent::remove_legacy_library() +{ + std::string data_dir_str = data_dir(); + boost::filesystem::path data_dir_path(data_dir_str); + auto plugin_folder = data_dir_path / "plugins"; + +#if defined(_MSC_VER) || defined(_WIN32) + auto legacy_path = plugin_folder / (std::string(BAMBU_NETWORK_LIBRARY) + ".dll"); +#elif defined(__WXMAC__) + auto legacy_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".dylib"); +#else + auto legacy_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".so"); +#endif + + if (boost::filesystem::exists(legacy_path)) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": removing legacy library at " << legacy_path.string(); + boost::system::error_code ec; + boost::filesystem::remove(legacy_path, ec); + if (ec) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": failed to remove legacy library: " << ec.message(); + } + } +} + +std::vector NetworkAgent::scan_plugin_versions() +{ + std::vector discovered_versions; + std::string data_dir_str = data_dir(); + boost::filesystem::path plugin_folder = boost::filesystem::path(data_dir_str) / "plugins"; + + if (!boost::filesystem::is_directory(plugin_folder)) { + return discovered_versions; + } + +#if defined(_MSC_VER) || defined(_WIN32) + std::string prefix = std::string(BAMBU_NETWORK_LIBRARY) + "_"; + std::string extension = ".dll"; +#elif defined(__WXMAC__) + std::string prefix = std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_"; + std::string extension = ".dylib"; +#else + std::string prefix = std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_"; + std::string extension = ".so"; +#endif + + boost::system::error_code ec; + for (auto& entry : boost::filesystem::directory_iterator(plugin_folder, ec)) { + if (ec) { + BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << ": error iterating directory: " << ec.message(); + break; + } + if (!boost::filesystem::is_regular_file(entry.status())) + continue; + + std::string filename = entry.path().filename().string(); + + if (filename.rfind(prefix, 0) != 0) + continue; + if (filename.size() <= extension.size() || + filename.compare(filename.size() - extension.size(), extension.size(), extension) != 0) + continue; + + std::string version = filename.substr(prefix.size(), + filename.size() - prefix.size() - extension.size()); + discovered_versions.push_back(version); + } + + return discovered_versions; +} + +int NetworkAgent::initialize_network_module(bool using_backup, const std::string& version) +{ + clear_load_error(); + std::string library; std::string data_dir_str = data_dir(); boost::filesystem::path data_dir_path(data_dir_str); @@ -232,25 +353,74 @@ int NetworkAgent::initialize_network_module(bool using_backup) plugin_folder = plugin_folder/"backup"; } - //first load the library + if (version.empty()) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": version is required but not provided"; + set_load_error( + "Network library version not specified", + "A version must be specified to load the network library", + "" + ); + return -1; + } + + // Auto-migration: If loading legacy version and versioned library doesn't exist, + // but unversioned legacy library does exist, rename it to versioned format + if (version == BAMBU_NETWORK_AGENT_VERSION_LEGACY) { + boost::filesystem::path versioned_path; + boost::filesystem::path legacy_path; #if defined(_MSC_VER) || defined(_WIN32) - library = plugin_folder.string() + "\\" + std::string(BAMBU_NETWORK_LIBRARY) + ".dll"; - wchar_t lib_wstr[128]; + versioned_path = plugin_folder / (std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + ".dll"); + legacy_path = plugin_folder / (std::string(BAMBU_NETWORK_LIBRARY) + ".dll"); +#elif defined(__WXMAC__) + versioned_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + ".dylib"); + legacy_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".dylib"); +#else + versioned_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + ".so"); + legacy_path = plugin_folder / (std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".so"); +#endif + if (!boost::filesystem::exists(versioned_path) && boost::filesystem::exists(legacy_path)) { + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": auto-migrating unversioned legacy library to versioned format"; + + try { + // Rename unversioned to versioned in the same folder (main or backup). + boost::filesystem::rename(legacy_path, versioned_path); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": successfully renamed " << legacy_path.string() << " to " + << versioned_path.string(); + } catch (const std::exception& e) { + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": failed to rename legacy library: " << e.what(); + } + } + } + + // Load versioned library +#if defined(_MSC_VER) || defined(_WIN32) + library = plugin_folder.string() + "\\" + std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + ".dll"; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": loading versioned library at " << library; +#else + #if defined(__WXMAC__) + std::string lib_ext = ".dylib"; + #else + std::string lib_ext = ".so"; + #endif + library = plugin_folder.string() + "/" + std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + "_" + version + lib_ext; + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": loading versioned library at " << library; +#endif + +#if defined(_MSC_VER) || defined(_WIN32) + wchar_t lib_wstr[256]; memset(lib_wstr, 0, sizeof(lib_wstr)); ::MultiByteToWideChar(CP_UTF8, NULL, library.c_str(), strlen(library.c_str())+1, lib_wstr, sizeof(lib_wstr) / sizeof(lib_wstr[0])); netwoking_module = LoadLibrary(lib_wstr); - /*if (!netwoking_module) { - library = std::string(BAMBU_NETWORK_LIBRARY) + ".dll"; - memset(lib_wstr, 0, sizeof(lib_wstr)); - ::MultiByteToWideChar(CP_UTF8, NULL, library.c_str(), strlen(library.c_str()) + 1, lib_wstr, sizeof(lib_wstr) / sizeof(lib_wstr[0])); - netwoking_module = LoadLibrary(lib_wstr); - }*/ if (!netwoking_module) { - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", try load library directly from current directory"); - + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": versioned library not found, trying current directory"; std::string library_path = get_libpath_in_current_directory(std::string(BAMBU_NETWORK_LIBRARY)); if (library_path.empty()) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", can not get path in current directory for %1%") % BAMBU_NETWORK_LIBRARY; + set_load_error( + "Network library not found", + "Could not locate versioned library: " + library, + library + ); return -1; } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", current path %1%")%library_path; @@ -259,29 +429,28 @@ int NetworkAgent::initialize_network_module(bool using_backup) netwoking_module = LoadLibrary(lib_wstr); } #else - #if defined(__WXMAC__) - library = plugin_folder.string() + "/" + std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".dylib"; - #else - library = plugin_folder.string() + "/" + std::string("lib") + std::string(BAMBU_NETWORK_LIBRARY) + ".so"; - #endif - printf("loading network module at %s\n", library.c_str()); - netwoking_module = dlopen( library.c_str(), RTLD_LAZY); + netwoking_module = dlopen(library.c_str(), RTLD_LAZY); if (!netwoking_module) { - /*#if defined(__WXMAC__) - library = std::string("lib") + BAMBU_NETWORK_LIBRARY + ".dylib"; - #else - library = std::string("lib") + BAMBU_NETWORK_LIBRARY + ".so"; - #endif*/ - //netwoking_module = dlopen( library.c_str(), RTLD_LAZY); char* dll_error = dlerror(); - printf("error, dlerror is %s\n", dll_error); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", error, dlerror is %1%")%dll_error; + BOOST_LOG_TRIVIAL(error) << __FUNCTION__ << ": dlopen failed: " << (dll_error ? dll_error : "unknown error"); + set_load_error( + "Failed to load network library", + dll_error ? std::string(dll_error) : "Unknown dlopen error", + library + ); } printf("after dlopen, network_module is %p\n", netwoking_module); #endif if (!netwoking_module) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", can not Load Library for %1%")%library; + if (!s_load_error.has_error) { + set_load_error( + "Network library failed to load", + "LoadLibrary/dlopen returned null", + library + ); + } return -1; } BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(", successfully loaded library %1%, module %2%")%library %netwoking_module; @@ -391,6 +560,12 @@ int NetworkAgent::initialize_network_module(bool using_backup) get_mw_user_preference_ptr = reinterpret_cast(get_network_function("bambu_network_get_mw_user_preference")); get_mw_user_4ulist_ptr = reinterpret_cast(get_network_function("bambu_network_get_mw_user_4ulist")); + if (get_version_ptr) { + std::string version = get_version_ptr(); + printf("network plugin version: %s\n", version.c_str()); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ": network plugin version = " << version; + } + return 0; } @@ -515,6 +690,11 @@ int NetworkAgent::unload_network_module() return 0; } +bool NetworkAgent::is_network_module_loaded() +{ + return netwoking_module != nullptr; +} + #if defined(_MSC_VER) || defined(_WIN32) HMODULE NetworkAgent::get_bambu_source_entry() #else @@ -610,6 +790,24 @@ std::string NetworkAgent::get_version() return "00.00.00.00"; } +NetworkLibraryLoadError NetworkAgent::get_load_error() +{ + return s_load_error; +} + +void NetworkAgent::clear_load_error() +{ + s_load_error = NetworkLibraryLoadError{}; +} + +void NetworkAgent::set_load_error(const std::string& message, const std::string& technical_details, const std::string& attempted_path) +{ + s_load_error.has_error = true; + s_load_error.message = message; + s_load_error.technical_details = technical_details; + s_load_error.attempted_path = attempted_path; +} + int NetworkAgent::init_log() { int ret = 0; @@ -1662,3 +1860,63 @@ int NetworkAgent::get_model_mall_rating_result(int job_id, std::string &rating_r } } //namespace + +std::vector BBL::get_all_available_versions() +{ + std::vector result; + std::set known_base_versions; + std::set all_known_versions; + + for (size_t i = 0; i < AVAILABLE_NETWORK_VERSIONS_COUNT; ++i) { + result.push_back(NetworkLibraryVersionInfo::from_static(AVAILABLE_NETWORK_VERSIONS[i])); + known_base_versions.insert(AVAILABLE_NETWORK_VERSIONS[i].version); + all_known_versions.insert(AVAILABLE_NETWORK_VERSIONS[i].version); + } + + std::vector discovered = Slic3r::NetworkAgent::scan_plugin_versions(); + + std::vector> suffixed_versions; + + for (const auto& version : discovered) { + if (all_known_versions.count(version) > 0) + continue; + + std::string base = extract_base_version(version); + std::string suffix = extract_suffix(version); + + if (suffix.empty()) + continue; + + if (known_base_versions.count(base) == 0) + continue; + + suffixed_versions.emplace_back(base, version); + all_known_versions.insert(version); + } + + std::sort(suffixed_versions.begin(), suffixed_versions.end(), + [](const auto& a, const auto& b) { + if (a.first != b.first) return a.first > b.first; + return a.second < b.second; + }); + + for (const auto& [base, full] : suffixed_versions) { + size_t insert_pos = 0; + for (size_t i = 0; i < result.size(); ++i) { + if (result[i].base_version == base) { + insert_pos = i + 1; + while (insert_pos < result.size() && + result[insert_pos].base_version == base) { + ++insert_pos; + } + break; + } + } + + std::string sfx = extract_suffix(full); + result.insert(result.begin() + insert_pos, + NetworkLibraryVersionInfo::from_discovered(full, base, sfx)); + } + + return result; +} diff --git a/src/slic3r/Utils/NetworkAgent.hpp b/src/slic3r/Utils/NetworkAgent.hpp index 01d16d660b..50bb35474e 100644 --- a/src/slic3r/Utils/NetworkAgent.hpp +++ b/src/slic3r/Utils/NetworkAgent.hpp @@ -116,8 +116,14 @@ class NetworkAgent public: static std::string get_libpath_in_current_directory(std::string library_name); - static int initialize_network_module(bool using_backup = false); + static std::string get_versioned_library_path(const std::string& version); + static bool versioned_library_exists(const std::string& version); + static bool legacy_library_exists(); + static void remove_legacy_library(); + static std::vector scan_plugin_versions(); + static int initialize_network_module(bool using_backup = false, const std::string& version = ""); static int unload_network_module(); + static bool is_network_module_loaded(); #if defined(_MSC_VER) || defined(_WIN32) static HMODULE get_bambu_source_entry(); #else @@ -126,6 +132,10 @@ public: static std::string get_version(); static void* get_network_function(const char* name); static bool use_legacy_network; + + static NetworkLibraryLoadError get_load_error(); + static void clear_load_error(); + static void set_load_error(const std::string& message, const std::string& technical_details, const std::string& attempted_path); NetworkAgent(std::string log_dir); ~NetworkAgent(); @@ -232,6 +242,8 @@ private: bool enable_track = false; void* network_agent { nullptr }; + static NetworkLibraryLoadError s_load_error; + static func_check_debug_consistent check_debug_consistent_ptr; static func_get_version get_version_ptr; static func_create_agent create_agent_ptr; diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 0af6cd459f..26df92f7d4 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -849,7 +849,7 @@ void PresetUpdater::priv::sync_plugins(std::string http_url, std::string plugin_ BOOST_LOG_TRIVIAL(info) << "non need to sync plugins for there is no plugins currently."; return; } - std::string curr_version = NetworkAgent::use_legacy_network ? BAMBU_NETWORK_AGENT_VERSION_LEGACY : BAMBU_NETWORK_AGENT_VERSION; + std::string curr_version = NetworkAgent::use_legacy_network ? BAMBU_NETWORK_AGENT_VERSION_LEGACY : BBL::get_latest_network_version(); std::string using_version = curr_version.substr(0, 9) + "00"; std::string cached_version; diff --git a/src/slic3r/Utils/bambu_networking.hpp b/src/slic3r/Utils/bambu_networking.hpp index 710e171c7e..c4eafe6988 100644 --- a/src/slic3r/Utils/bambu_networking.hpp +++ b/src/slic3r/Utils/bambu_networking.hpp @@ -4,7 +4,9 @@ #include #include #include +#include +#include "libslic3r/AppConfig.hpp" extern std::string g_log_folder; extern std::string g_log_start_time; @@ -97,8 +99,6 @@ namespace BBL { #define BAMBU_NETWORK_LIBRARY "bambu_networking" #define BAMBU_NETWORK_AGENT_NAME "bambu_network_agent" -#define BAMBU_NETWORK_AGENT_VERSION_LEGACY "01.10.01.01" -#define BAMBU_NETWORK_AGENT_VERSION "02.03.00.62" //iot preset type strings #define IOT_PRINTER_TYPE_STRING "printer" @@ -306,6 +306,79 @@ struct CertificateInformation { std::string serial_number; }; +struct NetworkLibraryVersion { + const char* version; + const char* display_name; + const char* url_override; + bool is_latest; + const char* warning; +}; + +static const NetworkLibraryVersion AVAILABLE_NETWORK_VERSIONS[] = { + {"02.03.00.62", "02.03.00.62", nullptr, true, nullptr}, + {"02.01.01.52", "02.01.01.52", nullptr, false, nullptr}, + {"02.00.02.50", "02.00.02.50", nullptr, false, "This version may crash on startup due to Bambu Lab's signature verification."}, + {BAMBU_NETWORK_AGENT_VERSION_LEGACY, BAMBU_NETWORK_AGENT_VERSION_LEGACY " (legacy)", nullptr, false, nullptr}, +}; + +static const size_t AVAILABLE_NETWORK_VERSIONS_COUNT = sizeof(AVAILABLE_NETWORK_VERSIONS) / sizeof(AVAILABLE_NETWORK_VERSIONS[0]); + +inline const char* get_latest_network_version() { + for (size_t i = 0; i < AVAILABLE_NETWORK_VERSIONS_COUNT; ++i) { + if (AVAILABLE_NETWORK_VERSIONS[i].is_latest) + return AVAILABLE_NETWORK_VERSIONS[i].version; + } + return AVAILABLE_NETWORK_VERSIONS[0].version; +} + +struct NetworkLibraryVersionInfo { + std::string version; + std::string base_version; + std::string suffix; + std::string display_name; + std::string url_override; + bool is_latest; + std::string warning; + bool is_discovered; + + static NetworkLibraryVersionInfo from_static(const NetworkLibraryVersion& v) { + return { + v.version, + v.version, + "", + v.display_name, + v.url_override ? v.url_override : "", + v.is_latest, + v.warning ? v.warning : "", + false + }; + } + + static NetworkLibraryVersionInfo from_discovered(const std::string& full_version, + const std::string& base, + const std::string& sfx) { + return {full_version, base, sfx, full_version, "", false, "", true}; + } +}; + +inline std::string extract_base_version(const std::string& full_version) { + auto pos = full_version.find('-'); + return (pos == std::string::npos) ? full_version : full_version.substr(0, pos); +} + +inline std::string extract_suffix(const std::string& full_version) { + auto pos = full_version.find('-'); + return (pos == std::string::npos) ? "" : full_version.substr(pos + 1); +} + +std::vector get_all_available_versions(); + +struct NetworkLibraryLoadError { + bool has_error = false; + std::string message; + std::string technical_details; + std::string attempted_path; +}; enum class MessageFlag : int { diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt index 265feb660f..38ff543336 100644 --- a/tests/libslic3r/CMakeLists.txt +++ b/tests/libslic3r/CMakeLists.txt @@ -4,6 +4,8 @@ add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests.cpp test_3mf.cpp test_aabbindirect.cpp + test_appconfig.cpp + test_bambu_networking.cpp test_clipper_offset.cpp test_clipper_utils.cpp test_config.cpp @@ -29,6 +31,7 @@ if (TARGET OpenVDB::openvdb) endif() target_link_libraries(${_TEST_NAME}_tests test_common libslic3r Catch2::Catch2WithMain) +target_include_directories(${_TEST_NAME}_tests PRIVATE ${CMAKE_SOURCE_DIR}/src) set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests") if (WIN32) diff --git a/tests/libslic3r/test_appconfig.cpp b/tests/libslic3r/test_appconfig.cpp new file mode 100644 index 0000000000..59f9d11808 --- /dev/null +++ b/tests/libslic3r/test_appconfig.cpp @@ -0,0 +1,45 @@ +#include + +#include "libslic3r/AppConfig.hpp" + +using namespace Slic3r; + +TEST_CASE("AppConfig network version helpers", "[AppConfig]") { + AppConfig config; + + SECTION("skipped versions starts empty") { + auto skipped = config.get_skipped_network_versions(); + REQUIRE(skipped.empty()); + } + + SECTION("add and check skipped version") { + config.add_skipped_network_version("02.01.01.52"); + REQUIRE(config.is_network_version_skipped("02.01.01.52")); + REQUIRE_FALSE(config.is_network_version_skipped("02.03.00.62")); + } + + SECTION("multiple skipped versions") { + config.add_skipped_network_version("02.01.01.52"); + config.add_skipped_network_version("02.00.02.50"); + + auto skipped = config.get_skipped_network_versions(); + REQUIRE(skipped.size() == 2); + REQUIRE(config.is_network_version_skipped("02.01.01.52")); + REQUIRE(config.is_network_version_skipped("02.00.02.50")); + } + + SECTION("clear skipped versions") { + config.add_skipped_network_version("02.01.01.52"); + config.clear_skipped_network_versions(); + REQUIRE_FALSE(config.is_network_version_skipped("02.01.01.52")); + } + + SECTION("duplicate add is idempotent") { + config.add_skipped_network_version("02.01.01.52"); + config.add_skipped_network_version("02.01.01.52"); + + auto skipped = config.get_skipped_network_versions(); + REQUIRE(skipped.size() == 1); + REQUIRE(config.is_network_version_skipped("02.01.01.52")); + } +} diff --git a/tests/libslic3r/test_bambu_networking.cpp b/tests/libslic3r/test_bambu_networking.cpp new file mode 100644 index 0000000000..c15f3b3d39 --- /dev/null +++ b/tests/libslic3r/test_bambu_networking.cpp @@ -0,0 +1,98 @@ +#include + +#include "slic3r/Utils/bambu_networking.hpp" + +using namespace BBL; + +TEST_CASE("extract_base_version", "[BambuNetworking]") { + SECTION("version without suffix returns unchanged") { + REQUIRE(extract_base_version("02.03.00.62") == "02.03.00.62"); + REQUIRE(extract_base_version("01.00.00.00") == "01.00.00.00"); + } + + SECTION("version with suffix returns base only") { + REQUIRE(extract_base_version("02.03.00.62-mod") == "02.03.00.62"); + REQUIRE(extract_base_version("02.03.00.62-patched") == "02.03.00.62"); + REQUIRE(extract_base_version("02.03.00.62-test-build") == "02.03.00.62"); + } + + SECTION("empty string returns empty") { + REQUIRE(extract_base_version("") == ""); + } + + SECTION("suffix only returns empty") { + REQUIRE(extract_base_version("-mod") == ""); + } +} + +TEST_CASE("extract_suffix", "[BambuNetworking]") { + SECTION("version without suffix returns empty") { + REQUIRE(extract_suffix("02.03.00.62") == ""); + REQUIRE(extract_suffix("01.00.00.00") == ""); + } + + SECTION("version with suffix returns suffix without dash") { + REQUIRE(extract_suffix("02.03.00.62-mod") == "mod"); + REQUIRE(extract_suffix("02.03.00.62-patched") == "patched"); + } + + SECTION("version with multiple dashes returns everything after first dash") { + REQUIRE(extract_suffix("02.03.00.62-test-build") == "test-build"); + } + + SECTION("empty string returns empty") { + REQUIRE(extract_suffix("") == ""); + } + + SECTION("suffix only returns suffix without leading dash") { + REQUIRE(extract_suffix("-mod") == "mod"); + } +} + +TEST_CASE("NetworkLibraryVersionInfo::from_static", "[BambuNetworking]") { + SECTION("converts static version info correctly") { + NetworkLibraryVersion static_ver{"02.03.00.62", "02.03.00.62", nullptr, true, nullptr}; + auto info = NetworkLibraryVersionInfo::from_static(static_ver); + + REQUIRE(info.version == "02.03.00.62"); + REQUIRE(info.base_version == "02.03.00.62"); + REQUIRE(info.suffix == ""); + REQUIRE(info.display_name == "02.03.00.62"); + REQUIRE(info.url_override == ""); + REQUIRE(info.is_latest == true); + REQUIRE(info.warning == ""); + REQUIRE(info.is_discovered == false); + } + + SECTION("handles version with warning") { + NetworkLibraryVersion static_ver{"02.00.02.50", "02.00.02.50", nullptr, false, "This is a warning"}; + auto info = NetworkLibraryVersionInfo::from_static(static_ver); + + REQUIRE(info.version == "02.00.02.50"); + REQUIRE(info.is_latest == false); + REQUIRE(info.warning == "This is a warning"); + REQUIRE(info.is_discovered == false); + } + + SECTION("handles version with url override") { + NetworkLibraryVersion static_ver{"02.01.01.52", "02.01.01.52", "https://custom.url/plugin.zip", false, nullptr}; + auto info = NetworkLibraryVersionInfo::from_static(static_ver); + + REQUIRE(info.url_override == "https://custom.url/plugin.zip"); + } +} + +TEST_CASE("NetworkLibraryVersionInfo::from_discovered", "[BambuNetworking]") { + SECTION("creates discovered version info correctly") { + auto info = NetworkLibraryVersionInfo::from_discovered("02.03.00.62-mod", "02.03.00.62", "mod"); + + REQUIRE(info.version == "02.03.00.62-mod"); + REQUIRE(info.base_version == "02.03.00.62"); + REQUIRE(info.suffix == "mod"); + REQUIRE(info.display_name == "02.03.00.62-mod"); + REQUIRE(info.url_override == ""); + REQUIRE(info.is_latest == false); + REQUIRE(info.warning == ""); + REQUIRE(info.is_discovered == true); + } +} diff --git a/tests/libslic3r/test_placeholder_parser.cpp b/tests/libslic3r/test_placeholder_parser.cpp index 2394aad4bf..93c848b3a2 100644 --- a/tests/libslic3r/test_placeholder_parser.cpp +++ b/tests/libslic3r/test_placeholder_parser.cpp @@ -14,40 +14,22 @@ SCENARIO("Placeholder parser scripting", "[PlaceholderParser]") { { "nozzle_diameter", "0.6;0.6;0.6;0.6" }, { "nozzle_temperature", "357;359;363;378" } }); - // To let the PlaceholderParser throw when referencing initial_layer_line_width if it is set to percent, as the PlaceholderParser does not know + // To test the "min_width_top_surface" over "inner_wall_line_width". + config.option("inner_wall_line_width")->value = 150.; + config.option("inner_wall_line_width")->percent = true; + // To let the PlaceholderParser throw when referencing scarf_joint_speed if it is set to percent, as the PlaceholderParser does not know // a percent to what. - config.option("initial_layer_line_width")->value = 50.; - config.option("initial_layer_line_width")->percent = true; + config.option("scarf_joint_speed")->value = 50.; + config.option("scarf_joint_speed")->percent = true; parser.apply_config(config); parser.set("foo", 0); parser.set("bar", 2); parser.set("num_extruders", 4); - SECTION("nested config options (legacy syntax)") { REQUIRE(parser.process("[nozzle_temperature_[foo]]") == "357"); } + SECTION("nested config options (legacy syntax)") { REQUIRE(parser.process("[nozzle_temperature[foo]]") == "357"); } SECTION("array reference") { REQUIRE(parser.process("{nozzle_temperature[foo]}") == "357"); } - SECTION("whitespaces and newlines are maintained") { REQUIRE(parser.process("test [ nozzle_temperature_ [foo] ] \n hu") == "test 357 \n hu"); } - - // Test the "coFloatOrPercent" and "xxx_width" substitutions. - - // FIXME: Don't know what exactly this referred to in Prusaslicer or - // whether it should apply to Orca or not. - // {outer_wall_line_width} returns as its default value, 0. - // SECTION("outer_wall_line_width") { REQUIRE(std::stod(parser.process("{outer_wall_line_width}")) == Catch::Approx(0.67500001192092896)); } - SECTION("support_object_xy_distance") { REQUIRE(std::stod(parser.process("{support_object_xy_distance}")) == Catch::Approx(0.35)); } - // initial_layer_line_width ratio over nozzle_diameter. - // FIXME: either something else which correctly calculates a ratio should be here, - // or something else should be found for for the REQUIRE_THROWS - // SECTION("initial_layer_line_width") { REQUIRE(std::stod(parser.process("{initial_layer_line_width}")) == Catch::Approx(0.9)); } - // small_perimeter_speed ratio over outer_wall_speed - SECTION("small_perimeter_speed") { REQUIRE(std::stod(parser.process("{small_perimeter_speed}")) == Catch::Approx(30.)); } - // infill_wall_overlap over inner_wall_line_width - // FIXME: Shouldn't this return the calculated value and not the percentage 15? - // SECTION("infill_wall_overlap") { REQUIRE(std::stod(parser.process("{infill_wall_overlap}")) == Catch::Approx(0.16875)); } - - // If initial_layer_line_width is set to percent, then it is applied over respective extrusion types by overriding their respective speeds. - // The PlaceholderParser has no way to know which extrusion type the caller has in mind, therefore it throws. - SECTION("initial_layer_line_width throws failed to resolve the ratio_over dependencies") { REQUIRE_THROWS(parser.process("{initial_layer_line_width}")); } + SECTION("whitespaces and newlines are maintained") { REQUIRE(parser.process("test [ nozzle_temperature [foo] ] \n hu") == "test 357 \n hu"); } // Test the math expressions. SECTION("math: 2*3") { REQUIRE(parser.process("{2*3}") == "6"); } @@ -84,6 +66,20 @@ SCENARIO("Placeholder parser scripting", "[PlaceholderParser]") { SECTION("math: interpolate_table(13, (0, 0), (20, 20), (30, 20))") { REQUIRE(std::stod(parser.process("{interpolate_table(13, (0, 0), (20, 20), (30, 20))}")) == Catch::Approx(13.)); } SECTION("math: interpolate_table(25, (0, 0), (20, 20), (30, 20))") { REQUIRE(std::stod(parser.process("{interpolate_table(25, (0, 0), (20, 20), (30, 20))}")) == Catch::Approx(20.)); } + // Test the "coFloatOrPercent" and "xxx_line_width" substitutions. + // min_width_top_surface ratio_over inner_wall_line_width. + SECTION("line_width") { REQUIRE(std::stod(parser.process("{line_width}")) == Catch::Approx(0.67500001192092896)); } + SECTION("min_width_top_surface") { REQUIRE(std::stod(parser.process("{min_width_top_surface}")) == Catch::Approx(2.7)); } + // Orca: this one is not coFloatOrPercent + //SECTION("support_object_xy_distance") { REQUIRE(std::stod(parser.process("{support_object_xy_distance}")) == Catch::Approx(0.3375)); } + // small_perimeter_speed over outer_wall_speed + SECTION("small_perimeter_speed") { REQUIRE(std::stod(parser.process("{small_perimeter_speed}")) == Catch::Approx(30.)); } + // infill_anchor over sparse_infill_line_width + SECTION("infill_anchor") { REQUIRE(std::stod(parser.process("{infill_anchor}")) == Catch::Approx(2.7)); } + // If scarf_joint_speed is set to percent, then it is applied over respective extrusion types by overriding their respective speeds. + // The PlaceholderParser has no way to know which extrusion type the caller has in mind, therefore it throws. + SECTION("scarf_joint_speed") { REQUIRE_THROWS(parser.process("{scarf_joint_speed}")); } + // Test the boolean expression parser. auto boolean_expression = [&parser](const std::string& templ) { return parser.evaluate_boolean_expression(templ, parser.config()); }; @@ -116,3 +112,131 @@ SCENARIO("Placeholder parser scripting", "[PlaceholderParser]") { SECTION("complex expression2") { REQUIRE(boolean_expression("printer_notes=~/.*PRINTER_VEwerfNDOR_PRUSA3D.*/ or printer_notes=~/.*PRINTertER_MODEL_MK2.*/ or (nozzle_diameter[0]==0.6 and num_extruders>1)")); } SECTION("complex expression3") { REQUIRE(! boolean_expression("printer_notes=~/.*PRINTER_VEwerfNDOR_PRUSA3D.*/ or printer_notes=~/.*PRINTertER_MODEL_MK2.*/ or (nozzle_diameter[0]==0.3 and num_extruders>1)")); } } + +SCENARIO("Placeholder parser variables", "[PlaceholderParser]") { + PlaceholderParser parser; + auto config = DynamicPrintConfig::full_print_config(); + + config.set_deserialize_strict({ + { "filament_notes", "testnotes" }, + { "enable_pressure_advance", "1" }, + { "nozzle_diameter", "0.6;0.6;0.6;0.6" }, + { "nozzle_temperature", "357;359;363;378" } + }); + + PlaceholderParser::ContextData context_with_global_dict; + context_with_global_dict.global_config = std::make_unique(); + + SECTION("create an int local variable") { REQUIRE(parser.process("{local myint = 33+2}{myint}", 0, nullptr, nullptr, nullptr) == "35"); } + SECTION("create a string local variable") { REQUIRE(parser.process("{local mystr = \"mine\" + \"only\" + \"mine\"}{mystr}", 0, nullptr, nullptr, nullptr) == "mineonlymine"); } + SECTION("create a bool local variable") { REQUIRE(parser.process("{local mybool = 1 + 1 == 2}{mybool}", 0, nullptr, nullptr, nullptr) == "true"); } + SECTION("create an int global variable") { REQUIRE(parser.process("{global myint = 33+2}{myint}", 0, nullptr, nullptr, &context_with_global_dict) == "35"); } + SECTION("create a string global variable") { REQUIRE(parser.process("{global mystr = \"mine\" + \"only\" + \"mine\"}{mystr}", 0, nullptr, nullptr, &context_with_global_dict) == "mineonlymine"); } + SECTION("create a bool global variable") { REQUIRE(parser.process("{global mybool = 1 + 1 == 2}{mybool}", 0, nullptr, nullptr, &context_with_global_dict) == "true"); } + + SECTION("create an int local variable and overwrite it") { REQUIRE(parser.process("{local myint = 33+2}{myint = 12}{myint}", 0, nullptr, nullptr, nullptr) == "12"); } + SECTION("create a string local variable and overwrite it") { REQUIRE(parser.process("{local mystr = \"mine\" + \"only\" + \"mine\"}{mystr = \"yours\"}{mystr}", 0, nullptr, nullptr, nullptr) == "yours"); } + SECTION("create a bool local variable and overwrite it") { REQUIRE(parser.process("{local mybool = 1 + 1 == 2}{mybool = false}{mybool}", 0, nullptr, nullptr, nullptr) == "false"); } + SECTION("create an int global variable and overwrite it") { REQUIRE(parser.process("{global myint = 33+2}{myint = 12}{myint}", 0, nullptr, nullptr, &context_with_global_dict) == "12"); } + SECTION("create a string global variable and overwrite it") { REQUIRE(parser.process("{global mystr = \"mine\" + \"only\" + \"mine\"}{mystr = \"yours\"}{mystr}", 0, nullptr, nullptr, &context_with_global_dict) == "yours"); } + SECTION("create a bool global variable and overwrite it") { REQUIRE(parser.process("{global mybool = 1 + 1 == 2}{mybool = false}{mybool}", 0, nullptr, nullptr, &context_with_global_dict) == "false"); } + + SECTION("create an int local variable and redefine it") { REQUIRE(parser.process("{local myint = 33+2}{local myint = 12}{myint}", 0, nullptr, nullptr, nullptr) == "12"); } + SECTION("create a string local variable and redefine it") { REQUIRE(parser.process("{local mystr = \"mine\" + \"only\" + \"mine\"}{local mystr = \"yours\"}{mystr}", 0, nullptr, nullptr, nullptr) == "yours"); } + SECTION("create a bool local variable and redefine it") { REQUIRE(parser.process("{local mybool = 1 + 1 == 2}{local mybool = false}{mybool}", 0, nullptr, nullptr, nullptr) == "false"); } + SECTION("create an int global variable and redefine it") { REQUIRE(parser.process("{global myint = 33+2}{global myint = 12}{myint}", 0, nullptr, nullptr, &context_with_global_dict) == "12"); } + SECTION("create a string global variable and redefine it") { REQUIRE(parser.process("{global mystr = \"mine\" + \"only\" + \"mine\"}{global mystr = \"yours\"}{mystr}", 0, nullptr, nullptr, &context_with_global_dict) == "yours"); } + SECTION("create a bool global variable and redefine it") { REQUIRE(parser.process("{global mybool = 1 + 1 == 2}{global mybool = false}{mybool}", 0, nullptr, nullptr, &context_with_global_dict) == "false"); } + + SECTION("create an ints local variable with repeat()") { REQUIRE(parser.process("{local myint = repeat(2*3, 4*6)}{myint[5]}", 0, nullptr, nullptr, nullptr) == "24"); } + SECTION("create a strings local variable with repeat()") { REQUIRE(parser.process("{local mystr = repeat(2*3, \"mine\" + \"only\" + \"mine\")}{mystr[5]}", 0, nullptr, nullptr, nullptr) == "mineonlymine"); } + SECTION("create a bools local variable with repeat()") { REQUIRE(parser.process("{local mybool = repeat(5, 1 + 1 == 2)}{mybool[4]}", 0, nullptr, nullptr, nullptr) == "true"); } + SECTION("create an ints global variable with repeat()") { REQUIRE(parser.process("{global myint = repeat(2*3, 4*6)}{myint[5]}", 0, nullptr, nullptr, &context_with_global_dict) == "24"); } + SECTION("create a strings global variable with repeat()") { REQUIRE(parser.process("{global mystr = repeat(2*3, \"mine\" + \"only\" + \"mine\")}{mystr[5]}", 0, nullptr, nullptr, &context_with_global_dict) == "mineonlymine"); } + SECTION("create a bools global variable with repeat()") { REQUIRE(parser.process("{global mybool = repeat(5, 1 + 1 == 2)}{mybool[4]}", 0, nullptr, nullptr, &context_with_global_dict) == "true"); } + + SECTION("create an ints local variable with initializer list") { REQUIRE(parser.process("{local myint = (2*3, 4*6, 5*5)}{myint[1]}", 0, nullptr, nullptr, nullptr) == "24"); } + SECTION("create a strings local variable with initializer list") { REQUIRE(parser.process("{local mystr = (2*3, \"mine\" + \"only\" + \"mine\", 8)}{mystr[1]}", 0, nullptr, nullptr, nullptr) == "mineonlymine"); } + SECTION("create a bools local variable with initializer list") { REQUIRE(parser.process("{local mybool = (3*3 == 8, 1 + 1 == 2)}{mybool[1]}", 0, nullptr, nullptr, nullptr) == "true"); } + SECTION("create an ints global variable with initializer list") { REQUIRE(parser.process("{global myint = (2*3, 4*6, 5*5)}{myint[1]}", 0, nullptr, nullptr, &context_with_global_dict) == "24"); } + SECTION("create a strings global variable with initializer list") { REQUIRE(parser.process("{global mystr = (2*3, \"mine\" + \"only\" + \"mine\", 8)}{mystr[1]}", 0, nullptr, nullptr, &context_with_global_dict) == "mineonlymine"); } + SECTION("create a bools global variable with initializer list") { REQUIRE(parser.process("{global mybool = (2*3 == 8, 1 + 1 == 2, 5*5 != 33)}{mybool[1]}", 0, nullptr, nullptr, &context_with_global_dict) == "true"); } + + SECTION("create an ints local variable by a copy") { REQUIRE(parser.process("{local myint = nozzle_temperature}{myint[0]}", 0, &config, nullptr, nullptr) == "357"); } + SECTION("create a strings local variable by a copy") { REQUIRE(parser.process("{local mystr = filament_notes}{mystr[0]}", 0, &config, nullptr, nullptr) == "testnotes"); } + SECTION("create a bools local variable by a copy") { REQUIRE(parser.process("{local mybool = enable_pressure_advance}{mybool[0]}", 0, &config, nullptr, nullptr) == "true"); } + SECTION("create an ints global variable by a copy") { REQUIRE(parser.process("{global myint = nozzle_temperature}{myint[0]}", 0, &config, nullptr, &context_with_global_dict) == "357"); } + SECTION("create a strings global variable by a copy") { REQUIRE(parser.process("{global mystr = filament_notes}{mystr[0]}", 0, &config, nullptr, &context_with_global_dict) == "testnotes"); } + SECTION("create a bools global variable by a copy") { REQUIRE(parser.process("{global mybool = enable_pressure_advance}{mybool[0]}", 0, &config, nullptr, &context_with_global_dict) == "true"); } + + SECTION("create an ints local variable by a copy and overwrite it") { + REQUIRE(parser.process("{local myint = nozzle_temperature}{myint = repeat(2*3, 4*6)}{myint[5]}", 0, &config, nullptr, nullptr) == "24"); + REQUIRE(parser.process("{local myint = nozzle_temperature}{myint = (2*3, 4*6)}{myint[1]}", 0, &config, nullptr, nullptr) == "24"); + REQUIRE(parser.process("{local myint = nozzle_temperature}{myint = (1)}{myint = nozzle_temperature}{myint[0]}", 0, &config, nullptr, nullptr) == "357"); + } + SECTION("create a strings local variable by a copy and overwrite it") { + REQUIRE(parser.process("{local mystr = filament_notes}{mystr = repeat(2*3, \"mine\" + \"only\" + \"mine\")}{mystr[5]}", 0, &config, nullptr, nullptr) == "mineonlymine"); + REQUIRE(parser.process("{local mystr = filament_notes}{mystr = (2*3, \"mine\" + \"only\" + \"mine\")}{mystr[1]}", 0, &config, nullptr, nullptr) == "mineonlymine"); + REQUIRE(parser.process("{local mystr = filament_notes}{mystr = (2*3, \"mine\" + \"only\" + \"mine\")}{mystr = filament_notes}{mystr[0]}", 0, &config, nullptr, nullptr) == "testnotes"); + } + SECTION("create a bools local variable by a copy and overwrite it") { + REQUIRE(parser.process("{local mybool = enable_pressure_advance}{mybool = repeat(2*3, true)}{mybool[5]}", 0, &config, nullptr, nullptr) == "true"); + REQUIRE(parser.process("{local mybool = enable_pressure_advance}{mybool = (false, true)}{mybool[1]}", 0, &config, nullptr, nullptr) == "true"); + REQUIRE(parser.process("{local mybool = enable_pressure_advance}{mybool = (false, false)}{mybool = enable_pressure_advance}{mybool[0]}", 0, &config, nullptr, nullptr) == "true"); + } + + SECTION("size() of a non-empty vector returns the right size") { REQUIRE(parser.process("{local myint = (0, 1, 2, 3)}{size(myint)}", 0, nullptr, nullptr, nullptr) == "4"); } + SECTION("size() of a an empty vector returns the right size") { REQUIRE(parser.process("{local myint = (0);myint=();size(myint)}", 0, nullptr, nullptr, nullptr) == "0"); } + SECTION("empty() of a non-empty vector returns false") { REQUIRE(parser.process("{local myint = (0, 1, 2, 3)}{empty(myint)}", 0, nullptr, nullptr, nullptr) == "false"); } + SECTION("empty() of a an empty vector returns true") { REQUIRE(parser.process("{local myint = (0);myint=();empty(myint)}", 0, nullptr, nullptr, nullptr) == "true"); } + + SECTION("nested if with new variables") { + std::string script = + "{if 1 == 1}{local myints = (5, 4, 3, 2, 1)}{else}{local myfloats = (1., 2., 3., 4., 5., 6., 7.)}{endif}" + "{myints[1]},{size(myints)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "4,5"); + } + SECTION("nested if with new variables 2") { + std::string script = + "{if 1 == 0}{local myints = (5, 4, 3, 2, 1)}{else}{local myfloats = (1., 2., 3., 4., 5., 6., 7.)}{endif}" + "{size(myfloats)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "7"); + } + SECTION("nested if with new variables 2, mixing }{ with ;") { + std::string script = + "{if 1 == 0 then local myints = (5, 4, 3, 2, 1);else;local myfloats = (1., 2., 3., 4., 5., 6., 7.);endif}" + "{size(myfloats)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "7"); + } + SECTION("nested if with new variables, two level") { + std::string script = + "{if 1 == 1}{if 2 == 3}{nejaka / haluz}{else}{local myints = (6, 5, 4, 3, 2, 1)}{endif}{else}{if zase * haluz}{else}{local myfloats = (1., 2., 3., 4., 5., 6., 7.)}{endif}{endif}" + "{size(myints)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "6"); + } + SECTION("if with empty block and ;") { + std::string script = + "{if false then else;local myfloats = (1., 2., 3., 4., 5., 6., 7.);endif}" + "{size(myfloats)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "7"); + } + SECTION("nested if with new variables, two level, mixing }{ with ;") { + std::string script = + "{if 1 == 1 then if 2 == 3}nejaka / haluz{else local myints = (6, 5, 4, 3, 2, 1) endif else if zase * haluz then else local myfloats = (1., 2., 3., 4., 5., 6., 7.) endif endif}" + "{size(myints)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "6"); + } + SECTION("nested if with new variables, two level, mixing }{ with ; 2") { + std::string script = + "{if 1 == 1 then if 2 == 3 then nejaka / haluz else}{local myints = (6, 5, 4, 3, 2, 1)}{endif else if zase * haluz then else local myfloats = (1., 2., 3., 4., 5., 6., 7.) endif endif}" + "{size(myints)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "6"); + } + SECTION("nested if with new variables, two level, mixing }{ with ; 3") { + std::string script = + "{if 1 == 1 then if 2 == 3 then nejaka / haluz else}{local myints = (6, 5, 4, 3, 2, 1)}{endif else}{if zase * haluz}{else local myfloats = (1., 2., 3., 4., 5., 6., 7.) endif}{endif}" + "{size(myints)}"; + REQUIRE(parser.process(script, 0, nullptr, nullptr, nullptr) == "6"); + } + SECTION("if else completely empty") { REQUIRE(parser.process("{if false then elsif false then else endif}", 0, nullptr, nullptr, nullptr) == ""); } +}