Merge branch 'main' into CURA-10201_fill-narrow-skin-with-walls

This commit is contained in:
c.lamboo 2023-03-21 13:49:12 +01:00
commit 06dbf0f275
5787 changed files with 255549 additions and 269562 deletions

View file

@ -109,9 +109,13 @@ jobs:
if: ${{ runner.os == 'Macos' }}
run: brew install autoconf automake ninja
# 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
@ -141,48 +145,10 @@ jobs:
if: ${{ inputs.conan_config_branch == '' }}
run: conan config install https://github.com/Ultimaker/conan-config.git
- name: Create the lock file
if: ${{ inputs.build_info }}
run: |
conan_build_info --v2 start ${{ inputs.project_name }} ${{ github.run_number }}000${{ inputs.build_id }}
conan lock create --reference ${{ inputs.recipe_id_full }} --lockfile-out=conan.lock
- name: Create the Packages using lockfile
if: ${{ inputs.build_info }}
run: conan install ${{ inputs.recipe_id_full }} --build=missing --update --lockfile=conan.lock --lockfile-out=conan.lock
- name: Create the Packages
if: ${{ ! inputs.build_info }}
run: conan install ${{ inputs.recipe_id_full }} --build=missing --update
- name: Create the build info
if: ${{ inputs.build_info }}
run: conan_build_info --v2 create buildinfo.json --lockfile conan.lock --user ${{ secrets.CONAN_USER }} --password ${{ secrets.CONAN_PASS }}
- name: Upload the Package(s)
if: always()
run: conan upload "*" -r cura --all -c
- name: Upload the build info
if: ${{ inputs.build_info }}
run: |
conan_build_info --v2 publish buildinfo.json --url https://ultimaker.jfrog.io/artifactory --user ${{ secrets.CONAN_USER }} --password ${{ secrets.CONAN_PASS }}
conan_build_info --v2 stop
- name: Upload the Package(s) community
if: ${{ always() && inputs.conan_upload_community == true }}
run: conan upload "*" -r cura-ce -c
- name: Upload the log and build artifacts
if: always()
uses: actions/upload-artifact@v3
with:
name: log-${{ inputs.runs_on }}-${{ runner.arch }}
path: |
buildinfo.json
conan.lock
conanbuildinfo.txt
conaninfo.txt
graph_info.json
build/**
retention-days: 1
conan upload ${{ inputs.recipe_id_full }} -r cura --all -c

View file

@ -7,110 +7,134 @@ name: conan-package
# It should run on pushes against main or CURA-* branches, but it will only create the binaries for main and release branches
on:
workflow_dispatch:
inputs:
create_binaries_windows:
required: true
default: false
description: 'create binaries Windows'
create_binaries_linux:
required: true
default: false
description: 'create binaries Linux'
create_binaries_macos:
required: true
default: false
description: 'create binaries Macos'
workflow_dispatch:
inputs:
create_binaries_windows:
required: true
default: false
description: 'create binaries Windows'
create_binaries_linux:
required: true
default: false
description: 'create binaries Linux'
create_binaries_macos:
required: true
default: false
description: 'create binaries Macos'
push:
paths:
- 'plugins/**'
- 'resources/**'
- 'cura/**'
- 'icons/**'
- 'tests/**'
- 'packaging/**'
- '.github/workflows/conan-*.yml'
- '.github/workflows/notify.yml'
- '.github/workflows/requirements-conan-package.txt'
- 'requirements*.txt'
- 'conanfile.py'
- 'conandata.yml'
- 'GitVersion.yml'
- '*.jinja'
branches:
- main
- 'CURA-*'
- '[1-9].[0-9]'
- '[1-9].[0-9][0-9]'
tags:
- '[1-9].[0-9].[0-9]*'
- '[1-9].[0-9].[0-9]'
- '[1-9].[0-9][0-9].[0-9]*'
push:
paths:
- 'plugins/**'
- 'resources/**'
- 'cura/**'
- 'icons/**'
- 'tests/**'
- 'packaging/**'
- '.github/workflows/conan-*.yml'
- '.github/workflows/notify.yml'
- '.github/workflows/requirements-conan-package.txt'
- 'requirements*.txt'
- 'conanfile.py'
- 'conandata.yml'
- 'GitVersion.yml'
- '*.jinja'
branches:
- main
- 'CURA-*'
- '[1-9].[0-9]'
- '[1-9].[0-9][0-9]'
tags:
- '[1-9].[0-9].[0-9]*'
- '[1-9].[0-9].[0-9]'
- '[1-9].[0-9][0-9].[0-9]*'
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
permissions: {}
jobs:
conan-recipe-version:
permissions:
contents: read
conan-recipe-version:
permissions:
contents: read
uses: ultimaker/cura/.github/workflows/conan-recipe-version.yml@main
uses: ultimaker/cura/.github/workflows/conan-recipe-version.yml@main
with:
project_name: cura
conan-package-create-linux:
needs: [ conan-recipe-version ]
runs-on: 'ubuntu-latest'
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Cache Conan data
id: cache-conan
uses: actions/cache@v3
with:
project_name: cura
path: ~/.conan
key: ${{ runner.os }}-conan
conan-package-export:
permissions:
contents: read
needs: [ conan-recipe-version ]
uses: ultimaker/cura/.github/workflows/conan-recipe-export.yml@main
- name: Setup Python and pip
uses: actions/setup-python@v4
with:
recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }}
recipe_id_latest: ${{ needs.conan-recipe-version.outputs.recipe_id_latest }}
runs_on: 'ubuntu-20.04'
python_version: '3.10.x'
conan_logging_level: 'info'
secrets: inherit
python-version: '3.11.x'
cache: 'pip'
cache-dependency-path: .github/workflows/requirements-conan-package.txt
conan-package-create-linux:
permissions:
contents: read
- name: Install Python requirements for runner
run: pip install -r .github/workflows/requirements-conan-package.txt
if: ${{ (github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || needs.conan-recipe-version.outputs.is_release_branch == 'true')) || (github.event_name == 'workflow_dispatch' && inputs.create_binaries_linux) }}
needs: [ conan-recipe-version, conan-package-export ]
# 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 efibootmgr 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 flex bison g++-12 gcc-12 -y
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
uses: ultimaker/cura/.github/workflows/conan-package-create.yml@main
with:
project_name: ${{ needs.conan-recipe-version.outputs.project_name }}
recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }}
build_id: 1
runs_on: 'ubuntu-20.04'
python_version: '3.10.x'
conan_logging_level: 'info'
secrets: inherit
- name: Create the default Conan profile
run: conan profile new default --detect --force
notify-export:
if: ${{ always() }}
needs: [ conan-recipe-version, conan-package-export ]
- name: Get Conan configuration
run: conan config install https://github.com/Ultimaker/conan-config.git
uses: ultimaker/cura/.github/workflows/notify.yml@main
with:
success: ${{ contains(join(needs.*.result, ','), 'success') }}
success_title: "New Conan recipe exported in ${{ github.repository }}"
success_body: "Exported ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
failure_title: "Failed to export Conan Export in ${{ github.repository }}"
failure_body: "Failed to exported ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
secrets: inherit
- name: Create the Packages
run: conan create . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o ${{ needs.conan-recipe-version.outputs.project_name }}:devtools=True
notify-create:
if: ${{ always() && ((github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || needs.conan-recipe-version.outputs.is_release_branch == 'true')) || (github.event_name == 'workflow_dispatch' && inputs.create_binaries_linux)) }}
needs: [ conan-recipe-version, conan-package-create-linux ]
- name: Create the latest alias
if: always()
run: conan alias ${{ needs.conan-recipe-version.outputs.recipe_id_latest }} ${{ needs.conan-recipe-version.outputs.recipe_id_full }}
uses: ultimaker/cura/.github/workflows/notify.yml@main
with:
success: ${{ contains(join(needs.*.result, ','), 'success') }}
success_title: "New binaries created in ${{ github.repository }}"
success_body: "Created binaries for ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
failure_title: "Failed to create binaries in ${{ github.repository }}"
failure_body: "Failed to created binaries for ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
secrets: inherit
- name: Upload the Package(s)
if: always()
run: |
conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_full }} -r cura --all -c
conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_latest }} -r cura -c
notify-create:
if: ${{ always() && (github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || needs.conan-recipe-version.outputs.is_release_branch == 'true')) }}
needs: [ conan-recipe-version, conan-package-create-linux ]
uses: ultimaker/cura/.github/workflows/notify.yml@main
with:
success: ${{ contains(join(needs.*.result, ','), 'success') }}
success_title: "New binaries created in ${{ github.repository }}"
success_body: "Created binaries for ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
failure_title: "Failed to create binaries in ${{ github.repository }}"
failure_body: "Failed to created binaries for ${{ needs.conan-recipe-version.outputs.recipe_id_full }}"
secrets: inherit

View file

@ -88,20 +88,12 @@ jobs:
if: ${{ !inputs.conan_export_binaries }}
run: conan export . ${{ inputs.recipe_id_full }}
- name: Remove the latest alias
if: ${{ inputs.recipe_id_latest != '' && runner.os == 'Linux' }}
run: |
conan remove ${{ inputs.recipe_id_latest }} -r cura -f || true
conan remove ${{ inputs.recipe_id_latest }} -r cura-ce -f || true
- name: Create the latest alias
if: ${{ inputs.recipe_id_latest != '' && always() }}
if: always()
run: conan alias ${{ inputs.recipe_id_latest }} ${{ inputs.recipe_id_full }}
- name: Upload the Package(s)
if: always()
run: conan upload "*" -r cura --all -c
- name: Upload the Package(s) community
if: ${{ always() && inputs.conan_upload_community == true }}
run: conan upload "*" -r cura-ce -c
run: |
conan upload ${{ inputs.recipe_id_full }} -r cura --all -c
conan upload ${{ inputs.recipe_id_latest }} -r cura -c

View file

@ -7,6 +7,11 @@ on:
required: true
type: string
user:
required: false
default: ultimaker
type: string
additional_buildmetadata:
required: false
default: ""
@ -86,12 +91,12 @@ jobs:
run: |
import subprocess
import os
from conans import tools
from conans.errors import ConanException
from conan.tools.scm import Version
from conan.errors import ConanException
from git import Repo
repo = Repo('.')
user = "${{ github.repository_owner }}".lower()
user = "${{ inputs.user }}".lower()
project_name = "${{ inputs.project_name }}"
event_name = "${{ github.event_name }}"
issue_number = "${{ github.ref }}".split('/')[2]
@ -103,16 +108,16 @@ jobs:
# FIXME: for when we push a tag (such as an release)
channel = "testing"
if is_tag:
branch_version = tools.Version(ref_name)
branch_version = Version(ref_name)
is_release_branch = True
channel = "_"
user = "_"
actual_version = f"{branch_version}"
else:
try:
branch_version = tools.Version(repo.active_branch.name)
branch_version = Version(repo.active_branch.name)
except ConanException:
branch_version = tools.Version('0.0.0')
branch_version = Version('0.0.0')
if ref_name == f"{branch_version.major}.{branch_version.minor}":
channel = 'stable'
is_release_branch = True
@ -125,17 +130,17 @@ jobs:
channel = f"pr_{issue_number}"
# %% Get the actual version
latest_branch_version = tools.Version("0.0.0")
latest_branch_version = Version("0.0.0")
latest_branch_tag = None
for tag in repo.git.tag(merged = True).splitlines():
for tag in repo.active_branch.repo.tags:
if str(tag).startswith("firmware") or str(tag).startswith("master"):
continue # Quick-fix for the versioning scheme name of the embedded team in fdm_materials(_private) repo
try:
version = tools.Version(tag)
version = Version(tag)
except ConanException:
continue
if version > latest_branch_version and version < tools.Version("10.0.0"):
# FIXME: stupid old Cura tags 13.04 etc. keep popping up
if version > latest_branch_version and version < Version("6.0.0"):
# FIXME: stupid old Cura tags 13.04 etc. keep popping up, als the fdm_material tag for firmware are messing with this
latest_branch_version = version
latest_branch_tag = repo.tag(tag)
@ -146,12 +151,12 @@ jobs:
if commit == latest_branch_tag.commit:
break
no_commits += 1
latest_branch_version_prerelease = latest_branch_version.prerelease
if latest_branch_version.prerelease and not "." in latest_branch_version.prerelease:
latest_branch_version_prerelease = latest_branch_version.pre
if latest_branch_version.pre and not "." in str(latest_branch_version.pre):
# The prerealese did not contain a version number, default it to 1
latest_branch_version_prerelease = f"{latest_branch_version.prerelease}.1"
latest_branch_version_prerelease = f"{latest_branch_version.pre}.1"
if event_name == "pull_request":
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{latest_branch_version_prerelease.lower()}+{buildmetadata}pr_{issue_number}_{no_commits}"
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{str(latest_branch_version_prerelease).lower()}+{buildmetadata}pr_{issue_number}_{no_commits}"
channel_metadata = f"{channel}_{no_commits}"
else:
if channel in ("stable", "_", ""):
@ -159,18 +164,34 @@ jobs:
else:
channel_metadata = f"{channel}_{no_commits}"
if is_release_branch:
if latest_branch_version.prerelease == "":
if latest_branch_version.pre == "" and branch_version > latest_branch_version:
actual_version = f"{branch_version.major}.{branch_version.minor}.0-beta.1+{buildmetadata}{channel_metadata}"
elif latest_branch_version.pre == "":
# An actual full release has been created, we are working on patch
bump_up_patch = int(latest_branch_version.patch) + 1
bump_up_patch = int(str(latest_branch_version.patch)) + 1
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{bump_up_patch}-beta.1+{buildmetadata}{channel_metadata}"
elif latest_branch_version.pre is None:
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{int(latest_branch_version.patch.value) + 1}-beta.1+{buildmetadata}{channel_metadata}"
else:
# An beta release has been created we are working toward a next beta or full release
bump_up_release_tag = int(latest_branch_version.prerelease.split('.')[1]) + 1
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{latest_branch_version.prerelease.split('.')[0]}.{bump_up_release_tag}+{buildmetadata}{channel_metadata}"
bump_up_release_tag = int(str(latest_branch_version.pre).split('.')[1]) + 1
actual_version = f"{latest_branch_version.major}.{latest_branch_version.minor}.{latest_branch_version.patch}-{str(latest_branch_version.pre).split('.')[0]}.{bump_up_release_tag}+{buildmetadata}{channel_metadata}"
else:
bump_up_minor = int(latest_branch_version.minor) + 1
reset_patch = 0
actual_version = f"{latest_branch_version.major}.{bump_up_minor}.{reset_patch}-alpha+{buildmetadata}{channel_metadata}"
max_branches_version = Version("0.0.0")
branches_no_commits = no_commits
for branch in repo.references:
try:
if "remotes/origin" in branch.abspath:
b_version = Version(branch.name.split("/")[-1])
if b_version < Version("10.0.0") and b_version > max_branches_version:
max_branches_version = b_version
branches_no_commits = repo.commit().count() - branch.commit.count()
except:
pass
if max_branches_version > latest_branch_version:
actual_version = f"{max_branches_version.major}.{int(str(max_branches_version.minor)) + 1}.0-alpha+{buildmetadata}{channel}_{branches_no_commits}"
else:
actual_version = f"{latest_branch_version.major}.{int(str(latest_branch_version.minor)) + 1}.0-alpha+{buildmetadata}{channel_metadata}"
# %% Set the environment output
output_env = os.environ["GITHUB_OUTPUT"]
@ -189,14 +210,14 @@ jobs:
f.writelines(f"semver_full={actual_version}\n")
f.writelines(f"is_release_branch={str(is_release_branch).lower()}\n")
print("::group::Conan Recipe Information")
print(f"name = {project_name}")
print(f"version = {actual_version}")
print(f"user = {user}")
print(f"channel = {channel}")
print(f"recipe_id_full = {project_name}/{actual_version}@{user}/{channel}")
print(f"recipe_id_latest = {project_name}/latest@{user}/{channel}")
print(f"semver_full = {actual_version}")
print(f"is_release_branch = {str(is_release_branch).lower()}")
print("::endgroup::")
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
with open(summary_env, "w") as f:
f.writelines(f"# {project_name}\n")
f.writelines(f"name={project_name}\n")
f.writelines(f"version={actual_version}\n")
f.writelines(f"channel={channel}\n")
f.writelines(f"recipe_id_full={project_name}/{actual_version}@{user}/{channel}\n")
f.writelines(f"recipe_id_latest={project_name}/latest@{user}/{channel}\n")
f.writelines(f"semver_full={actual_version}\n")
f.writelines(f"is_release_branch={str(is_release_branch).lower()}\n")
shell: python

View file

@ -122,9 +122,17 @@ jobs:
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
@ -265,6 +273,32 @@ jobs:
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 }} uses:\n")
for dep in sorted_deps:
f.writelines(f"`{dep}`\n")
- name: Archive the artifacts (bash)
if: ${{ !inputs.installer && runner.os != 'Windows' }}
run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./UltiMaker-Cura/"

View file

@ -18,19 +18,20 @@ jobs:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Python and pip
uses: actions/setup-python@v4
with:
python-version: 3.11.x
cache: 'pip'
cache-dependency-path: .github/workflows/requirements-printer-linter.txt
- uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
resources/+(definitions|extruders)/*.def.json
resources/+(intent|quality|variants)/**/*.inst.cfg
- name: Setup Python and pip
if: env.GIT_DIFF && !env.MATCHED_FILES # If nothing happens with python and/or pip after, the clean-up crashes.
uses: actions/setup-python@v4
with:
python-version: 3.11.x
cache: 'pip'
cache-dependency-path: .github/workflows/requirements-printer-linter.txt
- name: Install Python requirements for runner
if: env.GIT_DIFF && !env.MATCHED_FILES
run: pip install -r .github/workflows/requirements-printer-linter.txt

View file

@ -16,19 +16,20 @@ jobs:
with:
fetch-depth: 2
- name: Setup Python and pip
uses: actions/setup-python@v4
with:
python-version: 3.11.x
cache: "pip"
cache-dependency-path: .github/workflows/requirements-printer-linter.txt
- uses: technote-space/get-diff-action@v6
with:
PATTERNS: |
resources/+(extruders|definitions)/*.def.json
resources/+(intent|quality|variants)/**/*.inst.cfg
- name: Setup Python and pip
if: env.GIT_DIFF && !env.MATCHED_FILES # If nothing happens with python and/or pip after, the clean-up crashes.
uses: actions/setup-python@v4
with:
python-version: 3.11.x
cache: "pip"
cache-dependency-path: .github/workflows/requirements-printer-linter.txt
- name: Install Python requirements for runner
if: env.GIT_DIFF && !env.MATCHED_FILES
run: pip install -r .github/workflows/requirements-printer-linter.txt

View file

@ -1,2 +1,2 @@
conan!=1.51.0,!=1.51.1,!=1.51.2,!=1.51.3,!=1.52.0,!=1.57.0
conan==1.56.0
sip

View file

@ -105,9 +105,13 @@ jobs:
$HOME/.conan/conan_download_cache
key: conan-${{ runner.os }}-${{ runner.arch }}-unit-cache
# 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 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

View file

