diff --git a/.github/workflows/cura-all-installers.yml b/.github/workflows/cura-all-installers.yml deleted file mode 100644 index 4729c4198a9..00000000000 --- a/.github/workflows/cura-all-installers.yml +++ /dev/null @@ -1,151 +0,0 @@ -name: Cura All Installers -run-name: ${{ inputs.cura_conan_version }} for exe ${{ inputs.build_windows_exe }}, msi ${{ inputs.build_windows_msi }}, dmg ${{ inputs.build_macos }}, pkg ${{ inputs.build_macos_installer }}, appimage ${{ inputs.build_linux }} - enterprise ${{ inputs.enterprise }} - -on: - workflow_dispatch: - inputs: - cura_conan_version: - description: 'Cura Conan Version' - default: 'cura/latest@ultimaker/testing' - required: true - type: string - conan_args: - description: 'Conan args: eq.: --require-override' - default: '' - required: false - type: string - conan_config: - description: 'Conan config branch to use' - default: '' - required: false - type: string - enterprise: - description: 'Build Cura as an Enterprise edition' - default: false - required: true - type: boolean - staging: - description: 'Use staging API' - default: false - required: true - type: boolean - installer: - description: 'Create the installer' - default: true - required: true - type: boolean - build_windows_exe: - description: 'Build for Windows exe' - default: false - required: true - type: boolean - build_windows_msi: - description: 'Build for msi+pkg' - default: true - required: true - type: boolean - build_linux: - description: 'Build for Linux' - default: true - required: true - type: boolean - build_macos: - description: 'Build dmg for MacOS' - default: true - required: true - type: boolean - - # Run the nightly at 3:25 UTC on working days - schedule: - - cron: '25 3 * * 1-5' - -jobs: - windows-installer-create-exe: - if: ${{ inputs.build_windows_exe }} - uses: ./.github/workflows/cura-installer.yml - with: - platform: 'windows-2022' - os_name: 'win64' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - windows-installer-create-msi: - if: ${{ inputs.build_windows_msi }} - uses: ./.github/workflows/cura-installer.yml - with: - platform: 'windows-2022' - os_name: 'win64' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: true - secrets: inherit - - linux-installer-create: - if: ${{ inputs.build_linux }} - uses: ./.github/workflows/cura-installer.yml - with: - platform: 'ubuntu-20.04' - os_name: 'linux' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - linux-modern-installer-create: - if: ${{ inputs.build_linux }} - uses: ./.github/workflows/cura-installer.yml - with: - platform: 'ubuntu-22.04' - os_name: 'linux-modern' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - macos-dmg-create: - if: ${{ inputs.build_macos }} - uses: ./.github/workflows/cura-installer.yml - with: - platform: 'macos-11' - os_name: 'mac' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - macos-installer-create: - if: ${{ inputs.build_macos }} - uses: ./.github/workflows/cura-installer.yml - with: - platform: 'macos-11' - os_name: 'mac' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: true - secrets: inherit diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml deleted file mode 100644 index 9572b31aee0..00000000000 --- a/.github/workflows/cura-installer.yml +++ /dev/null @@ -1,390 +0,0 @@ -name: Cura Installer -run-name: ${{ inputs.cura_conan_version }} for ${{ inputs.platform }} by @${{ github.actor }} - -on: - workflow_call: - inputs: - platform: - description: 'Selected Installer OS' - default: 'ubuntu-20.04' - required: true - type: string - os_name: - description: 'OS Friendly Name' - default: 'linux' - required: true - type: string - cura_conan_version: - description: 'Cura Conan Version' - default: 'cura/latest@ultimaker/testing' - required: true - type: string - conan_args: - description: 'Conan args: eq.: --require-override' - default: '' - required: false - type: string - conan_config: - description: 'Conan config branch to use' - default: '' - required: false - type: string - enterprise: - description: 'Build Cura as an Enterprise edition' - default: false - required: true - type: boolean - staging: - description: 'Use staging API' - default: false - required: true - type: boolean - installer: - description: 'Create the installer' - default: true - required: true - type: boolean - msi_installer: - description: 'Create the msi' - default: false - required: true - type: boolean - -env: - CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} - CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }} - CONAN_LOG_RUN_TO_OUTPUT: 1 - CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} - CONAN_NON_INTERACTIVE: 1 - CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }} - MAC_NOTARIZE_USER: ${{ secrets.MAC_NOTARIZE_USER }} - MAC_NOTARIZE_PASS: ${{ secrets.MAC_NOTARIZE_PASS }} - MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }} - MACOS_CERT_INSTALLER_P12: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} - MACOS_CERT_USER: ${{ secrets.MACOS_CERT_USER }} - GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} - MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }} - WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }} - WIN_CERT_INSTALLER_CER_PASS: ${{ secrets.WIN_CERT_INSTALLER_CER_PASS }} - CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} - ENTERPRISE: ${{ inputs.enterprise }} - STAGING: ${{ inputs.staging }} - -jobs: - cura-installer-create: - runs-on: ${{ inputs.platform }} - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: '3.10.x' - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-conan-package.txt - - - name: Install Python requirements for runner - run: pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt - # Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo - - - name: Use Conan download cache (Bash) - if: ${{ runner.os != 'Windows' }} - run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" - - - name: Use Conan download cache (Powershell) - if: ${{ runner.os == 'Windows' }} - run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" - - - name: Cache Conan local repository packages (Bash) - uses: actions/cache@v3 - if: ${{ runner.os != 'Windows' }} - with: - path: | - $HOME/.conan/data - $HOME/.conan/conan_download_cache - key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache - - - name: Cache Conan local repository packages (Powershell) - uses: actions/cache@v3 - if: ${{ runner.os == 'Windows' }} - with: - path: | - C:\Users\runneradmin\.conan\data - C:\.conan - C:\Users\runneradmin\.conan\conan_download_cache - key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache - - - name: Install MacOS system requirements - if: ${{ runner.os == 'Macos' }} - run: brew install autoconf automake ninja create-dmg # Delete create-dmg when deprecating dmg - - - name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards - if: ${{ runner.os == 'Linux' && startsWith(inputs.platform, 'ubuntu-22.04') }} - run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y - - # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. - # This is maybe because grub caches the disk it uses last time, which is recreated each time. - - name: Install Linux system requirements - if: ${{ runner.os == 'Linux' }} - run: | - sudo rm /var/cache/debconf/config.dat - sudo dpkg --configure -a - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt update - sudo apt upgrade - sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y - wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool - chmod +x $GITHUB_WORKSPACE/appimagetool - echo "APPIMAGETOOL_LOCATION=$GITHUB_WORKSPACE/appimagetool" >> $GITHUB_ENV - - - name: Install GCC-12 on ubuntu-22.04 - if: ${{ startsWith(inputs.platform, 'ubuntu-22.04') }} - run: | - sudo apt install g++-12 gcc-12 -y - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 - - - name: Use GCC-10 on ubuntu-20.04 - if: ${{ startsWith(inputs.platform, 'ubuntu-20.04') }} - run: | - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 - - - name: Create the default Conan profile - run: conan profile new default --detect - - - name: Configure GPG Key Linux (Bash) - if: ${{ runner.os == 'Linux' }} - run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import - - - name: Configure Macos keychain Developer Cert(Bash) - id: macos-keychain-developer-cert - if: ${{ runner.os == 'Macos' }} - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Configure Macos keychain Installer Cert (Bash) - id: macos-keychain-installer-cert - if: ${{ runner.os == 'Macos' }} - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - create-keychain: false # keychain is created in previous use of action. - p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Create PFX certificate from BASE64_PFX_CONTENT secret - if: ${{ runner.os == 'Windows' }} - id: create-pfx - env: - PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} - run: | - $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; - $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); - Set-Content $pfxPath -Value $encodedBytes -AsByteStream; - echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; - - - name: Get Conan configuration from branch - if: ${{ inputs.conan_config != '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config }}" - - - name: Get Conan configuration - if: ${{ inputs.conan_config == '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git - - - name: Create the Packages (Bash) - if: ${{ runner.os != 'Windows' }} - run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" - - - name: Create the Packages (Powershell) - if: ${{ runner.os == 'Windows' }} - run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING --json "cura_inst/conan_install_info.json" - - - name: Set Environment variables for Cura (bash) - if: ${{ runner.os != 'Windows' }} - run: | - . ./cura_inst/bin/activate_github_actions_env.sh - . ./cura_inst/bin/activate_github_actions_version_env.sh - - - name: Set Environment variables for Cura (Powershell) - if: ${{ runner.os == 'Windows' }} - run: | - echo "${Env:WIX}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - .\cura_inst\Scripts\activate_github_actions_env.ps1 - .\cura_inst\Scripts\activate_github_actions_version_env.ps1 - - - name: Unlock Macos keychain (Bash) - if: ${{ runner.os == 'Macos' }} - run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain - env: - TEMP_KEYCHAIN_PASSWORD: ${{ steps.macos-keychain-developer-cert.outputs.keychain-password }} - - # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile - # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. - # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly - # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. - - - name: Install OpenSSL shared - run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy - - - name: Copy OpenSSL shared (Bash) - if: ${{ runner.os != 'Windows' }} - run: | - cp ./openssl/lib/*.so* ./cura_inst/bin/ || true - cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true - - - name: Copy OpenSSL shared (Powershell) - if: ${{ runner.os == 'Windows' }} - run: | - cp openssl/bin/*.dll ./cura_inst/Scripts/ - cp openssl/lib/*.lib ./cura_inst/Lib/ - - - name: Create the Cura dist - run: pyinstaller ./cura_inst/UltiMaker-Cura.spec - - - name: Output the name file name and extension - id: filename - shell: python - run: | - import os - enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-${{ inputs.os_name }}" - if "${{ runner.os }}" == "Windows": - installer_ext = "msi" if "${{ inputs.msi_installer }}" == "true" else "exe" - elif "${{ runner.os }}" == "macOS": - installer_ext = "pkg" if "${{ inputs.msi_installer }}" == "true" else "dmg" - else: - installer_ext = "AppImage" - output_env = os.environ["GITHUB_OUTPUT"] - content = "" - if os.path.exists(output_env): - with open(output_env, "r") as f: - content = f.read() - with open(output_env, "w") as f: - f.write(content) - f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") - f.writelines(f"INSTALLER_EXT={installer_ext}\n") - f.writelines(f"FULL_INSTALLER_FILENAME={installer_filename}.{installer_ext}\n") - - - name: Summarize the used Conan dependencies - shell: python - run: | - import os - import json - from pathlib import Path - - conan_install_info_path = Path("cura_inst/conan_install_info.json") - conan_info = {"installed": []} - if os.path.exists(conan_install_info_path): - with open(conan_install_info_path, "r") as f: - conan_info = json.load(f) - sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) - - summary_env = os.environ["GITHUB_STEP_SUMMARY"] - content = "" - if os.path.exists(summary_env): - with open(summary_env, "r") as f: - content = f.read() - - with open(summary_env, "w") as f: - f.write(content) - f.writelines("# ${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}\n") - f.writelines("## Conan packages:\n") - for dep in sorted_deps: - f.writelines(f"`{dep}`\n") - - - name: Summarize the used Python modules - shell: python - run: | - import os - import pkg_resources - summary_env = os.environ["GITHUB_STEP_SUMMARY"] - content = "" - if os.path.exists(summary_env): - with open(summary_env, "r") as f: - content = f.read() - - with open(summary_env, "w") as f: - f.write(content) - f.writelines("## Python modules:\n") - for package in pkg_resources.working_set: - f.writelines(f"`{package.key}/{package.version}`\n") - - - name: Archive the artifacts (bash) - if: ${{ !inputs.installer && runner.os != 'Windows' }} - run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./UltiMaker-Cura/" - working-directory: dist - - - name: Archive the artifacts (Powershell) - if: ${{ !inputs.installer && runner.os == 'Windows' }} - run: Compress-Archive -Path ".\UltiMaker-Cura" -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" - working-directory: dist - - - name: Create the Windows exe installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && !inputs.msi_installer }} - run: | - python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Create the Windows msi installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && inputs.msi_installer }} - run: | - python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" "$Env:CURA_APP_NAME" - working-directory: dist - - - name: Sign the Windows exe installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && !inputs.msi_installer }} - env: - PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} - run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Sign the Windows msi installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && inputs.msi_installer }} - env: - PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} - run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Create the Linux AppImage (Bash) - if: ${{ inputs.installer && runner.os == 'Linux' }} - run: python ../cura_inst/packaging/AppImage/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Create the MacOS dmg and/or pkg (Bash) - if: ${{ github.event.inputs.installer == 'true' && runner.os == 'Macos' }} - run: python ../cura_inst/packaging/MacOS/build_macos.py ../cura_inst . $CURA_CONAN_VERSION "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" "$CURA_APP_NAME" - working-directory: dist - - - name: Upload the artifacts - uses: actions/upload-artifact@v3 - with: - name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-${{ steps.filename.outputs.INSTALLER_EXT }} - path: | - dist/*.tar.gz - dist/*.zip - dist/${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }} - dist/*.asc - retention-days: 5 - - notify-export: - if: ${{ always() }} - needs: [ cura-installer-create ] - - uses: ultimaker/cura/.github/workflows/notify.yml@main - with: - success: ${{ contains(join(needs.*.result, ','), 'success') }} - success_title: "Create the Cura distributions" - success_body: "Installers for ${{ inputs.cura_conan_version }}" - failure_title: "Failed to create the Cura distributions" - failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" - secrets: inherit diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml new file mode 100644 index 00000000000..ead3b7a87a4 --- /dev/null +++ b/.github/workflows/installers.yml @@ -0,0 +1,82 @@ +name: All installers +run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + +jobs: + windows-installer: + uses: ./.github/workflows/windows.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: windows-2022 + secrets: inherit + + linux-modern-installer: + uses: ./.github/workflows/linux.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: ubuntu-22.04 + secrets: inherit + + linux-legacy-installer: + uses: ./.github/workflows/linux.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: ubuntu-20.04 + secrets: inherit + + macos-installer: + uses: ./.github/workflows/macos.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: macos-11.0 + secrets: inherit + + macos-arm-installer: + uses: ./.github/workflows/macos.yml + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: ARM64 + operating_system: self-hosted + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 00000000000..5a18199e3cb --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,271 @@ +name: Linux Installer +run-name: ${{ inputs.cura_conan_version }} for Linux-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: choice + options: + - ubuntu-22.04 + - ubuntu-20.04 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: ${{ inputs.operating_system }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Cache Conan local repository packages (Bash) + uses: actions/cache@v3 + with: + path: | + $HOME/.conan/data + $HOME/.conan/conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache + + - name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards + if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }} + run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y + + # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. + # This is maybe because grub caches the disk it uses last time, which is recreated each time. + - name: Install Linux system requirements + run: | + sudo rm /var/cache/debconf/config.dat + sudo dpkg --configure -a + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt update + sudo apt upgrade + sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y + wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool + chmod +x $GITHUB_WORKSPACE/appimagetool + echo "APPIMAGETOOL_LOCATION=$GITHUB_WORKSPACE/appimagetool" >> $GITHUB_ENV + + - name: Install GCC-12 on ubuntu-22.04 + if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }} + run: | + sudo apt install g++-12 gcc-12 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 + + - name: Use GCC-10 on ubuntu-20.04 + if: ${{ startsWith(inputs.operating_system, 'ubuntu-20.04') }} + run: | + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Configure GPG Key Linux (Bash) + run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import + + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" + + - name: Use Conan download cache (Bash) + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + + - name: Create the Packages (Bash) + run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" + + - name: Upload the Package(s) + if: always() + run: | + conan upload "*" -r cura --all -c + + - name: Set Environment variables for Cura (bash) + run: | + . ./cura_inst/bin/activate_github_actions_env.sh + . ./cura_inst/bin/activate_github_actions_version_env.sh + + # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile + # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. + # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly + # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. + + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Bash) + run: | + cp ./openssl/lib/*.so* ./cura_inst/bin/ || true + cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + if "${{ inputs.operating_system }}" == "ubuntu-22.04": + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-modern-${{ inputs.architecture }}" + else: + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create the Linux AppImage (Bash) + run: | + python ../cura_inst/packaging/AppImage/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" + chmod +x "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" + working-directory: dist + + - name: Upload the AppImage + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-AppImage + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage + retention-days: 5 + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml new file mode 100644 index 00000000000..af1fc3d12be --- /dev/null +++ b/.github/workflows/macos.yml @@ -0,0 +1,279 @@ +name: Macos Installer +run-name: ${{ inputs.cura_conan_version }} for Macos-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + - ARM64 + operating_system: + description: 'OS' + required: true + default: 'macos-11' + type: choice + options: + - self-hosted + - macos-11 + - macos-12 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + operating_system: + description: 'OS' + required: true + default: 'macos-11' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }} + MAC_NOTARIZE_USER: ${{ secrets.MAC_NOTARIZE_USER }} + MAC_NOTARIZE_PASS: ${{ secrets.MAC_NOTARIZE_PASS }} + MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }} + MACOS_CERT_INSTALLER_P12: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + MACOS_CERT_USER: ${{ secrets.MACOS_CERT_USER }} + MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: ${{ inputs.operating_system }} + + outputs: + INSTALLER_FILENAME: ${{ steps.filename.outputs.INSTALLER_FILENAME }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Cache Conan local repository packages (Bash) + uses: actions/cache@v3 + with: + path: | + $HOME/.conan/data + $HOME/.conan/conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache + + - name: Install MacOS system requirements + run: brew install cmake autoconf automake ninja create-dmg + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Remove Macos keychain (Bash) + run: security delete-keychain signing_temp.keychain || true + + - name: Configure Macos keychain Developer Cert(Bash) + id: macos-keychain-developer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Configure Macos keychain Installer Cert (Bash) + id: macos-keychain-installer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + create-keychain: false # keychain is created in previous use of action. + p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" + + - name: Use Conan download cache (Bash) + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + + - name: Create the Packages (Bash) + run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" + + - name: Upload the Package(s) + if: always() + run: | + conan upload "*" -r cura --all -c + + - name: Set Environment variables for Cura (bash) + run: | + . ./cura_inst/bin/activate_github_actions_env.sh + . ./cura_inst/bin/activate_github_actions_version_env.sh + + - name: Unlock Macos keychain (Bash) + run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain + env: + TEMP_KEYCHAIN_PASSWORD: ${{ steps.macos-keychain-developer-cert.outputs.keychain-password }} + + # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile + # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. + # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly + # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Bash) + run: | + cp ./openssl/lib/*.so* ./cura_inst/bin/ || true + cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ inputs.architecture }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create the Macos dmg (Bash) + run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_dmg --build_pkg --app_name "$CURA_APP_NAME" + working-directory: dist + + - name: Upload the dmg + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-dmg + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.dmg + retention-days: 5 + + - name: Upload the pkg + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-pkg + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.pkg + retention-days: 5 + + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit diff --git a/.github/workflows/requirements-conan-package.txt b/.github/workflows/requirements-conan-package.txt index 26d167db2b5..6b4d4cffc88 100644 --- a/.github/workflows/requirements-conan-package.txt +++ b/.github/workflows/requirements-conan-package.txt @@ -1,2 +1,2 @@ -conan==1.56.0 +conan==1.60.2 sip diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 00000000000..df9056d4540 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,270 @@ +name: Windows Installer +run-name: ${{ inputs.cura_conan_version }} for Windows-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + operating_system: + description: 'OS' + required: true + default: 'windows-2022' + type: choice + options: + - windows-2022 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + operating_system: + description: 'OS' + required: true + default: 'windows-2022' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }} + WIN_CERT_INSTALLER_CER_PASS: ${{ secrets.WIN_CERT_INSTALLER_CER_PASS }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: ${{ inputs.operating_system }} + + outputs: + INSTALLER_FILENAME: ${{ steps.filename.outputs.INSTALLER_FILENAME }} + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Cache Conan local repository packages (Powershell) + uses: actions/cache@v3 + with: + path: | + C:\Users\runneradmin\.conan\data + C:\.conan + C:\Users\runneradmin\.conan\conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" + + - name: Use Conan download cache (Powershell) + run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" + + - name: Create the Packages (Powershell) + run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING --json "cura_inst/conan_install_info.json" + + - name: Upload the Package(s) + if: always() + run: | + conan upload "*" -r cura --all -c + + - name: Set Environment variables for Cura (Powershell) + run: | + echo "${Env:WIX}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + .\cura_inst\Scripts\activate_github_actions_env.ps1 + .\cura_inst\Scripts\activate_github_actions_version_env.ps1 + + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Powershell) + run: | + cp openssl/bin/*.dll ./cura_inst/Scripts/ + cp openssl/lib/*.lib ./cura_inst/Lib/ + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-win64-${{ inputs.architecture }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create PFX certificate from BASE64_PFX_CONTENT secret + id: create-pfx + env: + PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} + run: | + $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; + $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); + Set-Content $pfxPath -Value $encodedBytes -AsByteStream; + echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; + + - name: Create the Windows msi installer (Powershell) + run: | + python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{steps.filename.outputs.INSTALLER_FILENAME }}.msi" "$Env:CURA_APP_NAME" + working-directory: dist + + - name: Sign the Windows msi installer (Powershell) + env: + PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} + run: | + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{steps.filename.outputs.INSTALLER_FILENAME }}.msi" + working-directory: dist + + - name: Create the Windows exe installer (Powershell) + run: | + python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{steps.filename.outputs.INSTALLER_FILENAME }}.exe" + working-directory: dist + + - name: Sign the Windows exe installer (Powershell) + env: + PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} + run: | + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{steps.filename.outputs.INSTALLER_FILENAME }}.exe" + working-directory: dist + + - name: Upload the msi + uses: actions/upload-artifact@v3 + with: + name: ${{steps.filename.outputs.INSTALLER_FILENAME }}-msi + path: | + dist/${{steps.filename.outputs.INSTALLER_FILENAME }}.msi + retention-days: 5 + + - name: Upload the exe + uses: actions/upload-artifact@v3 + with: + name: ${{steps.filename.outputs.INSTALLER_FILENAME }}-exe + path: | + dist/${{steps.filename.outputs.INSTALLER_FILENAME }}.exe + retention-days: 5 + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit diff --git a/CITATION.cff b/CITATION.cff index 627cfa2515a..7a93bbf0990 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -18,8 +18,8 @@ url: "https://ultimaker.com/software/ultimaker-cura" repository-code: "https://github.com/Ultimaker/Cura" license: LGPL-3.0 license-url: "https://github.com/Ultimaker/Cura/blob/main/LICENSE" -version: 5.2.1 -date-released: "2022-10-19" +version: 5.4.0 +date-released: "2023-07-04" keywords: - Ultimaker - Cura diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 00000000000..2d108a74e15 --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1 @@ +github: [ultimaker] diff --git a/README.md b/README.md index c40ead2baa6..eb047993397 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ [![Badge Test]][Test]    [![Badge Conan]][Conan]    - +![Badge Downloads]

