diff --git a/.github/workflows/cura-all-installers.yml b/.github/workflows/cura-all-installers.yml deleted file mode 100644 index 4729c4198a..0000000000 --- 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 9572b31aee..0000000000 --- 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 0000000000..ead3b7a87a --- /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 0000000000..5a18199e3c --- /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 0000000000..af1fc3d12b --- /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 26d167db2b..6b4d4cffc8 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 0000000000..df9056d454 --- /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 627cfa2515..7a93bbf099 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 0000000000..2d108a74e1 --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1 @@ +github: [ultimaker] diff --git a/README.md b/README.md index c40ead2baa..eb04799339 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 d4f365c7a4..77cecf1134 100644 --- a/conanfile.py +++ b/conanfile.py @@ -466,6 +466,7 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV 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 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV 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 193803325f..6c2d3f4cb8 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.Operations.SetParentOperation import SetParentOperation 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 @@ class CuraActions(QObject): 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 889e442eaa..f44393657f 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -409,7 +409,7 @@ class CuraApplication(QtApplication): 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,6 +495,36 @@ class CuraApplication(QtApplication): def startSplashWindowPhase(self) -> None: """Runs preparations that needs to be done before the starting process.""" + 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. + + # Views: + "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. + + # 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. + ]) + # 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(): @@ -503,33 +533,7 @@ class CuraApplication(QtApplication): 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. - # Views: - "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. - - # 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. - ]) self._i18n_catalog = i18nCatalog("cura") self._update_platform_activity_timer = QTimer() diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 06ec247ae4..0dbf3ba782 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -111,11 +111,7 @@ class ConvexHullDecorator(SceneNodeDecorator): # 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 @@ class ConvexHullDecorator(SceneNodeDecorator): 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 fd6555e679..08c24180bb 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -97,14 +97,14 @@ class CuraFormulaFunctions: 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 bd106eb2da..ab18be0f42 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 dcde629900..eae9afceff 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 e8b6a54e46..e06e9dcf4e 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -56,7 +56,8 @@ class ThreeMFReader(MeshReader): 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 @@ class ThreeMFReader(MeshReader): 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 @@ class ThreeMFReader(MeshReader): 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 @@ class ThreeMFReader(MeshReader): 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 @@ class ThreeMFReader(MeshReader): 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 @@ class ThreeMFReader(MeshReader): 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 57c667145e..3f6fef7201 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -55,11 +55,12 @@ class ThreeMFWriter(MeshWriter): "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 @@ class ThreeMFWriter(MeshWriter): """ 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 @@ class ThreeMFWriter(MeshWriter): 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 @@ class ThreeMFWriter(MeshWriter): # 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 @@ class ThreeMFWriter(MeshWriter): 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 @@ class ThreeMFWriter(MeshWriter): 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 fbb4214021..b3ef761af5 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 a80f304aaa..0f379479ba 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 1cc9b59c9c..be661e0889 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 91b36389f3..2930623a93 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 dacb40e905..534c0208cf 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 d3c1e60192..93941c0992 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 b5ea4d4eda..eaa15e0942 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 40a56ace57..7a12c229cc 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 8d35f68822..ab964d160a 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 e93473c25f..8c0c50d0b4 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 @@ class RemovableDriveOutputDevice(OutputDevice): 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 d85ade9dce..76254547da 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py @@ -37,24 +37,13 @@ class NewPrinterDetectedMessage(Message): 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 95b165075b..728a6c6242 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 0000000000..944398711f --- /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 b0a0717c59..c54a388806 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 b44b8c6853..680dd3b6f8 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 79a4916680..bda5ac03b2 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 0000000000..fc5d4f6dda --- /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 41b2b982be..7ae10f5f1d 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 22046a16ff..7ef3aff2ab 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 60005e8712..fbae8a657d 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 0000000000..51a6c351bc --- /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 0000000000..f05e4b4e20 --- /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 6cd75b51ac..f945b1c11d 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 f13ca28447..a42239056c 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 f7029939cd..d85703451f 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 4be25fdffe..6a57a99515 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 7d8f6b886d..3f0db28058 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 0000000000..47983fe3b1 --- /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 6bc57b7a6e..3a88801570 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 2cba4bb788..cd74f2688f 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 3d765aaa1e..a148563d97 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 3e97141c64..7a15e94478 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 ffaf1dd591..d2695b0eaf 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 95d624cf99..1b40b93f91 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 90ac201992..75cea75e5b 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 90a389ea0b..03daa33819 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 ad57f4d87d..f6969a31a3 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 075c1fd4aa..6d5e7148c4 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 5c2bb0f6f4..852c8580d7 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 6d68564281..df95d49c12 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 fe501993d4..baa0b0c36d 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 f9c44650c2..f53c0f5aeb 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 d7b82b4a1c..967d3ccd44 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 76a248a749..de0053edf9 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 8a399bd637..7a13861023 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 e6f19344df..60a9e47834 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 730f7cd2f3..422258c09c 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 da5699d463..1764954dd5 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 39f3fd8686..f6be35a2ec 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 b834ac75bb..874bcc66f0 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 ea8f7837a2..89c3b6f361 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 88b89d7a47..662aa9fb66 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 046b9f6ce2..4e217f5cca 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 c1d488bf5f..b5ec910404 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 d2a3b67d4c..ff2159e522 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 c95009797d..a524c5c040 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 fdbdb811c1..adc4670e8d 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 d71148e5ce..3967838a12 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 69f6059c00..7829f46334 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 5291946ccd..db079b04c9 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 6de3ad3edb..4b8f9f433b 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 f076447401..5581284de4 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 40b7c5b843..30af138465 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 8452bce4a9..e5dc960d98 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 98990f6fe0..719adc820b 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 b2cbff9177..70d53dd331 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 309f646559..009039d972 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 234ec47e8f..9c2870b661 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 6268da9a9f..e091136b32 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 d94df8b8f3..450c82a0c2 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 cd358539bb..fa25ccb171 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 a0d698a327..fd3574f313 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 e9e0c2fc7f..cbf086000e 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 18aaeb6470..c6e9fc00d1 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 e8e7410cd5..043aa880ad 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 e24ab778b5..0c8d7eb429 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 3dff641b42..fd25f84ca5 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 f9d1cb1295..ea26d6b146 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 864e913a9c..b49ee3061e 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 138b118073..db82d6e40e 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 6f899afbbf..8e94df9387 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 ae9144728a..08053a4f6d 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 ba519667d0..ca39f8dc7a 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 710701b22a..009628fd2e 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 f5a34415b4..eeffba5b98 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 7b41e45d1c..374ef26315 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 199995e5a1..2b99c9acce 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 4b9d902b31..d38c036bcd 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 81d1d1f735..4f02a053b4 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 8ecbf19956..7694e37ba3 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 f576b20987..c27a4a1b57 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 65e2cb0361..f19345a0fe 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 337054f0de..03f67f9924 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 e95804af3a..72e6ead239 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 ac1e50fd49..1a4e89f783 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 77ccf92459..6c2e7b2f94 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 dde22bbd42..b2182320fd 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 5e96ec7e28..ab7fc5ef9b 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 ec4cef925d..7c27d79d2d 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 2928127314..20c036907a 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 af34967c61..b1094daf5a 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 e243e33749..0abeb14221 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 8833881fdf..94536f1904 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 70f76a5266..f07d801dc0 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 0f7b604b15..005ccf6e59 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 c19de26c93..a2e3bd792b 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 b21da5f2e4..9ef073b635 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 c99934288e..e118f0db8a 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 7eedf33df9..4351a289b9 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 8bebbf4113..6fe817fba1 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 ce957c1a50..060e9b3540 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 4bba37dd01..1e04aad8ce 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 6b7f2fba1a..aaf279f115 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 5facf88970..f34549bc78 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 262fa01441..4a9e914b99 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 b05f4fdd62..dc73f13bb5 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 aea145b1f9..ead512bb50 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 31d2b31017..c6641e7a08 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 318a14834f..9712132da9 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 1527a11fd0..79a0f11262 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 356fa2d4cb..70207475dc 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 5f63f533f7..f3e17318b6 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 bf64c24170..6a3ec605ad 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 977232f4d4..9e3a3586f3 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 8e904a41a5..506ed71f9a 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 0ac60ad5a2..5590368369 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 b641bdbe13..281d99afb1 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 9a4f7c61fd..450b9adeb4 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 3461b45736..21fbcff466 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 4921b87434..88ee346758 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 2dde7772b6..00f9ef51ff 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 df11fcf377..c9a6a2bafe 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 759f3ed41d..7abb9e4018 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 f18c0e018e..e0c6719bde 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 a744c8eae8..c3451d2c98 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 6517728968..5388681e8f 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 0000000000..793dcbd6b5 --- /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 0000000000..4d0858a573 --- /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 0000000000..e127a63c76 --- /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 0000000000..3422da8b90 --- /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 0000000000..744e7e441d --- /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 0000000000..289eb3bd96 --- /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 0000000000..68aa6dc7da --- /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 0000000000..5e332ea26b --- /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 +