@ -0,0 +1,75 @@
name: update-translations
on:
push:
paths:
- 'plugins/**'
- 'resources/**'
- 'cura/**'
- 'icons/**'
- 'tests/**'
- 'packaging/**'
- '.github/workflows/conan-*.yml'
- '.github/workflows/notify.yml'
- '.github/workflows/requirements-conan-package.txt'
- 'requirements*.txt'
- 'conanfile.py'
- 'conandata.yml'
- 'GitVersion.yml'
- '*.jinja'
jobs:
update-translations:
name: Update translations
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Cache Conan data
id: cache-conan
uses: actions/cache@v3
with:
path: ~/.conan
key: ${{ runner.os }}-conan
- name: Setup Python and pip
uses: actions/setup-python@v4
with:
python-version: 3.11.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
# 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 efibootmgr 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 flex bison g++-12 gcc-12 -y
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: 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
- name: generate the files using Conan install
run: conan install . --build=missing --update -o cura:devtools=True
- uses: stefanzweifel/git-auto-commit-action@v4
with:
file_pattern: resources/i18n/*.po resources/i18n/*.pot
status_options: --untracked-files=no
commit_message: update translations

View file

@ -1,4 +1,10 @@
> # Work with us!
> If you're interested in working with us on Cura and Thingiverse, please apply to one of the open positions below.
> - [Software Engineer C++ & Python](https://www.linkedin.com/jobs/view/3516545085) for [Cura](https://github.com/Ultimaker/Cura)
> - [DevOps Engineer Community Software](https://www.linkedin.com/jobs/view/3516542580) for [Cura](https://github.com/Ultimaker/Cura) and [Thingiverse](https://www.thingiverse.com/)
> - [QA / Test Engineer Cura (3D printing)](https://www.linkedin.com/jobs/view/3516538895) for [Cura](https://github.com/Ultimaker/Cura) and [Thingiverse](https://www.thingiverse.com/)
<br>
<div align = center>

View file

@ -1,534 +1,197 @@
---
# Usage: defaults to the first entry in this conandata.yml file
# If you're on a release branch create an entry for that **version** e.q.: `5.1.0` update the requirements (use pinned versions, not latest)
# also create a beta entry for that **version** e.q.: `5.1.0-beta`, update the requirements (use the <dep_name>/(latest)@ultimaker/stable)
#
# If you're working on a feature/bugfix branch from a release branch, create an entry for that **channel**, update the requirements (use
# the <dep_name>/(latest)@ultimaker/stable)
#
# If you're working on a feature/bugfix branch from a main branch, it is optional to create an entry for that **channel**, update the
# requirements (use the <dep_name>/(latest)@ultimaker/testing)
#
# Subject to change in the future!
"5.3.0-alpha":
requirements:
- "pyarcus/5.2.2"
- "curaengine/(latest)@ultimaker/testing"
- "pysavitar/5.2.2"
- "pynest2d/5.2.2"
- "uranium/(latest)@ultimaker/testing"
- "fdm_materials/(latest)@ultimaker/testing"
- "cura_binary_data/(latest)@ultimaker/testing"
- "cpython/3.10.4"
internal_requirements:
- "fdm_materials_private/(latest)@ultimaker/testing"
- "cura_private_data/(latest)@ultimaker/testing"
pyinstaller:
runinfo:
entrypoint: "cura_app.py"
pyinstaller:
datas:
cura_plugins:
package: "cura"
src: "plugins"
dst: "share/cura/plugins"
cura_resources:
package: "cura"
src: "resources"
dst: "share/cura/resources"
cura_private_data:
package: "cura_private_data"
src: "resources"
dst: "share/cura/resources"
internal: true
cura_private_data_plugins:
package: "cura_private_data"
src: "plugins"
dst: "share/cura/plugins"
internal: true
uranium_plugins:
package: "uranium"
src: "plugins"
dst: "share/uranium/plugins"
uranium_resources:
package: "uranium"
src: "resources"
dst: "share/uranium/resources"
uranium_um_qt_qml_um:
package: "uranium"
src: "site-packages/UM/Qt/qml/UM"
dst: "PyQt6/Qt6/qml/UM"
cura_binary_data:
package: "cura_binary_data"
src: "resources/cura/resources"
dst: "share/cura/resources"
uranium_binary_data:
package: "cura_binary_data"
src: "resources/uranium/resources"
dst: "share/uranium/resources"
windows_binary_data:
package: "cura_binary_data"
src: "windows"
dst: "share/windows"
fdm_materials:
package: "fdm_materials"
src: "materials"
dst: "share/cura/resources/materials"
fdm_materials_private:
package: "fdm_materials_private"
src: "resources/materials"
dst: "share/cura/resources/materials"
internal: true
tcl:
package: "tcl"
src: "lib/tcl8.6"
dst: "tcl"
tk:
package: "tk"
src: "lib/tk8.6"
dst: "tk"
binaries:
curaengine:
package: "curaengine"
src: "bin"
dst: "."
binary: "CuraEngine"
hiddenimports:
- "pySavitar"
- "pyArcus"
- "pynest2d"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "logging.handlers"
- "zeroconf"
- "fcntl"
- "stl"
- "serial"
collect_all:
- "cura"
- "UM"
- "serial"
- "Charon"
- "sqlite3"
- "trimesh"
- "win32ctypes"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "stl"
icon:
Windows: "./icons/Cura.ico"
Macos: "./icons/cura.icns"
Linux: "./icons/cura-128.png"
"5.2.1":
requirements:
- "pyarcus/5.2.0"
- "curaengine/5.2.1"
- "pysavitar/5.2.0"
- "pynest2d/5.2.0"
- "uranium/5.2.0"
- "fdm_materials/5.2.0"
- "cura_binary_data/5.2.1"
- "cpython/3.10.4"
internal_requirements:
- "fdm_materials_private/(latest)@ultimaker/testing"
- "cura_private_data/(latest)@ultimaker/testing"
runinfo:
entrypoint: "cura_app.py"
pyinstaller:
datas:
cura_plugins:
package: "cura"
src: "plugins"
dst: "share/cura/plugins"
cura_resources:
package: "cura"
src: "resources"
dst: "share/cura/resources"
cura_private_data:
package: "cura_private_data"
src: "resources"
dst: "share/cura/resources"
internal: true
uranium_plugins:
package: "uranium"
src: "plugins"
dst: "share/uranium/plugins"
uranium_resources:
package: "uranium"
src: "resources"
dst: "share/uranium/resources"
uranium_um_qt_qml_um:
package: "uranium"
src: "site-packages/UM/Qt/qml/UM"
dst: "PyQt6/Qt6/qml/UM"
cura_binary_data:
package: "cura_binary_data"
src: "resources/cura/resources"
dst: "share/cura/resources"
uranium_binary_data:
package: "cura_binary_data"
src: "resources/uranium/resources"
dst: "share/uranium/resources"
windows_binary_data:
package: "cura_binary_data"
src: "windows"
dst: "share/windows"
fdm_materials:
package: "fdm_materials"
src: "materials"
dst: "share/cura/resources/materials"
fdm_materials_private:
package: "fdm_materials_private"
src: "resources/materials"
dst: "share/cura/resources/materials"
internal: true
tcl:
package: "tcl"
src: "lib/tcl8.6"
dst: "tcl"
tk:
package: "tk"
src: "lib/tk8.6"
dst: "tk"
binaries:
curaengine:
package: "curaengine"
src: "bin"
dst: "."
binary: "CuraEngine"
hiddenimports:
- "pySavitar"
- "pyArcus"
- "pynest2d"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "logging.handlers"
- "zeroconf"
- "fcntl"
- "stl"
- "serial"
collect_all:
- "cura"
- "UM"
- "serial"
- "Charon"
- "sqlite3"
- "trimesh"
- "win32ctypes"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "stl"
icon:
Windows: "./icons/Cura.ico"
Macos: "./icons/cura.icns"
Linux: "./icons/cura-128.png"
"5.2.0":
requirements:
- "pyarcus/5.2.0"
- "curaengine/5.2.0"
- "pysavitar/5.2.0"
- "pynest2d/5.2.0"
- "uranium/5.2.0"
- "fdm_materials/5.2.0"
- "cura_binary_data/5.2.0"
- "cpython/3.10.4"
internal_requirements:
- "fdm_materials_private/(latest)@ultimaker/testing"
- "cura_private_data/(latest)@ultimaker/testing"
runinfo:
entrypoint: "cura_app.py"
pyinstaller:
datas:
cura_plugins:
package: "cura"
src: "plugins"
dst: "share/cura/plugins"
cura_resources:
package: "cura"
src: "resources"
dst: "share/cura/resources"
cura_private_data:
package: "cura_private_data"
src: "resources"
dst: "share/cura/resources"
internal: true
uranium_plugins:
package: "uranium"
src: "plugins"
dst: "share/uranium/plugins"
uranium_resources:
package: "uranium"
src: "resources"
dst: "share/uranium/resources"
uranium_um_qt_qml_um:
package: "uranium"
src: "site-packages/UM/Qt/qml/UM"
dst: "PyQt6/Qt6/qml/UM"
cura_binary_data:
package: "cura_binary_data"
src: "resources/cura/resources"
dst: "share/cura/resources"
uranium_binary_data:
package: "cura_binary_data"
src: "resources/uranium/resources"
dst: "share/uranium/resources"
windows_binary_data:
package: "cura_binary_data"
src: "windows"
dst: "share/windows"
fdm_materials:
package: "fdm_materials"
src: "materials"
dst: "share/cura/resources/materials"
fdm_materials_private:
package: "fdm_materials_private"
src: "resources/materials"
dst: "share/cura/resources/materials"
internal: true
tcl:
package: "tcl"
src: "lib/tcl8.6"
dst: "tcl"
tk:
package: "tk"
src: "lib/tk8.6"
dst: "tk"
binaries:
curaengine:
package: "curaengine"
src: "bin"
dst: "."
binary: "CuraEngine"
hiddenimports:
- "pySavitar"
- "pyArcus"
- "pynest2d"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "logging.handlers"
- "zeroconf"
- "fcntl"
- "stl"
- "serial"
collect_all:
- "cura"
- "UM"
- "serial"
- "Charon"
- "sqlite3"
- "trimesh"
- "win32ctypes"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "stl"
icon:
Windows: "./icons/Cura.ico"
Macos: "./icons/cura.icns"
Linux: "./icons/cura-128.png"
"5.1.0":
requirements:
- "arcus/5.1.0"
- "curaengine/5.1.0"
- "savitar/5.1.0"
- "pynest2d/5.1.0"
- "uranium/5.1.0"
- "fdm_materials/5.1.0"
- "cura_binary_data/5.1.0"
- "cpython/3.10.4"
runinfo:
entrypoint: "cura_app.py"
pyinstaller:
datas:
cura_plugins:
package: "cura"
src: "plugins"
dst: "share/cura/plugins"
cura_resources:
package: "cura"
src: "resources"
dst: "share/cura/resources"
uranium_plugins:
package: "uranium"
src: "plugins"
dst: "share/uranium/plugins"
uranium_resources:
package: "uranium"
src: "resources"
dst: "share/uranium/resources"
uranium_um_qt_qml_um:
package: "uranium"
src: "site-packages/UM/Qt/qml/UM"
dst: "PyQt6/Qt6/qml/UM"
cura_binary_data:
package: "cura_binary_data"
src: "resources/cura/resources"
dst: "share/cura/resources"
uranium_binary_data:
package: "cura_binary_data"
src: "resources/uranium/resources"
dst: "share/uranium/resources"
windows_binary_data:
package: "cura_binary_data"
src: "windows"
dst: "share/windows"
fdm_materials:
package: "fdm_materials"
src: "materials"
dst: "share/cura/resources/materials"
tcl:
package: "tcl"
src: "lib/tcl8.6"
dst: "tcl"
tk:
package: "tk"
src: "lib/tk8.6"
dst: "tk"
binaries:
curaengine:
package: "curaengine"
src: "bin"
dst: "."
binary: "CuraEngine"
hiddenimports:
- "pySavitar"
- "pyArcus"
- "pynest2d"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "logging.handlers"
- "zeroconf"
- "fcntl"
- "stl"
- "serial"
collect_all:
- "cura"
- "UM"
- "serial"
- "Charon"
- "sqlite3"
- "trimesh"
- "win32ctypes"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "stl"
icon:
Windows: "./icons/Cura.ico"
Macos: "./icons/cura.icns"
Linux: "./icons/cura-128.png"
datas:
cura_plugins:
package: "cura"
src: "plugins"
dst: "share/cura/plugins"
cura_resources:
package: "cura"
src: "resources"
dst: "share/cura/resources"
cura_private_data:
package: "cura_private_data"
src: "resources"
dst: "share/cura/resources"
internal: true
uranium_plugins:
package: "uranium"
src: "plugins"
dst: "share/uranium/plugins"
uranium_resources:
package: "uranium"
src: "resources"
dst: "share/uranium/resources"
uranium_um_qt_qml_um:
package: "uranium"
src: "site-packages/UM/Qt/qml/UM"
dst: "PyQt6/Qt6/qml/UM"
cura_binary_data:
package: "cura_binary_data"
src: "resources/cura/resources"
dst: "share/cura/resources"
uranium_binary_data:
package: "cura_binary_data"
src: "resources/uranium/resources"
dst: "share/uranium/resources"
windows_binary_data:
package: "cura_binary_data"
src: "windows"
dst: "share/windows"
fdm_materials:
package: "fdm_materials"
src: "materials"
dst: "share/cura/resources/materials"
tcl:
package: "tcl"
src: "lib/tcl8.6"
dst: "tcl"
tk:
package: "tk"
src: "lib/tk8.6"
dst: "tk"
binaries:
curaengine:
package: "curaengine"
src: "bin"
dst: "."
binary: "CuraEngine"
hiddenimports:
- "pySavitar"
- "pyArcus"
- "pynest2d"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "logging.handlers"
- "zeroconf"
- "fcntl"
- "stl"
- "serial"
collect_all:
- "cura"
- "UM"
- "serial"
- "Charon"
- "sqlite3"
- "trimesh"
- "win32ctypes"
- "PyQt6"
- "PyQt6.QtNetwork"
- "PyQt6.sip"
- "stl"
icon:
Windows: "./icons/Cura.ico"
Macos: "./icons/cura.icns"
Linux: "./icons/cura-128.png"
pycharm_targets:
- jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
module_name: Cura
name: cura
script_name: cura_app.py
- jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
module_name: Cura
name: cura_external_engine
parameters: --external-backend
script_name: cura_app.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in tests
script_name: tests/
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestBuildVolume.py
script_name: tests/TestBuildVolume.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestConvexHullDecorator.py
script_name: tests/TestConvexHullDecorator.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraSceneNode.py
script_name: tests/TestCuraSceneNode.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraSceneNode.py
script_name: tests/TestExtruderManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestGCodeListDecorator.py
script_name: tests/TestGCodeListDecorator.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestIntentManager.py
script_name: tests/TestIntentManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestLayer.py
script_name: tests/TestLayer.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestMachineAction.py
script_name: tests/TestMachineAction.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestMachineManager.py
script_name: tests/TestMachineManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestOAuth2.py
script_name: tests/TestOAuth2.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestObjectsModel.py
script_name: tests/TestObjectsModel.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestPrintInformation.py
script_name: tests/TestPrintInformation.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestProfileRequirements.py
script_name: tests/TestProfileRequirements.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestThemes.py
script_name: tests/TestThemes.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestContainerManager.py
script_name: tests/Settings/TestContainerManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraContainerRegistry.py
script_name: tests/Settings/TestCuraContainerRegistry.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraStackBuilder.py
script_name: tests/Settings/TestCuraStackBuilder.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestDefinitionContainer.py
script_name: tests/Settings/TestDefinitionContainer.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestExtruderStack.py
script_name: tests/Settings/TestExtruderStack.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestGlobalStack.py
script_name: tests/Settings/TestGlobalStack.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestProfiles.py
script_name: tests/Settings/TestProfiles.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestSettingInheritanceManager.py
script_name: tests/Settings/TestSettingInheritanceManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestSettingOverrideDecorator.py
script_name: tests/Settings/TestSettingOverrideDecorator.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestSettingVisibilityPresets.py
script_name: tests/Settings/TestSettingVisibilityPresets.py
- jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
module_name: Cura
name: cura
script_name: cura_app.py
- jinja_path: .run_templates/pycharm_cura_run.run.xml.jinja
module_name: Cura
name: cura_external_engine
parameters: --external-backend
script_name: cura_app.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in tests
script_name: tests/
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestBuildVolume.py
script_name: tests/TestBuildVolume.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestConvexHullDecorator.py
script_name: tests/TestConvexHullDecorator.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraSceneNode.py
script_name: tests/TestCuraSceneNode.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraSceneNode.py
script_name: tests/TestExtruderManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestGCodeListDecorator.py
script_name: tests/TestGCodeListDecorator.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestIntentManager.py
script_name: tests/TestIntentManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestLayer.py
script_name: tests/TestLayer.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestMachineAction.py
script_name: tests/TestMachineAction.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestMachineManager.py
script_name: tests/TestMachineManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestOAuth2.py
script_name: tests/TestOAuth2.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestObjectsModel.py
script_name: tests/TestObjectsModel.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestPrintInformation.py
script_name: tests/TestPrintInformation.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestProfileRequirements.py
script_name: tests/TestProfileRequirements.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestThemes.py
script_name: tests/TestThemes.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestContainerManager.py
script_name: tests/Settings/TestContainerManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraContainerRegistry.py
script_name: tests/Settings/TestCuraContainerRegistry.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestCuraStackBuilder.py
script_name: tests/Settings/TestCuraStackBuilder.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestDefinitionContainer.py
script_name: tests/Settings/TestDefinitionContainer.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestExtruderStack.py
script_name: tests/Settings/TestExtruderStack.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestGlobalStack.py
script_name: tests/Settings/TestGlobalStack.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestProfiles.py
script_name: tests/Settings/TestProfiles.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestSettingInheritanceManager.py
script_name: tests/Settings/TestSettingInheritanceManager.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestSettingOverrideDecorator.py
script_name: tests/Settings/TestSettingOverrideDecorator.py
- jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja
module_name: Cura
name: pytest in TestSettingVisibilityPresets.py
script_name: tests/Settings/TestSettingVisibilityPresets.py

View file

@ -6,11 +6,11 @@ from jinja2 import Template
from conan import ConanFile
from conan.tools.files import copy, rmdir, save, mkdir
from conan.tools.microsoft import unix_path
from conan.tools.env import VirtualRunEnv, Environment
from conan.tools.env import VirtualRunEnv, Environment, VirtualBuildEnv
from conan.tools.scm import Version
from conan.errors import ConanInvalidConfiguration, ConanException
required_conan_version = ">=1.52.0"
required_conan_version = "<=1.56.0"
class CuraConan(ConanFile):
@ -19,15 +19,14 @@ class CuraConan(ConanFile):
author = "UltiMaker"
url = "https://github.com/Ultimaker/cura"
description = "3D printer / slicing GUI built on top of the Uranium framework"
topics = ("conan", "python", "pyqt5", "qt", "qml", "3d-printing", "slicer")
topics = ("conan", "python", "pyqt6", "qt", "qml", "3d-printing", "slicer")
build_policy = "missing"
exports = "LICENSE*", "UltiMaker-Cura.spec.jinja", "CuraVersion.py.jinja"
settings = "os", "compiler", "build_type", "arch"
no_copy_source = True # We won't build so no need to copy sources to the build folder
# FIXME: Remove specific branch once merged to main
# Extending the conanfile with the UMBaseConanfile https://github.com/Ultimaker/conan-ultimaker-index/tree/CURA-9177_Fix_CI_CD/recipes/umbase
python_requires = "umbase/[>=0.1.7]@ultimaker/stable"
python_requires = "umbase/[>=0.1.7]@ultimaker/stable", "translationextractor/[>=2.1.1]@ultimaker/stable"
python_requires_extend = "umbase.UMBaseConanfile"
options = {
@ -48,12 +47,10 @@ class CuraConan(ConanFile):
"cura_debug_mode": False, # Not yet implemented
"internal": False,
}
scm = {
"type": "git",
"subfolder": ".",
"url": "auto",
"revision": "auto"
}
def set_version(self):
if self.version == "auto":
self.version = "5.4.0-alpha"
@property
def _pycharm_targets(self):
@ -152,8 +149,16 @@ class CuraConan(ConanFile):
py_interp = Path(*[f'"{p}"' if " " in p else p for p in py_interp.parts])
return py_interp
@property
def _pyinstaller_spec_arch(self):
if self.settings.os == "Macos":
if self.settings.arch == "armv8":
return "'arm64'"
return "'x86_64'"
return "None"
def _generate_cura_version(self, location):
with open(Path(__file__).parent.joinpath("CuraVersion.py.jinja"), "r") as f:
with open(os.path.join(self.recipe_folder, "CuraVersion.py.jinja"), "r") as f:
cura_version_py = Template(f.read())
# If you want a specific Cura version to show up on the splash screen add the user configuration `user.cura:version=VERSION`
@ -164,7 +169,7 @@ class CuraConan(ConanFile):
internal_tag = f"+internal" if self.options.internal else ""
cura_version = f"{cura_version.major}.{cura_version.minor}.{cura_version.patch}{pre_tag}{build_tag}{internal_tag}"
with open(Path(location, "CuraVersion.py"), "w") as f:
with open(os.path.join(location, "CuraVersion.py"), "w") as f:
f.write(cura_version_py.render(
cura_app_name = self.name,
cura_app_display_name = self._app_name,
@ -179,7 +184,7 @@ class CuraConan(ConanFile):
cura_latest_url = self._cura_latest_url))
def _generate_pyinstaller_spec(self, location, entrypoint_location, icon_path, entitlements_file):
pyinstaller_metadata = self._um_data()["pyinstaller"]
pyinstaller_metadata = self.conan_data["pyinstaller"]
datas = [(str(self._base_dir.joinpath("conan_install_info.json")), ".")]
for data in pyinstaller_metadata["datas"].values():
if not self.options.internal and data.get("internal", False):
@ -188,33 +193,33 @@ class CuraConan(ConanFile):
if "package" in data: # get the paths from conan package
if data["package"] == self.name:
if self.in_local_cache:
src_path = Path(self.package_folder, data["src"])
src_path = os.path.join(self.package_folder, data["src"])
else:
src_path = Path(self.source_folder, data["src"])
src_path = os.path.join(self.source_folder, data["src"])
else:
src_path = Path(self.deps_cpp_info[data["package"]].rootpath, data["src"])
src_path = os.path.join(self.deps_cpp_info[data["package"]].rootpath, data["src"])
elif "root" in data: # get the paths relative from the sourcefolder
src_path = Path(self.source_folder, data["root"], data["src"])
src_path = os.path.join(self.source_folder, data["root"], data["src"])
else:
continue
if src_path.exists():
if Path(src_path).exists():
datas.append((str(src_path), data["dst"]))
binaries = []
for binary in pyinstaller_metadata["binaries"].values():
if "package" in binary: # get the paths from conan package
src_path = Path(self.deps_cpp_info[binary["package"]].rootpath, binary["src"])
src_path = os.path.join(self.deps_cpp_info[binary["package"]].rootpath, binary["src"])
elif "root" in binary: # get the paths relative from the sourcefolder
src_path = Path(self.source_folder, binary["root"], binary["src"])
src_path = os.path.join(self.source_folder, binary["root"], binary["src"])
else:
continue
if not src_path.exists():
if not Path(src_path).exists():
self.output.warning(f"Source path for binary {binary['binary']} does not exist")
continue
for bin in src_path.glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.]*"):
for bin in Path(src_path).glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.]*"):
binaries.append((str(bin), binary["dst"]))
for bin in src_path.glob(binary["binary"]):
for bin in Path(src_path).glob(binary["binary"]):
binaries.append((str(bin), binary["dst"]))
# Make sure all Conan dependencies which are shared are added to the binary list for pyinstaller
@ -232,13 +237,13 @@ class CuraConan(ConanFile):
# Collect all dll's from PyQt6 and place them in the root
binaries.extend([(f"{p}", ".") for p in Path(self._site_packages, "PyQt6", "Qt6").glob("**/*.dll")])
with open(Path(__file__).parent.joinpath("UltiMaker-Cura.spec.jinja"), "r") as f:
with open(os.path.join(self.recipe_folder, "UltiMaker-Cura.spec.jinja"), "r") as f:
pyinstaller = Template(f.read())
version = self.conf_info.get("user.cura:version", default = self.version, check_type = str)
cura_version = Version(version)
with open(Path(location, "UltiMaker-Cura.spec"), "w") as f:
with open(os.path.join(location, "UltiMaker-Cura.spec"), "w") as f:
f.write(pyinstaller.render(
name = str(self.options.display_name).replace(" ", "-"),
display_name = self._app_name,
@ -253,15 +258,25 @@ class CuraConan(ConanFile):
osx_bundle_identifier = "'nl.ultimaker.cura'" if self.settings.os == "Macos" else "None",
upx = str(self.settings.os == "Windows"),
strip = False, # This should be possible on Linux and MacOS but, it can also cause issues on some distributions. Safest is to disable it for now
target_arch = "'x86_64'" if self.settings.os == "Macos" else "None", # FIXME: Make this dependent on the settings.arch_target
target_arch = self._pyinstaller_spec_arch,
macos = self.settings.os == "Macos",
version = f"'{version}'",
short_version = f"'{cura_version.major}.{cura_version.minor}.{cura_version.patch}'",
))
def set_version(self):
if self.version is None:
self.version = self._umdefault_version()
def export_sources(self):
copy(self, "*", os.path.join(self.recipe_folder, "plugins"), os.path.join(self.export_sources_folder, "plugins"))
copy(self, "*", os.path.join(self.recipe_folder, "resources"), os.path.join(self.export_sources_folder, "resources"), excludes = "*.mo")
copy(self, "*", os.path.join(self.recipe_folder, "tests"), os.path.join(self.export_sources_folder, "tests"))
copy(self, "*", os.path.join(self.recipe_folder, "cura"), os.path.join(self.export_sources_folder, "cura"), excludes="CuraVersion.py")
copy(self, "*", os.path.join(self.recipe_folder, "packaging"), os.path.join(self.export_sources_folder, "packaging"))
copy(self, "*", os.path.join(self.recipe_folder, ".run_templates"), os.path.join(self.export_sources_folder, ".run_templates"))
copy(self, "requirements.txt", self.recipe_folder, self.export_sources_folder)
copy(self, "requirements-dev.txt", self.recipe_folder, self.export_sources_folder)
copy(self, "requirements-ultimaker.txt", self.recipe_folder, self.export_sources_folder)
copy(self, "UltiMaker-Cura.spec.jinja", self.recipe_folder, self.export_sources_folder)
copy(self, "CuraVersion.py.jinja", self.recipe_folder, self.export_sources_folder)
copy(self, "cura_app.py", self.recipe_folder, self.export_sources_folder)
def configure(self):
self.options["pyarcus"].shared = True
@ -275,63 +290,70 @@ class CuraConan(ConanFile):
raise ConanInvalidConfiguration("Only versions 5+ are support")
def requirements(self):
for req in self._um_data()["requirements"]:
self.requires(req)
self.requires("pyarcus/5.2.2")
self.requires("curaengine/(latest)@ultimaker/testing")
self.requires("pysavitar/5.2.2")
self.requires("pynest2d/5.2.2")
self.requires("uranium/(latest)@ultimaker/testing")
self.requires("fdm_materials/(latest)@{}/testing".format("internal" if self.options.internal else "ultimaker"))
self.requires("cura_binary_data/(latest)@ultimaker/testing")
self.requires("cpython/3.10.4")
if self.options.internal:
for req in self._um_data()["internal_requirements"]:
self.requires(req)
self.requires("cura_private_data/(latest)@ultimaker/testing")
def build_requirements(self):
if self.options.devtools:
if self.settings.os != "Windows" or self.conf.get("tools.microsoft.bash:path", check_type = str):
# FIXME: once m4, autoconf, automake are Conan V2 ready use self.win_bash and add gettext as base tool_requirement
self.tool_requires("gettext/0.21", force_host_context=True)
self.tool_requires("gettext/0.21@ultimaker/testing", force_host_context = True)
def layout(self):
self.folders.source = "."
self.folders.build = "venv"
self.folders.generators = Path(self.folders.build, "conan")
self.folders.generators = os.path.join(self.folders.build, "conan")
self.cpp.package.libdirs = [os.path.join("site-packages", "cura")]
self.cpp.package.bindirs = ["bin"]
self.cpp.package.resdirs = ["resources", "plugins", "packaging", "pip_requirements"] # pip_requirements should be the last item in the list
def build(self):
if self.options.devtools:
if self.settings.os != "Windows" or self.conf.get("tools.microsoft.bash:path", check_type = str):
# FIXME: once m4, autoconf, automake are Conan V2 ready use self.win_bash and add gettext as base tool_requirement
cpp_info = self.dependencies["gettext"].cpp_info
for po_file in self.source_path.joinpath("resources", "i18n").glob("**/*.po"):
mo_file = self.build_path.joinpath(po_file.with_suffix('.mo').relative_to(self.source_path))
mkdir(self, str(unix_path(self, mo_file.parent)))
self.run(f"{cpp_info.bindirs[0]}/msgfmt {po_file} -o {mo_file} -f", env="conanbuild", ignore_errors=True)
def generate(self):
copy(self, "cura_app.py", self.source_folder, str(self._script_dir))
cura_run_envvars = self._cura_run_env.vars(self, scope = "run")
ext = ".ps1" if self.settings.os == "Windows" else ".sh"
cura_run_envvars.save_script(self.folders.generators.joinpath(f"cura_run_environment{ext}"))
cura_run_envvars.save_script(os.path.join(self.folders.generators, f"cura_run_environment{ext}"))
vr = VirtualRunEnv(self)
vr.generate()
self._generate_cura_version(Path(self.source_folder, "cura"))
self._generate_cura_version(os.path.join(self.source_folder, "cura"))
if self.options.devtools:
entitlements_file = "'{}'".format(Path(self.source_folder, "packaging", "MacOS", "cura.entitlements"))
entitlements_file = "'{}'".format(os.path.join(self.source_folder, "packaging", "MacOS", "cura.entitlements"))
self._generate_pyinstaller_spec(location = self.generators_folder,
entrypoint_location = "'{}'".format(Path(self.source_folder, self._um_data()["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
icon_path = "'{}'".format(Path(self.source_folder, "packaging", self._um_data()["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
entrypoint_location = "'{}'".format(os.path.join(self.source_folder, self.conan_data["pyinstaller"]["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
icon_path = "'{}'".format(os.path.join(self.source_folder, "packaging", self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
entitlements_file = entitlements_file if self.settings.os == "Macos" else "None")
# Update the po files
if self.settings.os != "Windows" or self.conf.get("tools.microsoft.bash:path", check_type = str):
# Update the po and pot files
if self.settings.os != "Windows" or self.conf.get("tools.microsoft.bash:path", check_type=str):
vb = VirtualBuildEnv(self)
vb.generate()
# FIXME: once m4, autoconf, automake are Conan V2 ready use self.win_bash and add gettext as base tool_requirement
cpp_info = self.dependencies["gettext"].cpp_info
pot = self.python_requires["translationextractor"].module.ExtractTranslations(self, cpp_info.bindirs[0])
pot.generate()
def build(self):
if self.options.devtools:
if self.settings.os != "Windows" or self.conf.get("tools.microsoft.bash:path", check_type = str):
# FIXME: once m4, autoconf, automake are Conan V2 ready use self.win_bash and add gettext as base tool_requirement
for po_file in self.source_path.joinpath("resources", "i18n").glob("**/*.po"):
pot_file = self.source_path.joinpath("resources", "i18n", po_file.with_suffix('.pot').name)
mkdir(self, str(unix_path(self, pot_file.parent)))
self.run(f"{cpp_info.bindirs[0]}/msgmerge --no-wrap --no-fuzzy-matching -width=140 -o {po_file} {po_file} {pot_file}",
env = "conanbuild", ignore_errors = True)
mo_file = Path(self.build_folder, po_file.with_suffix('.mo').relative_to(self.source_path))
mo_file = mo_file.parent.joinpath("LC_MESSAGES", mo_file.name)
mkdir(self, str(unix_path(self, Path(mo_file).parent)))
cpp_info = self.dependencies["gettext"].cpp_info
self.run(f"{cpp_info.bindirs[0]}/msgfmt {po_file} -o {mo_file} -f", env="conanbuild", ignore_errors=True)
def imports(self):
self.copy("CuraEngine.exe", root_package = "curaengine", src = "@bindirs", dst = "", keep_path = False)
@ -342,8 +364,6 @@ class CuraConan(ConanFile):
self.copy("*.sig", root_package = "fdm_materials", src = "@resdirs", dst = "resources/materials", keep_path = False)
if self.options.internal:
self.copy("*.fdm_material", root_package = "fdm_materials_private", src = "@resdirs", dst = "resources/materials", keep_path = False)
self.copy("*.sig", root_package = "fdm_materials_private", src = "@resdirs", dst = "resources/materials", keep_path = False)
self.copy("*", root_package = "cura_private_data", src = self.deps_cpp_info["cura_private_data"].resdirs[0],
dst = self._share_dir.joinpath("cura", "resources"), keep_path = True)
@ -381,10 +401,6 @@ class CuraConan(ConanFile):
# Copy internal resources
if self.options.internal:
self.copy_deps("*.fdm_material", root_package = "fdm_materials_private", src = self.deps_cpp_info["fdm_materials_private"].resdirs[0],
dst = self._share_dir.joinpath("cura", "resources", "materials"), keep_path = False)
self.copy_deps("*.sig", root_package = "fdm_materials_private", src = self.deps_cpp_info["fdm_materials_private"].resdirs[0],
dst = self._share_dir.joinpath("cura", "resources", "materials"), keep_path = False)
self.copy_deps("*", root_package = "cura_private_data", src = self.deps_cpp_info["cura_private_data"].resdirs[0],
dst = self._share_dir.joinpath("cura", "resources"), keep_path = True)
self.copy_deps("*", root_package = "cura_private_data", src = self.deps_cpp_info["cura_private_data"].resdirs[1],
@ -398,7 +414,7 @@ class CuraConan(ConanFile):
self.copy_deps("*", root_package = "uranium", src = self.deps_cpp_info["uranium"].libdirs[0],
dst = self._site_packages.joinpath("UM"),
keep_path = True)
self.copy_deps("*", root_package = "uranium", src = str(Path(self.deps_cpp_info["uranium"].libdirs[0], "Qt", "qml", "UM")),
self.copy_deps("*", root_package = "uranium", src = str(os.path.join(self.deps_cpp_info["uranium"].libdirs[0], "Qt", "qml", "UM")),
dst = self._site_packages.joinpath("PyQt6", "Qt6", "qml", "UM"),
keep_path = True)
@ -441,24 +457,24 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
env_prefix = env_prefix)
ext = ".sh" if self.settings.os != "Windows" else ".ps1"
save(self, self._script_dir.joinpath(f"activate_github_actions_version_env{ext}"), activate_github_actions_version_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(Path(self._site_packages, "cura"))
self._generate_cura_version(os.path.join(self._site_packages, "cura"))
entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements"))
self._generate_pyinstaller_spec(location = self._base_dir,
entrypoint_location = "'{}'".format(Path(self.cpp_info.bin_paths[0], self._um_data()["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
icon_path = "'{}'".format(Path(self.cpp_info.res_paths[2], self._um_data()["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
entrypoint_location = "'{}'".format(os.path.join(self.package_folder, self.cpp_info.bindirs[0], self.conan_data["pyinstaller"]["runinfo"]["entrypoint"])).replace("\\", "\\\\"),
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")
def package(self):
copy(self, "cura_app.py", src = self.source_path, dst = self.package_path.joinpath(self.cpp.package.bindirs[0]))
copy(self, "*", src = self.source_path.joinpath("cura"), dst = self.package_path.joinpath(self.cpp.package.libdirs[0]))
copy(self, "*", src = self.source_path.joinpath("resources"), dst = self.package_path.joinpath(self.cpp.package.resdirs[0]), excludes="*.po")
copy(self, "*", src = self.build_path.joinpath("resources"), dst = self.package_path.joinpath(self.cpp.package.resdirs[0]))
copy(self, "*", src = self.source_path.joinpath("plugins"), dst = self.package_path.joinpath(self.cpp.package.resdirs[1]))
copy(self, "requirement*.txt", src = self.source_path, dst = self.package_path.joinpath(self.cpp.package.resdirs[-1]))
copy(self, "*", src = self.source_path.joinpath("packaging"), dst = self.package_path.joinpath(self.cpp.package.resdirs[2]))
copy(self, "cura_app.py", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.bindirs[0]))
copy(self, "*", src = os.path.join(self.source_folder, "cura"), dst = os.path.join(self.package_folder, self.cpp.package.libdirs[0]))
copy(self, "*", src = os.path.join(self.source_folder, "resources"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[0]))
copy(self, "*.mo", os.path.join(self.build_folder, "resources"), os.path.join(self.package_folder, "resources"))
copy(self, "*", src = os.path.join(self.source_folder, "plugins"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[1]))
copy(self, "requirement*.txt", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.resdirs[-1]))
copy(self, "*", src = os.path.join(self.source_folder, "packaging"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[2]))
def package_info(self):
self.user_info.pip_requirements = "requirements.txt"
@ -466,17 +482,14 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
self.user_info.pip_requirements_build = "requirements-dev.txt"
if self.in_local_cache:
self.runenv_info.append_path("PYTHONPATH", str(Path(self.cpp_info.lib_paths[0]).parent))
self.runenv_info.append_path("PYTHONPATH", self.cpp_info.res_paths[1]) # Add plugins to PYTHONPATH
self.runenv_info.append_path("PYTHONPATH", os.path.join(self.package_folder, "site-packages"))
self.runenv_info.append_path("PYTHONPATH", os.path.join(self.package_folder, "plugins"))
else:
self.runenv_info.append_path("PYTHONPATH", self.source_folder)
self.runenv_info.append_path("PYTHONPATH", os.path.join(self.source_folder, "plugins"))
def package_id(self):
del self.info.settings.os
del self.info.settings.compiler
del self.info.settings.build_type
del self.info.settings.arch
self.info.clear()
# The following options shouldn't be used to determine the hash, since these are only used to set the CuraVersion.py
# which will als be generated by the deploy method during the `conan install cura/5.1.0@_/_`

View file

@ -14,7 +14,7 @@ DEFAULT_CURA_LATEST_URL = "https://software.ultimaker.com/latest.json"
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
# CuraVersion.py.in template.
CuraSDKVersion = "8.2.0"
CuraSDKVersion = "8.3.0"
try:
from cura.CuraVersion import CuraLatestURL

View file

@ -130,7 +130,7 @@ class CuraApplication(QtApplication):
# SettingVersion represents the set of settings available in the machine/extruder definitions.
# You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
# changes of the settings.
SettingVersion = 20
SettingVersion = 21
Created = False
@ -2076,3 +2076,7 @@ class CuraApplication(QtApplication):
@classmethod
def getInstance(cls, *args, **kwargs) -> "CuraApplication":
return cast(CuraApplication, super().getInstance(**kwargs))
@pyqtProperty(bool, constant=True)
def isEnterprise(self) -> bool:
return ApplicationMetadata.IsEnterpriseVersion

View file

@ -54,6 +54,8 @@ class CompatibleMachineModel(ListModel):
# initialize & add current active material:
for extruder in printer.extruders:
if not extruder.activeMaterial:
continue
materials = [_makeMaterial(
extruder.activeMaterial.brand, extruder.activeMaterial.name, extruder.activeMaterial.color)]
extruder_configs[extruder.getPosition()] = {

View file

@ -466,7 +466,6 @@ class ExtruderManager(QObject):
return False
return list(active_material_node_qualities.keys())[0] != "empty_quality"
@pyqtSlot(str, result="QVariant")
def getInstanceExtruderValues(self, key: str) -> List:
"""Get all extruder values for a certain setting.

View file

@ -43,7 +43,7 @@ from .WorkspaceDialog import WorkspaceDialog
i18n_catalog = i18nCatalog("cura")
_ignored_machine_network_metadata = {
_ignored_machine_network_metadata: Set[str] = {
"um_cloud_cluster_id",
"um_network_key",
"um_linked_to_account",
@ -55,7 +55,7 @@ _ignored_machine_network_metadata = {
"capabilities",
"octoprint_api_key",
"is_abstract_machine"
} # type: Set[str]
}
class ContainerInfo:
@ -69,41 +69,41 @@ class ContainerInfo:
class QualityChangesInfo:
def __init__(self) -> None:
self.name = None
self.name: Optional[str] = None
self.global_info = None
self.extruder_info_dict = {} # type: Dict[str, ContainerInfo]
self.extruder_info_dict: Dict[str, ContainerInfo] = {}
class MachineInfo:
def __init__(self) -> None:
self.container_id = None
self.name = None
self.definition_id = None
self.container_id: Optional[str] = None
self.name: Optional[str] = None
self.definition_id: Optional[str] = None
self.metadata_dict = {} # type: Dict[str, str]
self.metadata_dict: Dict[str, str] = {}
self.quality_type = None
self.intent_category = None
self.custom_quality_name = None
self.quality_changes_info = None
self.variant_info = None
self.quality_type: Optional[str] = None
self.intent_category: Optional[str] = None
self.custom_quality_name: Optional[str] = None
self.quality_changes_info: Optional[QualityChangesInfo] = None
self.variant_info: Optional[ContainerInfo] = None
self.definition_changes_info = None
self.user_changes_info = None
self.definition_changes_info: Optional[ContainerInfo] = None
self.user_changes_info: Optional[ContainerInfo] = None
self.extruder_info_dict = {} # type: Dict[str, ExtruderInfo]
self.extruder_info_dict: Dict[str, str] = {}
class ExtruderInfo:
def __init__(self) -> None:
self.position = None
self.enabled = True
self.variant_info = None
self.root_material_id = None
self.variant_info: Optional[ContainerInfo] = None
self.root_material_id: Optional[str] = None
self.definition_changes_info = None
self.user_changes_info = None
self.intent_info = None
self.definition_changes_info: Optional[ContainerInfo] = None
self.user_changes_info: Optional[ContainerInfo] = None
self.intent_info: Optional[ContainerInfo] = None
class ThreeMFWorkspaceReader(WorkspaceReader):
@ -131,14 +131,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# - variant
self._ignored_instance_container_types = {"quality", "variant"}
self._resolve_strategies = {} # type: Dict[str, str]
self._resolve_strategies: Dict[str, str] = {}
self._id_mapping = {} # type: Dict[str, str]
self._id_mapping: Dict[str, str] = {}
# In Cura 2.5 and 2.6, the empty profiles used to have those long names
self._old_empty_profile_id_dict = {"empty_%s" % k: "empty" for k in ["material", "variant"]}
self._old_new_materials = {} # type: Dict[str, str]
self._old_new_materials: Dict[str, str] = {}
self._machine_info = None
def _clearState(self):
@ -461,11 +461,15 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
materials_in_extruders_dict = {} # Which material is in which extruder
# if the global stack is found, we check if there are conflicts in the extruder stacks
# If the global stack is found, we check if there are conflicts in the extruder stacks
for extruder_stack_file in extruder_stack_files:
serialized = archive.open(extruder_stack_file).read().decode("utf-8")
not_upgraded_parser = ConfigParser(interpolation=None)
not_upgraded_parser.read_string(serialized)
serialized = ExtruderStack._updateSerialized(serialized, extruder_stack_file)
parser = ConfigParser(interpolation = None)
parser = ConfigParser(interpolation=None)
parser.read_string(serialized)
# The check should be done for the extruder stack that's associated with the existing global stack,
@ -497,19 +501,26 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
extruder_info.user_changes_info = instance_container_info_dict[user_changes_id]
self._machine_info.extruder_info_dict[position] = extruder_info
intent_container_id = parser["containers"][str(_ContainerIndexes.Intent)]
intent_id = parser["containers"][str(_ContainerIndexes.Intent)]
if intent_id not in ("empty", "empty_intent"):
extruder_info.intent_info = instance_container_info_dict[intent_id]
if intent_container_id in instance_container_info_dict:
extruder_info.intent_info = instance_container_info_dict[intent_id]
else:
# It can happen that an intent has been renamed. In that case, we should still use the old
# name, since we used that to generate the instance_container_info_dict keys.
extruder_info.intent_info = instance_container_info_dict[not_upgraded_parser["containers"][str(_ContainerIndexes.Intent)]]
if not machine_conflict and containers_found_dict["machine"] and global_stack:
if int(position) >= len(global_stack.extruderList):
continue
existing_extruder_stack = global_stack.extruderList[int(position)]
# check if there are any changes at all in any of the container stacks.
# Check if there are any changes at all in any of the container stacks.
id_list = self._getContainerIdListFromSerialized(serialized)
for index, container_id in enumerate(id_list):
# take into account the old empty container IDs
# Take into account the old empty container IDs
container_id = self._old_empty_profile_id_dict.get(container_id, container_id)
if existing_extruder_stack.getContainer(index).getId() != container_id:
machine_conflict = True
@ -740,7 +751,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# quality_changes file. If that's the case, take the extruder count into account when creating the machine
# or else the extruderList will return only the first extruder, leading to missing non-global settings in
# the other extruders.
machine_extruder_count = self._getMachineExtruderCount() # type: Optional[int]
machine_extruder_count: Optional[int] = self._getMachineExtruderCount()
global_stack = CuraStackBuilder.createMachine(machine_name, self._machine_info.definition_id, machine_extruder_count)
if global_stack: # Only switch if creating the machine was successful.
extruder_stack_dict = {str(position): extruder for position, extruder in enumerate(global_stack.extruderList)}
@ -751,8 +762,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
global_stacks = self._container_registry.findContainerStacks(id = self._dialog.getMachineToOverride(), type = "machine")
if not global_stacks:
message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag <filename>!",
"Project file <filename>{0}</filename> is made using profiles that"
" are unknown to this version of Ultimaker Cura.", file_name),
"Project file <filename>{0}</filename> is made using profiles that are unknown to this version of UltiMaker Cura.", file_name),
message_type = Message.MessageType.ERROR)
message.show()
self.setWorkspaceName("")
@ -868,7 +878,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
@staticmethod
def _loadMetadata(file_name: str) -> Dict[str, Dict[str, Any]]:
result = dict() # type: Dict[str, Dict[str, Any]]
result: Dict[str, Dict[str, Any]] = dict()
try:
archive = zipfile.ZipFile(file_name, "r")
except zipfile.BadZipFile:
@ -880,7 +890,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
metadata_files = [name for name in archive.namelist() if name.endswith("plugin_metadata.json")]
for metadata_file in metadata_files:
try:
plugin_id = metadata_file.split("/")[0]
@ -921,7 +930,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
quality_changes_name = self._container_registry.uniqueName(quality_changes_name)
for position, container_info in container_info_dict.items():
extruder_stack = None
intent_category = None # type: Optional[str]
intent_category: Optional[str] = None
if position is not None:
try:
extruder_stack = global_stack.extruderList[int(position)]
@ -1162,7 +1171,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
root_material_id = self._old_new_materials.get(root_material_id, root_material_id)
material_node = machine_node.variants[extruder_stack.variant.getName()].materials[root_material_id]
extruder_stack.material = material_node.container # type: InstanceContainer
extruder_stack.material = material_node.container
def _applyChangesToMachine(self, global_stack, extruder_stack_dict):
# Clear all first

View file

@ -143,7 +143,7 @@ class CuraEngineBackend(QObject, Backend):
self._last_num_objects = defaultdict(int) #type: Dict[int, int] # Count number of objects to see if there is something changed
self._postponed_scene_change_sources = [] #type: List[SceneNode] # scene change is postponed (by a tool)
self._slice_start_time = None #type: Optional[float]
self._time_start_process = None #type: Optional[float]
self._is_disabled = False #type: bool
application.getPreferences().addPreference("general/auto_slice", False)
@ -171,10 +171,25 @@ class CuraEngineBackend(QObject, Backend):
)
self._slicing_error_message.actionTriggered.connect(self._reportBackendError)
self._resetLastSliceTimeStats()
self._snapshot = None #type: Optional[QImage]
application.initializationFinished.connect(self.initialize)
def _resetLastSliceTimeStats(self) -> None:
self._time_start_process = None
self._time_send_message = None
self._time_end_slice = None
def resetAndReturnLastSliceTimeStats(self) -> Dict[str, float]:
last_slice_data = {
"time_start_process": self._time_start_process,
"time_send_message": self._time_send_message,
"time_end_slice": self._time_end_slice,
}
self._resetLastSliceTimeStats()
return last_slice_data
def initialize(self) -> None:
application = CuraApplication.getInstance()
self._multi_build_plate_model = application.getMultiBuildPlateModel()
@ -288,7 +303,7 @@ class CuraEngineBackend(QObject, Backend):
self._createSnapshot()
Logger.log("i", "Starting to slice...")
self._slice_start_time = time()
self._time_start_process = time()
if not self._build_plates_to_be_sliced:
self.processingProgress.emit(1.0)
Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.")
@ -512,8 +527,10 @@ class CuraEngineBackend(QObject, Backend):
# Notify the user that it's now up to the backend to do it's job
self.setState(BackendState.Processing)
if self._slice_start_time:
Logger.log("d", "Sending slice message took %s seconds", time() - self._slice_start_time )
# Handle time reporting.
self._time_send_message = time()
if self._time_start_process:
Logger.log("d", "Sending slice message took %s seconds", self._time_send_message - self._time_start_process)
def determineAutoSlicing(self) -> bool:
"""Determine enable or disable auto slicing. Return True for enable timer and False otherwise.
@ -750,6 +767,7 @@ class CuraEngineBackend(QObject, Backend):
self.setState(BackendState.Done)
self.processingProgress.emit(1.0)
self._time_end_slice = time()
try:
gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically.
@ -766,8 +784,8 @@ class CuraEngineBackend(QObject, Backend):
gcode_list[index] = replaced
self._slicing = False
if self._slice_start_time:
Logger.log("d", "Slicing took %s seconds", time() - self._slice_start_time )
if self._time_start_process:
Logger.log("d", "Slicing took %s seconds", time() - self._time_start_process)
Logger.log("d", "Number of models per buildplate: %s", dict(self._numObjectsPerBuildPlate()))
# See if we need to process the sliced layers job.

View file

@ -32,6 +32,7 @@ class FlavorParser:
"""This parser is intended to interpret the common firmware codes among all the different flavors"""
MAX_EXTRUDER_COUNT = 16
DEFAULT_FILAMENT_DIAMETER = 2.85
def __init__(self) -> None:
CuraApplication.getInstance().hideMessageSignal.connect(self._onHideMessage)
@ -48,7 +49,7 @@ class FlavorParser:
self._is_layers_in_file = False # Does the Gcode have the layers comment?
self._extruder_offsets = {} # type: Dict[int, List[float]] # Offsets for multi extruders. key is index, value is [x-offset, y-offset]
self._current_layer_thickness = 0.2 # default
self._filament_diameter = 2.85 # default
self._current_filament_diameter = 2.85 # default
self._previous_extrusion_value = 0.0 # keep track of the filament retractions
CuraApplication.getInstance().getPreferences().addPreference("gcodereader/show_caution", True)
@ -152,7 +153,7 @@ class FlavorParser:
def _calculateLineWidth(self, current_point: Position, previous_point: Position, current_extrusion: float, previous_extrusion: float, layer_thickness: float) -> float:
# Area of the filament
Af = (self._filament_diameter / 2) ** 2 * numpy.pi
Af = (self._current_filament_diameter / 2) ** 2 * numpy.pi
# Length of the extruded filament
de = current_extrusion - previous_extrusion
# Volume of the extruded filament
@ -287,7 +288,11 @@ class FlavorParser:
def processTCode(self, global_stack, T: int, line: str, position: Position, path: List[List[Union[float, int]]]) -> Position:
self._extruder_number = T
self._filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value")
try:
self._current_filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value")
except IndexError:
self._current_filament_diameter = self.DEFAULT_FILAMENT_DIAMETER
if self._extruder_number + 1 > len(position.e):
self._extrusion_length_offset.extend([0] * (self._extruder_number - len(position.e) + 1))
position.e.extend([0] * (self._extruder_number - len(position.e) + 1))
@ -323,7 +328,11 @@ class FlavorParser:
if not global_stack:
return None
self._filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value")
try:
self._current_filament_diameter = global_stack.extruderList[self._extruder_number].getProperty("material_diameter", "value")
except IndexError:
# There can be a mismatch between the number of extruders in the G-Code file and the number of extruders in the current machine.
self._current_filament_diameter = self.DEFAULT_FILAMENT_DIAMETER
scene_node = CuraSceneNode()

View file

@ -303,18 +303,17 @@ Item
Component.onCompleted:
{
update()
updateModel();
}
function update()
function updateModel()
{
clear()
for (var i = 1; i <= Cura.MachineManager.activeMachine.maxExtruderCount; i++)
{
clear();
for (var i = 1; i <= Cura.MachineManager.activeMachine.maxExtruderCount; i ++) {
// Use String as value. JavaScript only has Number. PropertyProvider.setPropertyValue()
// takes a QVariant as value, and Number gets translated into a float. This will cause problem
// for integer settings such as "Number of Extruders".
append({ text: String(i), value: String(i) })
append({ text: String(i), value: String(i) });
}
}
}
@ -322,7 +321,9 @@ Item
Connections
{
target: Cura.MachineManager
function onGlobalContainerChanged() { extruderCountModel.update() }
function onGlobalContainerChanged() {
extruderCountModel.updateModel();
}
}
}

View file

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"api": 8,
"description": "Manages extensions to the application and allows browsing extensions from the Ultimaker website.",
"description": "Manages extensions to the application and allows browsing extensions from the UltiMaker website.",
"i18n-catalog": "cura"
}

View file

@ -285,4 +285,33 @@ Window
}
}
}
Rectangle
{
color: UM.Theme.getColor("main_background")
anchors.fill: parent
visible: !Cura.API.account.isLoggedIn && CuraApplication.isEnterprise
UM.Label
{
id: signInLabel
anchors.centerIn: parent
width: Math.round(UM.Theme.getSize("modal_window_minimum").width / 2.5)
text: catalog.i18nc("@description","Please sign in to get verified plugins and materials for UltiMaker Cura Enterprise")
horizontalAlignment: Text.AlignHCenter
}
Cura.PrimaryButton
{
id: loginButton
width: UM.Theme.getSize("account_button").width
height: UM.Theme.getSize("account_button").height
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: signInLabel.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height * 2
text: catalog.i18nc("@button", "Sign in")
fixedWidthMode: true
onClicked: Cura.API.account.login()
}
}
}

View file

@ -1,8 +1,12 @@
# Copyright (c) 2021 Ultimaker B.V.
# Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from ..Script import Script
# Revised by GregValiant 10-17-2022
# Changed "extrude" line to before the nozzle moves back to the print (if not Repetier or Griffin).
# Add M104 option for Resume temperature
from ..Script import Script
import re
from UM.Application import Application #To get the current printer's settings.
from UM.Logger import Logger
@ -42,7 +46,7 @@ class PauseAtHeight(Script):
"pause_layer":
{
"label": "Pause Layer",
"description": "At what layer should the pause occur?",
"description": "Enter the Number of the LAST layer you want to finish prior to the pause. Note that 0 is the first layer printed.",
"type": "int",
"value": "math.floor((pause_height - 0.27) / 0.1) + 1",
"minimum_value": "0",
@ -156,6 +160,14 @@ class PauseAtHeight(Script):
"type": "bool",
"default_value": false
},
"standby_wait_for_temperature_enabled":
{
"label": "Use M109 for standby temperature? (M104 when false)",
"description": "Wait for hot end after Resume? (If your standby temperature is lower than the Printing temperature CHECK and use M109",
"type": "bool",
"default_value": true,
"enabled": "pause_method not in [\\\"griffin\\\", \\\"repetier\\\"]"
},
"standby_temperature":
{
"label": "Standby Temperature",
@ -220,14 +232,14 @@ class PauseAtHeight(Script):
"custom_gcode_before_pause":
{
"label": "G-code Before Pause",
"description": "Any custom g-code to run before the pause, for example, M300 S440 P200 to beep.",
"description": "Custom g-code to run before the pause. EX: M300 to beep. Use a comma to separate multiple commands. EX: M400,M300,M117 Pause",
"type": "str",
"default_value": ""
},
"custom_gcode_after_pause":
{
"label": "G-code After Pause",
"description": "Any custom g-code to run after the pause, for example, M300 S440 P200 to beep.",
"description": "Custom g-code to run after the pause. Use a comma to separate multiple commands. EX: M204 X8 Y8,M106 S0,M117 Resume",
"type": "str",
"default_value": ""
}
@ -279,13 +291,14 @@ class PauseAtHeight(Script):
move_z = self.getSettingValueByKey("head_move_z")
layers_started = False
redo_layer = self.getSettingValueByKey("redo_layer")
standby_wait_for_temperature_enabled = self.getSettingValueByKey("standby_wait_for_temperature_enabled")
standby_temperature = self.getSettingValueByKey("standby_temperature")
firmware_retract = Application.getInstance().getGlobalContainerStack().getProperty("machine_firmware_retract", "value")
control_temperatures = Application.getInstance().getGlobalContainerStack().getProperty("machine_nozzle_temp_enabled", "value")
initial_layer_height = Application.getInstance().getGlobalContainerStack().getProperty("layer_height_0", "value")
display_text = self.getSettingValueByKey("display_text")
gcode_before = self.getSettingValueByKey("custom_gcode_before_pause")
gcode_after = self.getSettingValueByKey("custom_gcode_after_pause")
gcode_before = re.sub("\\s*,\\s*", "\n", self.getSettingValueByKey("custom_gcode_before_pause"))
gcode_after = re.sub("\\s*,\\s*", "\n", self.getSettingValueByKey("custom_gcode_after_pause"))
beep_at_pause = self.getSettingValueByKey("beep_at_pause")
beep_length = self.getSettingValueByKey("beep_length")
@ -477,14 +490,14 @@ class PauseAtHeight(Script):
# Set a custom GCODE section before pause
if gcode_before:
prepend_gcode += gcode_before.replace(";","\n") + "\n"
prepend_gcode += gcode_before + "\n"
# Wait till the user continues printing
prepend_gcode += pause_command + " ; Do the actual pause\n"
# Set a custom GCODE section after pause
if gcode_after:
prepend_gcode += gcode_after.replace(";","\n") + "\n"
prepend_gcode += gcode_after + "\n"
if pause_method == "repetier":
#Push the filament back,
@ -530,19 +543,23 @@ class PauseAtHeight(Script):
elif pause_method != "griffin":
if control_temperatures:
# Set extruder resume temperature
prepend_gcode += self.putValue(M = 109, S = int(target_temperature.get(current_t, 0))) + " ; resume temperature\n"
if standby_wait_for_temperature_enabled:
WFT_numeric = 109
Temp_resume_Text = " ; WAIT for resume temperature\n"
else:
WFT_numeric = 104
Temp_resume_Text = " ; resume temperature\n"
prepend_gcode += self.putValue(M=WFT_numeric,
S=int(target_temperature.get(current_t, 0))) + Temp_resume_Text
if extrude_amount != 0: # Need to prime after the pause.
# Push the filament back.
if retraction_amount != 0:
prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = retraction_speed * 60) + "\n"
if extrude_speed == 0:
extrude_speed = 25
# Prime the material.
prepend_gcode += self.putValue(G = 1, E = extrude_amount, F = extrude_speed * 60) + "; Extra extrude after the unpause\n"
# And retract again to make the movements back to the starting position.
if retraction_amount != 0:
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
if extrude_amount != 0:
prepend_gcode += self.putValue(G=1, E=extrude_amount, F=extrude_speed * 60) + "\n"
# Move the head back
if park_enabled:
@ -556,8 +573,6 @@ class PauseAtHeight(Script):
retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature.
for i in range(retraction_count):
prepend_gcode += self.putValue(G = 11) + "\n"
else:
prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = retraction_speed * 60) + "\n"
if current_extrusion_f != 0:
prepend_gcode += self.putValue(G = 1, F = current_extrusion_f) + " ; restore extrusion feedrate\n"

View file

@ -1,15 +1,18 @@
# Copyright (c) 2019 Ultimaker B.V.
# Copyright (c) 2023 UltiMaker B.V.
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
import math
from ..Script import Script
from UM.Application import Application # To get current absolute/relative setting.
from UM.Math.Vector import Vector
from typing import List, Tuple
class RetractContinue(Script):
"""Continues retracting during all travel moves."""
def getSettingDataString(self):
def getSettingDataString(self) -> str:
return """{
"name": "Retract Continue",
"key": "RetractContinue",
@ -27,58 +30,90 @@ class RetractContinue(Script):
}
}"""
def execute(self, data):
current_e = 0
current_x = 0
current_y = 0
current_z = 0
def _getTravelMove(self, travel_move: str, default_pos: Vector) -> Tuple[Vector, float]:
travel = Vector(
self.getValue(travel_move, "X", default_pos.x),
self.getValue(travel_move, "Y", default_pos.y),
self.getValue(travel_move, "Z", default_pos.z)
)
f = self.getValue(travel_move, "F", -1.0)
return travel, f
def _travelMoveString(self, travel: Vector, f: float, e: float) -> str:
# Note that only G1 moves are written, since extrusion is included.
if f <= 0.0:
return f"G1 X{travel.x:.5f} Y{travel.y:.5f} Z{travel.z:.5f} E{e:.5f}"
else:
return f"G1 F{f:.5f} X{travel.x:.5f} Y{travel.y:.5f} Z{travel.z:.5f} E{e:.5f}"
def execute(self, data: List[str]) -> List[str]:
current_e = 0.0
to_compensate = 0 # Used when extrusion mode is relative.
is_active = False # Whether retract-continue is in effect.
current_pos = Vector(0.0, 0.0, 0.0)
last_pos = Vector(0.0, 0.0, 0.0)
extra_retraction_speed = self.getSettingValueByKey("extra_retraction_speed")
relative_extrusion = Application.getInstance().getGlobalContainerStack().getProperty(
"relative_extrusion", "value"
)
for layer_number, layer in enumerate(data):
lines = layer.split("\n")
for line_number, line in enumerate(lines):
if self.getValue(line, "G") in {0, 1}: # Track X,Y,Z location.
current_x = self.getValue(line, "X", current_x)
current_y = self.getValue(line, "Y", current_y)
current_z = self.getValue(line, "Z", current_z)
if self.getValue(line, "G") == 1:
if not self.getValue(line, "E"): # Either None or 0: Not a retraction then.
continue
new_e = self.getValue(line, "E")
if new_e - current_e >= -0.0001: # Not a retraction. Account for floating point rounding errors.
current_e = new_e
continue
# A retracted travel move may consist of multiple commands, due to combing.
# This continues retracting over all of these moves and only unretracts at the end.
delta_line = 1
dx = current_x # Track the difference in X for this move only to compute the length of the travel.
dy = current_y
dz = current_z
while line_number + delta_line < len(lines) and self.getValue(lines[line_number + delta_line], "G") != 1:
travel_move = lines[line_number + delta_line]
if self.getValue(travel_move, "G") != 0:
delta_line += 1
continue
travel_x = self.getValue(travel_move, "X", dx)
travel_y = self.getValue(travel_move, "Y", dy)
travel_z = self.getValue(travel_move, "Z", dz)
f = self.getValue(travel_move, "F", "no f")
length = math.sqrt((travel_x - dx) * (travel_x - dx) + (travel_y - dy) * (travel_y - dy) + (travel_z - dz) * (travel_z - dz)) # Length of the travel move.
new_e -= length * extra_retraction_speed # New retraction is by ratio of this travel move.
if f == "no f":
new_travel_move = "G1 X{travel_x} Y{travel_y} Z{travel_z} E{new_e}".format(travel_x = travel_x, travel_y = travel_y, travel_z = travel_z, new_e = new_e)
else:
new_travel_move = "G1 F{f} X{travel_x} Y{travel_y} Z{travel_z} E{new_e}".format(f = f, travel_x = travel_x, travel_y = travel_y, travel_z = travel_z, new_e = new_e)
lines[line_number + delta_line] = new_travel_move
delta_line += 1
dx = travel_x
dy = travel_y
dz = travel_z
# Focus on move-type lines.
code_g = self.getValue(line, "G")
if code_g not in [0, 1]:
continue
current_e = new_e
# Track X,Y,Z location.
last_pos = last_pos.set(current_pos.x, current_pos.y, current_pos.z)
current_pos = current_pos.set(
self.getValue(line, "X", current_pos.x),
self.getValue(line, "Y", current_pos.y),
self.getValue(line, "Z", current_pos.z)
)
# Track extrusion 'axis' position.
last_e = current_e
e_value = self.getValue(line, "E")
if e_value:
current_e = (current_e if relative_extrusion else 0) + e_value
# Handle lines: Detect retractions and compensate relative if G1, potential retract-continue if G0.
if code_g == 1:
if last_e > (current_e + 0.0001): # Account for floating point inaccuracies.
# There is a retraction, each following G0 command needs to continue the retraction.
is_active = True
continue
elif relative_extrusion and is_active:
# If 'relative', the first G1 command after the total retraction will have to compensate more.
travel, f = self._getTravelMove(lines[line_number], current_pos)
lines[line_number] = self._travelMoveString(travel, f, to_compensate + e_value)
to_compensate = 0.0
# There is no retraction (see continue in the retract-clause) and everything else has been handled.
is_active = False
elif code_g == 0:
if not is_active:
continue
# The retract-continue is active, so each G0 until the next extrusion needs to continue retraction.
travel, f = self._getTravelMove(lines[line_number], current_pos)
travel_length = (current_pos - last_pos).length()
extra_retract = travel_length * extra_retraction_speed
new_e = (0 if relative_extrusion else current_e) - extra_retract
to_compensate += extra_retract
current_e -= extra_retract
lines[line_number] = self._travelMoveString(travel, f, new_e)
new_layer = "\n".join(lines)
data[layer_number] = new_layer
return data
return data

View file

@ -1,4 +1,4 @@
# Copyright (c) 2021 Ultimaker B.V.
# Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import json
@ -27,7 +27,7 @@ catalog = i18nCatalog("cura")
class SliceInfo(QObject, Extension):
"""This Extension runs in the background and sends several bits of information to the Ultimaker servers.
"""This Extension runs in the background and sends several bits of information to the UltiMaker servers.
The data is only sent when the user in question gave permission to do so. All data is anonymous and
no model files are being sent (Just a SHA256 hash of the model).
@ -277,6 +277,26 @@ class SliceInfo(QObject, Extension):
# Send the name of the output device type that is used.
data["output_to"] = type(output_device).__name__
# Engine Statistics (Slicing Time, ...)
# Call it backend-time, sice we might want to get the actual slice time from the engine itself,
# to also identify problems in between the users pressing the button and the engine actually starting
# (and the other way around with data that arrives back from the engine).
time_setup = 0.0
time_backend = 0.0
if not print_information.preSliced:
backend_info = self._application.getBackend().resetAndReturnLastSliceTimeStats()
time_start_process = backend_info["time_start_process"]
time_send_message = backend_info["time_send_message"]
time_end_slice = backend_info["time_end_slice"]
if time_start_process and time_send_message and time_end_slice:
time_setup = time_send_message - time_start_process
time_backend = time_end_slice - time_send_message
data["engine_stats"] = {
"is_presliced": int(print_information.preSliced),
"time_setup": int(round(time_setup)),
"time_backend": int(round(time_backend)),
}
# Convert data to bytes
binary_data = json.dumps(data).encode("utf-8")

View file

@ -1,3 +1,7 @@
<!-- Copyright (c) 2023 UltiMaker
Cura is released under the terms of the LGPLv3 or higher.
-->
<html>
<body>
<b>Cura Version:</b> 4.8<br/>
@ -63,11 +67,18 @@
<h3>Print Times:</h3>
<ul>
<li>Infill: 61200 sec.</li>
<li>Support: 25480 sec.</li>
<li>Travel: 6224 sec.</li>
<li>Walls: 10225 sec.</li>
<li>Total: 103129 sec.</li>
<li><b>Infill:</b> 61200 sec.</li>
<li><b>Support:</b> 25480 sec.</li>
<li><b>Travel:</b> 6224 sec.</li>
<li><b>Walls:</b> 10225 sec.</li>
<li><b>Total:</b> 103129 sec.</li>
</ul>
<h3>Engine Statistics:</h3>
<ul>
<li><b>Is Pre-Sliced:</b> no</li>
<li><b>Pre-Process Time:</b> 7 sec.</li>
<li><b>Slicing Time:</b> 69 sec.</li>
</ul>
</body>
</html>

View file

@ -1,7 +1,7 @@
{
"name": "Ultimaker Network Connection",
"name": "UltiMaker Network Connection",
"author": "Ultimaker B.V.",
"description": "Manages network connections to Ultimaker networked printers.",
"description": "Manages network connections to UltiMaker networked printers.",
"version": "2.0.0",
"api": 8,
"i18n-catalog": "cura"

View file

@ -16,7 +16,7 @@ class LegacyDeviceNoLongerSupportedMessage(Message):
def __init__(self) -> None:
super().__init__(
text = I18N_CATALOG.i18nc("@info:status", "You are attempting to connect to a printer that is not "
"running Ultimaker Connect. Please update the printer to the "
"running UltiMaker Connect. Please update the printer to the "
"latest firmware."),
title = I18N_CATALOG.i18nc("@info:title", "Update your printer"),
lifetime = 10,

View file

@ -1,5 +1,5 @@
{
"name": "Ultimaker machine actions",
"name": "UltiMaker machine actions",
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",

View file

@ -0,0 +1,372 @@
# Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import configparser
from typing import Tuple, List
import io
from UM.VersionUpgrade import VersionUpgrade
_REMOVED_SETTINGS = {
"limit_support_retractions",
"material_flow_dependent_temperature",
}
_RENAMED_PROFILES = {
"um_s3_aa0.25_ABS_Normal_Quality": "um_s3_aa0.25_abs_0.1mm",
"um_s3_aa0.25_CPE_Normal_Quality": "um_s3_aa0.25_cpe_0.1mm",
"um_s3_aa0.25_Nylon_Normal_Quality": "um_s3_aa0.25_nylon_0.1mm",
"um_s3_aa0.25_PC_Normal_Quality": "um_s3_aa0.25_pc_0.1mm",
"um_s3_aa0.25_PETG_Normal_Quality": "um_s3_aa0.25_petg_0.1mm",
"um_s3_aa0.25_PLA_Normal_Quality": "um_s3_aa0.25_pla_0.1mm",
"um_s3_aa0.25_PP_Normal_Quality": "um_s3_aa0.25_pp_0.1mm",
"um_s3_aa0.25_TPLA_Normal_Quality": "um_s3_aa0.25_tough-pla_0.1mm",
"um_s3_aa0.4_ABS_Draft_Print": "um_s3_aa0.4_abs_0.2mm",
"um_s3_aa0.4_ABS_Draft_Print_Quick": "um_s3_aa0.4_abs_0.2mm_quick",
"um_s3_aa0.4_ABS_Fast_Print": "um_s3_aa0.4_abs_0.15mm",
"um_s3_aa0.4_ABS_Fast_Print_Accurate": "um_s3_aa0.4_abs_0.15mm_engineering",
"um_s3_aa0.4_ABS_Fast_Visual": "um_s3_aa0.4_abs_0.15mm_visual",
"um_s3_aa0.4_ABS_High_Quality": "um_s3_aa0.4_abs_0.06mm",
"um_s3_aa0.4_ABS_High_Visual": "um_s3_aa0.4_abs_0.06mm_visual",
"um_s3_aa0.4_ABS_Normal_Quality": "um_s3_aa0.4_abs_0.1mm",
"um_s3_aa0.4_ABS_Normal_Quality_Accurate": "um_s3_aa0.4_abs_0.1mm_engineering",
"um_s3_aa0.4_ABS_Normal_Visual": "um_s3_aa0.4_abs_0.1mm_visual",
"um_s3_aa0.4_BAM_Draft_Print": "um_s3_aa0.4_bam_0.2mm",
"um_s3_aa0.4_BAM_Fast_Print": "um_s3_aa0.4_bam_0.15mm",
"um_s3_aa0.4_BAM_Normal_Quality": "um_s3_aa0.4_bam_0.1mm",
"um_s3_aa0.4_BAM_VeryDraft_Print": "um_s3_aa0.4_bam_0.3mm",
"um_s3_aa0.4_CPE_Draft_Print": "um_s3_aa0.4_cpe_0.2mm",
"um_s3_aa0.4_CPE_Fast_Print": "um_s3_aa0.4_cpe_0.15mm",
"um_s3_aa0.4_CPE_Fast_Print_Accurate": "um_s3_aa0.4_cpe_0.15mm_engineering",
"um_s3_aa0.4_CPE_High_Quality": "um_s3_aa0.4_cpe_0.06mm",
"um_s3_aa0.4_CPE_Normal_Quality": "um_s3_aa0.4_cpe_0.1mm",
"um_s3_aa0.4_CPE_Normal_Quality_Accurate": "um_s3_aa0.4_cpe_0.1mm_engineering",
"um_s3_aa0.4_CPEP_Draft_Print": "um_s3_aa0.4_cpe-plus_0.2mm",
"um_s3_aa0.4_CPEP_Fast_Print": "um_s3_aa0.4_cpe-plus_0.15mm",
"um_s3_aa0.4_CPEP_Fast_Print_Accurate": "um_s3_aa0.4_cpe-plus_0.15mm_engineering",
"um_s3_aa0.4_CPEP_High_Quality": "um_s3_aa0.4_cpe-plus_0.06mm",
"um_s3_aa0.4_CPEP_Normal_Quality": "um_s3_aa0.4_cpe-plus_0.1mm",
"um_s3_aa0.4_CPEP_Normal_Quality_Accurate": "um_s3_aa0.4_cpe-plus_0.1mm_engineering",
"um_s3_aa0.4_Nylon_Draft_Print": "um_s3_aa0.4_nylon_0.2mm",
"um_s3_aa0.4_Nylon_Fast_Print": "um_s3_aa0.4_nylon_0.15mm",
"um_s3_aa0.4_Nylon_Fast_Print_Accurate": "um_s3_aa0.4_nylon_0.15mm_engineering",
"um_s3_aa0.4_Nylon_High_Quality": "um_s3_aa0.4_nylon_0.06mm",
"um_s3_aa0.4_Nylon_Normal_Quality": "um_s3_aa0.4_nylon_0.1mm",
"um_s3_aa0.4_Nylon_Normal_Quality_Accurate": "um_s3_aa0.4_nylon_0.1mm_engineering",
"um_s3_aa0.4_PC_Draft_Print": "um_s3_aa0.4_pc_0.2mm",
"um_s3_aa0.4_PC_Fast_Print": "um_s3_aa0.4_pc_0.15mm",
"um_s3_aa0.4_PC_Fast_Print_Accurate": "um_s3_aa0.4_pc_0.15mm_engineering",
"um_s3_aa0.4_PC_High_Quality": "um_s3_aa0.4_pc_0.06mm",
"um_s3_aa0.4_PC_Normal_Quality": "um_s3_aa0.4_pc_0.1mm",
"um_s3_aa0.4_PC_Normal_Quality_Accurate": "um_s3_aa0.4_pc_0.1mm_engineering",
"um_s3_aa0.4_PETG_Draft_Print": "um_s3_aa0.4_petg_0.2mm",
"um_s3_aa0.4_PETG_Fast_Print": "um_s3_aa0.4_petg_0.15mm",
"um_s3_aa0.4_PETG_Fast_Print_Accurate": "um_s3_aa0.4_petg_0.15mm_engineering",
"um_s3_aa0.4_PETG_High_Quality": "um_s3_aa0.4_petg_0.06mm",
"um_s3_aa0.4_PETG_Normal_Quality": "um_s3_aa0.4_petg_0.1mm",
"um_s3_aa0.4_PETG_Normal_Quality_Accurate": "um_s3_aa0.4_petg_0.1mm_engineering",
"um_s3_aa0.4_PLA_Draft_Print": "um_s3_aa0.4_pla_0.2mm",
"um_s3_aa0.4_PLA_Draft_Print_Quick": "um_s3_aa0.4_pla_0.2mm_quick",
"um_s3_aa0.4_PLA_Fast_Print": "um_s3_aa0.4_pla_0.15mm",
"um_s3_aa0.4_PLA_Fast_Print_Accurate": "um_s3_aa0.4_pla_0.15mm_engineering",
"um_s3_aa0.4_PLA_Fast_Visual": "um_s3_aa0.4_pla_0.15mm_visual",
"um_s3_aa0.4_PLA_High_Quality": "um_s3_aa0.4_pla_0.06mm",
"um_s3_aa0.4_PLA_High_Visual": "um_s3_aa0.4_pla_0.06mm_visual",
"um_s3_aa0.4_PLA_Normal_Quality": "um_s3_aa0.4_pla_0.1mm",
"um_s3_aa0.4_PLA_Normal_Quality_Accurate": "um_s3_aa0.4_pla_0.1mm_engineering",
"um_s3_aa0.4_PLA_Normal_Visual": "um_s3_aa0.4_pla_0.1mm_visual",
"um_s3_aa0.4_PLA_VeryDraft_Print": "um_s3_aa0.4_pla_0.3mm",
"um_s3_aa0.4_PLA_VeryDraft_Print_Quick": "um_s3_aa0.4_pla_0.3mm_quick",
"um_s3_aa0.4_PP_Draft_Print": "um_s3_aa0.4_pp_0.2mm",
"um_s3_aa0.4_PP_Fast_Print": "um_s3_aa0.4_pp_0.15mm",
"um_s3_aa0.4_PP_Normal_Quality": "um_s3_aa0.4_pp_0.1mm",
"um_s3_aa0.4_TPLA_Draft_Print": "um_s3_aa0.4_tough-pla_0.2mm",
"um_s3_aa0.4_TPLA_Draft_Print_Quick": "um_s3_aa0.4_tough-pla_0.2mm_quick",
"um_s3_aa0.4_TPLA_Fast_Print": "um_s3_aa0.4_tough-pla_0.15mm",
"um_s3_aa0.4_TPLA_Fast_Print_Accurate": "um_s3_aa0.4_tough-pla_0.15mm_engineering",
"um_s3_aa0.4_TPLA_Fast_Visual": "um_s3_aa0.4_tough-pla_0.15mm_visual",
"um_s3_aa0.4_TPLA_High_Quality": "um_s3_aa0.4_tough-pla_0.06mm",
"um_s3_aa0.4_TPLA_High_Visual": "um_s3_aa0.4_tough-pla_0.06mm_visual",
"um_s3_aa0.4_TPLA_Normal_Quality": "um_s3_aa0.4_tough-pla_0.1mm",
"um_s3_aa0.4_TPLA_Normal_Quality_Accurate": "um_s3_aa0.4_tough-pla_0.1mm_engineering",
"um_s3_aa0.4_TPLA_Normal_Visual": "um_s3_aa0.4_tough-pla_0.1mm_visual",
"um_s3_aa0.4_TPLA_VeryDraft_Print": "um_s3_aa0.4_tough-pla_0.3mm",
"um_s3_aa0.4_TPLA_VeryDraft_Print_Quick": "um_s3_aa0.4_tough-pla_0.3mm_quick",
"um_s3_aa0.4_TPU_Draft_Print": "um_s3_aa0.4_tpu_0.2mm",
"um_s3_aa0.4_TPU_Fast_Print": "um_s3_aa0.4_tpu_0.15mm",
"um_s3_aa0.4_TPU_Normal_Quality": "um_s3_aa0.4_tpu_0.1mm",
"um_s3_aa0.8_ABS_Draft_Print": "um_s3_aa0.8_abs_0.2mm",
"um_s3_aa0.8_ABS_Superdraft_Print": "um_s3_aa0.8_abs_0.4mm",
"um_s3_aa0.8_ABS_VeryDraft_Print": "um_s3_aa0.8_abs_0.3mm",
"um_s3_aa0.8_CPE_Draft_Print": "um_s3_aa0.8_cpe_0.2mm",
"um_s3_aa0.8_CPE_Superdraft_Print": "um_s3_aa0.8_cpe_0.4mm",
"um_s3_aa0.8_CPE_VeryDraft_Print": "um_s3_aa0.8_cpe_0.3mm",
"um_s3_aa0.8_CPEP_Fast_Print": "um_s3_aa0.8_cpe-plus_0.2mm",
"um_s3_aa0.8_CPEP_Superdraft_Print": "um_s3_aa0.8_cpe-plus_0.4mm",
"um_s3_aa0.8_CPEP_VeryDraft_Print": "um_s3_aa0.8_cpe-plus_0.3mm",
"um_s3_aa0.8_Nylon_Draft_Print": "um_s3_aa0.8_nylon_0.2mm",
"um_s3_aa0.8_Nylon_Superdraft_Print": "um_s3_aa0.8_nylon_0.4mm",
"um_s3_aa0.8_Nylon_VeryDraft_Print": "um_s3_aa0.8_nylon_0.3mm",
"um_s3_aa0.8_PC_Fast_Print": "um_s3_aa0.8_pc_0.2mm",
"um_s3_aa0.8_PC_Superdraft_Print": "um_s3_aa0.8_pc_0.4mm",
"um_s3_aa0.8_PC_VeryDraft_Print": "um_s3_aa0.8_pc_0.3mm",
"um_s3_aa0.8_PETG_Draft_Print": "um_s3_aa0.8_petg_0.2mm",
"um_s3_aa0.8_PETG_Superdraft_Print": "um_s3_aa0.8_petg_0.4mm",
"um_s3_aa0.8_PETG_VeryDraft_Print": "um_s3_aa0.8_petg_0.3mm",
"um_s3_aa0.8_PLA_Draft_Print": "um_s3_aa0.8_pla_0.2mm",
"um_s3_aa0.8_PLA_Superdraft_Print": "um_s3_aa0.8_pla_0.4mm",
"um_s3_aa0.8_PLA_VeryDraft_Print": "um_s3_aa0.8_pla_0.3mm",
"um_s3_aa0.8_PP_Draft_Print": "um_s3_aa0.8_pp_0.2mm",
"um_s3_aa0.8_PP_Superdraft_Print": "um_s3_aa0.8_pp_0.4mm",
"um_s3_aa0.8_PP_VeryDraft_Print": "um_s3_aa0.8_pp_0.3mm",
"um_s3_aa0.8_TPLA_Draft_Print": "um_s3_aa0.8_tough-pla_0.2mm",
"um_s3_aa0.8_TPLA_Superdraft_Print": "um_s3_aa0.8_tough-pla_0.4mm",
"um_s3_aa0.8_TPLA_VeryDraft_Print": "um_s3_aa0.8_tough-pla_0.3mm",
"um_s3_aa0.8_TPU_Draft_Print": "um_s3_aa0.8_tpu_0.2mm",
"um_s3_aa0.8_TPU_Superdraft_Print": "um_s3_aa0.8_tpu_0.4mm",
"um_s3_aa0.8_TPU_VeryDraft_Print": "um_s3_aa0.8_tpu_0.3mm",
"um_s3_bb0.4_PVA_Draft_Print": "um_s3_bb0.4_pva_0.2mm",
"um_s3_bb0.4_PVA_Fast_Print": "um_s3_bb0.4_pva_0.15mm",
"um_s3_bb0.4_PVA_High_Quality": "um_s3_bb0.4_pva_0.06mm",
"um_s3_bb0.4_PVA_Normal_Quality": "um_s3_bb0.4_pva_0.1mm",
"um_s3_bb0.4_PVA_VeryDraft_Print": "um_s3_bb0.4_pva_0.3mm",
"um_s3_bb0.8_PVA_Draft_Print": "um_s3_bb0.8_pva_0.2mm",
"um_s3_bb0.8_PVA_Superdraft_Print": "um_s3_bb0.8_pva_0.4mm",
"um_s3_bb0.8_PVA_VeryDraft_Print": "um_s3_bb0.8_pva_0.3mm",
"um_s3_cc0.4_CFFCPE_Draft_Print": "um_s3_cc0.4_cffcpe_0.2mm",
"um_s3_cc0.4_CFFCPE_Fast_Print": "um_s3_cc0.4_cffcpe_0.15mm",
"um_s3_cc0.4_CFFPA_Draft_Print": "um_s3_cc0.4_cffpa_0.2mm",
"um_s3_cc0.4_CFFPA_Fast_Print": "um_s3_cc0.4_cffpa_0.15mm",
"um_s3_cc0.4_GFFCPE_Draft_Print": "um_s3_cc0.4_gffcpe_0.2mm",
"um_s3_cc0.4_GFFCPE_Fast_Print": "um_s3_cc0.4_gffcpe_0.15mm",
"um_s3_cc0.4_GFFPA_Draft_Print": "um_s3_cc0.4_gffpa_0.2mm",
"um_s3_cc0.4_GFFPA_Fast_Print": "um_s3_cc0.4_gffpa_0.15mm",
"um_s3_cc0.4_PLA_Draft_Print": "um_s3_cc0.4_pla_0.2mm",
"um_s3_cc0.4_PLA_Fast_Print": "um_s3_cc0.4_pla_0.15mm",
"um_s3_cc0.6_CFFCPE_Draft_Print": "um_s3_cc0.6_cffcpe_0.2mm",
"um_s3_cc0.6_CFFPA_Draft_Print": "um_s3_cc0.6_cffpa_0.2mm",
"um_s3_cc0.6_GFFCPE_Draft_Print": "um_s3_cc0.6_gffcpe_0.2mm",
"um_s3_cc0.6_GFFPA_Draft_Print": "um_s3_cc0.6_gffpa_0.2mm",
"um_s3_cc0.6_PLA_Draft_Print": "um_s3_cc0.6_pla_0.2mm",
"um_s3_cc0.6_PLA_Fast_Print": "um_s3_cc0.6_pla_0.15mm",
"um_s5_aa0.25_ABS_Normal_Quality": "um_s5_aa0.25_abs_0.1mm",
"um_s5_aa0.25_CPE_Normal_Quality": "um_s5_aa0.25_cpe_0.1mm",
"um_s5_aa0.25_Nylon_Normal_Quality": "um_s5_aa0.25_nylon_0.1mm",
"um_s5_aa0.25_PC_Normal_Quality": "um_s5_aa0.25_pc_0.1mm",
"um_s5_aa0.25_PETG_Normal_Quality": "um_s5_aa0.25_petg_0.1mm",
"um_s5_aa0.25_PLA_Normal_Quality": "um_s5_aa0.25_pla_0.1mm",
"um_s5_aa0.25_PP_Normal_Quality": "um_s5_aa0.25_pp_0.1mm",
"um_s5_aa0.25_TPLA_Normal_Quality": "um_s5_aa0.25_tough-pla_0.1mm",
"um_s5_aa0.4_ABS_Draft_Print": "um_s5_aa0.4_abs_0.2mm",
"um_s5_aa0.4_ABS_Draft_Print_Quick": "um_s5_aa0.4_abs_0.2mm_quick",
"um_s5_aa0.4_ABS_Fast_Print": "um_s5_aa0.4_abs_0.15mm",
"um_s5_aa0.4_ABS_Fast_Print_Accurate": "um_s5_aa0.4_abs_0.15mm_engineering",
"um_s5_aa0.4_ABS_Fast_Visual": "um_s5_aa0.4_abs_0.15mm_visual",
"um_s5_aa0.4_ABS_High_Quality": "um_s5_aa0.4_abs_0.06mm",
"um_s5_aa0.4_ABS_High_Visual": "um_s5_aa0.4_abs_0.06mm_visual",
"um_s5_aa0.4_ABS_Normal_Quality": "um_s5_aa0.4_abs_0.1mm",
"um_s5_aa0.4_ABS_Normal_Quality_Accurate": "um_s5_aa0.4_abs_0.1mm_engineering",
"um_s5_aa0.4_ABS_Normal_Visual": "um_s5_aa0.4_abs_0.1mm_visual",
"um_s5_aa0.4_BAM_Draft_Print": "um_s5_aa0.4_bam_0.2mm",
"um_s5_aa0.4_BAM_Fast_Print": "um_s5_aa0.4_bam_0.15mm",
"um_s5_aa0.4_BAM_Normal_Quality": "um_s5_aa0.4_bam_0.1mm",
"um_s5_aa0.4_BAM_VeryDraft_Print": "um_s5_aa0.4_bam_0.3mm",
"um_s5_aa0.4_CPE_Draft_Print": "um_s5_aa0.4_cpe_0.2mm",
"um_s5_aa0.4_CPE_Fast_Print": "um_s5_aa0.4_cpe_0.15mm",
"um_s5_aa0.4_CPE_Fast_Print_Accurate": "um_s5_aa0.4_cpe_0.15mm_engineering",
"um_s5_aa0.4_CPE_High_Quality": "um_s5_aa0.4_cpe_0.06mm",
"um_s5_aa0.4_CPE_Normal_Quality": "um_s5_aa0.4_cpe_0.1mm",
"um_s5_aa0.4_CPE_Normal_Quality_Accurate": "um_s5_aa0.4_cpe_0.1mm_engineering",
"um_s5_aa0.4_CPEP_Draft_Print": "um_s5_aa0.4_cpe-plus_0.2mm",
"um_s5_aa0.4_CPEP_Fast_Print": "um_s5_aa0.4_cpe-plus_0.15mm",
"um_s5_aa0.4_CPEP_Fast_Print_Accurate": "um_s5_aa0.4_cpe-plus_0.15mm_engineering",
"um_s5_aa0.4_CPEP_High_Quality": "um_s5_aa0.4_cpe-plus_0.06mm",
"um_s5_aa0.4_CPEP_Normal_Quality": "um_s5_aa0.4_cpe-plus_0.1mm",
"um_s5_aa0.4_CPEP_Normal_Quality_Accurate": "um_s5_aa0.4_cpe-plus_0.1mm_engineering",
"um_s5_aa0.4_Nylon_Draft_Print": "um_s5_aa0.4_nylon_0.2mm",
"um_s5_aa0.4_Nylon_Fast_Print": "um_s5_aa0.4_nylon_0.15mm",
"um_s5_aa0.4_Nylon_Fast_Print_Accurate": "um_s5_aa0.4_nylon_0.15mm_engineering",
"um_s5_aa0.4_Nylon_High_Quality": "um_s5_aa0.4_nylon_0.06mm",
"um_s5_aa0.4_Nylon_Normal_Quality": "um_s5_aa0.4_nylon_0.1mm",
"um_s5_aa0.4_Nylon_Normal_Quality_Accurate": "um_s5_aa0.4_nylon_0.1mm_engineering",
"um_s5_aa0.4_PC_Draft_Print": "um_s5_aa0.4_pc_0.2mm",
"um_s5_aa0.4_PC_Fast_Print": "um_s5_aa0.4_pc_0.15mm",
"um_s5_aa0.4_PC_Fast_Print_Accurate": "um_s5_aa0.4_pc_0.15mm_engineering",
"um_s5_aa0.4_PC_High_Quality": "um_s5_aa0.4_pc_0.06mm",
"um_s5_aa0.4_PC_Normal_Quality": "um_s5_aa0.4_pc_0.1mm",
"um_s5_aa0.4_PC_Normal_Quality_Accurate": "um_s5_aa0.4_pc_0.1mm_engineering",
"um_s5_aa0.4_PETG_Draft_Print": "um_s5_aa0.4_petg_0.2mm",
"um_s5_aa0.4_PETG_Fast_Print": "um_s5_aa0.4_petg_0.15mm",
"um_s5_aa0.4_PETG_Fast_Print_Accurate": "um_s5_aa0.4_petg_0.15mm_engineering",
"um_s5_aa0.4_PETG_High_Quality": "um_s5_aa0.4_petg_0.06mm",
"um_s5_aa0.4_PETG_Normal_Quality": "um_s5_aa0.4_petg_0.1mm",
"um_s5_aa0.4_PETG_Normal_Quality_Accurate": "um_s5_aa0.4_petg_0.1mm_engineering",
"um_s5_aa0.4_PLA_Draft_Print": "um_s5_aa0.4_pla_0.2mm",
"um_s5_aa0.4_PLA_Draft_Print_Quick": "um_s5_aa0.4_pla_0.2mm_quick",
"um_s5_aa0.4_PLA_Fast_Print": "um_s5_aa0.4_pla_0.15mm",
"um_s5_aa0.4_PLA_Fast_Print_Accurate": "um_s5_aa0.4_pla_0.15mm_engineering",
"um_s5_aa0.4_PLA_Fast_Visual": "um_s5_aa0.4_pla_0.15mm_visual",
"um_s5_aa0.4_PLA_High_Quality": "um_s5_aa0.4_pla_0.06mm",
"um_s5_aa0.4_PLA_High_Visual": "um_s5_aa0.4_pla_0.06mm_visual",
"um_s5_aa0.4_PLA_Normal_Quality": "um_s5_aa0.4_pla_0.1mm",
"um_s5_aa0.4_PLA_Normal_Quality_Accurate": "um_s5_aa0.4_pla_0.1mm_engineering",
"um_s5_aa0.4_PLA_Normal_Visual": "um_s5_aa0.4_pla_0.1mm_visual",
"um_s5_aa0.4_PLA_VeryDraft_Print": "um_s5_aa0.4_pla_0.3mm",
"um_s5_aa0.4_PLA_VeryDraft_Print_Quick": "um_s5_aa0.4_pla_0.3mm_quick",
"um_s5_aa0.4_PP_Draft_Print": "um_s5_aa0.4_pp_0.2mm",
"um_s5_aa0.4_PP_Fast_Print": "um_s5_aa0.4_pp_0.15mm",
"um_s5_aa0.4_PP_Normal_Quality": "um_s5_aa0.4_pp_0.1mm",
"um_s5_aa0.4_TPLA_Draft_Print": "um_s5_aa0.4_tough-pla_0.2mm",
"um_s5_aa0.4_TPLA_Draft_Print_Quick": "um_s5_aa0.4_tough-pla_0.2mm_quick",
"um_s5_aa0.4_TPLA_Fast_Print": "um_s5_aa0.4_tough-pla_0.15mm",
"um_s5_aa0.4_TPLA_Fast_Print_Accurate": "um_s5_aa0.4_tough-pla_0.15mm_engineering",
"um_s5_aa0.4_TPLA_Fast_Visual": "um_s5_aa0.4_tough-pla_0.15mm_visual",
"um_s5_aa0.4_TPLA_High_Quality": "um_s5_aa0.4_tough-pla_0.06mm",
"um_s5_aa0.4_TPLA_High_Visual": "um_s5_aa0.4_tough-pla_0.06mm_visual",
"um_s5_aa0.4_TPLA_Normal_Quality": "um_s5_aa0.4_tough-pla_0.1mm",
"um_s5_aa0.4_TPLA_Normal_Quality_Accurate": "um_s5_aa0.4_tough-pla_0.1mm_engineering",
"um_s5_aa0.4_TPLA_Normal_Visual": "um_s5_aa0.4_tough-pla_0.1mm_visual",
"um_s5_aa0.4_TPLA_VeryDraft_Print": "um_s5_aa0.4_tough-pla_0.3mm",
"um_s5_aa0.4_TPLA_VeryDraft_Print_Quick": "um_s5_aa0.4_tough-pla_0.3mm_quick",
"um_s5_aa0.4_TPU_Draft_Print": "um_s5_aa0.4_tpu_0.2mm",
"um_s5_aa0.4_TPU_Fast_Print": "um_s5_aa0.4_tpu_0.15mm",
"um_s5_aa0.4_TPU_Normal_Quality": "um_s5_aa0.4_tpu_0.1mm",
"um_s5_aa0.8_ABS_Draft_Print": "um_s5_aa0.8_abs_0.2mm",
"um_s5_aa0.8_ABS_Superdraft_Print": "um_s5_aa0.8_abs_0.4mm",
"um_s5_aa0.8_ABS_VeryDraft_Print": "um_s5_aa0.8_abs_0.3mm",
"um_s5_aa0.8_CPE_Draft_Print": "um_s5_aa0.8_cpe_0.2mm",
"um_s5_aa0.8_CPE_Superdraft_Print": "um_s5_aa0.8_cpe_0.4mm",
"um_s5_aa0.8_CPE_VeryDraft_Print": "um_s5_aa0.8_cpe_0.3mm",
"um_s5_aa0.8_CPEP_Fast_Print": "um_s5_aa0.8_cpe-plus_0.2mm",
"um_s5_aa0.8_CPEP_Superdraft_Print": "um_s5_aa0.8_cpe-plus_0.4mm",
"um_s5_aa0.8_CPEP_VeryDraft_Print": "um_s5_aa0.8_cpe-plus_0.3mm",
"um_s5_aa0.8_Nylon_Draft_Print": "um_s5_aa0.8_nylon_0.2mm",
"um_s5_aa0.8_Nylon_Superdraft_Print": "um_s5_aa0.8_nylon_0.4mm",
"um_s5_aa0.8_Nylon_VeryDraft_Print": "um_s5_aa0.8_nylon_0.3mm",
"um_s5_aa0.8_PC_Fast_Print": "um_s5_aa0.8_pc_0.2mm",
"um_s5_aa0.8_PC_Superdraft_Print": "um_s5_aa0.8_pc_0.4mm",
"um_s5_aa0.8_PC_VeryDraft_Print": "um_s5_aa0.8_pc_0.3mm",
"um_s5_aa0.8_PETG_Draft_Print": "um_s5_aa0.8_petg_0.2mm",
"um_s5_aa0.8_PETG_Superdraft_Print": "um_s5_aa0.8_petg_0.4mm",
"um_s5_aa0.8_PETG_VeryDraft_Print": "um_s5_aa0.8_petg_0.3mm",
"um_s5_aa0.8_PLA_Draft_Print": "um_s5_aa0.8_pla_0.2mm",
"um_s5_aa0.8_PLA_Superdraft_Print": "um_s5_aa0.8_pla_0.4mm",
"um_s5_aa0.8_PLA_VeryDraft_Print": "um_s5_aa0.8_pla_0.3mm",
"um_s5_aa0.8_PP_Draft_Print": "um_s5_aa0.8_pp_0.2mm",
"um_s5_aa0.8_PP_Superdraft_Print": "um_s5_aa0.8_pp_0.4mm",
"um_s5_aa0.8_PP_VeryDraft_Print": "um_s5_aa0.8_pp_0.3mm",
"um_s5_aa0.8_TPLA_Draft_Print": "um_s5_aa0.8_tough-pla_0.2mm",
"um_s5_aa0.8_TPLA_Superdraft_Print": "um_s5_aa0.8_tough-pla_0.4mm",
"um_s5_aa0.8_TPLA_VeryDraft_Print": "um_s5_aa0.8_tough-pla_0.3mm",
"um_s5_aa0.8_TPU_Draft_Print": "um_s5_aa0.8_tpu_0.2mm",
"um_s5_aa0.8_TPU_Superdraft_Print": "um_s5_aa0.8_tpu_0.4mm",
"um_s5_aa0.8_TPU_VeryDraft_Print": "um_s5_aa0.8_tpu_0.3mm",
"um_s5_bb0.4_PVA_Draft_Print": "um_s5_bb0.4_pva_0.2mm",
"um_s5_bb0.4_PVA_Fast_Print": "um_s5_bb0.4_pva_0.15mm",
"um_s5_bb0.4_PVA_High_Quality": "um_s5_bb0.4_pva_0.06mm",
"um_s5_bb0.4_PVA_Normal_Quality": "um_s5_bb0.4_pva_0.1mm",
"um_s5_bb0.4_PVA_VeryDraft_Print": "um_s5_bb0.4_pva_0.3mm",
"um_s5_bb0.8_PVA_Draft_Print": "um_s5_bb0.8_pva_0.2mm",
"um_s5_bb0.8_PVA_Superdraft_Print": "um_s5_bb0.8_pva_0.4mm",
"um_s5_bb0.8_PVA_VeryDraft_Print": "um_s5_bb0.8_pva_0.3mm",
"um_s5_cc0.4_CFFCPE_Draft_Print": "um_s5_cc0.4_cffcpe_0.2mm",
"um_s5_cc0.4_CFFCPE_Fast_Print": "um_s5_cc0.4_cffcpe_0.15mm",
"um_s5_cc0.4_CFFPA_Draft_Print": "um_s5_cc0.4_cffpa_0.2mm",
"um_s5_cc0.4_CFFPA_Fast_Print": "um_s5_cc0.4_cffpa_0.15mm",
"um_s5_cc0.4_GFFCPE_Draft_Print": "um_s5_cc0.4_gffcpe_0.2mm",
"um_s5_cc0.4_GFFCPE_Fast_Print": "um_s5_cc0.4_gffcpe_0.15mm",
"um_s5_cc0.4_GFFPA_Draft_Print": "um_s5_cc0.4_gffpa_0.2mm",
"um_s5_cc0.4_GFFPA_Fast_Print": "um_s5_cc0.4_gffpa_0.15mm",
"um_s5_cc0.4_PLA_Draft_Print": "um_s5_cc0.4_pla_0.2mm",
"um_s5_cc0.4_PLA_Fast_Print": "um_s5_cc0.4_pla_0.15mm",
"um_s5_cc0.6_CFFCPE_Draft_Print": "um_s5_cc0.6_cffcpe_0.2mm",
"um_s5_cc0.6_CFFPA_Draft_Print": "um_s5_cc0.6_cffpa_0.2mm",
"um_s5_cc0.6_GFFCPE_Draft_Print": "um_s5_cc0.6_gffcpe_0.2mm",
"um_s5_cc0.6_GFFPA_Draft_Print": "um_s5_cc0.6_gffpa_0.2mm",
"um_s5_cc0.6_PLA_Draft_Print": "um_s5_cc0.6_pla_0.2mm",
"um_s5_cc0.6_PLA_Fast_Print": "um_s5_cc0.6_pla_0.15mm"
}
class VersionUpgrade52to53(VersionUpgrade):
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades preferences to remove from the visibility list the settings that were removed in this version.
It also changes the preferences to have the new version number.
This removes any settings that were removed in the new Cura version.
:param serialized: The original contents of the preferences file.
:param filename: The file name of the preferences file.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "21"
# Remove deleted settings from the visible settings list.
if "general" in parser and "visible_settings" in parser["general"]:
visible_settings = set(parser["general"]["visible_settings"].split(";"))
for removed in _REMOVED_SETTINGS:
if removed in visible_settings:
visible_settings.remove(removed)
parser["general"]["visible_settings"] = ";".join(visible_settings)
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades instance containers to remove the settings that were removed in this version.
It also changes the instance containers to have the new version number.
This removes any settings that were removed in the new Cura version and updates settings that need to be updated
with a new value.
:param serialized: The original contents of the instance container.
:param filename: The original file name of the instance container.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ())
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "21"
if "values" in parser:
# Remove deleted settings from the instance containers.
for removed in _REMOVED_SETTINGS:
if removed in parser["values"]:
del parser["values"][removed]
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades stacks to have the new version number.
:param serialized: The original contents of the stack.
:param filename: The original file name of the stack.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = "21"
for container in parser['containers']:
parser['containers'][container] = _RENAMED_PROFILES.get(parser['containers'][container], parser['containers'][container])
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]

View file

@ -0,0 +1,61 @@
# Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Any, Dict, TYPE_CHECKING
from . import VersionUpgrade52to53
if TYPE_CHECKING:
from UM.Application import Application
upgrade = VersionUpgrade52to53.VersionUpgrade52to53()
def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
("preferences", 7000020): ("preferences", 7000021, upgrade.upgradePreferences),
("machine_stack", 5000020): ("machine_stack", 5000021, upgrade.upgradeStack),
("extruder_train", 5000020): ("extruder_train", 5000021, upgrade.upgradeStack),
("definition_changes", 4000020): ("definition_changes", 4000021, upgrade.upgradeInstanceContainer),
("quality_changes", 4000020): ("quality_changes", 4000021, upgrade.upgradeInstanceContainer),
("quality", 4000020): ("quality", 4000021, upgrade.upgradeInstanceContainer),
("user", 4000020): ("user", 4000021, upgrade.upgradeInstanceContainer),
("intent", 4000020): ("intent", 4000021, upgrade.upgradeInstanceContainer),
},
"sources": {
"preferences": {
"get_version": upgrade.getCfgVersion,
"location": {"."}
},
"machine_stack": {
"get_version": upgrade.getCfgVersion,
"location": {"./machine_instances"}
},
"extruder_train": {
"get_version": upgrade.getCfgVersion,
"location": {"./extruders"}
},
"definition_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./definition_changes"}
},
"quality_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality_changes"}
},
"quality": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality"}
},
"user": {
"get_version": upgrade.getCfgVersion,
"location": {"./user"}
}
}
}
def register(app: "Application") -> Dict[str, Any]:
return {"version_upgrade": upgrade}

View file

@ -0,0 +1,8 @@
{
"name": "Version Upgrade 5.2 to 5.3",
"author": "UltiMaker",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 5.2 to Cura 5.3.",
"api": 8,
"i18n-catalog": "cura"
}

View file

@ -1,5 +1,5 @@
pytest
pyinstaller==5.6.2
pyinstaller==5.8.0
pyinstaller-hooks-contrib
pyyaml
sip==6.5.1

View file

@ -1,40 +1,64 @@
### Direct requirements for Uranium and libCharon ###
PyQt6-sip==13.2.1 \
--hash=sha256:b7bce59900b2e0a04f70246de2ccf79ee7933036b6b9183cf039b62eeae2b858 \
--hash=sha256:8b52d42e42e6e9f934ac7528cd154ac0210a532bb33fa1edfb4a8bbfb73ff88b \
--hash=sha256:0314d011633bc697e99f3f9897b484720e81a5f4ba0eaa5f05c5811e2e74ea53 \
--hash=sha256:226e9e349aa16dc1132f106ca01fa99cf7cb8e59daee29304c2fea5fa33212ec
PyQt6==6.2.3 \
--hash=sha256:a9bfcac198fe4b703706f809bb686c7cef5f60a7c802fc145c6b57929c7a6a34 \
--hash=sha256:11c039b07962b29246de2da0912f4f663786185fd74d48daac7a270a43c8d92a \
--hash=sha256:8a2f357b86fec8598f52f16d5f93416931017ca1986d5f68679c9565bfc21fff \
--hash=sha256:577334c9d4518022a4cb6f9799dfbd1b996167eb31404b5a63d6c43d603e6418
PyQt6-Qt6==6.2.4 \
--hash=sha256:42c37475a50ec7e06e0445ac9ce39465f69a86af407ad9b28b183da178d401ee \
--hash=sha256:b68543e5d5a4f5d24c26b517569da3cd30b0fbe75390b841e142c160399b3c0a \
--hash=sha256:0aa93581b92e01deaf2dcaad88ed6718996a6d84de59ee88316bcba143f008c9 \
--hash=sha256:48bc5b7400d6bca13d8c0a145f82295a6da317952ee1a3f107f1cd7d078c8140
PyQt6-NetworkAuth==6.2.0 \
--hash=sha256:23e730cc0d6b828bec2f92d9fac3607871e6033a8af4620e5d4e3afc13bd6c3c \
--hash=sha256:b85ee25b01d6cb38d6141df0052b96de2df7f6e69066eaddb22ae238f56be40b \
--hash=sha256:e637781a00dd2032d0fd2025af09274898335033763e1dc765a5a99348f60c3b \
--hash=sha256:542e9d9a8a5bb78e1f26fa3d35ee01f45209bcf5a35b0cc367aaa85932c29750
PyQt6-NetworkAuth-Qt6==6.2.4 \
--hash=sha256:c7996a9d8c4ce024529ec37981fbfd525ab1a2d497af1281f81f2b6054452d2e \
--hash=sha256:1ae9e08e03bd9d5ebdb42dfaccf484a9cc62eeea7504621fe42c005ff1745e66 \
--hash=sha256:8ed4e5e0eaaa42a6f91aba6745eea23fb3ffcbddc6b162016936530ed28dd0ad
PyQt6-sip==13.2.1 \
--hash=sha256:b7bce59900b2e0a04f70246de2ccf79ee7933036b6b9183cf039b62eeae2b858 \
--hash=sha256:8b52d42e42e6e9f934ac7528cd154ac0210a532bb33fa1edfb4a8bbfb73ff88b \
--hash=sha256:0314d011633bc697e99f3f9897b484720e81a5f4ba0eaa5f05c5811e2e74ea53 \
--hash=sha256:226e9e349aa16dc1132f106ca01fa99cf7cb8e59daee29304c2fea5fa33212ec
PyQt6-sip==13.4.1 \
--hash=sha256:0df998f2b6ceeacfd10de773441572e215be0c9cae566cc7dd36e231bf714a12 \
--hash=sha256:224575e84805c4317bacd5d1b8e93e0ad5c48685dadbbe1e902d4ebe16f22828 \
--hash=sha256:36ae29cdc223cacc1257d0f5075cf81474550c6d26b728f922487a2aa935f130 \
--hash=sha256:3a674c591d4274d4ea8127205290e927a7dab0eb87a0038d4f4ea1d430782649 \
--hash=sha256:3ef9392e4ae29d393b79237d85840cdc6b8831f36eed5d56c7d9b329b380cc8d \
--hash=sha256:43935873d60f57719632840d517afee04ef8f30e92cfe0dadc7e6326691920fc \
--hash=sha256:5731f22618435654352ef07684549a17be82b75254227fc80b4b5b0b59fc6656 \
--hash=sha256:5bc4beb6fb1de4c9ba8beee7b1a4a813fa888c3b095206dafcd25d7e6e4ed2a7 \
--hash=sha256:5c36ab984402e96792eebf4b031abfaa589aa20af3190a79c54502c16964d97e \
--hash=sha256:a2a0461992c6657f343308b150c4d6b57e9e7a0e5c2f79538434e7fb869ea827 \
--hash=sha256:a81490ee84d7a41a126b116081bd97d758f41bf706aee0a8cec24d6e4c660184 \
--hash=sha256:e00e287ea05bbc293fc6e2198301962af9b7b622bd2daf4288f925a88ae35dc9 \
--hash=sha256:e670a7b2fb7e32204ce67d274017bfff3e21139d217d60cebbfcb75b019c91ee \
--hash=sha256:ee06f255787a0b4957f357f93b78d2a11ca3761916833e3afa83f1381d4d1a46 \
--hash=sha256:fbee0d554e0e98f56dbf6d94b00a28cc32425938ad7ae98fd91f8822c5b24d45 \
--hash=sha256:fcc6d78314783f4a193f02353f431b7ea4d357f47c3c7a7d0740e723f69c64dc
PyQt6==6.4.2 \
--hash=sha256:18d1daf98d9236d55102cdadafd1056f5802f3c9288fcf7238569937b71a89f0 \
--hash=sha256:25bd399b4a95dce65d5f937c1aa85d3c7e14a21745ae2a4ca14c0116cd104290 \
--hash=sha256:740244f608fe15ee1d89695c43f31a14caeca41c4f02ac36c86dfba4a5d5813d \
--hash=sha256:c128bc0f17833e324593e3db83e99470d451a197dd17ff0333927b946c935bd9
PyQt6-Qt6==6.4.2 \
--hash=sha256:9f07c3c100cb46cca4074965e7494d4df4f0fc016497d5303c1fe135822876e1 \
--hash=sha256:a29b8c858babd523e80c8db5f8fd19792641588ec04eab49af18b7a4423eb99f \
--hash=sha256:c0e91d0275d428496cacff717a9b719c52bfa52b21f124d638b79cc2217bc81e \
--hash=sha256:d19c4e72615762cd6f0b043f23fa5f0b02656091427ce6de1efccd58e10e6a53
PyQt6-NetworkAuth==6.4.0 \
--hash=sha256:ab6178b3b2902ae9939a148555cfcee8c7803d6b0d5924cd1bd8f3407b8b9210 \
--hash=sha256:c16ec80232d88024b60d04386a23cc93067e5644a65f47f26ffb13d84dcd4a6d \
--hash=sha256:c302cd0d838c7229eda5e26e0b1b3d3ec4f8720f8d9379472bce5a89ff0735c2 \
--hash=sha256:d948fc0cf43b64afbda2acb5bf2392f785a1e7a2950d79ea850c1a3f4ae12f1a
PyQt6-NetworkAuth-Qt6==6.4.2 \
--hash=sha256:179094bcb4d4d056316c22d3d067cd94d4591da23f804461bfb025ccfa29b2b4 \
--hash=sha256:1de6abbb5fa6585b97ae49d3f64b0dfad40bd56b1a31744d9775ff26247241c8 \
--hash=sha256:79ec4b0fc9450bbedbff03541b93b10d1c7e761cd2cc16ce70d2b09dcdf8c720 \
--hash=sha256:d96d557fe61edb9b68d189f270f0393d6579c8d308e6b0d41bc0699371d7cb4e
certifi==2021.10.8 \
--hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872 \
--hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569
cryptography==3.4.8; \
--hash=sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14 \
--hash=sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e \
--hash=sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b \
--hash=sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7 \
--hash=sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085 \
--hash=sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc \
--hash=sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b
--hash=sha256:3c4129fc3fdc0fa8e40861b5ac0c673315b3c902bbdc05fc176764815b43dd1d \
--hash=sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a \
--hash=sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498 \
--hash=sha256:695104a9223a7239d155d7627ad912953b540929ef97ae0c34c7b8bf30857e89 \
--hash=sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9 \
--hash=sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c \
--hash=sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7 \
--hash=sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb \
--hash=sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14 \
--hash=sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af \
--hash=sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e \
--hash=sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5 \
--hash=sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06 \
--hash=sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7
zeroconf==0.31.0 \
--hash=sha256:53a180248471c6f81bd1fffcbce03ed93d7d8eaf10905c9121ac1ea996d19844 \
--hash=sha256:5a468da018bc3f04bbce77ae247924d802df7aeb4c291bbbb5a9616d128800b0
@ -52,20 +76,69 @@ https://software.ultimaker.com/cura-binary-dependencies/numpy-1.21.5+mkl-cp310-c
--hash=sha256:fbd5d5126b730a151134d21994a951fe28df06464e0c9a2cba2a4132e542a5fc
numpy==1.21.5; \
sys_platform!="win32" \
--hash=sha256:00c9fa73a6989895b8815d98300a20ac993c49ac36c8277e8ffeaa3631c0dbbb \
--hash=sha256:025b497014bc33fc23897859350f284323f32a2fff7654697f5a5fc2a19e9939 \
--hash=sha256:08de8472d9f7571f9d51b27b75e827f5296295fa78817032e84464be8bb905bc \
--hash=sha256:1964db2d4a00348b7a60ee9d013c8cb0c566644a589eaa80995126eac3b99ced \
--hash=sha256:2a9add27d7fc0fdb572abc3b2486eb3b1395da71e0254c5552b2aad2a18b5441 \
--hash=sha256:2d8adfca843bc46ac199a4645233f13abf2011a0b2f4affc5c37cd552626f27b \
--hash=sha256:301e408a052fdcda5cdcf03021ebafc3c6ea093021bf9d1aa47c54d48bdad166 \
--hash=sha256:a7e8f6216f180f3fd4efb73de5d1eaefb5f5a1ee5b645c67333033e39440e63a \
--hash=sha256:fc7a7d7b0ed72589fd8b8486b9b42a564f10b8762be8bd4d9df94b807af4a089 \
--hash=sha256:311283acf880cfcc20369201bd75da907909afc4666966c7895cbed6f9d2c640 \
--hash=sha256:341dddcfe3b7b6427a28a27baa59af5ad51baa59bfec3264f1ab287aa3b30b13 \
--hash=sha256:3a5098df115340fb17fc93867317a947e1dcd978c3888c5ddb118366095851f8 \
--hash=sha256:3c978544be9e04ed12016dd295a74283773149b48f507d69b36f91aa90a643e5 \
--hash=sha256:3d893b0871322eaa2f8c7072cdb552d8e2b27645b7875a70833c31e9274d4611 \
--hash=sha256:4fe6a006557b87b352c04596a6e3f12a57d6e5f401d804947bd3188e6b0e0e76 \
--hash=sha256:507c05c7a37b3683eb08a3ff993bd1ee1e6c752f77c2f275260533b265ecdb6c \
--hash=sha256:58ca1d7c8aef6e996112d0ce873ac9dfa1eaf4a1196b4ff7ff73880a09923ba7 \
--hash=sha256:61bada43d494515d5b122f4532af226fdb5ee08fe5b5918b111279843dc6836a \
--hash=sha256:69a5a8d71c308d7ef33ef72371c2388a90e3495dbb7993430e674006f94797d5 \
--hash=sha256:6a5928bc6241264dce5ed509e66f33676fc97f464e7a919edc672fb5532221ee \
--hash=sha256:7b9d6b14fc9a4864b08d1ba57d732b248f0e482c7b2ff55c313137e3ed4d8449 \
--hash=sha256:a7c4b701ca418cd39e28ec3b496e6388fe06de83f5f0cb74794fa31cfa384c02 \
--hash=sha256:a7e8f6216f180f3fd4efb73de5d1eaefb5f5a1ee5b645c67333033e39440e63a \
--hash=sha256:b545ebadaa2b878c8630e5bcdb97fc4096e779f335fc0f943547c1c91540c815 \
--hash=sha256:c293d3c0321996cd8ffe84215ffe5d269fd9d1d12c6f4ffe2b597a7c30d3e593 \
--hash=sha256:c5562bcc1a9b61960fc8950ade44d00e3de28f891af0acc96307c73613d18f6e \
--hash=sha256:ca9c23848292c6fe0a19d212790e62f398fd9609aaa838859be8459bfbe558aa \
--hash=sha256:cc1b30205d138d1005adb52087ff45708febbef0e420386f58664f984ef56954 \
--hash=sha256:dbce7adeb66b895c6aaa1fad796aaefc299ced597f6fbd9ceddb0dd735245354 \
--hash=sha256:dc4b2fb01f1b4ddbe2453468ea0719f4dbb1f5caa712c8b21bb3dd1480cd30d9 \
--hash=sha256:6a5928bc6241264dce5ed509e66f33676fc97f464e7a919edc672fb5532221ee
pyclipper==1.3.0.post2; \
--hash=sha256:c096703dc32f2e4700a1f7054e8b58c29fe86212fa7a2c2adecb0102cb639fb2 \
--hash=sha256:a1525051ced1ab74e8d32282299c24c68f3e31cd4b64e0b368720b5da65aad67 \
--hash=sha256:5960aaa012cb925ef44ecabe69528809564a3c95ceac874d95c6600f207138d3 \
--hash=sha256:d3954330c02a19f7566651a909ec4bc5733ba6c62a228ab26db4a90305748430 \
--hash=sha256:5175ee50772a7dcc0feaab19ccf5b979b6066f4753edb330700231cf70d0c918 \
--hash=sha256:19a6809d9cbd535d0fe922e9315babb8d70b5c7dcd43e0f89740d09c406b40f8 \
--hash=sha256:5c5d50498e335d7f969ca5ad5886e77c40088521dcabab4feb2f93727140251e
--hash=sha256:eed2afaa97ec33b4411995be12f8bdb95c87984eaa28d76cf628970c8a2d689a \
--hash=sha256:fc7a7d7b0ed72589fd8b8486b9b42a564f10b8762be8bd4d9df94b807af4a089
pyclipper==1.3.0.post3; \
--hash=sha256:1408461fba4985d58589fa74c59e273e8aa91d8b55c2e9a6abf966eed7562d90 \
--hash=sha256:1df7e4bce6ac68abfe926d319f52b749b7c9d5e0a6bd7112a0c7f2f908abecbc \
--hash=sha256:24b6b70114941805c14a33e9378e52d24b18791f1bfc365853d5adb33425f173 \
--hash=sha256:2b0950dada5b56a002dddccf131815a8f9b55c4df86ff6a43b7ef48a91b572aa \
--hash=sha256:2d51757df15f1721946f39016191c7d685306fc69d8a5f2933a1d22119150a1d \
--hash=sha256:341556b83ce2a5d4ee36e263e04751a9949e4161f60f0011f9500b845b25ce3c \
--hash=sha256:46b3996c8dcda562c408e653ccef8efd95a7d69400f9119df2c2cb8083d36bf8 \
--hash=sha256:5434e1e69425dc7958579b1f7bedfa8a7cce79400e1b708a42be769a165a3a2c \
--hash=sha256:5b4e0e360ebfc25d01c7e0873b27f912d1c02d99b84393d526bc01836a5fb9f4 \
--hash=sha256:60f20e96e9e055e9bb2e729fe6078969ce252c6b7b1b18d8d963e5343d99f99e \
--hash=sha256:615bece709d8c304d97089a83f8ff91ca0d2646e8fe42f2637d7cdfcf99a6e4e \
--hash=sha256:639fbc55569b94487f89261b1656e3e655d06888a582218c5432c426705d1f6f \
--hash=sha256:6748239b89a5edd00b3ce36cb5c7a177978ff3361de861fe2cc559bb2760625d \
--hash=sha256:679bfd1fd4595a3f58a706256dc6cc7179ee40fbeff4d134aa3163a9c87ca545 \
--hash=sha256:6ace0de72f252e48eda28981e24142a2b02ac17eacc3d8a2baf628671dd8cc8f \
--hash=sha256:771ba332790e88eb4aa9de2172131af25525ac23fdda789691e543962849f149 \
--hash=sha256:8fabba875314ebc751b66e571b8b0d5319c76e22051304880a552d70db2252af \
--hash=sha256:a050ec9df95e9611461adb7f86da4f066848c045d966c46e7b124593e6410e2a \
--hash=sha256:ab7e2f9b655333a37002b90bea47d77ff8d1f01293798911afa7f39217f1b71d \
--hash=sha256:b0097aef9ac8a5e10434059641fea338fb682c61993bfe65670e459ec14b4151 \
--hash=sha256:b509cfd696962683553cd6b9fc7f0baf05bff47c09fd68b085a8aea493436267 \
--hash=sha256:bad590e701eaef644899ce164631f83e39669796e552f17aef5a37238646b392 \
--hash=sha256:c586ca07c1418d4f010c6bc65215c4b193211e1b95dd8a1bd312d8207c5ccf6a \
--hash=sha256:cb5ad68b82c2aa408672444e567cea138db29790997d603525878632d61fd6ec \
--hash=sha256:cd9f0496daa9b505902848d401bfc3ffe80ee3a6863451fc6c05ceb2a45b9d8f \
--hash=sha256:da4d8f253dd8e152b3364902bed5e221165d3af4e71e2ae81eb9a9a9802089a2 \
--hash=sha256:e8d77755a00566e0f0cf48da2e42e76ff93423b55880621944f950058be3fc0e \
--hash=sha256:ebc13dbfaec1b489fc6ed92a642b8a2c7072fa2d4bc12514cc2bbeacd47c5baf \
--hash=sha256:ed5ea68bc6f3428fbf9d98f1e72e2020d763d88053cc9a9d31b2eeb49500b26f \
--hash=sha256:ee52b9d29512eb7b8b9faee6db3f8694eb6c8455785a5d2d561c40eca67b226f \
--hash=sha256:f428ecdd224ec30c1a4dbdbaac44e746cbe9a05c25627b05cc7bc2dcda235a26 \
--hash=sha256:f5f3ad171f21511813085ac549bb717bbdcc0f4da27abf6b0629438e1f23ca0b
scipy==1.9.1 \
--hash=sha256:c61b4a91a702e8e04aeb0bfc40460e1f17a640977c04dda8757efb0199c75332 \
--hash=sha256:d79da472015d0120ba9b357b28a99146cd6c17b9609403164b1a8ed149b4dfc8 \
@ -212,15 +285,62 @@ ifaddr==0.1.7 \
--hash=sha256:1f9e8a6ca6f16db5a37d3356f07b6e52344f6f9f7e806d618537731669eb1a94 \
--hash=sha256:d1f603952f0a71c9ab4e705754511e4e03b02565bc4cec7188ad6415ff534cd3
pycparser==2.20 \
--hash=sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0 \
--hash=sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705
zipp==3.5.0 \
--hash=sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3 \
--hash=sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4
cffi==1.15.0 \
--hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \
--hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \
--hash=sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3 \
--hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2
--hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2 \
--hash=sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636 \
--hash=sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20 \
--hash=sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728 \
--hash=sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27 \
--hash=sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66 \
--hash=sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443 \
--hash=sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0 \
--hash=sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7 \
--hash=sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39 \
--hash=sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605 \
--hash=sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a \
--hash=sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37 \
--hash=sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029 \
--hash=sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139 \
--hash=sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc \
--hash=sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df \
--hash=sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14 \
--hash=sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880 \
--hash=sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2 \
--hash=sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a \
--hash=sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e \
--hash=sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474 \
--hash=sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024 \
--hash=sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8 \
--hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \
--hash=sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e \
--hash=sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a \
--hash=sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e \
--hash=sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032 \
--hash=sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6 \
--hash=sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e \
--hash=sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b \
--hash=sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e \
--hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \
--hash=sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962 \
--hash=sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c \
--hash=sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4 \
--hash=sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55 \
--hash=sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962 \
--hash=sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023 \
--hash=sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c \
--hash=sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6 \
--hash=sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8 \
--hash=sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382 \
--hash=sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7 \
--hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \
--hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \
--hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796
urllib3==1.25.9 \
--hash=sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527 \
--hash=sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115

View file

@ -992,7 +992,7 @@
"display_name": "Version Upgrade 4.11 to 4.12",
"description": "Upgrades configurations from Cura 4.11 to Cura 4.12",
"package_version": "1.0.0",
"sdk_version": 7,
"sdk_version": "8.2.0",
"sdk_version_semver": "7.7.0",
"website": "https://ultimaker.com",
"author": {
@ -1003,6 +1003,40 @@
}
}
},
"VersionUpgrade413to50": {
"package_info": {
"package_id": "VersionUpgrade413to50",
"package_type": "plugin",
"display_name": "Version Upgrade 4.13 to 5.0",
"description": "Upgrades configurations from Cura 4.13 to Cura 5.0",
"package_version": "1.0.0",
"sdk_version": "8.2.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
"display_name": "UltiMaker",
"email": "plugins@ultimaker.com",
"website": "https://ultimaker.com"
}
}
},
"VersionUpgrade52to53": {
"package_info": {
"package_id": "VersionUpgrade52to53",
"package_type": "plugin",
"display_name": "Version Upgrade 5.2 to 5.3",
"description": "Upgrades configurations from Cura 5.2 to Cura 5.3",
"package_version": "1.0.0",
"sdk_version": "8.2.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
"display_name": "UltiMaker",
"email": "plugins@ultimaker.com",
"website": "https://ultimaker.com"
}
}
},
"X3DReader": {
"package_info": {
"package_id": "X3DReader",

View file

@ -133,7 +133,6 @@
"support_interface_pattern": { "value": "zigzag" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -134,7 +134,6 @@
"support_interface_pattern": { "value": "zigzag" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -121,7 +121,6 @@
"support_interface_pattern": { "value": "zigzag" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -115,7 +115,6 @@
"support_structure": { "value": "'tree'" },
"support_top_distance": { "value": "extruderValue(support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr, 'support_z_distance') + (layer_height if support_structure == 'tree' else 0)" },
"support_type": { "value": "'buildplate' if support_structure == 'tree' else 'everywhere'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -156,7 +156,6 @@
"support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_xy_overrides_z": { "value": "'xy_overrides_z'" },

View file

@ -221,7 +221,6 @@
"support_offset": { "value": "1.5" },
"support_pattern": { "default_value": "zigzag" },
"support_top_distance": { "value": "support_z_distance" },
"support_use_towers": { "value": "True" },
"support_xy_distance": { "value": "wall_line_width_0 * 2.5" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance": { "value": "layer_height" },

View file

@ -110,7 +110,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -99,7 +99,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_xy_overrides_z": { "value": "'xy_overrides_z'" },

View file

@ -160,7 +160,6 @@
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_top_distance": { "value": "extruderValue(support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr, 'support_z_distance') + (layer_height if support_structure == 'tree' else 0)" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -78,7 +78,6 @@
"speed_z_hop": { "value": "speed_travel" },
"support_bottom_distance": { "value": "layer_height" },
"support_bottom_enable": { "value": false },
"support_use_towers": { "default_value": false },
"support_wall_count": { "value": "1" },
"support_z_distance": { "value": "layer_height" },
"switch_extruder_retraction_amount": { "value": 10 },

View file

@ -123,11 +123,9 @@
"support_interface_density": { "default_value": 33.333 },
"support_interface_pattern": { "default_value": "lines" },
"support_material_flow": { "value": "material_flow * 0.95" },
"support_offset": { "default_value": 0.3 },
"support_roof_pattern": { "value": "'grid'" },
"support_top_distance": { "value": "extruderValue(support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr, 'layer_height') + (0 if support_structure == 'tree' else 0)" },
"support_tower_maximum_supported_diameter": { "value": "1" },
"support_use_towers": { "default_value": false },
"support_xy_distance": { "value": "machine_nozzle_size * 1.7" },
"support_xy_distance_overhang": { "value": "machine_nozzle_size * 1.2 if support_interface_enable else machine_nozzle_size * 0.8" },
"support_z_distance": { "value": "layer_height * 1.2 if (support_interface_enable and support_bottom_enable and layer_height < 0.16) or support_bottom_enable else layer_height" },

View file

@ -95,7 +95,6 @@
"support_pattern": { "value": "'triangles'" },
"support_roof_enable": { "value": true },
"support_type": { "value": "'everywhere'" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": 0.7 },
"support_xy_distance_overhang": { "value": 0.2 },
"support_z_distance": { "value": 0.3 },

View file

@ -115,7 +115,6 @@
"support_interface_enable": { "value": true },
"support_pattern": { "value": "'triangles'" },
"support_roof_enable": { "value": true },
"support_use_towers": { "value": false },
"support_z_distance": { "value": 0.3 },
"top_layers": { "value": 6 },
"top_thickness": { "value": "layer_height * top_layers" },

View file

@ -7,7 +7,7 @@
"author": "Ultimaker",
"manufacturer": "Unknown",
"position": "0",
"setting_version": 20,
"setting_version": 21,
"type": "extruder"
},
"settings":

View file

@ -6,7 +6,7 @@
"type": "machine",
"author": "Unknown",
"manufacturer": "Unknown",
"setting_version": 20,
"setting_version": 21,
"file_formats": "text/x-gcode;model/stl;application/x-wavefront-obj;application/x3g",
"visible": false,
"has_materials": true,
@ -1298,6 +1298,18 @@
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
"hole_xy_offset_max_diameter":
{
"label": "Hole Horizontal Expansion Max Diameter",
"description": "When greater than zero, the Hole Horizontal Expansion is gradually applied on small holes (small holes are expanded more). When set to zero the Hole Horizontal Expansion will be applied to all holes. Holes larger than the Hole Horizontal Expansion Max Diameter are not expanded.",
"unit": "mm",
"type": "float",
"default_value": 0,
"minimum_value": "0",
"enabled": "hole_xy_offset > 0",
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
"z_seam_type":
{
"label": "Z Seam Alignment",
@ -2423,7 +2435,7 @@
"minimum_value_warning": "0",
"maximum_value_warning": "285",
"maximum_value": "365",
"enabled": "machine_nozzle_temp_enabled and not (material_flow_dependent_temperature)",
"enabled": "machine_nozzle_temp_enabled",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -2485,7 +2497,7 @@
"minimum_value": "0",
"maximum_value_warning": "10.0",
"maximum_value": "machine_nozzle_heat_up_speed",
"enabled": "material_flow_dependent_temperature or (extruders_enabled_count > 1 and material_final_print_temperature != material_print_temperature)",
"enabled": "extruders_enabled_count > 1 and material_final_print_temperature != material_print_temperature",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -4117,16 +4129,6 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"limit_support_retractions":
{
"label": "Limit Support Retractions",
"description": "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure.",
"type": "bool",
"default_value": true,
"enabled": "retraction_enable and (support_enable or support_meshes_present)",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"retraction_combing":
{
"label": "Combing Mode",
@ -4419,8 +4421,9 @@
"unit": "mm/s",
"type": "float",
"default_value": 10,
"minimum_value": "0",
"minimum_value": "1",
"maximum_value_warning": "100",
"enabled": "cool_min_layer_time > 0",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -4430,18 +4433,22 @@
"description": "When the minimum speed is hit because of minimum layer time, lift the head away from the print and wait the extra time until the minimum layer time is reached.",
"type": "bool",
"default_value": false,
"enabled": "cool_min_layer_time > 0",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_min_temperature":
{
"label": "Small Layer Printing Temperature",
"description": "When reducing print speeds because of the minimum layer time, the printing temperature is gradually reduced to this temperature.",
"description": "Gradually reduce to this temperature when printing at reduced speeds because of minimum layer time.",
"unit": "\u00b0C",
"type": "float",
"value": "material_print_temperature",
"minimum_value": "material_final_print_temperature",
"maximum_value": "material_print_temperature",
"enabled": "cool_min_layer_time > 0",
"minimum_value_warning": "max(material_final_print_temperature, material_initial_print_temperature)",
"maximum_value_warning": "material_print_temperature",
"minimum_value": "-273.15",
"maximum_value": "365",
"settable_per_mesh": false,
"settable_per_extruder": true
}
@ -4719,7 +4726,7 @@
"maximum_value": "999999",
"type": "int",
"value": "1 if (support_interface_pattern == 'zigzag') else 0",
"enabled": "support_interface_enable or support_meshes_present",
"enabled": "(support_enable and support_interface_enable) or support_meshes_present",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
@ -4736,7 +4743,7 @@
"maximum_value": "999999",
"type": "int",
"value": "support_interface_wall_count",
"enabled": "support_interface_enable or support_meshes_present",
"enabled": "(support_enable and support_interface_enable) or support_meshes_present",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -4752,7 +4759,7 @@
"maximum_value": "999999",
"type": "int",
"value": "support_interface_wall_count",
"enabled": "support_interface_enable or support_meshes_present",
"enabled": "(support_enable and support_interface_enable) or support_meshes_present",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -4978,6 +4985,7 @@
"unit": "mm",
"type": "float",
"default_value": 0.3,
"value": "0 if support_bottom_enable else 0.3",
"limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr",
"minimum_value": "0",
"maximum_value_warning": "1.0",
@ -4991,10 +4999,10 @@
"unit": "mm",
"type": "float",
"default_value": 5.0,
"limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr",
"limit_to_extruder": "support_interface_extruder_nr if support_bottom_enable else support_infill_extruder_nr",
"minimum_value": "0",
"maximum_value_warning": "10.0",
"enabled": "support_enable or support_meshes_present",
"enabled": "(support_enable or support_meshes_present) and support_bottom_stair_step_height > 0",
"settable_per_mesh": true
},
"support_bottom_stair_step_min_slope":
@ -5007,7 +5015,7 @@
"limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr",
"minimum_value": "0.01",
"maximum_value": "89.99",
"enabled": "support_enable or support_meshes_present",
"enabled": "(support_enable or support_meshes_present) and support_bottom_stair_step_height > 0",
"settable_per_mesh": true
},
"support_join_distance":
@ -5030,7 +5038,8 @@
"description": "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support.",
"unit": "mm",
"type": "float",
"default_value": 0,
"default_value": 0.8,
"value": "support_line_width + 0.4",
"limit_to_extruder": "support_infill_extruder_nr",
"minimum_value_warning": "-1 * machine_nozzle_size",
"maximum_value_warning": "10 * machine_nozzle_size",
@ -5114,7 +5123,7 @@
"default_value": false,
"value": "extruderValue(support_roof_extruder_nr, 'support_interface_enable')",
"limit_to_extruder": "support_roof_extruder_nr",
"enabled": "support_enable or support_meshes_present",
"enabled": "(support_enable or support_meshes_present) and support_interface_enable",
"settable_per_mesh": true
},
"support_bottom_enable":
@ -5125,7 +5134,7 @@
"default_value": false,
"value": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable')",
"limit_to_extruder": "support_bottom_extruder_nr",
"enabled": "support_enable or support_meshes_present",
"enabled": "(support_enable or support_meshes_present) and support_interface_enable",
"settable_per_mesh": true
}
}
@ -5183,7 +5192,8 @@
"description": "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface.",
"unit": "mm",
"type": "float",
"default_value": 0.3,
"default_value": 0.2,
"value": "layer_height",
"minimum_value": "0",
"maximum_value_warning": "support_interface_height",
"limit_to_extruder": "support_interface_extruder_nr",
@ -5695,6 +5705,21 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"skirt_height":
{
"label": "Skirt Height",
"description": "Printing the innermost skirt line with multiple layers makes it easy to remove the skirt.",
"type": "int",
"default_value": 3,
"value": "3 if resolveOrValue('skirt_gap') > 0.0 else 1",
"minimum_value": "1",
"maximum_value_warning": "10",
"maximum_value": "machine_height / layer_height",
"enabled": "resolveOrValue('adhesion_type') == 'skirt'",
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"skirt_gap":
{
"label": "Skirt Distance",
@ -5795,7 +5820,7 @@
"brim_inside_margin":
{
"label": "Brim Inside Avoid Margin",
"description": "If brim is only on outside then parts fully enclosed inside another part will get a brim which might overlap with the internal holes of the outer part. This setting controls how far to stay away from those internal holes. Set to a high value to prevent any brim from being generated for parts enclosed within the holes of other parts.",
"description": "A part fully enclosed inside another part can generate an outer brim that touches the inside of the other part. This removes all brim within this distance from internal holes.",
"unit": "mm",
"type": "float",
"default_value": 2.5,
@ -5805,6 +5830,17 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"brim_smart_ordering":
{
"label": "Smart Brim",
"description": "Swap print order of the innermost and second innermost brim lines. This improves brim removal.",
"type": "bool",
"enabled": "resolveOrValue('adhesion_type') == 'brim'",
"default_value": true,
"limit_to_extruder": "skirt_brim_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"raft_margin":
{
"label": "Raft Extra Margin",
@ -6847,16 +6883,6 @@
"default_value": false,
"settable_per_mesh": true
},
"material_flow_dependent_temperature":
{
"label": "Auto Temperature",
"description": "Change the temperature for each layer automatically with the average flow speed of that layer.",
"type": "bool",
"default_value": false,
"enabled": "machine_nozzle_temp_enabled and False",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"material_flow_temp_graph":
{
"label": "Flow Temperature Graph",
@ -6864,7 +6890,7 @@
"unit": "[[mm\u00b3,\u00b0C]]",
"type": "str",
"default_value": "[[3.5, 200],[7.0, 240]]",
"enabled": "False and machine_nozzle_temp_enabled and material_flow_dependent_temperature",
"enabled": "False and machine_nozzle_temp_enabled",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -6884,7 +6910,7 @@
"interlocking_enable":
{
"label": "Generate Interlocking Structure",
"description": "Whether to generate a structure at the interface between two models of a different material in order to improve the adhesion. The structure consists of cells of horizontal beams with alternating direction which connect to each other over the Z direction in order to interlock with the beams of the other material.",
"description": "At the locations where models touch, generate an interlocking beam structure. This improves the adhesion between models, especially models printed in different materials.",
"type": "bool",
"enabled": "extruders_enabled_count > 1",
"default_value": false,
@ -6895,13 +6921,13 @@
"interlocking_beam_width":
{
"label": "Interlocking Beam Width",
"description": "The width of the beams of this material in the interlocking structure.",
"description": "The width of the interlocking structure beams.",
"type": "float",
"unit": "mm",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('interlocking_enable')",
"default_value": 0.8,
"value": "2 * wall_line_width_0",
"minimum_value": "0.001",
"minimum_value": "min_odd_wall_line_width",
"maximum_value": "min(0.5 * machine_width, 0.5 * machine_depth)",
"maximum_value_warning": "max(extruderValues('wall_line_width_0')) * 6",
"settable_per_mesh": true,
@ -6910,11 +6936,13 @@
"interlocking_orientation":
{
"label": "Interlocking Structure Orientation",
"description": "The direction of the beams of the interlocking structure in the XY plane as a rotation about the Z axis.",
"description": "The height of the beams of the interlocking structure, measured in number of layers. Less layers is stronger, but more prone to defects.",
"unit": "\u00b0",
"type": "float",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('interlocking_enable')",
"default_value": 22.5,
"minimum_value": "0",
"maximum_value": "360",
"resolve": "min(extruderValues('interlocking_orientation'))",
"settable_per_mesh": false,
"settable_per_extruder": false
@ -6922,11 +6950,12 @@
"interlocking_beam_layer_count":
{
"label": "Interlocking Beam Layer Count",
"description": "The height of the beams of the interlocking structure as measured in number of layers. Less layers is stronger, but more prone to manufacturing defects.",
"description": "The height of the beams of the interlocking structure, measured in number of layers. Less layers is stronger, but more prone to defects.",
"type": "int",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('interlocking_enable')",
"default_value": 2,
"minimum_value": "1",
"maximum_value_warning": "50",
"resolve": "max(extruderValues('interlocking_beam_layer_count'))",
"settable_per_mesh": false,
"settable_per_extruder": false
@ -6934,11 +6963,13 @@
"interlocking_depth":
{
"label": "Interlocking Depth",
"description": "The number of cells along the depth of the interface between two models where an interlocking structure is to be generated. Less cells is better, but too little cells can cause the not to be connected properly, which reduces the adhesion performance of the interlocking structure.",
"description": "The distance from the boundary between models to generate interlocking structure, measured in cells. Too few cells will result in poor adhesion.",
"type": "int",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('interlocking_enable')",
"default_value": 2,
"minimum_value": "1",
"maximum_value": "10",
"maximum_value_warning": "5",
"resolve": "max(extruderValues('interlocking_depth'))",
"settable_per_mesh": false,
"settable_per_extruder": false
@ -6946,13 +6977,15 @@
"interlocking_boundary_avoidance":
{
"label": "Interlocking Boundary Avoidance",
"description": "The distance close to the boundary of the print where not to generate an interlocking structure as measued in number of cells times 2. If set to a value lower than the Inerlocking Depth then the interlocking structure can become visible on the outside of the print near the interfaces where two models meet.",
"description": "The distance from the outside of a model where interlocking structures will not be generated, measured in cells.",
"type": "int",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('interlocking_enable')",
"default_value": 3,
"default_value": 2,
"minimum_value": "0",
"resolve": "max(extruderValues('interlocking_boundary_avoidance'))",
"minimum_value_warning": "resolveOrValue('interlocking_depth')",
"maximum_value": "10",
"maximum_value_warning": "5",
"resolve": "max(extruderValues('interlocking_boundary_avoidance'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -7786,7 +7819,7 @@
"description": "The speed at which the bridge walls are printed.",
"unit": "mm/s",
"type": "float",
"minimum_value": "cool_min_speed",
"minimum_value": "0",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "300",
"default_value": 15,
@ -7813,7 +7846,7 @@
"description": "The speed at which bridge skin regions are printed.",
"unit": "mm/s",
"type": "float",
"minimum_value": "cool_min_speed",
"minimum_value": "0",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "300",
"default_value": 15,
@ -7874,7 +7907,7 @@
"description": "Print speed to use when printing the second bridge skin layer.",
"unit": "mm/s",
"type": "float",
"minimum_value": "cool_min_speed",
"minimum_value": "0",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "300",
"default_value": 25,
@ -7926,7 +7959,7 @@
"description": "Print speed to use when printing the third bridge skin layer.",
"unit": "mm/s",
"type": "float",
"minimum_value": "cool_min_speed",
"minimum_value": "0",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "300",
"default_value": 15,

View file

@ -166,7 +166,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -114,7 +114,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 3" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -0,0 +1,49 @@
{
"version": 2,
"name": "Geeetech A10",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "Amit L",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains": { "0": "geeetech_A10_1" }
},
"overrides":
{
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "28" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.15 },
"machine_acceleration": { "default_value": 1000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 220 },
"machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-1 ;Retract filament to lower pressure\nG0 X0 Y200 ;Move hotend to left and bed forward\nM104 S0 ;Cooldown hotend\nG90 ;Switch to absolute mode\nG92 E0 ;Set extruder to zero\nM140 S0 ;Cooldown bed\nM84 ; Disable steppers" },
"machine_extruder_count": { "default_value": 1 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{
"default_value": [
[-31, 31],
[34, 31],
[34, -40],
[-31, -40]
]
},
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 260 },
"machine_max_acceleration_z": { "default_value": 500 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_jerk_e": { "default_value": 2.5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.2 },
"machine_name": { "default_value": "Geeetech A10" },
"machine_start_gcode": { "default_value": "G28 ; Auto home\nG1 Z15 F300 ;Move up slightly\nM107 ;Off fans\nG90 ;Switch to absolute positioning\nM82 ;Extruder absolute mode\nG92 E0 ;Set position of extruder to 0\nG0 X10 Y20 F1500 ;Move to X10 Y20 at 1500mms\nG1 Z0.8 ;Move Z to 0.8\nG1 F300 X180 E40 ;Extrude a line of filament\nG1 F1200 Z2 ;Raise Z\nG92 E0 ;Set extruder position to zero\nG28 ;Auto home" },
"machine_width": { "default_value": 220 },
"retraction_amount": { "default_value": 0.8 },
"retraction_speed": { "default_value": 35 }
}
}

View file

@ -1,23 +1,32 @@
{
"version": 2,
"name": "Geeetech A10M",
"inherits": "Geeetech_Base_Dual_Extruder",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "Amit L",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains":
{
"0": "Geeetech_Dual_Extruder_0",
"1": "Geeetech_Dual_Extruder_1"
},
"preferred_material": "Geeetech_PLA_Cyan"
"0": "geeetech_A10M_1",
"1": "geeetech_A10M_2"
}
},
"overrides":
{
"brim_width": { "value": 10 },
"gantry_height": { "value": 28 },
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "28" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.15 },
"machine_acceleration": { "default_value": 1000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 220 },
"machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-2.5 F2700 ;Retract filament\nG1 E-1.5 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Move away\nG1 Z10 ;lift print head\nG90 ;Switch to absolute positioning\nG28 X Y ;homing XY\nM106 S0 ;off Fan\nM104 S0 ;Cooldown hotend\nM140 S0 ;Cooldown bed\nM84 X Y E ;Disable steppers" },
"machine_end_gcode": { "default_value": "G91\nG1 E-1\nG0 X0 Y200\nM104 S0\nG90\nG92 E0\nM140 S0\nM84\nM104 S0\nM140 S0\nM84" },
"machine_extruder_count": { "default_value": 2 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{
"default_value": [
@ -28,10 +37,16 @@
]
},
"machine_height": { "default_value": 260 },
"machine_max_acceleration_z": { "default_value": 500 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_jerk_e": { "default_value": 2.5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.2 },
"machine_name": { "default_value": "Geeetech A10M" },
"machine_start_gcode": { "default_value": ";Geeetech A10M Custom Start G-code\nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\n;M106 P0 S383 ; ON MainFan 150% if need\n;M106 P1 S255 ; ON Aux Fan 100% if need\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue" },
"machine_start_gcode": { "default_value": ";GeeeTech A10M start script\nG28 ;home\nG90 ;absolute positioning\nG1 X0 Y0 Z15 E0 F300 ;go to wait position\nM140 S{material_bed_temperature_layer_0} ;set bed temp\nM109 S{material_print_temperature_layer_0} ;set extruder temp and wait\nG1 Z0.8 F200 ;set extruder height\nG1 X220 Y0 E80 F1000 ;purge line\n;end of start script" },
"machine_width": { "default_value": 220 },
"prime_tower_position_x": { "value": 190 },
"prime_tower_position_y": { "value": 160 }
"retraction_amount": { "default_value": 0.8 },
"retraction_speed": { "default_value": 35 }
}
}

View file

@ -1,24 +1,33 @@
{
"version": 2,
"name": "Geeetech A10T",
"inherits": "Geeetech_Base_Multi_Extruder",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "Amit L",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains":
{
"0": "Geeetech_Multi_Extruder_0",
"1": "Geeetech_Multi_Extruder_1",
"2": "Geeetech_Multi_Extruder_2"
},
"preferred_material": "Geeetech_PLA_Magenta"
"0": "geeetech_A10T_1",
"1": "geeetech_A10T_2",
"2": "geeetech_A10T_3"
}
},
"overrides":
{
"brim_width": { "value": 10 },
"gantry_height": { "value": 28 },
"machine_depth": { "default_value": 220 },
"machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-2.5 F2700 ;Retract filament\nG1 E-1.5 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Move away\nG1 Z10 ;lift print head\nG90 ;Switch to absolute positioning\nG28 X Y ;homing XY\nM106 S0 ;off Fan\nM104 S0 ;Cooldown hotend\nM140 S0 ;Cooldown bed\nM84 X Y E ;Disable steppers" },
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "28" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.15 },
"machine_acceleration": { "default_value": 1000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 260 },
"machine_end_gcode": { "default_value": "G91\nG1 E-1\nG0 X0 Y200\nM104 S0\nG90\nG92 E0\nM140 S0\nM84\nM104 S0\nM140 S0\nM84" },
"machine_extruder_count": { "default_value": 3 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{
"default_value": [
@ -28,11 +37,17 @@
[-31, -40]
]
},
"machine_height": { "default_value": 260 },
"machine_height": { "default_value": 220 },
"machine_max_acceleration_z": { "default_value": 500 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_jerk_e": { "default_value": 2.5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.2 },
"machine_name": { "default_value": "Geeetech A10T" },
"machine_start_gcode": { "default_value": ";Geeetech A10T Custom Start G-code\nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\n;M106 P0 S383 ; ON MainFan 150% if need\n;M106 P1 S255 ; ON Aux Fan 100% if need\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue" },
"machine_start_gcode": { "default_value": "G28 \nG1 Z15 F300\nM107\nG90\nM82\nM104 S215\nM140 S55\nG92 E0\nM109 S215\nM107\nM163 S0 P0.33\nM163 S1 P0.33\nM163 S2 P0.33\nM164 S4\nG0 X10 Y20 F6000\nG1 Z0.8\nG1 F300 X180 E40\nG1 F1200 Z2\nG92 E0\nG28" },
"machine_width": { "default_value": 220 },
"prime_tower_position_x": { "value": 190 },
"prime_tower_position_y": { "value": 160 }
"retraction_amount": { "default_value": 0.8 },
"retraction_speed": { "default_value": 35 }
}
}

View file

@ -1,17 +1,28 @@
{
"version": 2,
"name": "Geeetech A20",
"inherits": "Geeetech_Base_Single_Extruder",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"machine_extruder_trains": { "0": "Geeetech_Single_Extruder" }
"author": "Amit L",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains": { "0": "geeetech_A20_1" }
},
"overrides":
{
"gantry_height": { "value": 35 },
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "28" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.15 },
"machine_acceleration": { "default_value": 1000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 250 },
"machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-2.5 F2700 ;Retract filament\nG1 E-1.5 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Move away\nG1 Z10 ;lift print head\nG90 ;Switch to absolute positioning\nG28 X Y ;homing XY\nM106 S0 ;off Fan\nM104 S0 ;Cooldown hotend\nM140 S0 ;Cooldown bed\nM84 X Y E ;Disable steppers" },
"machine_end_gcode": { "default_value": "G91\nG1 E-1\nG0 X0 Y200\nM104 S0\nG90\nG92 E0\nM140 S0\nM84\nM104 S0\nM140 S0\nM84" },
"machine_extruder_count": { "default_value": 1 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{
"default_value": [
@ -22,8 +33,16 @@
]
},
"machine_height": { "default_value": 250 },
"machine_max_acceleration_z": { "default_value": 500 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_jerk_e": { "default_value": 2.5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.2 },
"machine_name": { "default_value": "Geeetech A20" },
"machine_start_gcode": { "default_value": ";Geeetech A20 Custom Start G-code\nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue" },
"machine_width": { "default_value": 250 }
"machine_start_gcode": { "default_value": "G28 \nG1 Z15 F300\nM107\nG90\nM82\nM104 S215\nM140 S55\nG92 E0\nM109 S215\nM107\nG0 X10 Y20 F6000\nG1 Z0.8\nG1 F300 X200 E40\nG1 F1200 Z2\nG92 E0\nG28" },
"machine_width": { "default_value": 250 },
"retraction_amount": { "default_value": 0.8 },
"retraction_speed": { "default_value": 35 }
}
}

View file

@ -1,23 +1,32 @@
{
"version": 2,
"name": "Geeetech A20M",
"inherits": "Geeetech_Base_Dual_Extruder",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "Amit L",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains":
{
"0": "Geeetech_Dual_Extruder_0",
"1": "Geeetech_Dual_Extruder_1"
},
"preferred_material": "Geeetech_PLA_Yellow"
"0": "geeetech_A20M_1",
"1": "geeetech_A20M_2"
}
},
"overrides":
{
"brim_width": { "value": 10 },
"gantry_height": { "value": 35 },
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "28" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.15 },
"machine_acceleration": { "default_value": 1000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 250 },
"machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-2.5 F2700 ;Retract filament\nG1 E-1.5 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Move away\nG1 Z10 ;lift print head\nG90 ;Switch to absolute positioning\nG28 X Y ;homing XY\nM106 S0 ;off Fan\nM104 S0 ;Cooldown hotend\nM140 S0 ;Cooldown bed\nM84 X Y E ;Disable steppers" },
"machine_end_gcode": { "default_value": "G91\nG1 E-1\nG0 X0 Y200\nM104 S0\nG90\nG92 E0\nM140 S0\nM84\nM104 S0\nM140 S0\nM84" },
"machine_extruder_count": { "default_value": 2 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{
"default_value": [
@ -28,10 +37,16 @@
]
},
"machine_height": { "default_value": 250 },
"machine_max_acceleration_z": { "default_value": 500 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_jerk_e": { "default_value": 2.5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.2 },
"machine_name": { "default_value": "Geeetech A20M" },
"machine_start_gcode": { "default_value": ";Geeetech A20M Custom Start G-code\nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\n;M106 P0 S383 ; ON MainFan 150% if need\n;M106 P1 S255 ; ON Aux Fan 100% if need\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue" },
"machine_start_gcode": { "default_value": ";GeeeTech A20M start script\nG28 ;home\nG90 ;absolute positioning\nG1 X0 Y0 Z15 E0 F300 ;go to wait position\nM140 S{material_bed_temperature_layer_0} ;set bed temp\nM109 S{material_print_temperature_layer_0} ;set extruder temp and wait\nG1 Z0.8 F200 ;set extruder height\nG1 X220 Y0 E80 F1000 ;purge line\n;end of start script" },
"machine_width": { "default_value": 250 },
"prime_tower_position_x": { "value": 220 },
"prime_tower_position_y": { "value": 190 }
"retraction_amount": { "default_value": 0.8 },
"retraction_speed": { "default_value": 35 }
}
}

View file

@ -1,24 +1,33 @@
{
"version": 2,
"name": "Geeetech A20T",
"inherits": "Geeetech_Base_Multi_Extruder",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "Amit L",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains":
{
"0": "Geeetech_Multi_Extruder_0",
"1": "Geeetech_Multi_Extruder_1",
"2": "Geeetech_Multi_Extruder_2"
},
"preferred_material": "Geeetech_PLA_Red"
"0": "geeetech_A20T_1",
"1": "geeetech_A20T_2",
"2": "geeetech_A20T_3"
}
},
"overrides":
{
"brim_width": { "value": 10 },
"gantry_height": { "value": 35 },
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "28" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.15 },
"machine_acceleration": { "default_value": 1000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 250 },
"machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-2.5 F2700 ;Retract filament\nG1 E-1.5 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Move away\nG1 Z10 ;lift print head\nG90 ;Switch to absolute positioning\nG28 X Y ;homing XY\nM106 S0 ;off Fan\nM104 S0 ;Cooldown hotend\nM140 S0 ;Cooldown bed\nM84 X Y E ;Disable steppers" },
"machine_end_gcode": { "default_value": "G91\nG1 E-1\nG0 X0 Y200\nM104 S0\nG90\nG92 E0\nM140 S0\nM84\nM104 S0\nM140 S0\nM84" },
"machine_extruder_count": { "default_value": 3 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{
"default_value": [
@ -29,10 +38,16 @@
]
},
"machine_height": { "default_value": 250 },
"machine_max_acceleration_z": { "default_value": 500 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_jerk_e": { "default_value": 2.5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.2 },
"machine_name": { "default_value": "Geeetech A20T" },
"machine_start_gcode": { "default_value": ";Geeetech A20T Custom Start G-code\nM104 S{material_print_temperature_layer_0} ; Set Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ; Wait for Bed Temperature\nM109 S{material_print_temperature_layer_0} ; Wait for Hotend Temperature\nG92 E0 ; Reset Extruder\nG28 ; Home all axes\nM107 P0 ;Off Main Fan\nM107 P1 ;Off Aux Fan\nM2012 P8 S1 F100 ; ON Light\n;M106 P0 S383 ; ON MainFan 150% if need\n;M106 P1 S255 ; ON Aux Fan 100% if need\nG1 Z5.0 F3000 ;Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y200.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y200.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y20 Z1.2 F1500 E25 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X5 Y20 Z0.4 F3000.0 ; Scrape off nozzle residue" },
"machine_start_gcode": { "default_value": "G28 \nG1 Z15 F300\nM107\nG90\nM82\nM104 S215\nM140 S55\nG92 E0\nM109 S215\nM107\nM163 S0 P0.33\nM163 S1 P0.33\nM163 S2 P0.33\nM164 S4\nG0 X10 Y20 F6000\nG1 Z0.8\nG1 F300 X200 E40\nG1 F1200 Z2\nG92 E0\nG28" },
"machine_width": { "default_value": 250 },
"prime_tower_position_x": { "value": 220 },
"prime_tower_position_y": { "value": 190 }
"retraction_amount": { "default_value": 0.8 },
"retraction_speed": { "default_value": 35 }
}
}

View file

@ -0,0 +1,49 @@
{
"version": 2,
"name": "Geeetech Mizar_S (legacy)",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "Amit L",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains": { "0": "geeetech_Mizar_S_1" }
},
"overrides":
{
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "28" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.15 },
"machine_acceleration": { "default_value": 1000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 255 },
"machine_end_gcode": { "default_value": "G91 ;Switch to relative positioning\nG1 E-1 ;Retract filament to lower pressure\nG0 X0 Y200 ;Move hotend to left and bed forward\nM104 S0 ;Cooldown hotend\nG90 ;Switch to absolute mode\nG92 E0 ;Set extruder to zero\nM140 S0 ;Cooldown bed\nM84 ; Disable steppers" },
"machine_extruder_count": { "default_value": 1 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{
"default_value": [
[-31, 31],
[34, 31],
[34, -40],
[-31, -40]
]
},
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 260 },
"machine_max_acceleration_z": { "default_value": 500 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_jerk_e": { "default_value": 2.5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.2 },
"machine_name": { "default_value": "Geeetech Mizar_S (legacy)" },
"machine_start_gcode": { "default_value": "G28 ; Auto home\nG1 Z15 F300 ;Move up slightly\nM107 ;Off fans\nG90 ;Switch to absolute positioning\nM82 ;Extruder absolute mode\nG92 E0 ;Set position of extruder to 0\nG0 X10 Y20 F1500 ;Move to X10 Y20 at 1500mms\nG1 Z0.8 ;Move Z to 0.8\nG1 F300 X180 E40 ;Extrude a line of filament\nG1 F1200 Z2 ;Raise Z\nG92 E0 ;Set extruder position to zero\nG28 ;Auto home" },
"machine_width": { "default_value": 255 },
"retraction_amount": { "default_value": 0.8 },
"retraction_speed": { "default_value": 35 }
}
}

View file

@ -0,0 +1,56 @@
{
"version": 2,
"name": "Geeetech A30",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "William & Cataldo URSO",
"manufacturer": "Geeetech",
"file_formats": "text/x-gcode",
"has_materials": true,
"machine_extruder_trains": { "0": "geeetech_a30_extruder_0" },
"preferred_quality_type": "draft"
},
"overrides":
{
"adhesion_type": { "default_value": "skirt" },
"gantry_height": { "value": "55" },
"layer_height": { "default_value": 0.1 },
"layer_height_0": { "default_value": 0.3 },
"machine_acceleration": { "default_value": 2000 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 320 },
"machine_end_gcode": { "default_value": "M104 S0;Cooling the heat end\nM140 S0;Cooling the heat bed\nG92 E1\nG1 E-1 F300\nG28 X0 Y0;Home X axis and Y axis\nM84" },
"machine_gcode_flavor": { "default_value": "Repetier" },
"machine_head_with_fans_polygon":
{
"default_value": [
[-75, 35],
[18, 35],
[18, -18],
[-75, -18]
]
},
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 420 },
"machine_max_acceleration_e": { "default_value": 10000 },
"machine_max_acceleration_x": { "default_value": 2000 },
"machine_max_acceleration_y": { "default_value": 2000 },
"machine_max_acceleration_z": { "default_value": 100 },
"machine_max_feedrate_e": { "default_value": 50 },
"machine_max_feedrate_x": { "default_value": 300 },
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 7 },
"machine_max_jerk_e": { "default_value": 5 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 1 },
"machine_name": { "default_value": "Geeetech A30" },
"machine_nozzle_size": { "default_value": 0.4 },
"machine_start_gcode": { "default_value": "G28 ;Home\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG1 Z15.0 F6000 ;Move the platform down 15mm\nG92 E0\nG1 F200 E3\nG92 E0" },
"machine_width": { "default_value": 320 },
"material_diameter": { "default_value": 1.75 },
"retraction_amount": { "default_value": 2 },
"retraction_speed": { "default_value": 25 }
}
}

View file

@ -0,0 +1,115 @@
{
"version": 2,
"name": "Gutenberg Base",
"inherits": "fdmprinter",
"metadata":
{
"visible": false,
"author": "Gutenberg Dev",
"manufacturer": "Gutenberg",
"file_formats": "text/x-gcode",
"first_start_actions": [ "MachineSettingsAction" ],
"has_machine_quality": true,
"machine_extruder_trains": { "0": "gutenberg_extruder_0" },
"preferred_material": "generic_abs",
"preferred_quality_type": "normal"
},
"overrides":
{
"acceleration_enabled": { "default_value": true },
"acceleration_layer_0": { "value": 10000 },
"acceleration_print": { "default_value": 15000 },
"acceleration_roofing": { "value": 10000 },
"acceleration_travel_layer_0": { "value": 10000 },
"acceleration_wall_0": { "value": 7500 },
"adhesion_type": { "default_value": "skirt" },
"alternate_extra_perimeter": { "default_value": true },
"bridge_fan_speed_2": { "resolve": "max(cool_fan_speed, 50)" },
"bridge_fan_speed_3": { "resolve": "max(cool_fan_speed, 20)" },
"bridge_settings_enabled": { "default_value": true },
"bridge_wall_coast": { "default_value": 10 },
"cool_fan_full_at_height": { "value": "resolveOrValue('layer_height_0') + resolveOrValue('layer_height') * max(1, cool_fan_full_layer - 1)" },
"cool_fan_full_layer": { "value": 4 },
"cool_min_layer_time": { "default_value": 15 },
"cool_min_layer_time_fan_speed_max": { "default_value": 20 },
"gantry_height": { "value": 30 },
"infill_before_walls": { "default_value": false },
"infill_enable_travel_optimization": { "default_value": true },
"jerk_roofing": { "value": 10 },
"jerk_wall_0": { "value": 10 },
"layer_height_0": { "resolve": "max(0.2, min(extruderValues('layer_height')))" },
"line_width": { "value": "machine_nozzle_size * 1.125" },
"machine_acceleration": { "default_value": 1500 },
"machine_depth": { "default_value": 165 },
"machine_end_gcode": { "default_value": "END_PRINT" },
"machine_endstop_positive_direction_x": { "default_value": true },
"machine_endstop_positive_direction_y": { "default_value": true },
"machine_endstop_positive_direction_z": { "default_value": false },
"machine_feeder_wheel_diameter": { "default_value": 7.5 },
"machine_head_with_fans_polygon":
{
"default_value": [
[-35, 65],
[-35, -50],
[35, -50],
[35, 65]
]
},
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 165 },
"machine_max_acceleration_x": { "default_value": 15000 },
"machine_max_acceleration_y": { "default_value": 15000 },
"machine_max_acceleration_z": { "default_value": 250 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_max_jerk_e": { "default_value": 60 },
"machine_name": { "default_value": "GUTENBERG 3DP" },
"machine_start_gcode": { "default_value": ";Simple\nSTART_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0}\n;Or with custom bed mesh area\n;START_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0} AREA_START=%MINX%,%MINY% AREA_END=%MAXX%,%MAXY% FILAMENT_TYPE={material_type}" },
"machine_steps_per_mm_x": { "default_value": 160 },
"machine_steps_per_mm_y": { "default_value": 160 },
"machine_steps_per_mm_z": { "default_value": 800 },
"machine_use_extruder_offset_to_offset_coords": { "value": false },
"machine_width": { "default_value": 165 },
"material_diameter": { "default_value": 1.75 },
"meshfix_maximum_resolution": { "default_value": 0.01 },
"min_infill_area": { "default_value": 5.0 },
"minimum_polygon_circumference": { "default_value": 0.2 },
"optimize_wall_printing_order": { "default_value": true },
"retraction_amount": { "default_value": 0.8 },
"retraction_combing": { "value": "'noskin'" },
"retraction_combing_max_distance": { "default_value": 10 },
"retraction_hop": { "default_value": 0.2 },
"retraction_hop_enabled": { "default_value": true },
"retraction_prime_speed":
{
"maximum_value_warning": 130,
"value": "math.ceil(retraction_speed * 0.4)"
},
"retraction_retract_speed": { "maximum_value_warning": 130 },
"retraction_speed":
{
"default_value": 35,
"maximum_value_warning": 130
},
"roofing_layer_count": { "value": 1 },
"skirt_brim_minimal_length": { "default_value": 550 },
"speed_layer_0": { "value": "math.ceil(speed_print * 0.25)" },
"speed_roofing": { "value": "math.ceil(speed_print * 0.33)" },
"speed_slowdown_layers": { "default_value": 4 },
"speed_topbottom": { "value": "math.ceil(speed_print * 0.33)" },
"speed_travel":
{
"maximum_value_warning": 501,
"value": 300
},
"speed_travel_layer_0": { "value": "math.ceil(speed_travel * 0.4)" },
"speed_wall": { "value": "math.ceil(speed_print * 0.33)" },
"speed_wall_0": { "value": "math.ceil(speed_print * 0.33)" },
"speed_wall_x": { "value": "math.ceil(speed_print * 0.66)" },
"travel_avoid_other_parts": { "default_value": false },
"wall_line_width": { "value": "machine_nozzle_size" },
"wall_overhang_angle": { "default_value": 75 },
"wall_overhang_speed_factor": { "default_value": 50 },
"zig_zaggify_infill": { "value": true }
}
}

View file

@ -0,0 +1,17 @@
{
"version": 2,
"name": "G-ZERO",
"inherits": "gutenberg_base",
"metadata":
{
"visible": true,
"quality_definition": "gutenberg_base"
},
"overrides":
{
"machine_depth": { "default_value": 200 },
"machine_height": { "default_value": 201 },
"machine_name": { "default_value": "G-ZERO" },
"machine_width": { "default_value": 250 }
}
}

View file

@ -316,7 +316,6 @@
"support_join_distance": { "value": 5.0 },
"support_offset": { "value": 3.0 },
"support_tree_angle": { "value": 60 },
"support_use_towers": { "value": false },
"support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" },
"support_z_distance": { "value": "layer_height if (2*layer_height > 0.8*machine_nozzle_size) else (2*layer_height)" },
"top_bottom_pattern": { "value": "'zigzag'" },

View file

@ -226,7 +226,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -72,7 +72,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -90,7 +90,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -90,7 +90,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -142,7 +142,6 @@
"speed_wall_x": { "value": "speed_wall" },
"support_angle": { "value": "45" },
"support_pattern": { "value": "'triangles'" },
"support_use_towers": { "value": "False" },
"support_xy_distance": { "value": "wall_line_width_0 * 2.5" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance": { "value": "0" },

View file

@ -111,7 +111,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -61,7 +61,6 @@
"speed_wall_x": { "value": 32 },
"support_infill_rate": { "value": 5 },
"support_pattern": { "default_value": "lines" },
"support_use_towers": { "value": false },
"switch_extruder_retraction_amount": { "value": 100 },
"switch_extruder_retraction_speeds": { "value": 60 },
"wall_overhang_speed_factor": { "value": 50 },

View file

@ -53,7 +53,6 @@
"jerk_enabled": { "value": false },
"layer_height": { "value": 0.16 },
"layer_height_0": { "value": 0.32 },
"limit_support_retractions": { "value": true },
"line_width": { "value": 0.4 },
"machine_depth": { "default_value": 300 },
"machine_end_gcode": { "default_value": "M104 S0\n M140 S0\n ;Retract the filament\n G92 E1\n G1 E-1 F300\n G28 X0 Y0\n G1 Y300 F3000 ;Move bed forward\n M84" },
@ -125,7 +124,6 @@
"support_tower_diameter": { "value": 3 },
"support_tower_roof_angle": { "value": "65" },
"support_type": { "value": "'everywhere'" },
"support_use_towers": { "value": true },
"support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" },
"support_xy_distance": { "value": 0.7 },
"support_xy_distance_overhang": { "value": 0.2 },

View file

@ -162,7 +162,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -132,10 +132,8 @@
"support_interface_enable": { "default_value": true },
"support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "default_value": "grid" },
"support_interface_skip_height": { "default_value": 0.24 },
"support_pattern": { "default_value": "zigzag" },
"support_type": { "default_value": "buildplate" },
"support_use_towers": { "default_value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -75,7 +75,6 @@
"support_interface_density": { "value": 40 },
"support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 3" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance": { "value": "layer_height if layer_height >= 0.2 else layer_height * 2" },

View file

@ -75,7 +75,6 @@
"support_interface_density": { "value": 40 },
"support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 3" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance": { "value": "layer_height if layer_height >= 0.2 else layer_height * 2" },

View file

@ -228,7 +228,6 @@
"support_interface_material_flow": { "value": "99" },
"support_line_distance": { "value": "0 if support_infill_rate == 0 else (support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))" },
"support_material_flow": { "value": "98" },
"support_offset": { "default_value": 0.2 },
"support_roof_density": { "value": "70" },
"support_roof_extruder_nr": { "value": "0" },
"support_roof_height": { "value": "0.4" },
@ -238,7 +237,6 @@
"support_skip_zag_per_mm": { "default_value": 10 },
"support_top_distance": { "value": "0.2" },
"support_tree_collision_resolution": { "value": "0.2" },
"support_use_towers": { "default_value": false },
"support_xy_distance": { "default_value": 0.6 },
"support_xy_distance_overhang": { "value": "0.5" },
"support_z_distance": { "default_value": 0.2 },

View file

@ -277,7 +277,6 @@
"maximum_value_warning": "machine_nozzle_size*1.5",
"value": "extruderValue(support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr, 'support_z_distance')"
},
"support_use_towers": { "default_value": true },
"support_xy_distance": { "value": "line_width * 1.7" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance":

View file

@ -72,7 +72,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -113,7 +113,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" },
"support_xy_distance": { "value": "wall_line_width_0 * 3" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -70,7 +70,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -37,6 +37,11 @@
"bridge_wall_material_flow": { "value": "wall_material_flow" },
"bridge_wall_speed": { "value": "bridge_skin_speed" },
"cool_fan_speed_0": { "value": "cool_fan_speed_min" },
"cool_fan_speed_max": { "value": "100" },
"cool_min_layer_time": { "value": 6 },
"cool_min_layer_time_fan_speed_max": { "value": "cool_min_layer_time + 5" },
"cool_min_speed": { "value": "round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5)" },
"cool_min_temperature": { "value": "max([material_final_print_temperature, material_initial_print_temperature, material_print_temperature - 15])" },
"gradual_support_infill_step_height": { "value": "4 * layer_height" },
"gradual_support_infill_steps": { "value": "2 if support_interface_enable else 0" },
"infill_material_flow": { "value": "(1.95-infill_sparse_density / 100 if infill_sparse_density > 95 else 1) * material_flow" },
@ -76,7 +81,6 @@
},
"meshfix_maximum_deviation": { "value": "machine_nozzle_size / 10" },
"meshfix_maximum_resolution": { "value": "max(speed_wall_0 / 75, 0.5)" },
"minimum_support_area": { "value": "2" },
"raft_base_speed": { "value": "raft_speed" },
"raft_base_thickness": { "value": "min(machine_nozzle_size * 0.75, 0.3)" },
"raft_interface_fan_speed": { "value": "(raft_base_fan_speed + raft_surface_fan_speed) / 2" },
@ -112,12 +116,10 @@
"support_interface_material_flow": { "value": "skin_material_flow" },
"support_interface_offset": { "value": "support_offset" },
"support_interface_pattern": { "value": "'zigzag'" },
"support_interface_skip_height": { "value": "layer_height" },
"support_line_distance": { "minimum_value_warning": "0 if support_structure == 'tree' else support_line_width" },
"support_offset": { "value": "3 if support_interface_enable else 0" },
"support_use_towers": { "value": false },
"support_tower_maximum_supported_diameter": { "value": "support_tower_diameter" },
"support_tower_roof_angle": { "value": "0 if support_interface_enable else 65" },
"support_wall_count": { "value": "1 if support_structure == 'tree' else 0" },
"support_xy_distance": { "value": "1" },
"support_xy_distance_overhang": { "value": "0.2" },
"support_z_distance": { "value": "0" },
"top_layers": { "value": "math.ceil(round(top_thickness / resolveOrValue('layer_height'), 4))" },

View file

@ -101,16 +101,6 @@
"machine_width": { "default_value": 223 },
"material_bed_temperature": { "maximum_value": 110 },
"material_bed_temperature_layer_0": { "maximum_value": 110 },
"material_final_print_temperature":
{
"maximum_value": 260,
"value": "material_print_temperature"
},
"material_initial_print_temperature":
{
"maximum_value": 260,
"value": "material_print_temperature"
},
"material_print_temperature": { "maximum_value": 260 },
"material_print_temperature_layer_0": { "maximum_value": 260 },
"meshfix_maximum_deviation": { "value": "(layer_height / 3) if magic_spiralize else (layer_height / 4)" },

View file

@ -60,8 +60,6 @@
"acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 3500)" },
"brim_width": { "value": "3" },
"cool_fan_speed": { "value": "50" },
"cool_fan_speed_max": { "value": "100" },
"cool_min_speed": { "value": "5" },
"default_material_print_temperature": { "value": "200" },
"extruder_prime_pos_abs": { "default_value": true },
"gantry_height": { "value": "60" },

View file

@ -58,8 +58,6 @@
"acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" },
"brim_width": { "value": "3" },
"cool_fan_speed": { "value": "50" },
"cool_fan_speed_max": { "value": "100" },
"cool_min_speed": { "value": "5" },
"default_material_print_temperature": { "value": "200" },
"extruder_prime_pos_abs": { "default_value": true },
"gantry_height": { "value": "55" },

View file

@ -60,8 +60,6 @@
"brim_width": { "value": "3" },
"build_volume_temperature": { "maximum_value": 50 },
"cool_fan_speed": { "value": "50" },
"cool_fan_speed_max": { "value": "100" },
"cool_min_speed": { "value": "5" },
"default_material_print_temperature": { "value": "200" },
"extruder_prime_pos_abs": { "default_value": true },
"gantry_height": { "value": "55" },

View file

@ -0,0 +1,50 @@
{
"version": 2,
"name": "Ultimaker S7",
"inherits": "ultimaker_s5",
"metadata":
{
"visible": true,
"author": "Ultimaker",
"manufacturer": "Ultimaker B.V.",
"file_formats": "application/x-ufp;text/x-gcode",
"platform": "ultimaker_s7_platform.obj",
"bom_numbers": [
5078167
],
"firmware_update_info":
{
"check_urls": [ "https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version" ],
"id": 5078167,
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
},
"first_start_actions": [ "DiscoverUM3Action" ],
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"machine_extruder_trains":
{
"0": "ultimaker_s7_extruder_left",
"1": "ultimaker_s7_extruder_right"
},
"nozzle_offsetting_for_disallowed_areas": false,
"platform_offset": [
0,
0,
0
],
"platform_texture": "UltimakerS7backplate.png",
"preferred_variant_name": "AA 0.4",
"quality_definition": "ultimaker_s5",
"supported_actions": [ "DiscoverUM3Action" ],
"supports_material_export": true,
"supports_network_connection": true,
"supports_usb_connection": false,
"variants_name": "Print core",
"weight": -2
},
"overrides":
{
"machine_name": { "default_value": "Ultimaker S7" }
}
}

View file

@ -101,7 +101,6 @@
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" },
"support_use_towers": { "value": false },
"support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View file

@ -196,7 +196,7 @@
"wall_line_width": { "value": "machine_nozzle_size" },
"wall_overhang_angle": { "default_value": 75 },
"wall_overhang_speed_factor": { "default_value": 50 },
"xy_offset_layer_0": { "value": 0.3 },
"xy_offset_layer_0": { "value": -0.3 },
"z_seam_type": { "value": "'back'" },
"zig_zaggify_infill": { "value": true }
}

View file

@ -262,7 +262,6 @@
"support_fan_enable": { "value": true },
"support_pattern": { "value": "'zigzag'" },
"support_supported_skin_fan_speed": { "value": 100 },
"support_use_towers": { "value": true },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" },

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A10M",
"position": "0"
},
"overrides":
{
"extruder_nr":
{
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A10M",
"position": "1"
},
"overrides":
{
"extruder_nr":
{
"default_value": 1,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A10T",
"position": "0"
},
"overrides":
{
"extruder_nr":
{
"default_value": 0,
"maximum_value": "2"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A10T",
"position": "1"
},
"overrides":
{
"extruder_nr":
{
"default_value": 1,
"maximum_value": "2"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 3",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A10T",
"position": "2"
},
"overrides":
{
"extruder_nr":
{
"default_value": 2,
"maximum_value": "2"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,16 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A10",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A20M",
"position": "0"
},
"overrides":
{
"extruder_nr":
{
"default_value": 0,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A20M",
"position": "1"
},
"overrides":
{
"extruder_nr":
{
"default_value": 1,
"maximum_value": "1"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A20T",
"position": "0"
},
"overrides":
{
"extruder_nr":
{
"default_value": 0,
"maximum_value": "2"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,20 @@
{
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata":
{
"machine": "geeetech_A20T",
"position": "1"
},
"overrides":
{
"extruder_nr":
{
"default_value": 1,
"maximum_value": "2"
},
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

Some files were not shown because too many files have changed in this diff Show more