@@ -84,6 +84,7 @@ [Badge Conan]: https://img.shields.io/github/workflow/status/Ultimaker/Cura/conan-package?style=for-the-badge&logoColor=white&labelColor=6185aa&color=4c6987&logo=Conan&label=Conan%20Package [Badge Test]: https://img.shields.io/github/workflow/status/Ultimaker/Cura/unit-test?style=for-the-badge&logoColor=white&labelColor=4a999d&color=346c6e&logo=Codacy&label=Unit%20Test [Badge Size]: https://img.shields.io/github/repo-size/ultimaker/cura?style=for-the-badge&logoColor=white&labelColor=715a97&color=584674&logo=GoogleAnalytics +[Badge Downloads]: https://img.shields.io/github/downloads-pre/Ultimaker/Cura/latest/total?style=for-the-badge diff --git a/conanfile.py b/conanfile.py index d4f365c7a42..77cecf1134b 100644 --- a/conanfile.py +++ b/conanfile.py @@ -466,6 +466,7 @@ def deploy(self): save(self, os.path.join(self._script_dir, f"activate_github_actions_version_env{ext}"), activate_github_actions_version_env) self._generate_cura_version(os.path.join(self._site_packages, "cura")) + self._generate_about_versions(str(self._share_dir.joinpath("cura", "resources", "qml", "Dialogs"))) entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements")) self._generate_pyinstaller_spec(location = self._base_dir, @@ -473,7 +474,6 @@ def deploy(self): icon_path = "'{}'".format(os.path.join(self.package_folder, self.cpp_info.resdirs[2], self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"), entitlements_file = entitlements_file if self.settings.os == "Macos" else "None") - self._generate_about_versions(os.path.join(self.source_folder, "resources", "qml", "Dialogs")) def package(self): copy(self, "cura_app.py", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.bindirs[0])) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 193803325f4..6c2d3f4cb8d 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -1,15 +1,18 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2023 UltiMaker # Cura is released under the terms of the LGPLv3 or higher. -from PyQt6.QtCore import QObject, QUrl -from PyQt6.QtGui import QDesktopServices from typing import List, cast +from PyQt6.QtCore import QObject, QUrl, QMimeData +from PyQt6.QtGui import QDesktopServices +from PyQt6.QtWidgets import QApplication + from UM.Event import CallFunctionEvent from UM.FlameProfiler import pyqtSlot from UM.Math.Vector import Vector from UM.Scene.Selection import Selection from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.TranslateOperation import TranslateOperation @@ -19,6 +22,7 @@ from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation from cura.Settings.ExtruderManager import ExtruderManager +from cura.Arranging.Nest2DArrange import createGroupOperationForArrange from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOperation @@ -181,5 +185,60 @@ def setBuildPlateForSelection(self, build_plate_nr: int) -> None: Selection.clear() + @pyqtSlot() + def cut(self) -> None: + self.copy() + self.deleteSelection() + + @pyqtSlot() + def copy(self) -> None: + mesh_writer = cura.CuraApplication.CuraApplication.getInstance().getMeshFileHandler().getWriter("3MFWriter") + if not mesh_writer: + Logger.log("e", "No 3MF writer found, unable to copy.") + return + + # Get the selected nodes + selected_objects = Selection.getAllSelectedObjects() + # Serialize the nodes to a string + scene_string = mesh_writer.sceneNodesToString(selected_objects) + # Put the string on the clipboard + QApplication.clipboard().setText(scene_string) + + @pyqtSlot() + def paste(self) -> None: + application = cura.CuraApplication.CuraApplication.getInstance() + mesh_reader = application.getMeshFileHandler().getReaderForFile(".3mf") + if not mesh_reader: + Logger.log("e", "No 3MF reader found, unable to paste.") + return + + # Parse the scene from the clipboard + scene_string = QApplication.clipboard().text() + + nodes = mesh_reader.stringToSceneNodes(scene_string) + + if not nodes: + # Nothing to paste + return + + # Find all fixed nodes, these are the nodes that should be avoided when arranging + fixed_nodes = [] + root = application.getController().getScene().getRoot() + for node in DepthFirstIterator(root): + # Only count sliceable objects + if node.callDecoration("isSliceable"): + fixed_nodes.append(node) + # Add the new nodes to the scene, and arrange them + group_operation, not_fit_count = createGroupOperationForArrange(nodes, application.getBuildVolume(), + fixed_nodes, factor=10000, + add_new_nodes_in_scene=True) + group_operation.push() + + # deselect currently selected nodes, and select the new nodes + for node in Selection.getAllSelectedObjects(): + Selection.remove(node) + for node in nodes: + Selection.add(node) + def _openUrl(self, url: QUrl) -> None: QDesktopServices.openUrl(url) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 889e442eaa5..f44393657f2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -409,7 +409,7 @@ def _initializeSettingFunctions(self): SettingFunction.registerOperator("extruderValue", self._cura_formula_functions.getValueInExtruder) SettingFunction.registerOperator("extruderValues", self._cura_formula_functions.getValuesInAllExtruders) - SettingFunction.registerOperator("anyExtruderNrWithOrDefault", self._cura_formula_functions.getAnyExtruderPositionWithOrDefault) + SettingFunction.registerOperator("anyExtruderWithMaterial", self._cura_formula_functions.getExtruderPositionWithMaterial) SettingFunction.registerOperator("resolveOrValue", self._cura_formula_functions.getResolveOrValue) SettingFunction.registerOperator("defaultExtruderPosition", self._cura_formula_functions.getDefaultExtruderPosition) SettingFunction.registerOperator("valueFromContainer", self._cura_formula_functions.getValueFromContainerAtIndex) @@ -495,41 +495,45 @@ def __setLatestResouceVersionsForVersionUpgrade(self): def startSplashWindowPhase(self) -> None: """Runs preparations that needs to be done before the starting process.""" - super().startSplashWindowPhase() - - if not self.getIsHeadLess(): - try: - self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png" if not ApplicationMetadata.IsAlternateVersion else "cura-icon_wip.png"))) - except FileNotFoundError: - Logger.log("w", "Unable to find the window icon.") - self.setRequiredPlugins([ # Misc.: - "ConsoleLogger", #You want to be able to read the log if something goes wrong. - "CuraEngineBackend", #Cura is useless without this one since you can't slice. - "FileLogger", #You want to be able to read the log if something goes wrong. - "XmlMaterialProfile", #Cura crashes without this one. - "Marketplace", #This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back. - "PrepareStage", #Cura is useless without this one since you can't load models. - "PreviewStage", #This shows the list of the plugin views that are installed in Cura. - "MonitorStage", #Major part of Cura's functionality. - "LocalFileOutputDevice", #Major part of Cura's functionality. - "LocalContainerProvider", #Cura is useless without any profiles or setting definitions. + "ConsoleLogger", # You want to be able to read the log if something goes wrong. + "CuraEngineBackend", # Cura is useless without this one since you can't slice. + "FileLogger", # You want to be able to read the log if something goes wrong. + "XmlMaterialProfile", # Cura crashes without this one. + "Marketplace", + # This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back. + "PrepareStage", # Cura is useless without this one since you can't load models. + "PreviewStage", # This shows the list of the plugin views that are installed in Cura. + "MonitorStage", # Major part of Cura's functionality. + "LocalFileOutputDevice", # Major part of Cura's functionality. + "LocalContainerProvider", # Cura is useless without any profiles or setting definitions. # Views: - "SimpleView", #Dependency of SolidView. - "SolidView", #Displays models. Cura is useless without it. + "SimpleView", # Dependency of SolidView. + "SolidView", # Displays models. Cura is useless without it. # Readers & Writers: - "GCodeWriter", #Cura is useless if it can't write its output. - "STLReader", #Most common model format, so disabling this makes Cura 90% useless. - "3MFWriter", #Required for writing project files. + "GCodeWriter", # Cura is useless if it can't write its output. + "STLReader", # Most common model format, so disabling this makes Cura 90% useless. + "3MFWriter", # Required for writing project files. # Tools: - "CameraTool", #Needed to see the scene. Cura is useless without it. - "SelectionTool", #Dependency of the rest of the tools. - "TranslateTool", #You'll need this for almost every print. + "CameraTool", # Needed to see the scene. Cura is useless without it. + "SelectionTool", # Dependency of the rest of the tools. + "TranslateTool", # You'll need this for almost every print. ]) + # Plugins need to be set here, since in the super the check is done if they are actually loaded. + + super().startSplashWindowPhase() + + if not self.getIsHeadLess(): + try: + self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png" if not ApplicationMetadata.IsAlternateVersion else "cura-icon_wip.png"))) + except FileNotFoundError: + Logger.log("w", "Unable to find the window icon.") + + self._i18n_catalog = i18nCatalog("cura") self._update_platform_activity_timer = QTimer() diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 06ec247ae4a..0dbf3ba7829 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -111,11 +111,7 @@ def getConvexHull(self) -> Optional[Polygon]: # Parent can be None if node is just loaded. if self._isSingularOneAtATimeNode(): - hull = self.getConvexHullHeadFull() - if hull is None: - return None - hull = self._add2DAdhesionMargin(hull) - return hull + return self.getConvexHullHeadFull() return self._compute2DConvexHull() @@ -323,6 +319,7 @@ def _getHeadAndFans(self) -> Polygon: def _compute2DConvexHeadFull(self) -> Optional[Polygon]: convex_hull = self._compute2DConvexHull() + convex_hull = self._add2DAdhesionMargin(convex_hull) if convex_hull: return convex_hull.getMinkowskiHull(self._getHeadAndFans()) return None diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py index fd6555e679d..08c24180bbc 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -97,14 +97,14 @@ def getValuesInAllExtruders(self, property_key: str, return result - # Get the first extruder that adheres to a specific (boolean) property, like 'material_is_support_material'. - def getAnyExtruderPositionWithOrDefault(self, filter_key: str, + # Get the first extruder with material that adheres to a specific (boolean) property, like 'material_is_support_material'. + def getExtruderPositionWithMaterial(self, filter_key: str, context: Optional["PropertyEvaluationContext"] = None) -> str: for extruder in self._getActiveExtruders(context): - value = extruder.getRawProperty(filter_key, "value", context=context) - if value is None or not value: - continue - return str(extruder.position) + material_container = extruder.material + value = material_container.getProperty(filter_key, "value", context) + if value is not None: + return str(extruder.position) return self.getDefaultExtruderPosition() # Get the resolve value or value for a given key. diff --git a/docs/profiles/getting_a_setting_value.md b/docs/profiles/getting_a_setting_value.md index bd106eb2da4..ab18be0f42f 100644 --- a/docs/profiles/getting_a_setting_value.md +++ b/docs/profiles/getting_a_setting_value.md @@ -54,7 +54,7 @@ There are also a few extra things that can be used in these expressions: * The function `extruderValue(extruder, key)` will evaluate a particular setting for a particular extruder. * The function `resolveOrValue(key)` will perform the full setting evaluation as described in this document for the current context (so if this setting is being evaluated for the second extruder it would perform it as if coming from the second extruder). * The function `defaultExtruderPosition()` will get the first extruder that is not disabled. For instance, if a printer has three extruders but the first is disabled, this would return `1` to indicate the second extruder (0-indexed). -* The function `anyExtruderNrWithOrDefault(key)` will filter the list of extruders on the key, and then give the first index for which it is true, or if none of them are, the default one as specified by the 'default extruder position' function above. +* The function `anyExtruderWithMaterial(key)` will filter the list of extruders on the key of material quality, and then give the first index for which it is true, or if none of them are, the default one as specified by the 'default extruder position' function above. * The function `valueFromContainer(key, index)` will get a setting value from the global stack, but skip the first few containers in that stack. It will skip until it reaches a particular index in the container stack. * The function `extruderValueFromContainer(key, index)` will get a setting value from the current extruder stack, but skip the first few containers in that stack. It will skip until it reaches a particular index in the container stack. diff --git a/packaging/MacOS/build_macos.py b/packaging/MacOS/build_macos.py index dcde6299000..eae9afceff7 100644 --- a/packaging/MacOS/build_macos.py +++ b/packaging/MacOS/build_macos.py @@ -21,6 +21,7 @@ def build_dmg(source_path: str, dist_path: str, filename: str, app_name: str) -> "--icon", app_name, "169", "272", "--eula", f"{source_path}/packaging/cura_license.txt", "--background", f"{source_path}/packaging/MacOs/cura_background_dmg.png", + "--hdiutil-quiet", f"{dist_path}/{filename}", f"{dist_path}/{app_name}"] @@ -138,18 +139,20 @@ def create_dmg(filename: str, dist_path: str, source_path: str, app_name: str) - if __name__ == "__main__": parser = argparse.ArgumentParser(description = "Create installer for Cura.") - parser.add_argument("source_path", type = str, help = "Path to Pyinstaller source folder") - parser.add_argument("dist_path", type = str, help = "Path to Pyinstaller dist folder") - parser.add_argument("cura_conan_version", type = str, help="The version of cura") - parser.add_argument("filename", type = str, help = "Filename of the pkg/dmg (e.g. 'UltiMaker-Cura-5.1.0-beta-Macos-X64.pkg' or 'UltiMaker-Cura-5.1.0-beta-Macos-X64.dmg')") - parser.add_argument("app_name", type = str, help = "Filename of the .app that will be contained within the dmg/pkg") + parser.add_argument("--source_path", required = True, type = str, help = "Path to Pyinstaller source folder") + parser.add_argument("--dist_path", required = True, type = str, help = "Path to Pyinstaller dist folder") + parser.add_argument("--cura_conan_version", required = True, type = str, help = "The version of cura") + parser.add_argument("--filename", required = True, type = str, help = "Filename of the pkg/dmg (e.g. 'UltiMaker-Cura-5.5.0-Macos-X64' or 'UltiMaker-Cura-5.5.0-beta.1-Macos-ARM64')") + parser.add_argument("--build_pkg", action="store_true", default = False, help = "build the pkg") + parser.add_argument("--build_dmg", action="store_true", default = True, help = "build the dmg") + parser.add_argument("--app_name", required = True, type = str, help = "Filename of the .app that will be contained within the dmg/pkg") args = parser.parse_args() cura_version = args.cura_conan_version.split("/")[-1] app_name = f"{args.app_name}.app" - if Path(args.filename).suffix == ".pkg": - create_pkg_installer(args.filename, args.dist_path, cura_version, app_name) - else: - create_dmg(args.filename, args.dist_path, args.source_path, app_name) + if args.build_pkg: + create_pkg_installer(f"{args.filename}.pkg", args.dist_path, cura_version, app_name) + if args.build_dmg: + create_dmg(f"{args.filename}.dmg", args.dist_path, args.source_path, app_name) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index e8b6a54e46d..e06e9dcf4e4 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -56,7 +56,8 @@ def __init__(self) -> None: def emptyFileHintSet(self) -> bool: return self._empty_project - def _createMatrixFromTransformationString(self, transformation: str) -> Matrix: + @staticmethod + def _createMatrixFromTransformationString(transformation: str) -> Matrix: if transformation == "": return Matrix() @@ -90,7 +91,8 @@ def _createMatrixFromTransformationString(self, transformation: str) -> Matrix: return temp_mat - def _convertSavitarNodeToUMNode(self, savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]: + @staticmethod + def _convertSavitarNodeToUMNode(savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]: """Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node. :returns: Scene node. @@ -119,7 +121,7 @@ def _convertSavitarNodeToUMNode(self, savitar_node: Savitar.SceneNode, file_name pass um_node.setName(node_name) um_node.setId(node_id) - transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation()) + transformation = ThreeMFReader._createMatrixFromTransformationString(savitar_node.getTransformation()) um_node.setTransformation(transformation) mesh_builder = MeshBuilder() @@ -138,7 +140,7 @@ def _convertSavitarNodeToUMNode(self, savitar_node: Savitar.SceneNode, file_name um_node.setMeshData(mesh_data) for child in savitar_node.getChildren(): - child_node = self._convertSavitarNodeToUMNode(child) + child_node = ThreeMFReader._convertSavitarNodeToUMNode(child) if child_node: um_node.addChild(child_node) @@ -214,7 +216,7 @@ def _read(self, file_name: str) -> Union[SceneNode, List[SceneNode]]: CuraApplication.getInstance().getController().getScene().setMetaDataEntry(key, value) for node in scene_3mf.getSceneNodes(): - um_node = self._convertSavitarNodeToUMNode(node, file_name) + um_node = ThreeMFReader._convertSavitarNodeToUMNode(node, file_name) if um_node is None: continue @@ -300,8 +302,23 @@ def _getScaleFromUnit(self, unit: Optional[str]) -> Vector: if unit is None: unit = "millimeter" elif unit not in conversion_to_mm: - Logger.log("w", "Unrecognised unit {unit} used. Assuming mm instead.".format(unit = unit)) + Logger.log("w", "Unrecognised unit {unit} used. Assuming mm instead.".format(unit=unit)) unit = "millimeter" scale = conversion_to_mm[unit] return Vector(scale, scale, scale) + + @staticmethod + def stringToSceneNodes(scene_string: str) -> List[SceneNode]: + parser = Savitar.ThreeMFParser() + scene = parser.parse(scene_string) + + # Convert the scene to scene nodes + nodes = [] + for savitar_node in scene.getSceneNodes(): + scene_node = ThreeMFReader._convertSavitarNodeToUMNode(savitar_node, "file_name") + if scene_node is None: + continue + nodes.append(scene_node) + + return nodes diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 57c667145e3..3f6fef7201d 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -55,11 +55,12 @@ def __init__(self): "cura": "http://software.ultimaker.com/xml/cura/3mf/2015/10" } - self._unit_matrix_string = self._convertMatrixToString(Matrix()) + self._unit_matrix_string = ThreeMFWriter._convertMatrixToString(Matrix()) self._archive: Optional[zipfile.ZipFile] = None self._store_archive = False - def _convertMatrixToString(self, matrix): + @staticmethod + def _convertMatrixToString(matrix): result = "" result += str(matrix._data[0, 0]) + " " result += str(matrix._data[1, 0]) + " " @@ -83,7 +84,8 @@ def setStoreArchive(self, store_archive): """ self._store_archive = store_archive - def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): + @staticmethod + def _convertUMNodeToSavitarNode(um_node, transformation=Matrix()): """Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode :returns: Uranium Scene node. @@ -100,7 +102,7 @@ def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): node_matrix = um_node.getLocalTransformation() - matrix_string = self._convertMatrixToString(node_matrix.preMultiply(transformation)) + matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix.preMultiply(transformation)) savitar_node.setTransformation(matrix_string) mesh_data = um_node.getMeshData() @@ -133,7 +135,7 @@ def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): # only save the nodes on the active build plate if child_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: continue - savitar_child_node = self._convertUMNodeToSavitarNode(child_node) + savitar_child_node = ThreeMFWriter._convertUMNodeToSavitarNode(child_node) if savitar_child_node is not None: savitar_node.addChild(savitar_child_node) @@ -221,7 +223,7 @@ def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode) -> bool: for node in nodes: if node == root_node: for root_child in node.getChildren(): - savitar_node = self._convertUMNodeToSavitarNode(root_child, transformation_matrix) + savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child, transformation_matrix) if savitar_node: savitar_scene.addSceneNode(savitar_node) else: @@ -303,9 +305,19 @@ def _createSnapshot(self): Logger.log("w", "Can't create snapshot when renderer not initialized.") return None try: - snapshot = Snapshot.snapshot(width = 300, height = 300) + snapshot = Snapshot.snapshot(width=300, height=300) except: Logger.logException("w", "Failed to create snapshot image") return None return snapshot + + @staticmethod + def sceneNodesToString(scene_nodes: [SceneNode]) -> str: + savitar_scene = Savitar.Scene() + for scene_node in scene_nodes: + savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(scene_node) + savitar_scene.addSceneNode(savitar_node) + parser = Savitar.ThreeMFParser() + scene_string = parser.sceneToString(savitar_scene) + return scene_string diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index fbb42140213..b3ef761af5e 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -1,5 +1,5 @@ # Copyright (c) 2018 Jaime van Kessel, Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import configparser # The script lists are stored in metadata as serialised config files. import importlib.util diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml index a80f304aaac..0f379479bac 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml @@ -1,5 +1,5 @@ // Copyright (c) 2022 Jaime van Kessel, Ultimaker B.V. -// The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +// The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 import QtQuick.Controls 2.15 diff --git a/plugins/PostProcessingPlugin/Script.py b/plugins/PostProcessingPlugin/Script.py index 1cc9b59c9c3..be661e08894 100644 --- a/plugins/PostProcessingPlugin/Script.py +++ b/plugins/PostProcessingPlugin/Script.py @@ -1,6 +1,6 @@ # Copyright (c) 2015 Jaime van Kessel # Copyright (c) 2018 Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. from typing import Optional, Any, Dict, TYPE_CHECKING, List from UM.Signal import Signal, signalemitter diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index 91b36389f3f..2930623a933 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -1,7 +1,7 @@ # ChangeAtZ script - Change printing parameters at a given height # This script is the successor of the TweakAtZ plugin for legacy Cura. # It contains code from the TweakAtZ plugin V1.0-V4.x and from the ExampleScript by Jaime van Kessel, Ultimaker B.V. -# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher. +# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher. # This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms # Authors of the ChangeAtZ plugin / script: diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index dacb40e9051..534c0208cf9 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -1,6 +1,6 @@ # ColorMix script - 2-1 extruder color mix and blending # This script is specific for the Geeetech A10M dual extruder but should work with other Marlin printers. -# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher. +# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher. # This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms #Authors of the 2-1 ColorMix plug-in / script: diff --git a/plugins/PostProcessingPlugin/scripts/FilamentChange.py b/plugins/PostProcessingPlugin/scripts/FilamentChange.py index d3c1e60192b..93941c09920 100644 --- a/plugins/PostProcessingPlugin/scripts/FilamentChange.py +++ b/plugins/PostProcessingPlugin/scripts/FilamentChange.py @@ -1,5 +1,5 @@ # Copyright (c) 2023 Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. # Modification 06.09.2020 # add checkbox, now you can choose and use configuration from the firmware itself. diff --git a/plugins/PostProcessingPlugin/scripts/RetractContinue.py b/plugins/PostProcessingPlugin/scripts/RetractContinue.py index b5ea4d4edab..eaa15e0942f 100644 --- a/plugins/PostProcessingPlugin/scripts/RetractContinue.py +++ b/plugins/PostProcessingPlugin/scripts/RetractContinue.py @@ -1,5 +1,5 @@ # Copyright (c) 2023 UltiMaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. from ..Script import Script diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 40a56ace57f..7a12c229ccf 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,5 +1,5 @@ # Copyright (c) 2017 Ghostkeeper -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import re #To perform the search and replace. diff --git a/plugins/PostProcessingPlugin/scripts/Stretch.py b/plugins/PostProcessingPlugin/scripts/Stretch.py index 8d35f688223..ab964d160ad 100644 --- a/plugins/PostProcessingPlugin/scripts/Stretch.py +++ b/plugins/PostProcessingPlugin/scripts/Stretch.py @@ -1,4 +1,4 @@ -# This PostProcessingPlugin script is released under the terms of the AGPLv3 or higher. +# This PostProcessingPlugin script is released under the terms of the LGPLv3 or higher. """ Copyright (c) 2017 Christophe Baribaud 2017 Python implementation of https://github.com/electrocbd/post_stretch diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py index e93473c25f7..8c0c50d0b4a 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py @@ -1,6 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import os import os.path from UM.Application import Application @@ -143,38 +144,44 @@ def _onProgress(self, job, progress): def _onFinished(self, job): if self._stream: - # Explicitly closing the stream flushes the write-buffer + error = job.getError() try: + # Explicitly closing the stream flushes the write-buffer self._stream.close() - self._stream = None - except: - Logger.logException("w", "An exception occurred while trying to write to removable drive.") - message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(),str(job.getError())), - title = catalog.i18nc("@info:title", "Error"), - message_type = Message.MessageType.ERROR) + except Exception as e: + if not error: + # Only log new error if there was no previous one + error = e + + self._stream = None + self._writing = False + self.writeFinished.emit(self) + + if not error: + message = Message( + catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), + os.path.basename( + job.getFileName())), + title=catalog.i18nc("@info:title", "File Saved"), + message_type=Message.MessageType.POSITIVE) + message.addAction("eject", catalog.i18nc("@action:button", "Eject"), "eject", + catalog.i18nc("@action", "Eject removable device {0}").format(self.getName())) + message.actionTriggered.connect(self._onActionTriggered) + message.show() + self.writeSuccess.emit(self) + else: + try: + os.remove(job.getFileName()) + except Exception as e: + Logger.logException("e", "Exception when trying to remove incomplete exported file %s", + str(job.getFileName())) + message = Message(catalog.i18nc("@info:status", + "Could not save to removable drive {0}: {1}").format(self.getName(), + str(job.getError())), + title=catalog.i18nc("@info:title", "Error"), + message_type=Message.MessageType.ERROR) message.show() self.writeError.emit(self) - return - - self._writing = False - self.writeFinished.emit(self) - if job.getResult(): - message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())), - title = catalog.i18nc("@info:title", "File Saved"), - message_type = Message.MessageType.POSITIVE) - message.addAction("eject", catalog.i18nc("@action:button", "Eject"), "eject", catalog.i18nc("@action", "Eject removable device {0}").format(self.getName())) - message.actionTriggered.connect(self._onActionTriggered) - message.show() - self.writeSuccess.emit(self) - else: - message = Message(catalog.i18nc("@info:status", - "Could not save to removable drive {0}: {1}").format(self.getName(), - str(job.getError())), - title = catalog.i18nc("@info:title", "Error"), - message_type = Message.MessageType.ERROR) - message.show() - self.writeError.emit(self) - job.getStream().close() def _onActionTriggered(self, message, action): if action == "eject": diff --git a/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py index d85ade9dce1..76254547dab 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py @@ -37,24 +37,13 @@ def updateProgressText(self, output_device): def finalize(self, new_devices_added, new_output_devices): self.setProgress(None) - num_devices_added = len(new_devices_added) - max_disp_devices = 3 - - if num_devices_added > max_disp_devices: - num_hidden = num_devices_added - max_disp_devices - device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in - new_output_devices[0: max_disp_devices]] - device_name_list.append( - "
  • " + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", - "... and {0} others", num_hidden) + "
  • ") - device_names = "".join(device_name_list) - else: - device_names = "".join( - ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices_added]) if new_devices_added: - message_text = self.i18n_catalog.i18nc("info:status", - "Printers added from Digital Factory:") + f"" + device_names = "" + for device in new_devices_added: + device_names = device_names + "
  • {} ({})
  • ".format(device.name, device.printerTypeName) + message_title = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + message_text = f"{message_title}" self.setText(message_text) else: self.hide() diff --git a/resources/definitions/SV02.def.json b/resources/definitions/SV02.def.json index 95b165075bd..728a6c62427 100644 --- a/resources/definitions/SV02.def.json +++ b/resources/definitions/SV02.def.json @@ -59,7 +59,7 @@ "machine_width": { "default_value": 280 }, "material_diameter": { "default_value": 1.75 }, "material_initial_print_temperature": { "value": "material_print_temperature" }, - "prime_tower_min_volume": { "value": "((reveOrValue('layer_height'))/2" }, + "prime_tower_min_volume": { "value": "((resolveOrValue('layer_height'))/2" }, "prime_tower_position_x": { "value": "240" }, "prime_tower_position_y": { "value": "190" }, "prime_tower_size": { "value": "30" }, diff --git a/resources/definitions/anycubic_kobra_plus.def.json b/resources/definitions/anycubic_kobra_plus.def.json new file mode 100644 index 00000000000..944398711f4 --- /dev/null +++ b/resources/definitions/anycubic_kobra_plus.def.json @@ -0,0 +1,29 @@ +{ + "version": 2, + "name": "Anycubic Kobra Plus", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Jordon Brooks", + "manufacturer": "Anycubic", + "file_formats": "text/x-gcode", + "has_machine_quality": true, + "has_materials": true, + "machine_extruder_trains": { "0": "anycubic_kobra_plus_extruder_0" }, + "preferred_material": "generic_pla", + "preferred_quality_type": "normal", + "quality_definition": "anycubic_kobra_plus" + }, + "overrides": + { + "machine_depth": { "default_value": 302 }, + "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84\nM355 S0; led off" }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 352 }, + "machine_name": { "default_value": "Anycubic Kobra Plus" }, + "machine_start_gcode": { "default_value": "G28 ;Home\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nM355 S1; Turn LED on\n; Add Custom purge lines\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X1.0 Y30 Z0.3 F5000.0 ; Move to start position\nG1 X1.0 Y100.0 Z0.3 F1500.0 E15 ; Draw the first line\nG1 X1.3 Y100.0 Z0.3 F5000.0 ; Move to side a little\nG1 X1.3 Y30 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-2 F500 ; Retract a little \nG1 X50 F500 ; wipe away from the filament line\nG1 X100 F9000 ; Quickly wipe away from the filament line\nG1 Z5.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\n; End custom purge lines" }, + "machine_width": { "default_value": 302 } + } +} \ No newline at end of file diff --git a/resources/definitions/elegoo_base.def.json b/resources/definitions/elegoo_base.def.json index b0a0717c599..c54a388806a 100644 --- a/resources/definitions/elegoo_base.def.json +++ b/resources/definitions/elegoo_base.def.json @@ -69,7 +69,7 @@ "material_print_temperature_layer_0": { "value": "210 if material_print_temperature < 210 else material_print_temperature" }, "min_infill_area": { "value": "5" }, "minimum_interface_area": { "default_value": 10 }, - "minimum_support_area": { "default_value": 3 }, + "minimum_support_area": { "value": "3 if support_structure == 'normal' else 0" }, "optimize_wall_printing_order": { "default_value": true }, "prime_tower_brim_enable": { "default_value": true }, "prime_tower_min_volume": { "value": "(layer_height) * (prime_tower_size / 2)**2 * 3 * 0.5 " }, diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b44b8c68531..680dd3b6f85 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1664,17 +1664,27 @@ "small_skin_width": { "label": "Small Top/Bottom Width", - "description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions.", - "value": "0", - "default_value": 0, + "description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions. Off for the topmost (air-exposed) layer by default (see 'Small Top/Bottom On Surface').", + "value": "skin_line_width * 2", + "default_value": 1, "minimum_value": "0", - "maximum_value_warning": "skin_line_width * 10", + "maximum_value_warning": "skin_line_width * 3", "type": "float", - "enabled": false, + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true, - "unit": "mm", - "comment": "Disabled for 5.4.x, as we're worried about micro-segments in the infill. Also disabled in the engine, so forcing this > 0 will not do anything at the moment." + "unit": "mm" + }, + "small_skin_on_surface": + { + "label": "Small Top/Bottom On Surface", + "description": "Enable small (up to 'Small Top/Bottom Width') regions on the topmost skinned layer (exposed to air) to be filled with walls instead of the default pattern.", + "value": "False", + "default_value": false, + "type": "bool", + "enabled": "small_skin_width > 0 and top_layers > 0", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true }, "skin_no_small_gaps_heuristic": { @@ -4490,7 +4500,7 @@ "type": "extruder", "default_value": "0", "enabled": "(support_enable or support_meshes_present) and extruders_enabled_count > 1", - "value": "int(defaultExtruderPosition())", + "value": "int(anyExtruderWithMaterial('material_is_support_material'))", "settable_per_mesh": false, "settable_per_extruder": false, "children": @@ -6811,6 +6821,48 @@ "minimum_value_warning": "500", "maximum_value_warning": "100000", "settable_per_mesh": true + }, + "meshfix_fluid_motion_enabled": + { + "label": "Enable Fluid Motion", + "description": "When enabled tool paths are corrected for printers with smooth motion planners. Small movements that deviate from the general tool path direction are smoothed to improve fluid motions.", + "type": "bool", + "default_value": true + }, + "meshfix_fluid_motion_shift_distance": + { + "label": "Fluid Motion Shift Distance", + "description": "Distance points are shifted to smooth the path", + "enabled": "meshfix_fluid_motion_enabled", + "type": "float", + "unit": "mm", + "default_value": 0.1, + "minimum_value": "0.01", + "maximum_value": "1" + }, + "meshfix_fluid_motion_small_distance": + { + "label": "Fluid Motion Small Distance", + "description": "Distance points are shifted to smooth the path", + "enabled": "meshfix_fluid_motion_enabled", + "unit": "mm", + "type": "float", + "default_value": 0.01, + "minimum_value": "0.01", + "maximum_value": "0.1" + }, + "meshfix_fluid_motion_angle": + { + "label": "Fluid Motion Angle", + "description": "If a toolpath-segment deviates more than this angle from the general motion it is smoothed.", + "enabled": "meshfix_fluid_motion_enabled", + "type": "float", + "unit": "\u00b0", + "default_value": 15, + "maximum_value": "90", + "minimum_value": "0", + "minimum_value_warning": "1", + "maximum_value_warning": "35" } } }, diff --git a/resources/definitions/kingroon_kp3s_pro.def.json b/resources/definitions/kingroon_kp3s_pro.def.json index 79a4916680c..bda5ac03b2f 100644 --- a/resources/definitions/kingroon_kp3s_pro.def.json +++ b/resources/definitions/kingroon_kp3s_pro.def.json @@ -5,13 +5,14 @@ "metadata": { "visible": true, + "author": "willuhmjs", "platform": "kingroon_kp3s.stl", - "quality_definition": "kingroon_base", - "author": "willuhmjs" + "quality_definition": "kingroon_base" }, "overrides": { "machine_acceleration": { "value": 1000 }, + "machine_depth": { "default_value": 200 }, "machine_height": { "default_value": 200 }, "machine_max_acceleration_e": { "value": 1000 }, "machine_max_acceleration_x": { "value": 1000 }, @@ -23,7 +24,7 @@ "machine_max_feedrate_z": { "value": 4 }, "machine_max_jerk_xy": { "value": 15 }, "machine_max_jerk_z": { "value": 0.4 }, - "machine_name": { "default_value": "Kingroon KP3S" }, + "machine_name": { "default_value": "Kingroon KP3S Pro" }, "machine_steps_per_mm_e": { "value": 764 }, "machine_steps_per_mm_x": { "value": 160 }, "machine_steps_per_mm_y": { "value": 160 }, @@ -34,4 +35,4 @@ "retraction_speed": { "value": 40 }, "speed_z_hop": { "value": 4 } } -} +} \ No newline at end of file diff --git a/resources/definitions/matterhackers_pulsexe_e444m.def.json b/resources/definitions/matterhackers_pulsexe_e444m.def.json new file mode 100644 index 00000000000..fc5d4f6ddac --- /dev/null +++ b/resources/definitions/matterhackers_pulsexe_e444m.def.json @@ -0,0 +1,60 @@ +{ + "version": 2, + "name": "Pulse XE E-444M", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Zwitch Guitars", + "manufacturer": "MatterHackers", + "file_formats": "text/x-gcode", + "first_start_actions": [ "MachineSettingsAction" ], + "has_machine_quality": false, + "has_materials": true, + "has_variants": false, + "machine_extruder_trains": { "0": "matterhackers_extruder" }, + "preferred_material": "generic_pla", + "preferred_quality_type": "normal" + }, + "overrides": + { + "adhesion_type": { "value": "skirt" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "value": 10 }, + "gantry_height": { "value": 23 }, + "machine_acceleration": { "value": 1300 }, + "machine_depth": { "default_value": 220 }, + "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y{machine_depth}; home X axis and push Y forward\nG28 Z0\nM84 ; disable motors" }, + "machine_gcode_flavor": { "default_value": "Marlin" }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-28, 45], + [-28, -18], + [40, 45], + [40, -18] + ] + }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 215 }, + "machine_max_feedrate_e": { "value": 75 }, + "machine_max_feedrate_x": { "value": 300 }, + "machine_max_feedrate_y": { "value": 300 }, + "machine_max_feedrate_z": { "value": 30 }, + "machine_name": { "default_value": "Pulse XE E-444M" }, + "machine_start_gcode": { "default_value": "G21 ; set units to millimeters\nG90 ; use absolute positioning\nM82 ; absolute extrusion mode\nG28 ; home axes\nM104 S{material_print_temperature_layer_0} ; set extruder temp\nM140 S{material_bed_temperature_layer_0} ; set bed temp\nM190 S{material_bed_temperature_layer_0} ; wait for bed temp\nM109 S{material_print_temperature_layer_0} ; wait for extruder temp\nG29 ; mesh bed leveling\n\nG92 E0\nG1 X5 Y5 Z0.8 F1800\nG1 X100 Z0.3 E25 F900\nG92 E0\nG1 E-2 F2400" }, + "machine_steps_per_mm_e": { "value": 415 }, + "machine_steps_per_mm_x": { "value": 80 }, + "machine_steps_per_mm_y": { "value": 80 }, + "machine_steps_per_mm_z": { "value": 400 }, + "machine_width": { "default_value": 250 }, + "material_diameter": { "value": 1.75 }, + "optimize_wall_printing_order": { "value": true }, + "speed_layer_0": { "value": 20.0 }, + "speed_print": { "value": 50 }, + "top_bottom_thickness": { "value": "layer_height_0 + layer_height * 3" }, + "travel_retract_before_outer_wall": { "value": true }, + "wall_thickness": { "value": "line_width * 2" }, + "z_seam_type": { "value": "back" } + } +} \ No newline at end of file diff --git a/resources/definitions/tizyx_evy.def.json b/resources/definitions/tizyx_evy.def.json index 41b2b982be3..7ae10f5f1d2 100644 --- a/resources/definitions/tizyx_evy.def.json +++ b/resources/definitions/tizyx_evy.def.json @@ -57,7 +57,7 @@ [25, 49], [25, -49], [-25, -49], - [25, 49] + [-25, 49] ] }, "machine_heated_bed": { "default_value": true }, diff --git a/resources/definitions/tizyx_evy_dual.def.json b/resources/definitions/tizyx_evy_dual.def.json index 22046a16ff4..7ef3aff2abd 100644 --- a/resources/definitions/tizyx_evy_dual.def.json +++ b/resources/definitions/tizyx_evy_dual.def.json @@ -54,7 +54,7 @@ [25, 49], [25, -49], [-25, -49], - [25, 49] + [-25, 49] ] }, "machine_heated_bed": { "default_value": true }, diff --git a/resources/definitions/tizyx_k25.def.json b/resources/definitions/tizyx_k25.def.json index 60005e87127..fbae8a657d0 100644 --- a/resources/definitions/tizyx_k25.def.json +++ b/resources/definitions/tizyx_k25.def.json @@ -51,7 +51,7 @@ [25, 49], [25, -49], [-25, -49], - [25, 49] + [-25, 49] ] }, "machine_heated_bed": { "default_value": true }, diff --git a/resources/extruders/anycubic_kobra_plus_extruder_0.def.json b/resources/extruders/anycubic_kobra_plus_extruder_0.def.json new file mode 100644 index 00000000000..51a6c351bcd --- /dev/null +++ b/resources/extruders/anycubic_kobra_plus_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "anycubic_kobra_plus", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/matterhackers_extruder.def.json b/resources/extruders/matterhackers_extruder.def.json new file mode 100644 index 00000000000..f05e4b4e201 --- /dev/null +++ b/resources/extruders/matterhackers_extruder.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "matterhackers_pulsexe_e444m", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 6cd75b51ac2..f945b1c11de 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2022 UltiMaker +// Copyright (c) 2023 UltiMaker // Cura is released under the terms of the LGPLv3 or higher. pragma Singleton @@ -6,7 +6,7 @@ pragma Singleton import QtQuick 2.10 import QtQuick.Controls 2.4 import UM 1.1 as UM -import Cura 1.0 as Cura +import Cura 1.5 as Cura Item { @@ -60,6 +60,7 @@ Item property alias showProfileFolder: showProfileFolderAction property alias documentation: documentationAction property alias showTroubleshooting: showTroubleShootingAction + property alias openSponsershipPage: openSponsershipPageAction property alias reportBug: reportBugAction property alias whatsNew: whatsNewAction property alias about: aboutAction @@ -71,6 +72,15 @@ Item property alias browsePackages: browsePackagesAction + property alias paste: pasteAction + property alias copy: copyAction + property alias cut: cutAction + + readonly property bool copy_paste_enabled: { + const all_enabled_packages = CuraApplication.getPackageManager().allEnabledPackages; + return all_enabled_packages.includes("3MFReader") && all_enabled_packages.includes("3MFWriter"); + } + UM.I18nCatalog{id: catalog; name: "cura"} @@ -81,6 +91,13 @@ Item text: catalog.i18nc("@action:inmenu", "Show Online Troubleshooting") } + Action + { + id: openSponsershipPageAction + onTriggered: Qt.openUrlExternally("https://ultimaker.com/software/ultimaker-cura/sponsor/") + text: catalog.i18nc("@action:inmenu", "Sponsor Cura") + } + Action { id: toggleFullScreenAction @@ -309,6 +326,33 @@ Item onTriggered: CuraActions.centerSelection() } + Action + { + id: copyAction + text: catalog.i18nc("@action:inmenu menubar:edit", "Copy to clipboard") + onTriggered: CuraActions.copy() + enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection && copy_paste_enabled + shortcut: StandardKey.Copy + } + + Action + { + id: pasteAction + text: catalog.i18nc("@action:inmenu menubar:edit", "Paste from clipboard") + onTriggered: CuraActions.paste() + enabled: UM.Controller.toolsEnabled && copy_paste_enabled + shortcut: StandardKey.Paste + } + + Action + { + id: cutAction + text: catalog.i18nc("@action:inmenu menubar:edit", "Cut") + onTriggered: CuraActions.cut() + enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection && copy_paste_enabled + shortcut: StandardKey.Cut + } + Action { id: multiplySelectionAction diff --git a/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml index f13ca284479..a42239056cd 100644 --- a/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml +++ b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml @@ -57,10 +57,10 @@ Popup permissionsRequired: [] }, { - displayName: "UltiMaker Academy", //Not translated, since it's a brand name. - thumbnail: UM.Theme.getIcon("Knowledge"), - description: catalog.i18nc("@tooltip:button", "Become a 3D printing expert with UltiMaker e-learning."), - link: "https://academy.ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-academy", + displayName: catalog.i18nc("@label:button", "Sponsor Cura"), + thumbnail: UM.Theme.getIcon("Heart"), + description: catalog.i18nc("@tooltip:button", "Show your support for Cura with a donation."), + link: "https://ultimaker.com/software/ultimaker-cura/sponsor/", permissionsRequired: [] }, { diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index f7029939cd5..d85703451f1 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -19,6 +19,8 @@ Cura.Menu // Selection-related actions. Cura.MenuItem { action: Cura.Actions.centerSelection; } Cura.MenuItem { action: Cura.Actions.deleteSelection; } + Cura.MenuItem { action: Cura.Actions.copy; } + Cura.MenuItem { action: Cura.Actions.paste; } Cura.MenuItem { action: Cura.Actions.multiplySelection; } // Extruder selection - only visible if there is more than 1 extruder diff --git a/resources/qml/Menus/HelpMenu.qml b/resources/qml/Menus/HelpMenu.qml index 4be25fdffe2..6a57a995156 100644 --- a/resources/qml/Menus/HelpMenu.qml +++ b/resources/qml/Menus/HelpMenu.qml @@ -17,6 +17,7 @@ Cura.Menu Cura.MenuItem { action: Cura.Actions.showTroubleshooting} Cura.MenuItem { action: Cura.Actions.documentation } Cura.MenuItem { action: Cura.Actions.reportBug } + Cura.MenuItem { action: Cura.Actions.openSponsershipPage } Cura.MenuSeparator { } Cura.MenuItem { action: Cura.Actions.whatsNew } Cura.MenuItem { action: Cura.Actions.about } diff --git a/resources/qml/Widgets/ScrollableTextArea.qml b/resources/qml/Widgets/ScrollableTextArea.qml index 7d8f6b886de..3f0db280580 100644 --- a/resources/qml/Widgets/ScrollableTextArea.qml +++ b/resources/qml/Widgets/ScrollableTextArea.qml @@ -4,41 +4,11 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 -import UM 1.5 as UM +import UM 1.7 as UM import Cura 1.1 as Cura -// -// Cura-style TextArea with scrolls -// -Flickable +// Wrapper to UM.ScrollableTextArea which was originally placed here +UM.ScrollableTextArea { - id: scrollableTextAreaBase - property bool do_borders: true - property var back_color: UM.Theme.getColor("main_background") - property alias textArea: flickableTextArea - - ScrollBar.vertical: UM.ScrollBar {} - - TextArea.flickable: TextArea - { - id: flickableTextArea - - background: Rectangle //Providing the background color and border. - { - anchors.fill: parent - anchors.margins: -border.width - - color: scrollableTextAreaBase.back_color - border.color: UM.Theme.getColor("thick_lining") - border.width: scrollableTextAreaBase.do_borders ? UM.Theme.getSize("default_lining").width : 0 - } - - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - textFormat: TextEdit.PlainText - renderType: Text.NativeRendering - wrapMode: Text.Wrap - selectByMouse: true - } -} \ No newline at end of file +} diff --git a/resources/quality/anycubic_kobra_plus/anycubic_kobra_plus_normal.inst.cfg b/resources/quality/anycubic_kobra_plus/anycubic_kobra_plus_normal.inst.cfg new file mode 100644 index 00000000000..47983fe3b13 --- /dev/null +++ b/resources/quality/anycubic_kobra_plus/anycubic_kobra_plus_normal.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = anycubic_kobra_plus +name = Normal +version = 4 + +[metadata] +global_quality = True +quality_type = normal +setting_version = 22 +type = quality +weight = 0 + +[values] +infill_pattern = cubic +layer_height = 0.2 +layer_height_0 = 0.2 +material_final_print_temperature = 195 +material_print_temperature = 195 +retraction_combing = off +retraction_hop = 0.1 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +speed_infill = 40 +speed_layer_0 = 20 +speed_print = 80 +speed_wall_x = 60 +wall_thickness = 1.2 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg index 6bc57b7a6ee..3a888015704 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_abs_0.1mm.inst.cfg @@ -13,4 +13,8 @@ weight = 0 [values] speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_cpe_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_cpe_0.1mm.inst.cfg index 2cba4bb7887..cd74f2688fc 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_cpe_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_cpe_0.1mm.inst.cfg @@ -14,5 +14,9 @@ weight = 0 [values] speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg index 3d765aaa1ea..a148563d97c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg @@ -20,6 +20,10 @@ retraction_min_travel = 5 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) speed_wall = =math.ceil(speed_print * 30 / 70) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg index 3e97141c644..7a15e944781 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg @@ -29,7 +29,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_petg_0.1mm.inst.cfg index ffaf1dd591b..d2695b0eaf9 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_petg_0.1mm.inst.cfg @@ -15,5 +15,9 @@ weight = 0 material_print_temperature = =default_material_print_temperature - 5 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_pla_0.1mm.inst.cfg index 95d624cf994..1b40b93f915 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_pla_0.1mm.inst.cfg @@ -21,6 +21,10 @@ retraction_hop = 0.2 speed_print = 30 speed_wall = =math.ceil(speed_print * 25 / 30) speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.72 travel_avoid_distance = 0.4 wall_0_inset = 0.015 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg index 90ac2019926..75cea75e5b3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg @@ -34,6 +34,10 @@ speed_print = 25 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_tough-pla_0.1mm.inst.cfg index 90a389ea0be..03daa338190 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_tough-pla_0.1mm.inst.cfg @@ -21,6 +21,10 @@ speed_print = 30 speed_topbottom = =math.ceil(speed_print * 20 / 30) speed_wall = =math.ceil(speed_print * 25 / 30) speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.72 wall_0_inset = 0.015 wall_0_wipe_dist = 0.25 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.06mm.inst.cfg index ad57f4d87d7..f6969a31a39 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.06mm.inst.cfg @@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.15mm.inst.cfg index 075c1fd4aa2..6d5e7148c41 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.15mm.inst.cfg @@ -23,4 +23,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) speed_wall = =math.ceil(speed_print * 40 / 60) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.1mm.inst.cfg index 5c2bb0f6f45..852c8580d7a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.1mm.inst.cfg @@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.2mm.inst.cfg index 6d68564281c..df95d49c12a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.2mm.inst.cfg @@ -23,4 +23,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 35 / 60) speed_wall = =math.ceil(speed_print * 45 / 60) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.06mm.inst.cfg index fe501993d4c..baa0b0c36d1 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.06mm.inst.cfg @@ -28,6 +28,9 @@ speed_print = 40 speed_topbottom = =math.ceil(speed_print * 30 / 35) speed_wall = =math.ceil(speed_print * 35 / 40) speed_wall_0 = =math.ceil(speed_wall * 30 / 35) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.15mm.inst.cfg index f9c44650c28..f53c0f5aeb3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.15mm.inst.cfg @@ -26,6 +26,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 45 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.1mm.inst.cfg index d7b82b4a1c7..967d3ccd444 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.1mm.inst.cfg @@ -28,6 +28,9 @@ speed_print = 40 speed_topbottom = =math.ceil(speed_print * 30 / 35) speed_wall = =math.ceil(speed_print * 35 / 40) speed_wall_0 = =math.ceil(speed_wall * 30 / 35) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.2mm.inst.cfg index 76a248a7498..de0053edf91 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe-plus_0.2mm.inst.cfg @@ -26,6 +26,9 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 40 / 50) speed_wall = =math.ceil(speed_print * 50 / 50) speed_wall_0 = =math.ceil(speed_wall * 40 / 50) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.06mm.inst.cfg index 8a399bd6379..7a138610235 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.06mm.inst.cfg @@ -21,4 +21,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.15mm.inst.cfg index e6f19344dfe..60a9e478342 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.15mm.inst.cfg @@ -20,4 +20,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) speed_wall = =math.ceil(speed_print * 40 / 60) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.1mm.inst.cfg index 730f7cd2f37..422258c09ca 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.1mm.inst.cfg @@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.2mm.inst.cfg index da5699d4631..1764954dd52 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_cpe_0.2mm.inst.cfg @@ -20,4 +20,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 35 / 60) speed_wall = =math.ceil(speed_print * 45 / 60) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.06mm.inst.cfg index 39f3fd8686d..f6be35a2ec5 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.06mm.inst.cfg @@ -14,7 +14,10 @@ weight = 1 [values] ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.15mm.inst.cfg index b834ac75bb8..874bcc66f06 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.15mm.inst.cfg @@ -15,7 +15,10 @@ weight = -1 material_print_temperature = =default_material_print_temperature + 5 ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.1mm.inst.cfg index ea8f7837a2d..89c3b6f361d 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.1mm.inst.cfg @@ -14,7 +14,10 @@ weight = 0 [values] ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.2mm.inst.cfg index 88b89d7a475..662aa9fb662 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_nylon_0.2mm.inst.cfg @@ -15,7 +15,10 @@ weight = -2 material_print_temperature = =default_material_print_temperature + 10 ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg index 046b9f6ce27..4e217f5ccaf 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg @@ -31,7 +31,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg index c1d488bf5f8..b5ec910404c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg @@ -31,7 +31,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg index d2a3b67d4c1..ff2159e5220 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg @@ -30,7 +30,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg index c95009797d7..a524c5c0405 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg @@ -31,7 +31,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.06mm.inst.cfg index fdbdb811c17..adc4670e8d5 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.06mm.inst.cfg @@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.15mm.inst.cfg index d71148e5ce5..3967838a12e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.15mm.inst.cfg @@ -19,4 +19,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) speed_wall = =math.ceil(speed_print * 40 / 60) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.1mm.inst.cfg index 69f6059c00c..7829f46334e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.1mm.inst.cfg @@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.2mm.inst.cfg index 5291946ccd2..db079b04c9f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.2mm.inst.cfg @@ -19,4 +19,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 35 / 60) speed_wall = =math.ceil(speed_print * 45 / 60) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.06mm.inst.cfg index 6de3ad3edb9..4b8f9f433b0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.06mm.inst.cfg @@ -21,5 +21,9 @@ retraction_prime_speed = =retraction_speed speed_print = 50 speed_topbottom = =math.ceil(speed_print * 35 / 50) speed_wall = =math.ceil(speed_print * 35 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.15mm.inst.cfg index f0764474018..5581284de49 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.15mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 70 speed_topbottom = =math.ceil(speed_print * 35 / 70) speed_wall = =math.ceil(speed_print * 45 / 70) speed_wall_0 = =math.ceil(speed_wall * 35 / 70) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.1mm.inst.cfg index 40b7c5b8434..30af138465b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.1mm.inst.cfg @@ -17,5 +17,9 @@ machine_nozzle_heat_up_speed = 1.6 prime_tower_enable = False raft_airgap = 0.25 retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.2mm.inst.cfg index 8452bce4a96..e5dc960d98c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.2mm.inst.cfg @@ -24,5 +24,9 @@ retraction_prime_speed = =retraction_speed speed_topbottom = =math.ceil(speed_print * 40 / 70) speed_wall = =math.ceil(speed_print * 55 / 70) speed_wall_0 = =math.ceil(speed_wall * 45 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.3mm.inst.cfg index 98990f6fe01..719adc820b4 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pla_0.3mm.inst.cfg @@ -27,6 +27,10 @@ raft_airgap = 0.25 retraction_prime_speed = =retraction_speed speed_print = 50 speed_wall = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.9 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg index b2cbff91775..70d53dd3319 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg index 309f6465593..009039d9727 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg index 234ec47e8f0..9c2870b6617 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.06mm.inst.cfg index 6268da9a9f2..e091136b32a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.06mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 40 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.15mm.inst.cfg index d94df8b8f39..450c82a0c24 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.15mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 40 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.1mm.inst.cfg index cd358539bbe..fa25ccb171b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.1mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 40 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.2mm.inst.cfg index a0d698a327f..fd3574f3130 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.2mm.inst.cfg @@ -22,5 +22,9 @@ speed_roofing = =math.ceil(speed_wall * 20 / 24) speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 36 / 50) speed_wall_0 = =math.ceil(speed_print * 26 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.3mm.inst.cfg index e9e0c2fc7f6..cbf086000eb 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tough-pla_0.3mm.inst.cfg @@ -27,6 +27,10 @@ raft_airgap = 0.25 retraction_prime_speed = =retraction_speed speed_print = 50 speed_wall = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg index 18aaeb64707..c6e9fc00d1a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg @@ -36,6 +36,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg index e8e7410cd55..043aa880ad3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg index e24ab778b51..0c8d7eb4290 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg @@ -36,6 +36,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm.inst.cfg index 3dff641b426..fd25f84ca51 100644 --- a/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.15mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm.inst.cfg index f9d1cb1295b..ea26d6b1461 100644 --- a/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_cc0.4_petcf_0.2mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm.inst.cfg index 864e913a9c2..b49ee3061e7 100644 --- a/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.15mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm.inst.cfg index 138b1180735..db82d6e40eb 100644 --- a/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.2mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.3mm.inst.cfg index 6f899afbbfd..8e94df9387a 100644 --- a/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_petcf_0.3mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg index ae9144728ab..08053a4f6df 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_abs_0.1mm.inst.cfg @@ -13,4 +13,8 @@ weight = 0 [values] speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_cpe_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_cpe_0.1mm.inst.cfg index ba519667d06..ca39f8dc7ab 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_cpe_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_cpe_0.1mm.inst.cfg @@ -14,5 +14,9 @@ weight = 0 [values] speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg index 710701b22a7..009628fd2e9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg @@ -15,11 +15,15 @@ weight = 0 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 ooze_shield_angle = 40 -raft_airgap = 0.15 +raft_airgap = 0.4 retraction_min_travel = 5 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) speed_wall = =math.ceil(speed_print * 30 / 70) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg index f5a34415b49..eeffba5b98e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg @@ -29,7 +29,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_petg_0.1mm.inst.cfg index 7b41e45d1c6..374ef263157 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_petg_0.1mm.inst.cfg @@ -15,5 +15,9 @@ weight = 0 material_print_temperature = =default_material_print_temperature - 5 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_pla_0.1mm.inst.cfg index 199995e5a16..2b99c9accea 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_pla_0.1mm.inst.cfg @@ -21,6 +21,10 @@ retraction_hop = 0.2 speed_print = 30 speed_wall = =math.ceil(speed_print * 25 / 30) speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.72 travel_avoid_distance = 0.4 wall_0_inset = 0.015 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg index 4b9d902b314..d38c036bcd3 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg @@ -34,6 +34,10 @@ speed_print = 25 speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_tough-pla_0.1mm.inst.cfg index 81d1d1f7353..4f02a053b4d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_tough-pla_0.1mm.inst.cfg @@ -21,6 +21,10 @@ speed_print = 30 speed_topbottom = =math.ceil(speed_print * 20 / 30) speed_wall = =math.ceil(speed_print * 25 / 30) speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.72 wall_0_inset = 0.015 wall_0_wipe_dist = 0.25 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.06mm.inst.cfg index 8ecbf19956f..7694e37ba3e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.06mm.inst.cfg @@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.15mm.inst.cfg index f576b209870..c27a4a1b57b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.15mm.inst.cfg @@ -23,4 +23,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) speed_wall = =math.ceil(speed_print * 40 / 60) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.1mm.inst.cfg index 65e2cb03617..f19345a0fee 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.1mm.inst.cfg @@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.2mm.inst.cfg index 337054f0deb..03f67f9924c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.2mm.inst.cfg @@ -23,4 +23,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 35 / 60) speed_wall = =math.ceil(speed_print * 45 / 60) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.06mm.inst.cfg index e95804af3a8..72e6ead2391 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.06mm.inst.cfg @@ -28,6 +28,9 @@ speed_print = 40 speed_topbottom = =math.ceil(speed_print * 30 / 35) speed_wall = =math.ceil(speed_print * 35 / 40) speed_wall_0 = =math.ceil(speed_wall * 30 / 35) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.15mm.inst.cfg index ac1e50fd492..1a4e89f7831 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.15mm.inst.cfg @@ -26,6 +26,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 45 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.1mm.inst.cfg index 77ccf924594..6c2e7b2f94f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.1mm.inst.cfg @@ -28,6 +28,9 @@ speed_print = 40 speed_topbottom = =math.ceil(speed_print * 30 / 35) speed_wall = =math.ceil(speed_print * 35 / 40) speed_wall_0 = =math.ceil(speed_wall * 30 / 35) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.2mm.inst.cfg index dde22bbd42d..b2182320fd9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe-plus_0.2mm.inst.cfg @@ -26,6 +26,9 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 40 / 50) speed_wall = =math.ceil(speed_print * 50 / 50) speed_wall_0 = =math.ceil(speed_wall * 40 / 50) -support_z_distance = =layer_height +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.4/layer_height)*layer_height wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.06mm.inst.cfg index 5e96ec7e281..ab7fc5ef9b3 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.06mm.inst.cfg @@ -21,4 +21,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.15mm.inst.cfg index ec4cef925d5..7c27d79d2df 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.15mm.inst.cfg @@ -20,4 +20,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) speed_wall = =math.ceil(speed_print * 40 / 60) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.1mm.inst.cfg index 2928127314b..20c036907a7 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.1mm.inst.cfg @@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.2mm.inst.cfg index af34967c615..b1094daf5aa 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_cpe_0.2mm.inst.cfg @@ -20,4 +20,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 35 / 60) speed_wall = =math.ceil(speed_print * 45 / 60) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.06mm.inst.cfg index e243e337492..0abeb142212 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.06mm.inst.cfg @@ -14,7 +14,10 @@ weight = 1 [values] ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.15mm.inst.cfg index 8833881fdf9..94536f19046 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.15mm.inst.cfg @@ -15,7 +15,10 @@ weight = -1 material_print_temperature = =default_material_print_temperature + 5 ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.1mm.inst.cfg index 70f76a52669..f07d801dc09 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.1mm.inst.cfg @@ -14,7 +14,10 @@ weight = 0 [values] ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.2mm.inst.cfg index 0f7b604b155..005ccf6e59c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_nylon_0.2mm.inst.cfg @@ -15,7 +15,10 @@ weight = -2 material_print_temperature = =default_material_print_temperature + 10 ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 30 switch_extruder_retraction_amount = 30 switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg index c19de26c930..a2e3bd792ba 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg @@ -31,7 +31,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg index b21da5f2e41..9ef073b6355 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg @@ -31,7 +31,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg index c99934288e3..e118f0db8a9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg @@ -30,7 +30,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg index 7eedf33df97..4351a289b9e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg @@ -31,7 +31,11 @@ speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance support_interface_density = 87.5 +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.06mm.inst.cfg index 8bebbf4113c..6fe817fba1d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.06mm.inst.cfg @@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.15mm.inst.cfg index ce957c1a505..060e9b35407 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.15mm.inst.cfg @@ -19,4 +19,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) speed_wall = =math.ceil(speed_print * 40 / 60) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.1mm.inst.cfg index 4bba37dd018..1e04aad8ce0 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.1mm.inst.cfg @@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.2mm.inst.cfg index 6b7f2fba1a3..aaf279f115b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.2mm.inst.cfg @@ -19,4 +19,8 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 35 / 60) speed_wall = =math.ceil(speed_print * 45 / 60) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.06mm.inst.cfg index 5facf889709..f34549bc781 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.06mm.inst.cfg @@ -21,5 +21,9 @@ retraction_prime_speed = =retraction_speed speed_print = 50 speed_topbottom = =math.ceil(speed_print * 35 / 50) speed_wall = =math.ceil(speed_print * 35 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.15mm.inst.cfg index 262fa014418..4a9e914b99d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.15mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 70 speed_topbottom = =math.ceil(speed_print * 35 / 70) speed_wall = =math.ceil(speed_print * 45 / 70) speed_wall_0 = =math.ceil(speed_wall * 35 / 70) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.1mm.inst.cfg index b05f4fdd623..dc73f13bb55 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.1mm.inst.cfg @@ -17,5 +17,9 @@ machine_nozzle_heat_up_speed = 1.6 prime_tower_enable = False raft_airgap = 0.25 retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.2mm.inst.cfg index aea145b1f94..ead512bb507 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.2mm.inst.cfg @@ -24,5 +24,9 @@ retraction_prime_speed = =retraction_speed speed_topbottom = =math.ceil(speed_print * 40 / 70) speed_wall = =math.ceil(speed_print * 55 / 70) speed_wall_0 = =math.ceil(speed_wall * 45 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.3mm.inst.cfg index 31d2b31017e..c6641e7a08e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pla_0.3mm.inst.cfg @@ -27,6 +27,10 @@ raft_airgap = 0.25 retraction_prime_speed = =retraction_speed speed_print = 50 speed_wall = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.9 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg index 318a14834ff..9712132da9f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg index 1527a11fd0e..79a0f11262e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg index 356fa2d4cb2..70207475dcc 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.06mm.inst.cfg index 5f63f533f77..f3e17318b66 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.06mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 40 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.15mm.inst.cfg index bf64c24170b..6a3ec605ad6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.15mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 40 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.1mm.inst.cfg index 977232f4d45..9e3a3586f33 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.1mm.inst.cfg @@ -21,5 +21,9 @@ speed_print = 45 speed_topbottom = =math.ceil(speed_print * 35 / 45) speed_wall = =math.ceil(speed_print * 40 / 45) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.2mm.inst.cfg index 8e904a41a54..506ed71f9a0 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.2mm.inst.cfg @@ -22,5 +22,9 @@ speed_roofing = =math.ceil(speed_wall * 20 / 24) speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 36 / 50) speed_wall_0 = =math.ceil(speed_print * 26 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.3mm.inst.cfg index 0ac60ad5a20..55903683690 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tough-pla_0.3mm.inst.cfg @@ -27,6 +27,10 @@ raft_airgap = 0.25 retraction_prime_speed = =retraction_speed speed_print = 50 speed_wall = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg index b641bdbe137..281d99afb16 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg @@ -36,6 +36,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg index 9a4f7c61fd3..450b9adeb45 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg @@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg index 3461b457366..21fbcff466f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg @@ -36,6 +36,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8) speed_wall = =math.ceil(speed_print * 25 / 25) speed_wall_0 = =math.ceil(speed_wall * 25 / 25) support_angle = 50 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm.inst.cfg index 4921b874341..88ee346758a 100644 --- a/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.15mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm.inst.cfg index 2dde7772b69..00f9ef51ff6 100644 --- a/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_cc0.4_petcf_0.2mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm.inst.cfg index df11fcf377d..c9a6a2bafe2 100644 --- a/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.15mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm.inst.cfg index 759f3ed41d5..7abb9e4018e 100644 --- a/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.2mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.3mm.inst.cfg index f18c0e018ec..e0c6719bde6 100644 --- a/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_cc0.6_petcf_0.3mm.inst.cfg @@ -22,8 +22,9 @@ speed_topbottom = =speed_print speed_wall = =speed_print speed_wall_0 = =speed_wall speed_wall_x = =speed_wall -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance / 2 -support_z_distance = =layer_height * 2 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height top_bottom_thickness = 1.2 diff --git a/resources/setting_visibility/advanced.cfg b/resources/setting_visibility/advanced.cfg index a744c8eae85..c3451d2c981 100644 --- a/resources/setting_visibility/advanced.cfg +++ b/resources/setting_visibility/advanced.cfg @@ -34,6 +34,8 @@ bottom_thickness bottom_layers ironing_enabled skin_monotonic +small_skin_width +small_skin_on_surface [infill] infill_extruder_nr diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 65177289680..5388681e8fa 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -60,6 +60,7 @@ skin_monotonic connect_skin_polygons skin_angles small_skin_width +small_skin_on_surface skin_no_small_gaps_heuristic skin_outline_count ironing_enabled @@ -365,6 +366,10 @@ multiple_mesh_overlap carve_multiple_volumes alternate_carve_order remove_empty_first_layers +meshfix_fluid_motion_enabled +meshfix_fluid_motion_shift_distance +meshfix_fluid_motion_small_distance +meshfix_fluid_motion_angle [blackmagic] print_sequence diff --git a/resources/themes/cura-light/icons/default/Heart.svg b/resources/themes/cura-light/icons/default/Heart.svg new file mode 100644 index 00000000000..793dcbd6b57 --- /dev/null +++ b/resources/themes/cura-light/icons/default/Heart.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.2.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.2.inst.cfg new file mode 100644 index 00000000000..4d0858a5738 --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.2.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.2mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.3.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.3.inst.cfg new file mode 100644 index 00000000000..e127a63c76e --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.3.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.4.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.4.inst.cfg new file mode 100644 index 00000000000..3422da8b90f --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.4.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.5.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.5.inst.cfg new file mode 100644 index 00000000000..744e7e441de --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.5.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.5mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.5 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.6.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.6.inst.cfg new file mode 100644 index 00000000000..289eb3bd96e --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.6.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.8.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.8.inst.cfg new file mode 100644 index 00000000000..68aa6dc7daf --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.8.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.8mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.8 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_1.0.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_1.0.inst.cfg new file mode 100644 index 00000000000..5e332ea26bf --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_1.0.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 1.0mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 1.0 +