mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-24 07:03:56 -06:00
Merge branch 'main' into CURA-11078_python_312_spike
This commit is contained in:
commit
052c37ae6f
291 changed files with 76894 additions and 67230 deletions
91
.github/workflows/installers.yml
vendored
91
.github/workflows/installers.yml
vendored
|
@ -31,20 +31,23 @@ on:
|
|||
type: boolean
|
||||
|
||||
schedule:
|
||||
# Daily at 5:15 CET
|
||||
# Daily at 4:15 CET (main-branch) and 5:15 CET (release-branch)
|
||||
- cron: '15 3 * * *'
|
||||
- cron: '15 4 * * *'
|
||||
|
||||
env:
|
||||
CURA_CONAN_VERSION: ${{ inputs.cura_conan_version || 'cura/latest@ultimaker/testing' }}
|
||||
CONAN_ARGS: ${{ inputs.conan_args || '' }}
|
||||
ENTERPRISE: ${{ inputs.enterprise || false }}
|
||||
STAGING: ${{ inputs.staging || false }}
|
||||
LATEST_RELEASE: '5.6'
|
||||
LATEST_RELEASE_SCHEDULE_HOUR: 4
|
||||
|
||||
jobs:
|
||||
default-values:
|
||||
default_values:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
cura_conan_version: ${{ steps.default.outputs.cura_conan_version }}
|
||||
release_tag: ${{ steps.default.outputs.release_tag }}
|
||||
|
||||
steps:
|
||||
- name: Output default values
|
||||
|
@ -52,7 +55,17 @@ jobs:
|
|||
shell: python
|
||||
run: |
|
||||
import os
|
||||
cura_conan_version = "cura/latest@ultimaker/testing" if "${{ github.event.inputs.cura_conan_version }}" == "" else "${{ github.event.inputs.cura_conan_version }}"
|
||||
import datetime
|
||||
|
||||
if "${{ github.event_name }}" != "schedule":
|
||||
cura_conan_version = "${{ github.event.inputs.cura_conan_version }}"
|
||||
else:
|
||||
now = datetime.datetime.now()
|
||||
cura_conan_version = "cura/latest@ultimaker/stable" if now.hour == int(os.environ['LATEST_RELEASE_SCHEDULE_HOUR']) else "cura/latest@ultimaker/testing"
|
||||
|
||||
release_tag = f"nightly-{os.environ['LATEST_RELEASE']}" if "/stable" in cura_conan_version else "nightly"
|
||||
|
||||
# Set cura_conan_version environment variable
|
||||
output_env = os.environ["GITHUB_OUTPUT"]
|
||||
content = ""
|
||||
if os.path.exists(output_env):
|
||||
|
@ -61,12 +74,24 @@ jobs:
|
|||
with open(output_env, "w") as f:
|
||||
f.write(content)
|
||||
f.writelines(f"cura_conan_version={cura_conan_version}\n")
|
||||
f.writelines(f"release_tag={release_tag}\n")
|
||||
|
||||
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(f"# cura_conan_version = {cura_conan_version}\n")
|
||||
f.writelines(f"# release_tag = {release_tag}\n")
|
||||
|
||||
windows-installer:
|
||||
uses: ./.github/workflows/windows.yml
|
||||
needs: [ default-values ]
|
||||
needs: [ default_values ]
|
||||
with:
|
||||
cura_conan_version: ${{ needs.default-values.outputs.cura_conan_version }}
|
||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||
conan_args: ${{ github.event.inputs.conan_args }}
|
||||
enterprise: ${{ github.event.inputs.enterprise == 'true' }}
|
||||
staging: ${{ github.event.inputs.staging == 'true' }}
|
||||
|
@ -76,9 +101,9 @@ jobs:
|
|||
|
||||
linux-installer:
|
||||
uses: ./.github/workflows/linux.yml
|
||||
needs: [ default-values ]
|
||||
needs: [ default_values ]
|
||||
with:
|
||||
cura_conan_version: ${{ needs.default-values.outputs.cura_conan_version }}
|
||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||
conan_args: ${{ github.event.inputs.conan_args }}
|
||||
enterprise: ${{ github.event.inputs.enterprise == 'true' }}
|
||||
staging: ${{ github.event.inputs.staging == 'true' }}
|
||||
|
@ -88,33 +113,33 @@ jobs:
|
|||
|
||||
macos-installer:
|
||||
uses: ./.github/workflows/macos.yml
|
||||
needs: [ default-values ]
|
||||
needs: [ default_values ]
|
||||
with:
|
||||
cura_conan_version: ${{ needs.default-values.outputs.cura_conan_version }}
|
||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||
conan_args: ${{ github.event.inputs.conan_args }}
|
||||
enterprise: ${{ github.event.inputs.enterprise == 'true' }}
|
||||
staging: ${{ github.event.inputs.staging == 'true' }}
|
||||
architecture: X64
|
||||
operating_system: macos-12
|
||||
operating_system: self-hosted-X64
|
||||
secrets: inherit
|
||||
|
||||
macos-arm-installer:
|
||||
uses: ./.github/workflows/macos.yml
|
||||
needs: [ default-values ]
|
||||
needs: [ default_values ]
|
||||
with:
|
||||
cura_conan_version: ${{ needs.default-values.outputs.cura_conan_version }}
|
||||
cura_conan_version: ${{ needs.default_values.outputs.cura_conan_version }}
|
||||
conan_args: ${{ github.event.inputs.conan_args }}
|
||||
enterprise: ${{ github.event.inputs.enterprise == 'true' }}
|
||||
staging: ${{ github.event.inputs.staging == 'true' }}
|
||||
architecture: ARM64
|
||||
operating_system: self-hosted
|
||||
operating_system: self-hosted-ARM64
|
||||
secrets: inherit
|
||||
|
||||
# Run and update nightly release when the nightly input is set to true or if the schedule is triggered
|
||||
update-nightly-release:
|
||||
if: ${{ inputs.nightly || github.event_name == 'schedule' }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: [ windows-installer, linux-installer, macos-installer, macos-arm-installer ]
|
||||
needs: [ default_values, windows-installer, linux-installer, macos-installer, macos-arm-installer ]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
@ -182,8 +207,8 @@ jobs:
|
|||
|
||||
- name: Update nightly release for Linux
|
||||
run: |
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-linux-X64.AppImage --clobber
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-linux-X64.AppImage.asc --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-linux-X64.AppImage --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-linux-X64.AppImage.asc --clobber
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
@ -206,8 +231,8 @@ jobs:
|
|||
|
||||
- name: Update nightly release for Windows
|
||||
run: |
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.msi --clobber
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.exe --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.msi --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-win64-X64.exe --clobber
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
@ -230,8 +255,8 @@ jobs:
|
|||
|
||||
- name: Update nightly release for MacOS (X64)
|
||||
run: |
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.dmg --clobber
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.pkg --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.dmg --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-X64.pkg --clobber
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
@ -254,14 +279,32 @@ jobs:
|
|||
|
||||
- name: Update nightly release for MacOS (ARM-64)
|
||||
run: |
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.dmg --clobber
|
||||
gh release upload nightly installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.pkg --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.dmg --clobber
|
||||
gh release upload ${{ needs.default_values.outputs.release_tag }} installers/${{ steps.filename.outputs.NIGHTLY_NAME }}-macos-ARM64.pkg --clobber
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: create the release notes
|
||||
shell: python
|
||||
run: |
|
||||
import os
|
||||
import datetime
|
||||
from jinja2 import Template
|
||||
|
||||
with open(".github/workflows/release_notes.md.jinja", "r") as f:
|
||||
release_notes = Template(f.read())
|
||||
|
||||
current_nightly_beta = "${{ needs.default_values.outputs.release_tag }}".split("nightly-")[-1]
|
||||
with open("release-notes.md", "w") as f:
|
||||
f.write(release_notes.render(
|
||||
timestamp="${{ steps.filename.outputs.NIGHTLY_TIME }}",
|
||||
branch="" if "${{ needs.default-values.outputs.release_tag == 'nightly' }}" == 'true' else current_nightly_beta,
|
||||
branch_specific="" if os.getenv("GITHUB_REF") == "refs/heads/main" else f"?branch={current_nightly_beta}",
|
||||
))
|
||||
|
||||
- name: Update nightly release description (with date)
|
||||
if: always()
|
||||
run: |
|
||||
gh release edit nightly --title "${{ steps.filename.outputs.NIGHTLY_NAME }}" --notes "Nightly release created on: ${{ steps.filename.outputs.NIGHTLY_TIME }}"
|
||||
gh release edit ${{ needs.default_values.outputs.release_tag }} --title "${{ steps.filename.outputs.NIGHTLY_NAME }}" --notes-file release-notes.md
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
47
.github/workflows/linux.yml
vendored
47
.github/workflows/linux.yml
vendored
|
@ -106,16 +106,8 @@ jobs:
|
|||
$HOME/.conan/conan_download_cache
|
||||
key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache
|
||||
|
||||
- name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards
|
||||
if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }}
|
||||
run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y
|
||||
|
||||
# NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest.
|
||||
# This is maybe because grub caches the disk it uses last time, which is recreated each time.
|
||||
- name: Install Linux system requirements
|
||||
run: |
|
||||
sudo rm /var/cache/debconf/config.dat
|
||||
sudo dpkg --configure -a
|
||||
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
|
||||
sudo apt update
|
||||
sudo apt upgrade
|
||||
|
@ -155,7 +147,12 @@ jobs:
|
|||
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
|
||||
|
||||
- name: Create the Packages (Bash)
|
||||
run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json"
|
||||
run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING -c tools.build:skip_test=True
|
||||
|
||||
- name: Remove internal packages before uploading
|
||||
run: |
|
||||
conan remove "*@internal/*" -f || true
|
||||
conan remove "cura_private_data*" -f || true
|
||||
|
||||
- name: Upload the Package(s)
|
||||
if: always()
|
||||
|
@ -199,19 +196,12 @@ jobs:
|
|||
f.write(content)
|
||||
f.writelines(f"INSTALLER_FILENAME={installer_filename}\n")
|
||||
|
||||
- name: Summarize the used Conan dependencies
|
||||
- name: Summarize the used 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"]])
|
||||
from cura.CuraVersion import ConanInstalls, PythonInstalls
|
||||
|
||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||
content = ""
|
||||
|
@ -223,25 +213,12 @@ jobs:
|
|||
f.write(content)
|
||||
f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n")
|
||||
f.writelines("## Conan packages:\n")
|
||||
for dep in sorted_deps:
|
||||
f.writelines(f"`{dep}`\n")
|
||||
for dep_name, dep_info in ConanInstalls.items():
|
||||
f.writelines(f"`{dep_name} {dep_info['version']} {dep_info['revision']}`\n")
|
||||
|
||||
- name: Summarize the used Python modules
|
||||
shell: python
|
||||
run: |
|
||||
import os
|
||||
import pkg_resources
|
||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||
content = ""
|
||||
if os.path.exists(summary_env):
|
||||
with open(summary_env, "r") as f:
|
||||
content = f.read()
|
||||
|
||||
with open(summary_env, "w") as f:
|
||||
f.write(content)
|
||||
f.writelines("## Python modules:\n")
|
||||
for package in pkg_resources.working_set:
|
||||
f.writelines(f"`{package.key}/{package.version}`\n")
|
||||
for dep_name, dep_info in PythonInstalls.items():
|
||||
f.writelines(f"`{dep_name} {dep_info['version']}`\n")
|
||||
|
||||
- name: Create the Linux AppImage (Bash)
|
||||
run: |
|
||||
|
|
53
.github/workflows/macos.yml
vendored
53
.github/workflows/macos.yml
vendored
|
@ -27,7 +27,7 @@ on:
|
|||
architecture:
|
||||
description: 'Architecture'
|
||||
required: true
|
||||
default: 'X64'
|
||||
default: 'ARM64'
|
||||
type: choice
|
||||
options:
|
||||
- X64
|
||||
|
@ -35,10 +35,11 @@ on:
|
|||
operating_system:
|
||||
description: 'OS'
|
||||
required: true
|
||||
default: 'macos-11'
|
||||
default: 'self-hosted-ARM64'
|
||||
type: choice
|
||||
options:
|
||||
- self-hosted
|
||||
- self-hosted-X64
|
||||
- self-hosted-ARM64
|
||||
- macos-11
|
||||
- macos-12
|
||||
workflow_call:
|
||||
|
@ -66,12 +67,12 @@ on:
|
|||
architecture:
|
||||
description: 'Architecture'
|
||||
required: true
|
||||
default: 'X64'
|
||||
default: 'ARM64'
|
||||
type: string
|
||||
operating_system:
|
||||
description: 'OS'
|
||||
required: true
|
||||
default: 'macos-11'
|
||||
default: 'self-hosted-ARM64'
|
||||
type: string
|
||||
|
||||
env:
|
||||
|
@ -102,7 +103,7 @@ jobs:
|
|||
- name: Setup Python and pip
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10.x'
|
||||
python-version: '3.11.x'
|
||||
cache: 'pip'
|
||||
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
||||
|
||||
|
@ -155,10 +156,14 @@ jobs:
|
|||
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
|
||||
|
||||
- name: Create the Packages (Bash)
|
||||
run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json"
|
||||
run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING -c tools.build:skip_test=True
|
||||
|
||||
- name: Remove internal packages before uploading
|
||||
run: |
|
||||
conan remove "*@internal/*" -f || true
|
||||
conan remove "cura_private_data*" -f || true
|
||||
|
||||
- name: Upload the Package(s)
|
||||
if: ${{ inputs.operating_system != 'self-hosted' }}
|
||||
run: |
|
||||
conan upload "*" -r cura --all -c
|
||||
|
||||
|
@ -203,19 +208,12 @@ jobs:
|
|||
f.write(content)
|
||||
f.writelines(f"INSTALLER_FILENAME={installer_filename}\n")
|
||||
|
||||
- name: Summarize the used Conan dependencies
|
||||
- name: Summarize the used 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"]])
|
||||
from cura.CuraVersion import ConanInstalls, PythonInstalls
|
||||
|
||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||
content = ""
|
||||
|
@ -227,25 +225,12 @@ jobs:
|
|||
f.write(content)
|
||||
f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n")
|
||||
f.writelines("## Conan packages:\n")
|
||||
for dep in sorted_deps:
|
||||
f.writelines(f"`{dep}`\n")
|
||||
for dep_name, dep_info in ConanInstalls.items():
|
||||
f.writelines(f"`{dep_name} {dep_info['version']} {dep_info['revision']}`\n")
|
||||
|
||||
- name: Summarize the used Python modules
|
||||
shell: python
|
||||
run: |
|
||||
import os
|
||||
import pkg_resources
|
||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||
content = ""
|
||||
if os.path.exists(summary_env):
|
||||
with open(summary_env, "r") as f:
|
||||
content = f.read()
|
||||
|
||||
with open(summary_env, "w") as f:
|
||||
f.write(content)
|
||||
f.writelines("## Python modules:\n")
|
||||
for package in pkg_resources.working_set:
|
||||
f.writelines(f"`{package.key}/{package.version}`\n")
|
||||
for dep_name, dep_info in PythonInstalls.items():
|
||||
f.writelines(f"`{dep_name} {dep_info['version']}`\n")
|
||||
|
||||
- name: Create the Macos dmg (Bash)
|
||||
run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_dmg --build_pkg --app_name "$CURA_APP_NAME"
|
||||
|
|
39
.github/workflows/release_notes.md.jinja
vendored
Normal file
39
.github/workflows/release_notes.md.jinja
vendored
Normal file
|
@ -0,0 +1,39 @@
|
|||
# Nightlies
|
||||
|
||||
> :clock12: Created at: {{ timestamp }}
|
||||
|
||||
| | |
|
||||
|--------------:|--------------------------------------------------------------------------------------------|
|
||||
| **Nightlies** | [](https://github.com/Ultimaker/Cura/actions/workflows/installers.yml) |
|
||||
|
||||
# Unit Test results
|
||||
|
||||
| | |
|
||||
|-------------------------------:|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| **Cura {{ branch }}** | [](https://github.com/Ultimaker/Cura/actions/workflows/unit-test.yml) |
|
||||
| **CuraEngine {{ branch }}** | [](https://github.com/Ultimaker/CuraEngine/actions/workflows/unit-test.yml) |
|
||||
| **Uranium {{ branch }}** | [](https://github.com/Ultimaker/Uranium/actions/workflows/unit-test.yml) |
|
||||
| **CuraEngine GradualFlow 0.1** | [](https://github.com/Ultimaker/CuraEngine_plugin_gradual_flow/actions/workflows/unit-test.yml) |
|
||||
| **synsepalum-dulcificum 0.1** | [](https://github.com/Ultimaker/synsepalum-dulcificum/actions/workflows/unit-test.yml) |
|
||||
| **libSavitar** | [](https://github.com/Ultimaker/libSavitar/actions/workflows/unit-test.yml) |
|
||||
| **libnest2d** | [](https://github.com/Ultimaker/libnest2d/actions/workflows/unit-test.yml) |
|
||||
|
||||
# Conan packages
|
||||
|
||||
| | |
|
||||
|------------------------------------:|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| **Cura {{ branch }}** | [](https://github.com/Ultimaker/Cura/actions/workflows/conan-package.yml) |
|
||||
| **CuraEngine {{ branch }}** | [](https://github.com/Ultimaker/CuraEngine/actions/workflows/conan-package.yml) |
|
||||
| **Uranium {{ branch }}** | [](https://github.com/Ultimaker/Uranium/actions/workflows/conan-package.yml) |
|
||||
| **fdm_materials {{ branch }}** | [](https://github.com/Ultimaker/fdm_materials/actions/workflows/conan-package.yml) |
|
||||
| **cura-binary-data {{ branch }}** | [](https://github.com/Ultimaker/cura-binary-data/actions/workflows/conan-package.yml) |
|
||||
| **CuraEngine GradualFlow 0.1** | [](https://github.com/Ultimaker/CuraEngine_plugin_gradual_flow/actions/workflows/conan-package.yml) |
|
||||
| **synsepalum-dulcificum 0.1** | [](https://github.com/Ultimaker/synsepalum-dulcificum/actions/workflows/conan-package.yml) |
|
||||
| **CuraEngine gRPC definitions 0.1** | [](https://github.com/Ultimaker/CuraEngine_grpc_definitions/actions/workflows/conan-package.yml) |
|
||||
| **libArcus** | [](https://github.com/Ultimaker/libArcus/actions/workflows/conan-package.yml) |
|
||||
| **pyArcus** | [](https://github.com/Ultimaker/pyArcus/actions/workflows/conan-package.yml) |
|
||||
| **libSavitar** | [](https://github.com/Ultimaker/libSavitar/actions/workflows/conan-package.yml) |
|
||||
| **pySavitar** | [](https://github.com/Ultimaker/pySavitar/actions/workflows/conan-package.yml) |
|
||||
| **libnest2d** | [](https://github.com/Ultimaker/libnest2d/actions/workflows/conan-package.yml) |
|
||||
| **pynest2d** | [](https://github.com/Ultimaker/pynest2d/actions/workflows/conan-package.yml) |
|
39
.github/workflows/windows.yml
vendored
39
.github/workflows/windows.yml
vendored
|
@ -122,7 +122,12 @@ jobs:
|
|||
run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache"
|
||||
|
||||
- name: Create the Packages (Powershell)
|
||||
run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING --json "cura_inst/conan_install_info.json"
|
||||
run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING -c tools.build:skip_test=True
|
||||
|
||||
- name: Remove internal packages before uploading
|
||||
run: |
|
||||
conan remove "*@internal/*" -f || true
|
||||
conan remove "cura_private_data*" -f || true
|
||||
|
||||
- name: Upload the Package(s)
|
||||
if: always()
|
||||
|
@ -162,19 +167,12 @@ jobs:
|
|||
f.write(content)
|
||||
f.writelines(f"INSTALLER_FILENAME={installer_filename}\n")
|
||||
|
||||
- name: Summarize the used Conan dependencies
|
||||
- name: Summarize the used 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"]])
|
||||
from cura.CuraVersion import ConanInstalls, PythonInstalls
|
||||
|
||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||
content = ""
|
||||
|
@ -186,25 +184,12 @@ jobs:
|
|||
f.write(content)
|
||||
f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n")
|
||||
f.writelines("## Conan packages:\n")
|
||||
for dep in sorted_deps:
|
||||
f.writelines(f"`{dep}`\n")
|
||||
for dep_name, dep_info in ConanInstalls.items():
|
||||
f.writelines(f"`{dep_name} {dep_info['version']} {dep_info['revision']}`\n")
|
||||
|
||||
- name: Summarize the used Python modules
|
||||
shell: python
|
||||
run: |
|
||||
import os
|
||||
import pkg_resources
|
||||
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||
content = ""
|
||||
if os.path.exists(summary_env):
|
||||
with open(summary_env, "r") as f:
|
||||
content = f.read()
|
||||
|
||||
with open(summary_env, "w") as f:
|
||||
f.write(content)
|
||||
f.writelines("## Python modules:\n")
|
||||
for package in pkg_resources.working_set:
|
||||
f.writelines(f"`{package.key}/{package.version}`\n")
|
||||
for dep_name, dep_info in PythonInstalls.items():
|
||||
f.writelines(f"`{dep_name} {dep_info['version']}`\n")
|
||||
|
||||
- name: Create PFX certificate from BASE64_PFX_CONTENT secret
|
||||
id: create-pfx
|
||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -101,7 +101,6 @@ graph_info.json
|
|||
Ultimaker-Cura.spec
|
||||
.run/
|
||||
/printer-linter/src/printerlinter.egg-info/
|
||||
/resources/qml/Dialogs/AboutDialogVersionsList.qml
|
||||
/plugins/CuraEngineGradualFlow
|
||||
/resources/bundled_packages/bundled_*.json
|
||||
curaengine_plugin_gradual_flow
|
||||
|
|
|
@ -1,61 +0,0 @@
|
|||
import QtQuick 2.2
|
||||
import QtQuick.Controls 2.9
|
||||
|
||||
import UM 1.6 as UM
|
||||
import Cura 1.5 as Cura
|
||||
|
||||
|
||||
ListView
|
||||
{
|
||||
id: projectBuildInfoList
|
||||
visible: false
|
||||
anchors.top: creditsNotes.bottom
|
||||
anchors.topMargin: UM.Theme.getSize("default_margin").height
|
||||
width: parent.width
|
||||
height: base.height - y - (2 * UM.Theme.getSize("default_margin").height + closeButton.height)
|
||||
|
||||
ScrollBar.vertical: UM.ScrollBar
|
||||
{
|
||||
id: projectBuildInfoListScrollBar
|
||||
}
|
||||
|
||||
delegate: Row
|
||||
{
|
||||
spacing: UM.Theme.getSize("narrow_margin").width
|
||||
UM.Label
|
||||
{
|
||||
text: (model.name)
|
||||
width: (projectBuildInfoList.width* 0.4) | 0
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
UM.Label
|
||||
{
|
||||
text: (model.version)
|
||||
width: (projectBuildInfoList.width *0.6) | 0
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
|
||||
}
|
||||
model: ListModel
|
||||
{
|
||||
id: developerInfo
|
||||
}
|
||||
Component.onCompleted:
|
||||
{
|
||||
var conan_installs = {{ conan_installs }};
|
||||
var python_installs = {{ python_installs }};
|
||||
developerInfo.append({ name : "<H1>Conan Installs</H1>", version : '' });
|
||||
for (var n in conan_installs)
|
||||
{
|
||||
developerInfo.append({ name : conan_installs[n][0], version : conan_installs[n][1] });
|
||||
}
|
||||
developerInfo.append({ name : '', version : '' });
|
||||
developerInfo.append({ name : "<H1>Python Installs</H1>", version : '' });
|
||||
for (var n in python_installs)
|
||||
{
|
||||
developerInfo.append({ name : python_installs[n][0], version : python_installs[n][1] });
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2022 UltiMaker
|
||||
# Copyright (c) 2023 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
CuraAppName = "{{ cura_app_name }}"
|
||||
|
@ -12,3 +12,6 @@ CuraCloudAccountAPIRoot = "{{ cura_cloud_account_api_root }}"
|
|||
CuraMarketplaceRoot = "{{ cura_marketplace_root }}"
|
||||
CuraDigitalFactoryURL = "{{ cura_digital_factory_url }}"
|
||||
CuraLatestURL = "{{ cura_latest_url }}"
|
||||
|
||||
ConanInstalls = {{ conan_installs }}
|
||||
PythonInstalls = {{ python_installs }}
|
||||
|
|
|
@ -86,6 +86,7 @@ pyinstaller:
|
|||
hiddenimports:
|
||||
- "pySavitar"
|
||||
- "pyArcus"
|
||||
- "pyDulcificum"
|
||||
- "pynest2d"
|
||||
- "PyQt6"
|
||||
- "PyQt6.QtNetwork"
|
||||
|
|
111
conanfile.py
111
conanfile.py
|
@ -34,7 +34,8 @@ class CuraConan(ConanFile):
|
|||
"cloud_api_version": "ANY",
|
||||
"display_name": "ANY", # TODO: should this be an option??
|
||||
"cura_debug_mode": [True, False], # FIXME: Use profiles
|
||||
"internal": [True, False]
|
||||
"internal": [True, False],
|
||||
"enable_i18n": [True, False],
|
||||
}
|
||||
default_options = {
|
||||
"enterprise": "False",
|
||||
|
@ -44,11 +45,12 @@ class CuraConan(ConanFile):
|
|||
"display_name": "UltiMaker Cura",
|
||||
"cura_debug_mode": False, # Not yet implemented
|
||||
"internal": False,
|
||||
"enable_i18n": False,
|
||||
}
|
||||
|
||||
def set_version(self):
|
||||
if not self.version:
|
||||
self.version = "5.6.0-alpha"
|
||||
self.version = "5.7.0-alpha"
|
||||
|
||||
@property
|
||||
def _pycharm_targets(self):
|
||||
|
@ -65,6 +67,8 @@ class CuraConan(ConanFile):
|
|||
self._cura_env = Environment()
|
||||
self._cura_env.define("QML2_IMPORT_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "qml")))
|
||||
self._cura_env.define("QT_PLUGIN_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "plugins")))
|
||||
if not self.in_local_cache:
|
||||
self._cura_env.define( "CURA_DATA_ROOT", str(self._share_dir.joinpath("cura")))
|
||||
|
||||
if self.settings.os == "Linux":
|
||||
self._cura_env.define("QT_QPA_FONTDIR", "/usr/share/fonts")
|
||||
|
@ -137,36 +141,33 @@ class CuraConan(ConanFile):
|
|||
return "'x86_64'"
|
||||
return "None"
|
||||
|
||||
def _generate_about_versions(self, location):
|
||||
with open(os.path.join(self.recipe_folder, "AboutDialogVersionsList.qml.jinja"), "r") as f:
|
||||
cura_version_py = Template(f.read())
|
||||
def _conan_installs(self):
|
||||
conan_installs = {}
|
||||
|
||||
conan_installs = []
|
||||
python_installs = []
|
||||
# list of conan installs
|
||||
for dependency in self.dependencies.host.values():
|
||||
conan_installs[dependency.ref.name] = {
|
||||
"version": dependency.ref.version,
|
||||
"revision": dependency.ref.revision
|
||||
}
|
||||
return conan_installs
|
||||
|
||||
# list of conan installs
|
||||
for _, dependency in self.dependencies.host.items():
|
||||
conan_installs.append([dependency.ref.name,dependency.ref.version])
|
||||
def _python_installs(self):
|
||||
python_installs = {}
|
||||
|
||||
#list of python installs
|
||||
outer = '"' if self.settings.os == "Windows" else "'"
|
||||
inner = "'" if self.settings.os == "Windows" else '"'
|
||||
python_ins_cmd = f"python -c {outer}import pkg_resources; print({inner};{inner}.join([(s.key+{inner},{inner}+ s.version) for s in pkg_resources.working_set])){outer}"
|
||||
# list of python installs
|
||||
python_ins_cmd = f"python -c \"import pkg_resources; print(';'.join([(s.key+','+ s.version) for s in pkg_resources.working_set]))\""
|
||||
from six import StringIO
|
||||
buffer = StringIO()
|
||||
self.run(python_ins_cmd, run_environment= True, env = "conanrun", output=buffer)
|
||||
|
||||
packages = str(buffer.getvalue()).split("-----------------\n")
|
||||
package = packages[1].strip('\r\n').split(";")
|
||||
for pack in package:
|
||||
python_installs.append(pack.split(","))
|
||||
|
||||
with open(os.path.join(location, "AboutDialogVersionsList.qml"), "w") as f:
|
||||
f.write(cura_version_py.render(
|
||||
conan_installs = conan_installs,
|
||||
python_installs = python_installs
|
||||
))
|
||||
packages = packages[1].strip('\r\n').split(";")
|
||||
for package in packages:
|
||||
name, version = package.split(",")
|
||||
python_installs[name] = {"version": version}
|
||||
|
||||
return python_installs
|
||||
|
||||
def _generate_cura_version(self, location):
|
||||
with open(os.path.join(self.recipe_folder, "CuraVersion.py.jinja"), "r") as f:
|
||||
|
@ -192,11 +193,14 @@ class CuraConan(ConanFile):
|
|||
cura_cloud_account_api_root = self.conan_data["urls"][self._urls]["cloud_account_api_root"],
|
||||
cura_marketplace_root = self.conan_data["urls"][self._urls]["marketplace_root"],
|
||||
cura_digital_factory_url = self.conan_data["urls"][self._urls]["digital_factory_url"],
|
||||
cura_latest_url = self.conan_data["urls"][self._urls]["cura_latest_url"]))
|
||||
cura_latest_url=self.conan_data["urls"][self._urls]["cura_latest_url"],
|
||||
conan_installs=self._conan_installs(),
|
||||
python_installs=self._python_installs(),
|
||||
))
|
||||
|
||||
def _generate_pyinstaller_spec(self, location, entrypoint_location, icon_path, entitlements_file):
|
||||
pyinstaller_metadata = self.conan_data["pyinstaller"]
|
||||
datas = [(str(self._base_dir.joinpath("conan_install_info.json")), ".")]
|
||||
datas = []
|
||||
for data in pyinstaller_metadata["datas"].values():
|
||||
if not self.options.internal and data.get("internal", False):
|
||||
continue
|
||||
|
@ -289,10 +293,15 @@ class CuraConan(ConanFile):
|
|||
copy(self, "requirements-ultimaker.txt", self.recipe_folder, self.export_sources_folder)
|
||||
copy(self, "cura_app.py", self.recipe_folder, self.export_sources_folder)
|
||||
|
||||
def config_options(self):
|
||||
if self.settings.os == "Windows" and not self.conf.get("tools.microsoft.bash:path", check_type=str):
|
||||
del self.options.enable_i18n
|
||||
|
||||
def configure(self):
|
||||
self.options["pyarcus"].shared = True
|
||||
self.options["pysavitar"].shared = True
|
||||
self.options["pynest2d"].shared = True
|
||||
self.options["dulcificum"].shared = self.settings.os != "Windows"
|
||||
self.options["cpython"].shared = True
|
||||
self.options["boost"].header_only = True
|
||||
if self.settings.os == "Linux":
|
||||
|
@ -305,27 +314,27 @@ class CuraConan(ConanFile):
|
|||
|
||||
def requirements(self):
|
||||
self.requires("boost/1.82.0")
|
||||
self.requires("curaengine_grpc_definitions/(latest)@ultimaker/testing")
|
||||
self.requires("fmt/9.0.0")
|
||||
self.requires("curaengine_grpc_definitions/0.1.0")
|
||||
self.requires("zlib/1.2.13")
|
||||
self.requires("pyarcus/5.3.0")
|
||||
self.requires("dulcificum/(latest)@ultimaker/stable")
|
||||
self.requires("curaengine/(latest)@ultimaker/testing")
|
||||
self.requires("pysavitar/5.3.0")
|
||||
self.requires("pynest2d/5.3.0")
|
||||
self.requires("curaengine_plugin_gradual_flow/(latest)@ultimaker/testing")
|
||||
self.requires("uranium/(latest)@ultimaker/testing")
|
||||
self.requires("cura_binary_data/(latest)@ultimaker/testing")
|
||||
self.requires("curaengine_plugin_gradual_flow/0.1.0")
|
||||
self.requires("uranium/(latest)@ultimaker/stable")
|
||||
self.requires("cura_binary_data/(latest)@ultimaker/stable")
|
||||
self.requires("cpython/3.10.4")
|
||||
if self.options.internal:
|
||||
self.requires("cura_private_data/(latest)@ultimaker/testing")
|
||||
self.requires("cura_private_data/(latest)@internal/testing")
|
||||
self.requires("fdm_materials/(latest)@internal/testing")
|
||||
else:
|
||||
self.requires("fdm_materials/(latest)@ultimaker/testing")
|
||||
self.requires("fdm_materials/(latest)@ultimaker/stable")
|
||||
|
||||
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@ultimaker/testing", force_host_context = True)
|
||||
if self.options.get_safe("enable_i18n", False):
|
||||
self.tool_requires("gettext/0.21@ultimaker/testing", force_host_context = True)
|
||||
|
||||
def layout(self):
|
||||
self.folders.source = "."
|
||||
|
@ -346,7 +355,6 @@ class CuraConan(ConanFile):
|
|||
vr.generate()
|
||||
|
||||
self._generate_cura_version(os.path.join(self.source_folder, "cura"))
|
||||
self._generate_about_versions(os.path.join(self.source_folder, "resources","qml", "Dialogs"))
|
||||
|
||||
if not self.in_local_cache:
|
||||
# Copy CuraEngine.exe to bindirs of Virtual Python Environment
|
||||
|
@ -393,26 +401,24 @@ class CuraConan(ConanFile):
|
|||
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")
|
||||
|
||||
if self.options.get_safe("enable_i18n", False):
|
||||
# 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()
|
||||
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()
|
||||
# # 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"):
|
||||
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)
|
||||
if self.options.get_safe("enable_i18n", False):
|
||||
for po_file in self.source_path.joinpath("resources", "i18n").glob("**/*.po"):
|
||||
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 deploy(self):
|
||||
copy(self, "*", os.path.join(self.package_folder, self.cpp.package.resdirs[2]), os.path.join(self.install_folder, "packaging"), keep_path = True)
|
||||
|
@ -451,7 +457,6 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
|
|||
save(self, os.path.join(self._script_dir, f"activate_github_actions_version_env{ext}"), activate_github_actions_version_env)
|
||||
|
||||
self._generate_cura_version(os.path.join(self._site_packages, "cura"))
|
||||
self._generate_about_versions(str(self._share_dir.joinpath("cura", "resources", "qml", "Dialogs")))
|
||||
|
||||
entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements"))
|
||||
self._generate_pyinstaller_spec(location = self._base_dir,
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2022 UltiMaker
|
||||
# Copyright (c) 2023 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
# ---------
|
||||
|
@ -69,13 +69,25 @@ try:
|
|||
except ImportError:
|
||||
CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME
|
||||
|
||||
DEPENDENCY_INFO = {}
|
||||
|
||||
try:
|
||||
from pathlib import Path
|
||||
conan_install_info = Path(__file__).parent.parent.joinpath("conan_install_info.json")
|
||||
if conan_install_info.exists():
|
||||
import json
|
||||
with open(conan_install_info, "r") as f:
|
||||
DEPENDENCY_INFO = json.loads(f.read())
|
||||
except:
|
||||
pass
|
||||
from cura.CuraVersion import ConanInstalls
|
||||
|
||||
if type(ConanInstalls) == dict:
|
||||
CONAN_INSTALLS = ConanInstalls
|
||||
else:
|
||||
CONAN_INSTALLS = {}
|
||||
|
||||
except ImportError:
|
||||
CONAN_INSTALLS = {}
|
||||
|
||||
try:
|
||||
from cura.CuraVersion import PythonInstalls
|
||||
|
||||
if type(PythonInstalls) == dict:
|
||||
PYTHON_INSTALLS = PythonInstalls
|
||||
else:
|
||||
PYTHON_INSTALLS = {}
|
||||
|
||||
except ImportError:
|
||||
PYTHON_INSTALLS = {}
|
||||
|
|
|
@ -118,8 +118,9 @@ class GridArrange(Arranger):
|
|||
|
||||
def _findOptimalGridOffset(self):
|
||||
if len(self._fixed_nodes) == 0:
|
||||
self._offset_x = 0
|
||||
self._offset_y = 0
|
||||
edge_disallowed_size = self._build_volume.getEdgeDisallowedSize()
|
||||
self._offset_x = edge_disallowed_size
|
||||
self._offset_y = edge_disallowed_size
|
||||
return
|
||||
|
||||
if len(self._fixed_nodes) == 1:
|
||||
|
|
|
@ -49,8 +49,9 @@ class Nest2DArrange(Arranger):
|
|||
def findNodePlacement(self) -> Tuple[bool, List[Item]]:
|
||||
spacing = int(1.5 * self._factor) # 1.5mm spacing.
|
||||
|
||||
machine_width = self._build_volume.getWidth()
|
||||
machine_depth = self._build_volume.getDepth()
|
||||
edge_disallowed_size = self._build_volume.getEdgeDisallowedSize()
|
||||
machine_width = self._build_volume.getWidth() - (edge_disallowed_size * 2)
|
||||
machine_depth = self._build_volume.getDepth() - (edge_disallowed_size * 2)
|
||||
build_plate_bounding_box = Box(int(machine_width * self._factor), int(machine_depth * self._factor))
|
||||
|
||||
if self._fixed_nodes is None:
|
||||
|
@ -80,7 +81,6 @@ class Nest2DArrange(Arranger):
|
|||
], numpy.float32))
|
||||
|
||||
disallowed_areas = self._build_volume.getDisallowedAreas()
|
||||
num_disallowed_areas_added = 0
|
||||
for area in disallowed_areas:
|
||||
converted_points = []
|
||||
|
||||
|
@ -95,7 +95,6 @@ class Nest2DArrange(Arranger):
|
|||
disallowed_area = Item(converted_points)
|
||||
disallowed_area.markAsDisallowedAreaInBin(0)
|
||||
node_items.append(disallowed_area)
|
||||
num_disallowed_areas_added += 1
|
||||
|
||||
for node in self._fixed_nodes:
|
||||
converted_points = []
|
||||
|
@ -108,20 +107,25 @@ class Nest2DArrange(Arranger):
|
|||
item = Item(converted_points)
|
||||
item.markAsFixedInBin(0)
|
||||
node_items.append(item)
|
||||
num_disallowed_areas_added += 1
|
||||
|
||||
config = NfpConfig()
|
||||
config.accuracy = 1.0
|
||||
config.alignment = NfpConfig.Alignment.DONT_ALIGN
|
||||
if self._lock_rotation:
|
||||
config.rotations = [0.0]
|
||||
strategies = [NfpConfig.Alignment.CENTER] * 3 + [NfpConfig.Alignment.BOTTOM_LEFT] * 3
|
||||
found_solution_for_all = False
|
||||
while not found_solution_for_all and len(strategies) > 0:
|
||||
config = NfpConfig()
|
||||
config.accuracy = 1.0
|
||||
config.alignment = NfpConfig.Alignment.CENTER
|
||||
config.starting_point = strategies[0]
|
||||
strategies = strategies[1:]
|
||||
|
||||
num_bins = nest(node_items, build_plate_bounding_box, spacing, config)
|
||||
if self._lock_rotation:
|
||||
config.rotations = [0.0]
|
||||
|
||||
# Strip the fixed items (previously placed) and the disallowed areas from the results again.
|
||||
node_items = list(filter(lambda item: not item.isFixed(), node_items))
|
||||
num_bins = nest(node_items, build_plate_bounding_box, spacing, config)
|
||||
|
||||
found_solution_for_all = num_bins == 1
|
||||
# Strip the fixed items (previously placed) and the disallowed areas from the results again.
|
||||
node_items = list(filter(lambda item: not item.isFixed(), node_items))
|
||||
|
||||
found_solution_for_all = num_bins == 1
|
||||
|
||||
return found_solution_for_all, node_items
|
||||
|
||||
|
|
|
@ -813,7 +813,7 @@ class BuildVolume(SceneNode):
|
|||
prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders)
|
||||
for extruder_id in prime_tower_areas:
|
||||
for area_index, prime_tower_area in enumerate(prime_tower_areas[extruder_id]):
|
||||
for area in result_areas[extruder_id]:
|
||||
for area in result_areas_no_brim[extruder_id]:
|
||||
if prime_tower_area.intersectsPolygon(area) is not None:
|
||||
prime_tower_collision = True
|
||||
break
|
||||
|
@ -860,13 +860,24 @@ class BuildVolume(SceneNode):
|
|||
machine_depth = self._global_container_stack.getProperty("machine_depth", "value")
|
||||
prime_tower_x = self._global_container_stack.getProperty("prime_tower_position_x", "value")
|
||||
prime_tower_y = - self._global_container_stack.getProperty("prime_tower_position_y", "value")
|
||||
prime_tower_brim_enable = self._global_container_stack.getProperty("prime_tower_brim_enable", "value")
|
||||
prime_tower_base_size = self._global_container_stack.getProperty("prime_tower_base_size", "value")
|
||||
prime_tower_base_height = self._global_container_stack.getProperty("prime_tower_base_height", "value")
|
||||
adhesion_type = self._global_container_stack.getProperty("adhesion_type", "value")
|
||||
|
||||
if not self._global_container_stack.getProperty("machine_center_is_zero", "value"):
|
||||
prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
|
||||
prime_tower_y = prime_tower_y + machine_depth / 2
|
||||
|
||||
radius = prime_tower_size / 2
|
||||
prime_tower_area = Polygon.approximatedCircle(radius, num_segments = 24)
|
||||
prime_tower_area = prime_tower_area.translate(prime_tower_x - radius, prime_tower_y - radius)
|
||||
delta_x = -radius
|
||||
delta_y = -radius
|
||||
|
||||
if prime_tower_base_size > 0 and ((prime_tower_brim_enable and prime_tower_base_height > 0) or adhesion_type == "raft"):
|
||||
radius += prime_tower_base_size
|
||||
|
||||
prime_tower_area = Polygon.approximatedCircle(radius, num_segments = 32)
|
||||
prime_tower_area = prime_tower_area.translate(prime_tower_x + delta_x, prime_tower_y + delta_y)
|
||||
|
||||
prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0))
|
||||
for extruder in used_extruders:
|
||||
|
@ -1171,7 +1182,7 @@ class BuildVolume(SceneNode):
|
|||
_raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_layers", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap", "layer_0_z_overlap"]
|
||||
_extra_z_settings = ["retraction_hop_enabled", "retraction_hop"]
|
||||
_prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "prime_blob_enable"]
|
||||
_tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y", "prime_tower_brim_enable"]
|
||||
_tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y", "prime_tower_brim_enable", "prime_tower_base_size", "prime_tower_base_height"]
|
||||
_ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"]
|
||||
_distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts", "travel_avoid_supports", "wall_line_count", "wall_line_width_0", "wall_line_width_x"]
|
||||
_extruder_settings = ["support_enable", "support_bottom_enable", "support_roof_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "skirt_brim_extruder_nr", "raft_base_extruder_nr", "raft_interface_extruder_nr", "raft_surface_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used.
|
||||
|
|
|
@ -6,6 +6,7 @@ import sys
|
|||
import tempfile
|
||||
import time
|
||||
import platform
|
||||
from pathlib import Path
|
||||
from typing import cast, TYPE_CHECKING, Optional, Callable, List, Any, Dict
|
||||
|
||||
import numpy
|
||||
|
@ -269,6 +270,9 @@ class CuraApplication(QtApplication):
|
|||
CentralFileStorage.setIsEnterprise(ApplicationMetadata.IsEnterpriseVersion)
|
||||
Resources.setIsEnterprise(ApplicationMetadata.IsEnterpriseVersion)
|
||||
|
||||
self._conan_installs = ApplicationMetadata.CONAN_INSTALLS
|
||||
self._python_installs = ApplicationMetadata.PYTHON_INSTALLS
|
||||
|
||||
@pyqtProperty(str, constant=True)
|
||||
def ultimakerCloudApiRootUrl(self) -> str:
|
||||
return UltimakerCloudConstants.CuraCloudAPIRoot
|
||||
|
@ -363,6 +367,10 @@ class CuraApplication(QtApplication):
|
|||
|
||||
Resources.addSecureSearchPath(os.path.join(self._app_install_dir, "share", "cura", "resources"))
|
||||
if not hasattr(sys, "frozen"):
|
||||
cura_data_root = os.environ.get('CURA_DATA_ROOT', None)
|
||||
if cura_data_root:
|
||||
Resources.addSearchPath(str(Path(cura_data_root).joinpath("resources")))
|
||||
|
||||
Resources.addSearchPath(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "resources"))
|
||||
|
||||
# local Conan cache
|
||||
|
@ -851,11 +859,8 @@ class CuraApplication(QtApplication):
|
|||
|
||||
self._log_hardware_info()
|
||||
|
||||
if len(ApplicationMetadata.DEPENDENCY_INFO) > 0:
|
||||
Logger.debug("Using Conan managed dependencies: " + ", ".join(
|
||||
[dep["recipe"]["id"] for dep in ApplicationMetadata.DEPENDENCY_INFO["installed"] if dep["recipe"]["version"] != "latest"]))
|
||||
else:
|
||||
Logger.warning("Could not find conan_install_info.json")
|
||||
Logger.debug("Using conan dependencies: {}", str(self.conanInstalls))
|
||||
Logger.debug("Using python dependencies: {}", str(self.pythonInstalls))
|
||||
|
||||
Logger.log("i", "Initializing machine error checker")
|
||||
self._machine_error_checker = MachineErrorChecker(self)
|
||||
|
@ -1550,15 +1555,14 @@ class CuraApplication(QtApplication):
|
|||
Logger.log("w", "Unable to reload data because we don't have a filename.")
|
||||
|
||||
for file_name, nodes in objects_in_filename.items():
|
||||
for node in nodes:
|
||||
file_path = os.path.normpath(os.path.dirname(file_name))
|
||||
job = ReadMeshJob(file_name, add_to_recent_files = file_path != tempfile.gettempdir()) # Don't add temp files to the recent files list
|
||||
job._node = node # type: ignore
|
||||
job.finished.connect(self._reloadMeshFinished)
|
||||
if has_merged_nodes:
|
||||
job.finished.connect(self.updateOriginOfMergedMeshes)
|
||||
|
||||
job.start()
|
||||
file_path = os.path.normpath(os.path.dirname(file_name))
|
||||
job = ReadMeshJob(file_name,
|
||||
add_to_recent_files=file_path != tempfile.gettempdir()) # Don't add temp files to the recent files list
|
||||
job._nodes = nodes # type: ignore
|
||||
job.finished.connect(self._reloadMeshFinished)
|
||||
if has_merged_nodes:
|
||||
job.finished.connect(self.updateOriginOfMergedMeshes)
|
||||
job.start()
|
||||
|
||||
@pyqtSlot("QStringList")
|
||||
def setExpandedCategories(self, categories: List[str]) -> None:
|
||||
|
@ -1730,9 +1734,10 @@ class CuraApplication(QtApplication):
|
|||
|
||||
def _reloadMeshFinished(self, job) -> None:
|
||||
"""
|
||||
Function called whenever a ReadMeshJob finishes in the background. It reloads a specific node object in the
|
||||
Function called when ReadMeshJob finishes reloading a file in the background, then update node objects in the
|
||||
scene from its source file. The function gets all the nodes that exist in the file through the job result, and
|
||||
then finds the scene node that it wants to refresh by its object id. Each job refreshes only one node.
|
||||
then finds the scene nodes that need to be refreshed by their name. Each job refreshes all nodes of a file.
|
||||
Nodes that are not present in the updated file are kept in the scene.
|
||||
|
||||
:param job: The :py:class:`Uranium.UM.ReadMeshJob.ReadMeshJob` running in the background that reads all the
|
||||
meshes in a file
|
||||
|
@ -1742,21 +1747,37 @@ class CuraApplication(QtApplication):
|
|||
if len(job_result) == 0:
|
||||
Logger.log("e", "Reloading the mesh failed.")
|
||||
return
|
||||
object_found = False
|
||||
mesh_data = None
|
||||
renamed_nodes = {} # type: Dict[str, int]
|
||||
# Find the node to be refreshed based on its id
|
||||
for job_result_node in job_result:
|
||||
if job_result_node.getId() == job._node.getId():
|
||||
mesh_data = job_result_node.getMeshData()
|
||||
object_found = True
|
||||
break
|
||||
if not object_found:
|
||||
Logger.warning("The object with id {} no longer exists! Keeping the old version in the scene.".format(job_result_node.getId()))
|
||||
return
|
||||
if not mesh_data:
|
||||
Logger.log("w", "Could not find a mesh in reloaded node.")
|
||||
return
|
||||
job._node.setMeshData(mesh_data)
|
||||
mesh_data = job_result_node.getMeshData()
|
||||
if not mesh_data:
|
||||
Logger.log("w", "Could not find a mesh in reloaded node.")
|
||||
continue
|
||||
|
||||
# Solves issues with object naming
|
||||
result_node_name = job_result_node.getName()
|
||||
if not result_node_name:
|
||||
result_node_name = os.path.basename(mesh_data.getFileName())
|
||||
if result_node_name in renamed_nodes: # objects may get renamed by ObjectsModel._renameNodes() when loaded
|
||||
renamed_nodes[result_node_name] += 1
|
||||
result_node_name = "{0}({1})".format(result_node_name, renamed_nodes[result_node_name])
|
||||
else:
|
||||
renamed_nodes[job_result_node.getName()] = 0
|
||||
|
||||
# Find the matching scene node to replace
|
||||
scene_node = None
|
||||
for replaced_node in job._nodes:
|
||||
if replaced_node.getName() == result_node_name:
|
||||
scene_node = replaced_node
|
||||
break
|
||||
|
||||
if scene_node:
|
||||
scene_node.setMeshData(mesh_data)
|
||||
else:
|
||||
# Current node is a new one in the file, or it's name has changed
|
||||
# TODO: Load this mesh into the scene. Also alter the "_reloadJobFinished" action in UM.Scene
|
||||
Logger.log("w", "Could not find matching node for object '{0}' in the scene.".format(result_node_name))
|
||||
|
||||
def _openFile(self, filename):
|
||||
self.readLocalFile(QUrl.fromLocalFile(filename))
|
||||
|
@ -1943,7 +1964,8 @@ class CuraApplication(QtApplication):
|
|||
node.scale(original_node.getScale())
|
||||
|
||||
node.setSelectable(True)
|
||||
node.setName(os.path.basename(file_name))
|
||||
if not node.getName():
|
||||
node.setName(os.path.basename(file_name))
|
||||
self.getBuildVolume().checkBoundsAndUpdate(node)
|
||||
|
||||
is_non_sliceable = "." + file_extension in self._non_sliceable_extensions
|
||||
|
@ -2130,3 +2152,11 @@ class CuraApplication(QtApplication):
|
|||
@pyqtProperty(bool, constant=True)
|
||||
def isEnterprise(self) -> bool:
|
||||
return ApplicationMetadata.IsEnterpriseVersion
|
||||
|
||||
@pyqtProperty("QVariant", constant=True)
|
||||
def conanInstalls(self) -> Dict[str, Dict[str, str]]:
|
||||
return self._conan_installs
|
||||
|
||||
@pyqtProperty("QVariant", constant=True)
|
||||
def pythonInstalls(self) -> Dict[str, Dict[str, str]]:
|
||||
return self._python_installs
|
||||
|
|
|
@ -51,6 +51,9 @@ class CompatibleMachineModel(ListModel):
|
|||
for output_device in machine_manager.printerOutputDevices:
|
||||
for printer in output_device.printers:
|
||||
extruder_configs = dict()
|
||||
# If the printer name already exist in the queue skip it
|
||||
if printer.name in [item["name"] for item in self.items]:
|
||||
continue
|
||||
|
||||
# initialize & add current active material:
|
||||
for extruder in printer.extruders:
|
||||
|
|
|
@ -45,17 +45,17 @@ class PreviewPass(RenderPass):
|
|||
This is useful to get a preview image of a scene taken from a different location as the active camera.
|
||||
"""
|
||||
|
||||
def __init__(self, width: int, height: int) -> None:
|
||||
def __init__(self, width: int, height: int, *, root: CuraSceneNode = None) -> None:
|
||||
super().__init__("preview", width, height, 0)
|
||||
|
||||
self._camera = None # type: Optional[Camera]
|
||||
self._camera: Optional[Camera] = None
|
||||
|
||||
self._renderer = Application.getInstance().getRenderer()
|
||||
|
||||
self._shader = None # type: Optional[ShaderProgram]
|
||||
self._non_printing_shader = None # type: Optional[ShaderProgram]
|
||||
self._support_mesh_shader = None # type: Optional[ShaderProgram]
|
||||
self._scene = Application.getInstance().getController().getScene()
|
||||
self._shader: Optional[ShaderProgram] = None
|
||||
self._non_printing_shader: Optional[ShaderProgram] = None
|
||||
self._support_mesh_shader: Optional[ShaderProgram] = None
|
||||
self._root = Application.getInstance().getController().getScene().getRoot() if root is None else root
|
||||
|
||||
# Set the camera to be used by this render pass
|
||||
# if it's None, the active camera is used
|
||||
|
@ -96,7 +96,7 @@ class PreviewPass(RenderPass):
|
|||
batch_support_mesh = RenderBatch(self._support_mesh_shader)
|
||||
|
||||
# Fill up the batch with objects that can be sliced.
|
||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||
for node in DepthFirstIterator(self._root):
|
||||
if hasattr(node, "_outside_buildarea") and not getattr(node, "_outside_buildarea"):
|
||||
if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible():
|
||||
per_mesh_stack = node.callDecoration("getStack")
|
||||
|
|
|
@ -40,9 +40,22 @@ class ExtruderConfigurationModel(QObject):
|
|||
|
||||
def setHotendID(self, hotend_id: Optional[str]) -> None:
|
||||
if self._hotend_id != hotend_id:
|
||||
self._hotend_id = hotend_id
|
||||
self._hotend_id = ExtruderConfigurationModel.applyNameMappingHotend(hotend_id)
|
||||
self.extruderConfigurationChanged.emit()
|
||||
|
||||
@staticmethod
|
||||
def applyNameMappingHotend(hotendId) -> str:
|
||||
_EXTRUDER_NAME_MAP = {
|
||||
"mk14_hot":"1XA",
|
||||
"mk14_hot_s":"2XA",
|
||||
"mk14_c":"1C",
|
||||
"mk14":"1A",
|
||||
"mk14_s":"2A"
|
||||
}
|
||||
if hotendId in _EXTRUDER_NAME_MAP:
|
||||
return _EXTRUDER_NAME_MAP[hotendId]
|
||||
return hotendId
|
||||
|
||||
@pyqtProperty(str, fset = setHotendID, notify = extruderConfigurationChanged)
|
||||
def hotendID(self) -> Optional[str]:
|
||||
return self._hotend_id
|
||||
|
|
|
@ -9,7 +9,9 @@ from PyQt6.QtCore import pyqtProperty, QObject
|
|||
class MaterialOutputModel(QObject):
|
||||
def __init__(self, guid: Optional[str], type: str, color: str, brand: str, name: str, parent = None) -> None:
|
||||
super().__init__(parent)
|
||||
self._guid = guid
|
||||
|
||||
name, guid = MaterialOutputModel.getMaterialFromDefinition(guid,type, brand, name)
|
||||
self._guid =guid
|
||||
self._type = type
|
||||
self._color = color
|
||||
self._brand = brand
|
||||
|
@ -19,6 +21,34 @@ class MaterialOutputModel(QObject):
|
|||
def guid(self) -> str:
|
||||
return self._guid if self._guid else ""
|
||||
|
||||
@staticmethod
|
||||
def getMaterialFromDefinition(guid, type, brand, name):
|
||||
|
||||
_MATERIAL_MAP = { "abs" :{"name" :"abs_175" ,"guid": "2780b345-577b-4a24-a2c5-12e6aad3e690"},
|
||||
"abs-wss1" :{"name" :"absr_175" ,"guid": "88c8919c-6a09-471a-b7b6-e801263d862d"},
|
||||
"asa" :{"name" :"asa_175" ,"guid": "416eead4-0d8e-4f0b-8bfc-a91a519befa5"},
|
||||
"nylon-cf" :{"name" :"cffpa_175" ,"guid": "85bbae0e-938d-46fb-989f-c9b3689dc4f0"},
|
||||
"nylon" :{"name" :"nylon_175" ,"guid": "283d439a-3490-4481-920c-c51d8cdecf9c"},
|
||||
"pc" :{"name" :"pc_175" ,"guid": "62414577-94d1-490d-b1e4-7ef3ec40db02"},
|
||||
"petg" :{"name" :"petg_175" ,"guid": "69386c85-5b6c-421a-bec5-aeb1fb33f060"},
|
||||
"pla" :{"name" :"pla_175" ,"guid": "0ff92885-617b-4144-a03c-9989872454bc"},
|
||||
"pva" :{"name" :"pva_175" ,"guid": "a4255da2-cb2a-4042-be49-4a83957a2f9a"},
|
||||
"wss1" :{"name" :"rapidrinse_175","guid": "a140ef8f-4f26-4e73-abe0-cfc29d6d1024"},
|
||||
"sr30" :{"name" :"sr30_175" ,"guid": "77873465-83a9-4283-bc44-4e542b8eb3eb"},
|
||||
"im-pla" :{"name" :"tough_pla_175" ,"guid": "96fca5d9-0371-4516-9e96-8e8182677f3c"},
|
||||
"bvoh" :{"name" :"bvoh_175" ,"guid": "923e604c-8432-4b09-96aa-9bbbd42207f4"},
|
||||
"cpe" :{"name" :"cpe_175" ,"guid": "da1872c1-b991-4795-80ad-bdac0f131726"},
|
||||
"hips" :{"name" :"hips_175" ,"guid": "a468d86a-220c-47eb-99a5-bbb47e514eb0"},
|
||||
"tpu" :{"name" :"tpu_175" ,"guid": "19baa6a9-94ff-478b-b4a1-8157b74358d2"}
|
||||
}
|
||||
|
||||
|
||||
if guid is None and brand is not "empty" and type in _MATERIAL_MAP:
|
||||
name = _MATERIAL_MAP[type]["name"]
|
||||
guid = _MATERIAL_MAP[type]["guid"]
|
||||
return name, guid
|
||||
|
||||
|
||||
@pyqtProperty(str, constant = True)
|
||||
def type(self) -> str:
|
||||
return self._type
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# Copyright (c) 2018 Aldo Hoeben / fieldOfView
|
||||
# NetworkMJPGImage is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from PyQt6.QtCore import QUrl, pyqtProperty, pyqtSignal, pyqtSlot, QRect, QByteArray
|
||||
from PyQt6.QtGui import QImage, QPainter
|
||||
from PyQt6.QtQuick import QQuickPaintedItem
|
||||
|
@ -19,9 +21,9 @@ class NetworkMJPGImage(QQuickPaintedItem):
|
|||
|
||||
self._stream_buffer = QByteArray()
|
||||
self._stream_buffer_start_index = -1
|
||||
self._network_manager = None # type: QNetworkAccessManager
|
||||
self._image_request = None # type: QNetworkRequest
|
||||
self._image_reply = None # type: QNetworkReply
|
||||
self._network_manager: Optional[QNetworkAccessManager] = None
|
||||
self._image_request: Optional[QNetworkRequest] = None
|
||||
self._image_reply: Optional[QNetworkReply] = None
|
||||
self._image = QImage()
|
||||
self._image_rect = QRect()
|
||||
|
||||
|
|
|
@ -415,7 +415,18 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
|||
|
||||
@pyqtProperty(str, constant = True)
|
||||
def printerType(self) -> str:
|
||||
return self._properties.get(b"printer_type", b"Unknown").decode("utf-8")
|
||||
return NetworkedPrinterOutputDevice.applyPrinterTypeMapping(self._properties.get(b"printer_type", b"Unknown").decode("utf-8"))
|
||||
|
||||
@staticmethod
|
||||
def applyPrinterTypeMapping(printer_type):
|
||||
_PRINTER_TYPE_NAME = {
|
||||
"fire_e": "ultimaker_method",
|
||||
"lava_f": "ultimaker_methodx",
|
||||
"magma_10": "ultimaker_methodxl"
|
||||
}
|
||||
if printer_type in _PRINTER_TYPE_NAME:
|
||||
return _PRINTER_TYPE_NAME[printer_type]
|
||||
return printer_type
|
||||
|
||||
@pyqtProperty(str, constant = True)
|
||||
def ipAddress(self) -> str:
|
||||
|
|
|
@ -284,16 +284,20 @@ class CuraStackBuilder:
|
|||
abstract_machines = registry.findContainerStacks(id = abstract_machine_id)
|
||||
if abstract_machines:
|
||||
return cast(GlobalStack, abstract_machines[0])
|
||||
|
||||
definitions = registry.findDefinitionContainers(id=definition_id)
|
||||
|
||||
name = ""
|
||||
|
||||
if definitions:
|
||||
name = definitions[0].getName()
|
||||
|
||||
stack = cls.createMachine(abstract_machine_id, definition_id, show_warning_message=False)
|
||||
if not stack:
|
||||
return None
|
||||
|
||||
if not stack.getMetaDataEntry("visible", True):
|
||||
return None
|
||||
|
||||
stack.setName(name)
|
||||
|
||||
stack.setMetaDataEntry("is_abstract_machine", True)
|
||||
|
|
|
@ -1700,6 +1700,16 @@ class MachineManager(QObject):
|
|||
else: # No intent had the correct category.
|
||||
extruder.intent = empty_intent_container
|
||||
|
||||
@pyqtSlot()
|
||||
def resetIntents(self) -> None:
|
||||
"""Reset the intent category of the current printer.
|
||||
"""
|
||||
global_stack = self._application.getGlobalContainerStack()
|
||||
if global_stack is None:
|
||||
return
|
||||
for extruder in global_stack.extruderList:
|
||||
extruder.intent = empty_intent_container
|
||||
|
||||
def activeQualityGroup(self) -> Optional["QualityGroup"]:
|
||||
"""Get the currently activated quality group.
|
||||
|
||||
|
|
107
cura/Snapshot.py
107
cura/Snapshot.py
|
@ -1,7 +1,9 @@
|
|||
# Copyright (c) 2021 Ultimaker B.V.
|
||||
# Copyright (c) 2023 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
import numpy
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from PyQt6 import QtCore
|
||||
from PyQt6.QtCore import QCoreApplication
|
||||
from PyQt6.QtGui import QImage
|
||||
|
@ -10,11 +12,13 @@ from UM.Logger import Logger
|
|||
from cura.PreviewPass import PreviewPass
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||
from UM.Math.Matrix import Matrix
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Scene.Camera import Camera
|
||||
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from UM.Qt.QtRenderer import QtRenderer
|
||||
|
||||
class Snapshot:
|
||||
@staticmethod
|
||||
|
@ -32,6 +36,96 @@ class Snapshot:
|
|||
|
||||
return min_x, max_x, min_y, max_y
|
||||
|
||||
@staticmethod
|
||||
def isometricSnapshot(width: int = 300, height: int = 300, *, node: Optional[SceneNode] = None) -> Optional[QImage]:
|
||||
"""
|
||||
Create an isometric snapshot of the scene.
|
||||
|
||||
:param width: width of the aspect ratio default 300
|
||||
:param height: height of the aspect ratio default 300
|
||||
:param node: node of the scene default is the root of the scene
|
||||
:return: None when there is no model on the build plate otherwise it will return an image
|
||||
|
||||
"""
|
||||
|
||||
if node is None:
|
||||
root = Application.getInstance().getController().getScene().getRoot()
|
||||
|
||||
# the direction the camera is looking at to create the isometric view
|
||||
iso_view_dir = Vector(-1, -1, -1).normalized()
|
||||
|
||||
bounds = Snapshot.nodeBounds(node)
|
||||
if bounds is None:
|
||||
Logger.log("w", "There appears to be nothing to render")
|
||||
return None
|
||||
|
||||
camera = Camera("snapshot")
|
||||
|
||||
# find local x and y directional vectors of the camera
|
||||
tangent_space_x_direction = iso_view_dir.cross(Vector.Unit_Y).normalized()
|
||||
tangent_space_y_direction = tangent_space_x_direction.cross(iso_view_dir).normalized()
|
||||
|
||||
# find extreme screen space coords of the scene
|
||||
x_points = [p.dot(tangent_space_x_direction) for p in bounds.points]
|
||||
y_points = [p.dot(tangent_space_y_direction) for p in bounds.points]
|
||||
min_x = min(x_points)
|
||||
max_x = max(x_points)
|
||||
min_y = min(y_points)
|
||||
max_y = max(y_points)
|
||||
camera_width = max_x - min_x
|
||||
camera_height = max_y - min_y
|
||||
|
||||
if camera_width == 0 or camera_height == 0:
|
||||
Logger.log("w", "There appears to be nothing to render")
|
||||
return None
|
||||
|
||||
# increase either width or height to match the aspect ratio of the image
|
||||
if camera_width / camera_height > width / height:
|
||||
camera_height = camera_width * height / width
|
||||
else:
|
||||
camera_width = camera_height * width / height
|
||||
|
||||
# Configure camera for isometric view
|
||||
ortho_matrix = Matrix()
|
||||
ortho_matrix.setOrtho(
|
||||
-camera_width / 2,
|
||||
camera_width / 2,
|
||||
-camera_height / 2,
|
||||
camera_height / 2,
|
||||
-10000,
|
||||
10000
|
||||
)
|
||||
camera.setPerspective(False)
|
||||
camera.setProjectionMatrix(ortho_matrix)
|
||||
camera.setPosition(bounds.center)
|
||||
camera.lookAt(bounds.center + iso_view_dir)
|
||||
|
||||
# Render the scene
|
||||
renderer = QtRenderer()
|
||||
render_pass = PreviewPass(width, height, root=node)
|
||||
renderer.setViewportSize(width, height)
|
||||
renderer.setWindowSize(width, height)
|
||||
render_pass.setCamera(camera)
|
||||
renderer.addRenderPass(render_pass)
|
||||
renderer.beginRendering()
|
||||
renderer.render()
|
||||
|
||||
return render_pass.getOutput()
|
||||
|
||||
@staticmethod
|
||||
def nodeBounds(root_node: SceneNode) -> Optional[AxisAlignedBox]:
|
||||
axis_aligned_box = None
|
||||
for node in DepthFirstIterator(root_node):
|
||||
if not getattr(node, "_outside_buildarea", False):
|
||||
if node.callDecoration(
|
||||
"isSliceable") and node.getMeshData() and node.isVisible() and not node.callDecoration(
|
||||
"isNonThumbnailVisibleMesh"):
|
||||
if axis_aligned_box is None:
|
||||
axis_aligned_box = node.getBoundingBox()
|
||||
else:
|
||||
axis_aligned_box = axis_aligned_box + node.getBoundingBox()
|
||||
return axis_aligned_box
|
||||
|
||||
@staticmethod
|
||||
def snapshot(width = 300, height = 300):
|
||||
"""Return a QImage of the scene
|
||||
|
@ -55,14 +149,7 @@ class Snapshot:
|
|||
camera = Camera("snapshot", root)
|
||||
|
||||
# determine zoom and look at
|
||||
bbox = None
|
||||
for node in DepthFirstIterator(root):
|
||||
if not getattr(node, "_outside_buildarea", False):
|
||||
if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible() and not node.callDecoration("isNonThumbnailVisibleMesh"):
|
||||
if bbox is None:
|
||||
bbox = node.getBoundingBox()
|
||||
else:
|
||||
bbox = bbox + node.getBoundingBox()
|
||||
bbox = Snapshot.nodeBounds(root)
|
||||
# If there is no bounding box, it means that there is no model in the buildplate
|
||||
if bbox is None:
|
||||
Logger.log("w", "Unable to create snapshot as we seem to have an empty buildplate")
|
||||
|
|
|
@ -14,59 +14,42 @@ AppDir:
|
|||
- amd64
|
||||
allow_unauthenticated: true
|
||||
sources:
|
||||
- sourceline: deb http://nl.archive.ubuntu.com/ubuntu/ jammy main restricted
|
||||
- sourceline: deb http://nl.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
|
||||
- sourceline: deb http://nl.archive.ubuntu.com/ubuntu/ jammy universe
|
||||
- sourceline: deb http://nl.archive.ubuntu.com/ubuntu/ jammy-updates universe
|
||||
- sourceline: deb http://nl.archive.ubuntu.com/ubuntu/ jammy multiverse
|
||||
- sourceline: deb http://nl.archive.ubuntu.com/ubuntu/ jammy-updates multiverse
|
||||
- sourceline: deb http://nl.archive.ubuntu.com/ubuntu/ jammy-backports main restricted
|
||||
universe multiverse
|
||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security main restricted
|
||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security universe
|
||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security multiverse
|
||||
- sourceline: deb https://releases.jfrog.io/artifactory/jfrog-debs xenial contrib
|
||||
- sourceline: deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-14 main
|
||||
- sourceline: deb https://ppa.launchpadcontent.net/ubuntu-toolchain-r/test/ubuntu/
|
||||
jammy main
|
||||
- sourceline: deb https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu/ jammy
|
||||
main
|
||||
- sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/ms-teams stable
|
||||
main
|
||||
- sourceline: deb https://ppa.launchpadcontent.net/ppa-verse/cling/ubuntu/ jammy
|
||||
main
|
||||
- sourceline: deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable
|
||||
main
|
||||
- sourceline: deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_14.x
|
||||
jammy main
|
||||
- sourceline: deb [arch=amd64 signed-by=/usr/share/keyrings/transip-stack.gpg]
|
||||
https://mirror.transip.net/stack/software/deb/Ubuntu_22.04/ ./
|
||||
- sourceline: deb http://repository.spotify.com stable non-free
|
||||
- sourceline: deb [arch=amd64,arm64,armhf] http://packages.microsoft.com/repos/code
|
||||
stable main
|
||||
- sourceline: deb https://packagecloud.io/slacktechnologies/slack/debian/ jessie
|
||||
main
|
||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
|
||||
- sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse
|
||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse
|
||||
include:
|
||||
- xdg-desktop-portal-kde:amd64
|
||||
exclude:
|
||||
- xdg-desktop-portal-kde
|
||||
- libgtk-3-0
|
||||
- librsvg2-2
|
||||
- librsvg2-common
|
||||
- libgdk-pixbuf2.0-0
|
||||
- libgdk-pixbuf2.0-bin
|
||||
- libgdk-pixbuf2.0-common
|
||||
- imagemagick
|
||||
- shared-mime-info
|
||||
- gnome-icon-theme-symbolic
|
||||
- hicolor-icon-theme
|
||||
- adwaita-icon-theme
|
||||
- humanity-icon-theme
|
||||
exclude: []
|
||||
files:
|
||||
include: []
|
||||
exclude:
|
||||
- usr/share/man
|
||||
- usr/share/doc/*/README.*
|
||||
- usr/share/doc/*/changelog.*
|
||||
- usr/share/doc/*/NEWS.*
|
||||
- usr/share/doc/*/TODO.*
|
||||
- usr/share/man
|
||||
- usr/share/doc/*/README.*
|
||||
- usr/share/doc/*/changelog.*
|
||||
- usr/share/doc/*/NEWS.*
|
||||
- usr/share/doc/*/TODO.*
|
||||
runtime:
|
||||
env:
|
||||
APPDIR_LIBRARY_PATH: "$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders"
|
||||
APPDIR_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders"
|
||||
LD_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders"
|
||||
PYTHONPATH: "$APPDIR"
|
||||
QT_PLUGIN_PATH: "$APPDIR/qt/plugins"
|
||||
QML2_IMPORT_PATH: "$APPDIR/qt/qml"
|
||||
QT_QPA_PLATFORMTHEME: xdgdesktopportal
|
||||
GDK_PIXBUF_MODULEDIR: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders
|
||||
GDK_PIXBUF_MODULE_FILE: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders.cache
|
||||
path_mappings:
|
||||
- /usr/share:$APPDIR/usr/share
|
||||
test:
|
||||
fedora-30:
|
||||
image: appimagecrafters/tests-env:fedora-30
|
||||
|
|
|
@ -87,15 +87,16 @@ def notarize_file(dist_path: str, filename: str) -> None:
|
|||
""" Notarize a file. This takes 5+ minutes, there is indication that this step is successful."""
|
||||
notarize_user = os.environ.get("MAC_NOTARIZE_USER")
|
||||
notarize_password = os.environ.get("MAC_NOTARIZE_PASS")
|
||||
altool_executable = os.environ.get("ALTOOL_EXECUTABLE", "altool")
|
||||
notarize_team = os.environ.get("MACOS_CERT_USER")
|
||||
notary_executable = os.environ.get("NOTARY_TOOL_EXECUTABLE", "notarytool")
|
||||
|
||||
notarize_arguments = [
|
||||
"xcrun", altool_executable,
|
||||
"--notarize-app",
|
||||
"--primary-bundle-id", ULTIMAKER_CURA_DOMAIN,
|
||||
"--username", notarize_user,
|
||||
"xcrun", notary_executable,
|
||||
"submit",
|
||||
"--apple-id", notarize_user,
|
||||
"--password", notarize_password,
|
||||
"--file", Path(dist_path, filename)
|
||||
"--team-id", notarize_team,
|
||||
Path(dist_path, filename)
|
||||
]
|
||||
|
||||
subprocess.run(notarize_arguments)
|
||||
|
|
|
@ -1259,7 +1259,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||
available_intent_category_list = IntentManager.getInstance().currentAvailableIntentCategories()
|
||||
if self._intent_category_to_apply is not None and self._intent_category_to_apply in available_intent_category_list:
|
||||
machine_manager.setIntentByCategory(self._intent_category_to_apply)
|
||||
|
||||
else:
|
||||
# if no intent is provided, reset to the default (balanced) intent
|
||||
machine_manager.resetIntents()
|
||||
# Notify everything/one that is to notify about changes.
|
||||
global_stack.containersChanged.emit(global_stack.getTop())
|
||||
|
||||
|
|
|
@ -35,10 +35,12 @@ class WorkspaceDialog(QObject):
|
|||
self._qml_url = "WorkspaceDialog.qml"
|
||||
self._lock = threading.Lock()
|
||||
self._default_strategy = None
|
||||
self._result = {"machine": self._default_strategy,
|
||||
"quality_changes": self._default_strategy,
|
||||
"definition_changes": self._default_strategy,
|
||||
"material": self._default_strategy}
|
||||
self._result = {
|
||||
"machine": self._default_strategy,
|
||||
"quality_changes": self._default_strategy,
|
||||
"definition_changes": self._default_strategy,
|
||||
"material": self._default_strategy,
|
||||
}
|
||||
self._override_machine = None
|
||||
self._visible = False
|
||||
self.showDialogSignal.connect(self.__show)
|
||||
|
@ -347,10 +349,12 @@ class WorkspaceDialog(QObject):
|
|||
if threading.current_thread() != threading.main_thread():
|
||||
self._lock.acquire()
|
||||
# Reset the result
|
||||
self._result = {"machine": self._default_strategy,
|
||||
"quality_changes": self._default_strategy,
|
||||
"definition_changes": self._default_strategy,
|
||||
"material": self._default_strategy}
|
||||
self._result = {
|
||||
"machine": self._default_strategy,
|
||||
"quality_changes": self._default_strategy,
|
||||
"definition_changes": self._default_strategy,
|
||||
"material": self._default_strategy,
|
||||
}
|
||||
self._visible = True
|
||||
self.showDialogSignal.emit()
|
||||
|
||||
|
|
|
@ -208,12 +208,14 @@ Item
|
|||
anchors.rightMargin: UM.Theme.getSize("thin_margin").height
|
||||
|
||||
enabled: UM.Backend.state == UM.Backend.Done
|
||||
currentIndex: UM.Backend.state == UM.Backend.Done ? 0 : 1
|
||||
currentIndex: UM.Backend.state == UM.Backend.Done ? dfFilenameTextfield.text.startsWith("MM")? 1 : 0 : 2
|
||||
|
||||
textRole: "text"
|
||||
valueRole: "value"
|
||||
|
||||
model: [
|
||||
{ text: catalog.i18nc("@option", "Save Cura project and print file"), key: "3mf_ufp", value: ["3mf", "ufp"] },
|
||||
{ text: catalog.i18nc("@option", "Save Cura project and .ufp print file"), key: "3mf_ufp", value: ["3mf", "ufp"] },
|
||||
{ text: catalog.i18nc("@option", "Save Cura project and .makerbot print file"), key: "3mf_makerbot", value: ["3mf", "makerbot"] },
|
||||
{ text: catalog.i18nc("@option", "Save Cura project"), key: "3mf", value: ["3mf"] },
|
||||
]
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ from .ExportFileJob import ExportFileJob
|
|||
class DFFileExportAndUploadManager:
|
||||
"""
|
||||
Class responsible for exporting the scene and uploading the exported data to the Digital Factory Library. Since 3mf
|
||||
and UFP files may need to be uploaded at the same time, this class keeps a single progress and success message for
|
||||
and (UFP or makerbot) files may need to be uploaded at the same time, this class keeps a single progress and success message for
|
||||
both files and updates those messages according to the progress of both the file job uploads.
|
||||
"""
|
||||
def __init__(self, file_handlers: Dict[str, FileHandler],
|
||||
|
@ -118,7 +118,7 @@ class DFFileExportAndUploadManager:
|
|||
library_project_id = self._library_project_id,
|
||||
source_file_id = self._source_file_id
|
||||
)
|
||||
self._api.requestUploadUFP(request, on_finished = self._uploadFileData, on_error = self._onRequestUploadPrintFileFailed)
|
||||
self._api.requestUploadMeshFile(request, on_finished = self._uploadFileData, on_error = self._onRequestUploadPrintFileFailed)
|
||||
|
||||
def _uploadFileData(self, file_upload_response: Union[DFLibraryFileUploadResponse, DFPrintJobUploadResponse]) -> None:
|
||||
"""Uploads the exported file data after the file or print job upload has been registered at the Digital Factory
|
||||
|
@ -279,22 +279,25 @@ class DFFileExportAndUploadManager:
|
|||
This means that something went wrong with the initial request to create a "file" entry in the digital library.
|
||||
"""
|
||||
reply_string = bytes(reply.readAll()).decode()
|
||||
filename_ufp = self._file_name + ".ufp"
|
||||
Logger.log("d", "An error occurred while uploading the print job file '{}' to the Digital Library project '{}': {}".format(filename_ufp, self._library_project_id, reply_string))
|
||||
if "ufp" in self._formats:
|
||||
filename_meshfile = self._file_name + ".ufp"
|
||||
elif "makerbot" in self._formats:
|
||||
filename_meshfile = self._file_name + ".makerbot"
|
||||
Logger.log("d", "An error occurred while uploading the print job file '{}' to the Digital Library project '{}': {}".format(filename_meshfile, self._library_project_id, reply_string))
|
||||
with self._message_lock:
|
||||
# Set the progress to 100% when the upload job fails, to avoid having the progress message stuck
|
||||
self._file_upload_job_metadata[filename_ufp]["upload_status"] = "failed"
|
||||
self._file_upload_job_metadata[filename_ufp]["upload_progress"] = 100
|
||||
self._file_upload_job_metadata[filename_meshfile]["upload_status"] = "failed"
|
||||
self._file_upload_job_metadata[filename_meshfile]["upload_progress"] = 100
|
||||
|
||||
human_readable_error = self.extractErrorTitle(reply_string)
|
||||
self._file_upload_job_metadata[filename_ufp]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
|
||||
self._file_upload_job_metadata[filename_meshfile]["file_upload_failed_message"] = getBackwardsCompatibleMessage(
|
||||
title = "File upload error",
|
||||
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_ufp, self._library_project_name, human_readable_error),
|
||||
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_meshfile, self._library_project_name, human_readable_error),
|
||||
message_type_str = "ERROR",
|
||||
lifetime = 30
|
||||
)
|
||||
self._on_upload_error()
|
||||
self._onFileUploadFinished(filename_ufp)
|
||||
self._onFileUploadFinished(filename_meshfile)
|
||||
|
||||
@staticmethod
|
||||
def extractErrorTitle(reply_body: Optional[str]) -> str:
|
||||
|
@ -407,4 +410,28 @@ class DFFileExportAndUploadManager:
|
|||
job_ufp = ExportFileJob(self._file_handlers["ufp"], self._nodes, self._file_name, "ufp")
|
||||
job_ufp.finished.connect(self._onPrintFileExported)
|
||||
self._upload_jobs.append(job_ufp)
|
||||
|
||||
if "makerbot" in self._formats and "makerbot" in self._file_handlers and self._file_handlers["makerbot"]:
|
||||
filename_makerbot = self._file_name + ".makerbot"
|
||||
metadata[filename_makerbot] = {
|
||||
"export_job_output" : None,
|
||||
"upload_progress" : -1,
|
||||
"upload_status" : "",
|
||||
"file_upload_response": None,
|
||||
"file_upload_success_message": getBackwardsCompatibleMessage(
|
||||
text = "'{}' was uploaded to '{}'.".format(filename_makerbot, self._library_project_name),
|
||||
title = "Upload successful",
|
||||
message_type_str = "POSITIVE",
|
||||
lifetime = 30,
|
||||
),
|
||||
"file_upload_failed_message": getBackwardsCompatibleMessage(
|
||||
text = "Failed to upload the file '{}' to '{}'.".format(filename_makerbot, self._library_project_name),
|
||||
title = "File upload error",
|
||||
message_type_str = "ERROR",
|
||||
lifetime = 30
|
||||
)
|
||||
}
|
||||
job_makerbot = ExportFileJob(self._file_handlers["makerbot"], self._nodes, self._file_name, "makerbot")
|
||||
job_makerbot.finished.connect(self._onPrintFileExported)
|
||||
self._upload_jobs.append(job_makerbot)
|
||||
return metadata
|
||||
|
|
|
@ -313,7 +313,7 @@ class DigitalFactoryApiClient:
|
|||
error_callback = on_error,
|
||||
timeout = self.DEFAULT_REQUEST_TIMEOUT)
|
||||
|
||||
def requestUploadUFP(self, request: DFPrintJobUploadRequest,
|
||||
def requestUploadMeshFile(self, request: DFPrintJobUploadRequest,
|
||||
on_finished: Callable[[DFPrintJobUploadResponse], Any],
|
||||
on_error: Optional[Callable[["QNetworkReply", "QNetworkReply.NetworkError"], None]] = None) -> None:
|
||||
"""Requests the Digital Factory to register the upload of a file in a library project.
|
||||
|
|
|
@ -92,7 +92,8 @@ class DigitalFactoryOutputDevice(ProjectOutputDevice):
|
|||
if not self._controller.file_handlers:
|
||||
self._controller.file_handlers = {
|
||||
"3mf": CuraApplication.getInstance().getWorkspaceFileHandler(),
|
||||
"ufp": CuraApplication.getInstance().getMeshFileHandler()
|
||||
"ufp": CuraApplication.getInstance().getMeshFileHandler(),
|
||||
"makerbot": CuraApplication.getInstance().getMeshFileHandler()
|
||||
}
|
||||
|
||||
self._dialog = CuraApplication.getInstance().createQmlComponent(self._dialog_path, {"manager": self._controller})
|
||||
|
|
306
plugins/MakerbotWriter/MakerbotWriter.py
Normal file
306
plugins/MakerbotWriter/MakerbotWriter.py
Normal file
|
@ -0,0 +1,306 @@
|
|||
# Copyright (c) 2023 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from io import StringIO, BufferedIOBase
|
||||
import json
|
||||
from typing import cast, List, Optional, Dict
|
||||
from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED
|
||||
import pyDulcificum as du
|
||||
|
||||
from PyQt6.QtCore import QBuffer
|
||||
|
||||
from UM.Logger import Logger
|
||||
from UM.Math.AxisAlignedBox import AxisAlignedBox
|
||||
from UM.Mesh.MeshWriter import MeshWriter
|
||||
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Scene.SceneNode import SceneNode
|
||||
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||
from UM.i18n import i18nCatalog
|
||||
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Snapshot import Snapshot
|
||||
from cura.Utils.Threading import call_on_qt_thread
|
||||
from cura.CuraVersion import ConanInstalls
|
||||
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
|
||||
class MakerbotWriter(MeshWriter):
|
||||
"""A file writer that writes '.makerbot' files."""
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__(add_to_recent_files=False)
|
||||
Logger.info(f"Using PyDulcificum: {du.__version__}")
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name="application/x-makerbot",
|
||||
comment="Makerbot Toolpath Package",
|
||||
suffixes=["makerbot"]
|
||||
)
|
||||
)
|
||||
|
||||
_PNG_FORMATS = [
|
||||
{"prefix": "isometric_thumbnail", "width": 120, "height": 120},
|
||||
{"prefix": "isometric_thumbnail", "width": 320, "height": 320},
|
||||
{"prefix": "isometric_thumbnail", "width": 640, "height": 640},
|
||||
{"prefix": "thumbnail", "width": 140, "height": 106},
|
||||
{"prefix": "thumbnail", "width": 212, "height": 300},
|
||||
{"prefix": "thumbnail", "width": 960, "height": 1460},
|
||||
{"prefix": "thumbnail", "width": 90, "height": 90},
|
||||
]
|
||||
_META_VERSION = "3.0.0"
|
||||
_PRINT_NAME_MAP = {
|
||||
"UltiMaker Method": "fire_e",
|
||||
"UltiMaker Method X": "lava_f",
|
||||
"UltiMaker Method XL": "magma_10",
|
||||
}
|
||||
_EXTRUDER_NAME_MAP = {
|
||||
"1XA": "mk14_hot",
|
||||
"2XA": "mk14_hot_s",
|
||||
"1C": "mk14_c",
|
||||
"1A": "mk14",
|
||||
"2A": "mk14_s",
|
||||
}
|
||||
_MATERIAL_MAP = {"2780b345-577b-4a24-a2c5-12e6aad3e690": "abs",
|
||||
"88c8919c-6a09-471a-b7b6-e801263d862d": "abs-wss1",
|
||||
"416eead4-0d8e-4f0b-8bfc-a91a519befa5": "asa",
|
||||
"85bbae0e-938d-46fb-989f-c9b3689dc4f0": "nylon-cf",
|
||||
"283d439a-3490-4481-920c-c51d8cdecf9c": "nylon",
|
||||
"62414577-94d1-490d-b1e4-7ef3ec40db02": "pc",
|
||||
"69386c85-5b6c-421a-bec5-aeb1fb33f060": "petg",
|
||||
"0ff92885-617b-4144-a03c-9989872454bc": "pla",
|
||||
"a4255da2-cb2a-4042-be49-4a83957a2f9a": "pva",
|
||||
"a140ef8f-4f26-4e73-abe0-cfc29d6d1024": "wss1",
|
||||
"77873465-83a9-4283-bc44-4e542b8eb3eb": "sr30",
|
||||
"96fca5d9-0371-4516-9e96-8e8182677f3c": "im-pla",
|
||||
"9f52c514-bb53-46a6-8c0c-d507cd6ee742": "abs",
|
||||
"0f9a2a91-f9d6-4b6b-bd9b-a120a29391be": "abs",
|
||||
"d3e972f2-68c0-4d2f-8cfd-91028dfc3381": "abs",
|
||||
"495a0ce5-9daf-4a16-b7b2-06856d82394d": "abs-cf10",
|
||||
"cb76bd6e-91fd-480c-a191-12301712ec77": "abs-wss1",
|
||||
"a017777e-3f37-4d89-a96c-dc71219aac77": "abs-wss1",
|
||||
"4d96000d-66de-4d54-a580-91827dcfd28f": "abs-wss1",
|
||||
"0ecb0e1a-6a66-49fb-b9ea-61a8924e0cf5": "asa",
|
||||
"efebc2ea-2381-4937-926f-e824524524a5": "asa",
|
||||
"b0199512-5714-4951-af85-be19693430f8": "asa",
|
||||
"b9f55a0a-a2b6-4b8d-8d48-07802c575bd1": "pla",
|
||||
"c439d884-9cdc-4296-a12c-1bacae01003f": "pla",
|
||||
"16a723e3-44df-49f4-82ec-2a1173c1e7d9": "pla",
|
||||
"74d0f5c2-fdfd-4c56-baf1-ff5fa92d177e": "pla",
|
||||
"64dcb783-470d-4400-91b1-7001652f20da": "pla",
|
||||
"3a1b479b-899c-46eb-a2ea-67050d1a4937": "pla",
|
||||
"4708ac49-5dde-4cc2-8c0a-87425a92c2b3": "pla",
|
||||
"4b560eda-1719-407f-b085-1c2c1fc8ffc1": "pla",
|
||||
"e10a287d-0067-4a58-9083-b7054f479991": "im-pla",
|
||||
"01a6b5b0-fab1-420c-a5d9-31713cbeb404": "im-pla",
|
||||
"f65df4ad-a027-4a48-a51d-975cc8b87041": "im-pla",
|
||||
"f48739f8-6d96-4a3d-9a2e-8505a47e2e35": "im-pla",
|
||||
"5c7d7672-e885-4452-9a78-8ba90ec79937": "petg",
|
||||
"91e05a6e-2f5b-4964-b973-d83b5afe6db4": "petg",
|
||||
"bdc7dd03-bf38-48ee-aeca-c3e11cee799e": "petg",
|
||||
"54f66c89-998d-4070-aa60-1cb0fd887518": "nylon",
|
||||
"002c84b3-84ac-4b5a-b57d-fe1f555a6351": "pva",
|
||||
"e4da5fcb-f62d-48a2-aaef-0b645aa6973b": "wss1",
|
||||
"77f06146-6569-437d-8380-9edb0d635a32": "sr30"}
|
||||
|
||||
# must be called from the main thread because of OpenGL
|
||||
@staticmethod
|
||||
@call_on_qt_thread
|
||||
def _createThumbnail(width: int, height: int) -> Optional[QBuffer]:
|
||||
if not CuraApplication.getInstance().isVisible:
|
||||
Logger.warning("Can't create snapshot when renderer not initialized.")
|
||||
return
|
||||
try:
|
||||
snapshot = Snapshot.isometricSnapshot(width, height)
|
||||
|
||||
thumbnail_buffer = QBuffer()
|
||||
thumbnail_buffer.open(QBuffer.OpenModeFlag.WriteOnly)
|
||||
|
||||
snapshot.save(thumbnail_buffer, "PNG")
|
||||
|
||||
return thumbnail_buffer
|
||||
|
||||
except:
|
||||
Logger.logException("w", "Failed to create snapshot image")
|
||||
|
||||
return None
|
||||
|
||||
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool:
|
||||
if mode != MeshWriter.OutputMode.BinaryMode:
|
||||
Logger.log("e", "MakerbotWriter does not support text mode.")
|
||||
self.setInformation(catalog.i18nc("@error:not supported", "MakerbotWriter does not support text mode."))
|
||||
return False
|
||||
|
||||
# The GCodeWriter plugin is always available since it is in the "required" list of plugins.
|
||||
gcode_writer = PluginRegistry.getInstance().getPluginObject("GCodeWriter")
|
||||
|
||||
if gcode_writer is None:
|
||||
Logger.log("e", "Could not find the GCodeWriter plugin, is it disabled?.")
|
||||
self.setInformation(
|
||||
catalog.i18nc("@error:load", "Could not load GCodeWriter plugin. Try to re-enable the plugin."))
|
||||
return False
|
||||
|
||||
gcode_writer = cast(MeshWriter, gcode_writer)
|
||||
|
||||
gcode_text_io = StringIO()
|
||||
success = gcode_writer.write(gcode_text_io, None)
|
||||
|
||||
# Writing the g-code failed. Then I can also not write the gzipped g-code.
|
||||
if not success:
|
||||
self.setInformation(gcode_writer.getInformation())
|
||||
return False
|
||||
|
||||
json_toolpaths = du.gcode_2_miracle_jtp(gcode_text_io.getvalue())
|
||||
metadata = self._getMeta(nodes)
|
||||
|
||||
png_files = []
|
||||
for png_format in self._PNG_FORMATS:
|
||||
width, height, prefix = png_format["width"], png_format["height"], png_format["prefix"]
|
||||
thumbnail_buffer = self._createThumbnail(width, height)
|
||||
if thumbnail_buffer is None:
|
||||
Logger.warning(f"Could not create thumbnail of size {width}x{height}.")
|
||||
continue
|
||||
png_files.append({
|
||||
"file": f"{prefix}_{width}x{height}.png",
|
||||
"data": thumbnail_buffer.data(),
|
||||
})
|
||||
|
||||
try:
|
||||
with ZipFile(stream, "w", compression=ZIP_DEFLATED) as zip_stream:
|
||||
zip_stream.writestr("meta.json", json.dumps(metadata, indent=4))
|
||||
zip_stream.writestr("print.jsontoolpath", json_toolpaths)
|
||||
for png_file in png_files:
|
||||
file, data = png_file["file"], png_file["data"]
|
||||
zip_stream.writestr(file, data)
|
||||
except (IOError, OSError, BadZipFile) as ex:
|
||||
Logger.log("e", f"Could not write to (.makerbot) file because: '{ex}'.")
|
||||
self.setInformation(catalog.i18nc("@error", "MakerbotWriter could not save to the designated path."))
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def _getMeta(self, root_nodes: List[SceneNode]) -> Dict[str, any]:
|
||||
application = CuraApplication.getInstance()
|
||||
machine_manager = application.getMachineManager()
|
||||
global_stack = machine_manager.activeMachine
|
||||
extruders = global_stack.extruderList
|
||||
|
||||
nodes = []
|
||||
for root_node in root_nodes:
|
||||
for node in DepthFirstIterator(root_node):
|
||||
if not getattr(node, "_outside_buildarea", False):
|
||||
if node.callDecoration(
|
||||
"isSliceable") and node.getMeshData() and node.isVisible() and not node.callDecoration(
|
||||
"isNonThumbnailVisibleMesh"):
|
||||
nodes.append(node)
|
||||
|
||||
meta = dict()
|
||||
|
||||
meta["bot_type"] = MakerbotWriter._PRINT_NAME_MAP.get((name := global_stack.definition.name), name)
|
||||
|
||||
bounds: Optional[AxisAlignedBox] = None
|
||||
for node in nodes:
|
||||
node_bounds = node.getBoundingBox()
|
||||
if node_bounds is None:
|
||||
continue
|
||||
if bounds is None:
|
||||
bounds = node_bounds
|
||||
else:
|
||||
bounds = bounds + node_bounds
|
||||
|
||||
if bounds is not None:
|
||||
meta["bounding_box"] = {
|
||||
"x_min": bounds.left,
|
||||
"x_max": bounds.right,
|
||||
"y_min": bounds.back,
|
||||
"y_max": bounds.front,
|
||||
"z_min": bounds.bottom,
|
||||
"z_max": bounds.top,
|
||||
}
|
||||
|
||||
material_bed_temperature = global_stack.getProperty("material_bed_temperature", "value")
|
||||
meta["platform_temperature"] = material_bed_temperature
|
||||
|
||||
build_volume_temperature = global_stack.getProperty("build_volume_temperature", "value")
|
||||
meta["build_plane_temperature"] = build_volume_temperature
|
||||
|
||||
print_information = application.getPrintInformation()
|
||||
|
||||
meta["commanded_duration_s"] = int(print_information.currentPrintTime)
|
||||
meta["duration_s"] = int(print_information.currentPrintTime)
|
||||
|
||||
material_lengths = list(map(meterToMillimeter, print_information.materialLengths))
|
||||
meta["extrusion_distance_mm"] = material_lengths[0]
|
||||
meta["extrusion_distances_mm"] = material_lengths
|
||||
|
||||
meta["extrusion_mass_g"] = print_information.materialWeights[0]
|
||||
meta["extrusion_masses_g"] = print_information.materialWeights
|
||||
|
||||
meta["uuid"] = print_information.slice_uuid
|
||||
|
||||
materials = []
|
||||
for extruder in extruders:
|
||||
guid = extruder.material.getMetaData().get("GUID")
|
||||
material_name = extruder.material.getMetaData().get("material")
|
||||
material = self._MATERIAL_MAP.get(guid, material_name)
|
||||
materials.append(material)
|
||||
|
||||
meta["material"] = materials[0]
|
||||
meta["materials"] = materials
|
||||
|
||||
materials_temps = [extruder.getProperty("default_material_print_temperature", "value") for extruder in
|
||||
extruders]
|
||||
meta["extruder_temperature"] = materials_temps[0]
|
||||
meta["extruder_temperatures"] = materials_temps
|
||||
|
||||
meta["model_counts"] = [{"count": 1, "name": node.getName()} for node in nodes]
|
||||
|
||||
tool_types = [MakerbotWriter._EXTRUDER_NAME_MAP.get((name := extruder.variant.getName()), name) for extruder in
|
||||
extruders]
|
||||
meta["tool_type"] = tool_types[0]
|
||||
meta["tool_types"] = tool_types
|
||||
|
||||
meta["version"] = MakerbotWriter._META_VERSION
|
||||
|
||||
meta["preferences"] = dict()
|
||||
for node in nodes:
|
||||
bounds = node.getBoundingBox()
|
||||
meta["preferences"][str(node.getName())] = {
|
||||
"machineBounds": [bounds.right, bounds.back, bounds.left, bounds.front] if bounds is not None else None,
|
||||
"printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory,
|
||||
}
|
||||
|
||||
meta["miracle_config"] = {"gaggles": {str(node.getName()): {} for node in nodes}}
|
||||
|
||||
cura_engine_info = ConanInstalls.get("curaengine", {"version": "unknown", "revision": "unknown"})
|
||||
meta["curaengine_version"] = cura_engine_info["version"]
|
||||
meta["curaengine_commit_hash"] = cura_engine_info["revision"]
|
||||
|
||||
dulcificum_info = ConanInstalls.get("dulcificum", {"version": "unknown", "revision": "unknown"})
|
||||
meta["dulcificum_version"] = dulcificum_info["version"]
|
||||
meta["dulcificum_commit_hash"] = dulcificum_info["revision"]
|
||||
|
||||
meta["makerbot_writer_version"] = self.getVersion()
|
||||
meta["pyDulcificum_version"] = du.__version__
|
||||
|
||||
# Add engine plugin information to the metadata
|
||||
for name, package_info in ConanInstalls.items():
|
||||
if not name.startswith("curaengine_"):
|
||||
continue
|
||||
meta[f"{name}_version"] = package_info["version"]
|
||||
meta[f"{name}_commit_hash"] = package_info["revision"]
|
||||
|
||||
# TODO add the following instructions
|
||||
# num_tool_changes
|
||||
# num_z_layers
|
||||
# num_z_transitions
|
||||
# platform_temperature
|
||||
# total_commands
|
||||
|
||||
return meta
|
||||
|
||||
|
||||
def meterToMillimeter(value: float) -> float:
|
||||
"""Converts a value in meters to millimeters."""
|
||||
return value * 1000.0
|
28
plugins/MakerbotWriter/__init__.py
Normal file
28
plugins/MakerbotWriter/__init__.py
Normal file
|
@ -0,0 +1,28 @@
|
|||
# Copyright (c) 2023 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
|
||||
from . import MakerbotWriter
|
||||
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
|
||||
def getMetaData():
|
||||
file_extension = "makerbot"
|
||||
return {
|
||||
"mesh_writer": {
|
||||
"output": [{
|
||||
"extension": file_extension,
|
||||
"description": catalog.i18nc("@item:inlistbox", "Makerbot Printfile"),
|
||||
"mime_type": "application/x-makerbot",
|
||||
"mode": MakerbotWriter.MakerbotWriter.OutputMode.BinaryMode,
|
||||
}],
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def register(app):
|
||||
return {
|
||||
"mesh_writer": MakerbotWriter.MakerbotWriter(),
|
||||
}
|
13
plugins/MakerbotWriter/plugin.json
Normal file
13
plugins/MakerbotWriter/plugin.json
Normal file
|
@ -0,0 +1,13 @@
|
|||
{
|
||||
"name": "Makerbot Printfile Writer",
|
||||
"author": "UltiMaker",
|
||||
"version": "0.1.0",
|
||||
"description": "Provides support for writing MakerBot Format Packages.",
|
||||
"api": 8,
|
||||
"supported_sdk_versions": [
|
||||
"8.0.0",
|
||||
"8.1.0",
|
||||
"8.2.0"
|
||||
],
|
||||
"i18n-catalog": "cura"
|
||||
}
|
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Method X.png
Normal file
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Method X.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 202 KiB |
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Method XL.png
Normal file
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Method XL.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 620 KiB |
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Method.png
Normal file
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Method.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 140 KiB |
|
@ -115,7 +115,7 @@ UM.Dialog
|
|||
// Utils
|
||||
function formatPrintJobName(name)
|
||||
{
|
||||
var extensions = [ ".gcode.gz", ".gz", ".gcode", ".ufp" ]
|
||||
var extensions = [ ".gcode.gz", ".gz", ".gcode", ".ufp", ".makerbot" ]
|
||||
for (var i = 0; i < extensions.length; i++)
|
||||
{
|
||||
var extension = extensions[i]
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) 2019 Ultimaker B.V.
|
||||
// Copyright (c) 2023 UltiMaker
|
||||
// Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import QtQuick 2.2
|
||||
|
@ -6,7 +6,7 @@ import UM 1.3 as UM
|
|||
import Cura 1.0 as Cura
|
||||
|
||||
Item {
|
||||
property var cameraUrl: "";
|
||||
property string cameraUrl: "";
|
||||
|
||||
Rectangle {
|
||||
anchors.fill:parent;
|
||||
|
@ -34,22 +34,29 @@ Item {
|
|||
|
||||
Cura.NetworkMJPGImage {
|
||||
id: cameraImage
|
||||
anchors.horizontalCenter: parent.horizontalCenter;
|
||||
anchors.verticalCenter: parent.verticalCenter;
|
||||
height: Math.round((imageHeight === 0 ? 600 * screenScaleFactor : imageHeight) * width / imageWidth);
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
|
||||
readonly property real img_scale_factor: {
|
||||
if (imageWidth > maximumWidth || imageHeight > maximumHeight) {
|
||||
return Math.min(maximumWidth / imageWidth, maximumHeight / imageHeight);
|
||||
}
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
width: imageWidth === 0 ? 800 * screenScaleFactor : imageWidth * img_scale_factor
|
||||
height: imageHeight === 0 ? 600 * screenScaleFactor : imageHeight * img_scale_factor
|
||||
|
||||
onVisibleChanged: {
|
||||
if (cameraUrl === "") return;
|
||||
|
||||
if (visible) {
|
||||
if (cameraUrl != "") {
|
||||
start();
|
||||
}
|
||||
start();
|
||||
} else {
|
||||
if (cameraUrl != "") {
|
||||
stop();
|
||||
}
|
||||
stop();
|
||||
}
|
||||
}
|
||||
source: cameraUrl
|
||||
width: Math.min(imageWidth === 0 ? 800 * screenScaleFactor : imageWidth, maximumWidth);
|
||||
z: 1
|
||||
}
|
||||
|
||||
|
|
|
@ -82,13 +82,22 @@ class CloudApiClient:
|
|||
# HACK: There is something weird going on with the API, as it reports printer types in formats like
|
||||
# "ultimaker_s3", but wants "Ultimaker S3" when using the machine_variant filter query. So we need to do some
|
||||
# conversion!
|
||||
# API points to "MakerBot Method" for a makerbot printertypes which we already changed to allign with other printer_type
|
||||
|
||||
machine_type = machine_type.replace("_plus", "+")
|
||||
machine_type = machine_type.replace("_", " ")
|
||||
machine_type = machine_type.replace("ultimaker", "ultimaker ")
|
||||
machine_type = machine_type.replace(" ", " ")
|
||||
machine_type = machine_type.title()
|
||||
machine_type = urllib.parse.quote_plus(machine_type)
|
||||
method_x = {
|
||||
"ultimaker_method":"MakerBot Method",
|
||||
"ultimaker_methodx":"MakerBot Method X",
|
||||
"ultimaker_methodxl":"MakerBot Method XL"
|
||||
}
|
||||
if machine_type in method_x:
|
||||
machine_type = method_x[machine_type]
|
||||
else:
|
||||
machine_type = machine_type.replace("_plus", "+")
|
||||
machine_type = machine_type.replace("_", " ")
|
||||
machine_type = machine_type.replace("ultimaker", "ultimaker ")
|
||||
machine_type = machine_type.replace(" ", " ")
|
||||
machine_type = machine_type.title()
|
||||
machine_type = urllib.parse.quote_plus(machine_type)
|
||||
url = f"{self.CLUSTER_API_ROOT}/clusters?machine_variant={machine_type}"
|
||||
self._http.get(url,
|
||||
scope=self._scope,
|
||||
|
|
|
@ -58,6 +58,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
|||
|
||||
# The minimum version of firmware that support print job actions over cloud.
|
||||
PRINT_JOB_ACTIONS_MIN_VERSION = Version("5.2.12")
|
||||
PRINT_JOB_ACTIONS_MIN_VERSION_METHOD = Version("2.700")
|
||||
|
||||
# Notify can only use signals that are defined by the class that they are in, not inherited ones.
|
||||
# Therefore, we create a private signal used to trigger the printersChanged signal.
|
||||
|
@ -325,8 +326,13 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
|||
if not self._printers:
|
||||
return False
|
||||
version_number = self.printers[0].firmwareVersion.split(".")
|
||||
firmware_version = Version([version_number[0], version_number[1], version_number[2]])
|
||||
return firmware_version >= self.PRINT_JOB_ACTIONS_MIN_VERSION
|
||||
if len(version_number)> 2:
|
||||
firmware_version = Version([version_number[0], version_number[1], version_number[2]])
|
||||
return firmware_version >= self.PRINT_JOB_ACTIONS_MIN_VERSION
|
||||
else:
|
||||
firmware_version = Version([version_number[0], version_number[1]])
|
||||
return firmware_version >= self.PRINT_JOB_ACTIONS_MIN_VERSION_METHOD
|
||||
|
||||
|
||||
@pyqtProperty(bool, constant = True)
|
||||
def supportsPrintJobQueue(self) -> bool:
|
||||
|
|
|
@ -9,6 +9,7 @@ from PyQt6.QtWidgets import QMessageBox
|
|||
|
||||
from UM import i18nCatalog
|
||||
from UM.Logger import Logger # To log errors talking to the API.
|
||||
from UM.Message import Message
|
||||
from UM.Settings.Interfaces import ContainerInterface
|
||||
from UM.Signal import Signal
|
||||
from UM.Util import parseBool
|
||||
|
@ -25,7 +26,7 @@ from .CloudOutputDevice import CloudOutputDevice
|
|||
from ..Messages.RemovedPrintersMessage import RemovedPrintersMessage
|
||||
from ..Models.Http.CloudClusterResponse import CloudClusterResponse
|
||||
from ..Messages.NewPrinterDetectedMessage import NewPrinterDetectedMessage
|
||||
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
class CloudOutputDeviceManager:
|
||||
"""The cloud output device manager is responsible for using the Ultimaker Cloud APIs to manage remote clusters.
|
||||
|
@ -179,6 +180,13 @@ class CloudOutputDeviceManager:
|
|||
return
|
||||
Logger.log("e", f"Failed writing to specific cloud printer: {unique_id} not in remote clusters.")
|
||||
|
||||
# This message is added so that user knows when the print job was not sent to cloud printer
|
||||
message = Message(catalog.i18nc("@info:status",
|
||||
"Failed writing to specific cloud printer: {0} not in remote clusters.").format(unique_id),
|
||||
title=catalog.i18nc("@info:title", "Error"),
|
||||
message_type=Message.MessageType.ERROR)
|
||||
message.show()
|
||||
|
||||
def _createMachineStacksForDiscoveredClusters(self, discovered_clusters: List[CloudClusterResponse]) -> None:
|
||||
"""**Synchronously** create machines for discovered devices
|
||||
|
||||
|
|
|
@ -106,6 +106,10 @@ class MeshFormatHandler:
|
|||
if "application/x-ufp" not in machine_file_formats and Version(firmware_version) >= Version("4.4"):
|
||||
machine_file_formats = ["application/x-ufp"] + machine_file_formats
|
||||
|
||||
# Exception for makerbot firmware version >=2.700: makerbot is supported
|
||||
elif "application/x-makerbot" not in machine_file_formats and Version(firmware_version >= Version("2.700")):
|
||||
machine_file_formats = ["application/x-makerbot"] + machine_file_formats
|
||||
|
||||
# Take the intersection between file_formats and machine_file_formats.
|
||||
format_by_mimetype = {f["mime_type"]: f for f in file_formats}
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from typing import Optional, List
|
||||
|
||||
from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice
|
||||
from ..BaseModel import BaseModel
|
||||
|
||||
|
||||
|
@ -34,7 +35,7 @@ class CloudClusterResponse(BaseModel):
|
|||
self.host_version = host_version
|
||||
self.host_internal_ip = host_internal_ip
|
||||
self.friendly_name = friendly_name
|
||||
self.printer_type = printer_type
|
||||
self.printer_type = NetworkedPrinterOutputDevice.applyPrinterTypeMapping(printer_type)
|
||||
self.printer_count = printer_count
|
||||
self.capabilities = capabilities if capabilities is not None else []
|
||||
super().__init__(**kwargs)
|
||||
|
@ -51,3 +52,4 @@ class CloudClusterResponse(BaseModel):
|
|||
:return: A human-readable representation of the data in this object.
|
||||
"""
|
||||
return str({k: v for k, v in self.__dict__.items() if k in {"cluster_id", "host_guid", "host_name", "status", "is_online", "host_version", "host_internal_ip", "friendly_name", "printer_type", "printer_count", "capabilities"}})
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ import re
|
|||
|
||||
class VersionUpgrade54to55(VersionUpgrade):
|
||||
profile_regex = re.compile(
|
||||
r"um\_(?P<machine>s(3|5|7))_(?P<core_type>aa|cc|bb)(?P<nozzle_size>0\.(6|4|8))_(?P<material>pla|petg|abs|cpe|cpe_plus|nylon|pc|petcf|tough_pla|tpu)_(?P<layer_height>0\.\d{1,2}mm)")
|
||||
r"um\_(?P<machine>s(3|5|7))_(?P<core_type>aa|cc|bb)(?P<nozzle_size>0\.(6|4|8))_(?P<material>pla|petg|abs|tough_pla)_(?P<layer_height>0\.\d{1,2}mm)")
|
||||
|
||||
@staticmethod
|
||||
def _isUpgradedUltimakerDefinitionId(definition_id: str) -> bool:
|
||||
|
|
|
@ -305,6 +305,23 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"MakerbotWriter": {
|
||||
"package_info": {
|
||||
"package_id": "MakerbotWriter",
|
||||
"package_type": "plugin",
|
||||
"display_name": "Makerbot Printfile Writer",
|
||||
"description": "Provides support for writing MakerBot Format Packages.",
|
||||
"package_version": "1.0.1",
|
||||
"sdk_version": "8.5.0",
|
||||
"website": "https://ultimaker.com",
|
||||
"author": {
|
||||
"author_id": "UltimakerPackages",
|
||||
"display_name": "UltiMaker",
|
||||
"email": "plugins@ultimaker.com",
|
||||
"website": "https://ultimaker.com"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ModelChecker": {
|
||||
"package_info": {
|
||||
"package_id": "ModelChecker",
|
||||
|
|
|
@ -137,8 +137,6 @@
|
|||
"machine_start_gcode": { "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nM200 D0 T0 ;reset filament diameter\\nM200 D0 T1\\nG28 Z0; home all\\nG28 X0 Y0\\nG0 Z20 F2400 ;move the platform to 20mm\\nG92 E0\\nM190 S{material_bed_temperature_layer_0}\\nM109 T0 S{material_standby_temperature, 0}\\nM109 T1 S{material_print_temperature_layer_0, 1}\\nM104 T0 S{material_print_temperature_layer_0, 0}\\nT1 ; move to the 2th head\\nG0 Z20 F2400\\nG92 E-7.0 ;prime distance\\nG1 E0 F45 ;purge nozzle\\nG1 E-5.1 F1500 ; retract\\nG1 X90 Z0.01 F5000 ; move away from the prime poop\\nG1 X50 F9000\\nG0 Z20 F2400\\nT0 ; move to the first head\\nM104 T1 S{material_standby_temperature, 1}\\nG0 Z20 F2400\\nM104 T{initial_extruder_nr} S{material_print_temperature_layer_0, initial_extruder_nr}\\nG92 E-7.0\\nG1 E0 F45 ;purge nozzle\\nG1 X60 Z0.01 F5000 ; move away from the prime poop\\nG1 X20 F9000\\nM400 ;finish all moves\\nG92 E0\\n;end of startup sequence\\n\"" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": false },
|
||||
"machine_width": { "default_value": 223 },
|
||||
"prime_tower_position_x": { "value": "185" },
|
||||
"prime_tower_position_y": { "value": "160" },
|
||||
"retraction_amount": { "default_value": 5.1 },
|
||||
"retraction_speed": { "default_value": 25 },
|
||||
"speed_support": { "value": "speed_wall_0" },
|
||||
|
|
|
@ -60,8 +60,6 @@
|
|||
"material_diameter": { "default_value": 1.75 },
|
||||
"material_initial_print_temperature": { "value": "material_print_temperature" },
|
||||
"prime_tower_min_volume": { "value": "((resolveOrValue('layer_height'))/2" },
|
||||
"prime_tower_position_x": { "value": "240" },
|
||||
"prime_tower_position_y": { "value": "190" },
|
||||
"prime_tower_size": { "value": "30" },
|
||||
"prime_tower_wipe_enabled": { "default_value": true },
|
||||
"retraction_amount": { "default_value": 5 },
|
||||
|
|
|
@ -111,8 +111,6 @@
|
|||
"minimum_polygon_circumference": { "value": "0.2" },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"prime_tower_enable": { "value": "True" },
|
||||
"prime_tower_position_x": { "value": "270" },
|
||||
"prime_tower_position_y": { "value": "270" },
|
||||
"retraction_amount": { "value": "1" },
|
||||
"retraction_combing": { "value": "'noskin'" },
|
||||
"retraction_combing_max_distance": { "value": "10" },
|
||||
|
|
|
@ -41,8 +41,6 @@
|
|||
"machine_start_gcode": { "default_value": "M104 T0 165\nM104 T1 165\nM109 T{initial_extruder_nr} S{material_print_temperature_layer_0, initial_extruder_nr}\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z2.0 F400 ;move the platform down 2mm\nT0\nG92 E0\nG28\nG1 Y0 F1200 E0\nG92 E0\nT{initial_extruder_nr}\nM117 BIBO Printing..." },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 214 },
|
||||
"prime_tower_position_x": { "value": "50" },
|
||||
"prime_tower_position_y": { "value": "50" },
|
||||
"speed_print": { "default_value": 40 }
|
||||
}
|
||||
}
|
|
@ -81,8 +81,6 @@
|
|||
"material_standby_temperature": { "value": "material_print_temperature" },
|
||||
"prime_blob_enable": { "enabled": true },
|
||||
"prime_tower_min_volume": { "default_value": 50 },
|
||||
"prime_tower_position_x": { "value": "175" },
|
||||
"prime_tower_position_y": { "value": "178" },
|
||||
"prime_tower_wipe_enabled": { "default_value": false },
|
||||
"retraction_amount": { "default_value": 3 },
|
||||
"retraction_speed": { "default_value": 15 },
|
||||
|
|
|
@ -81,8 +81,6 @@
|
|||
"material_standby_temperature": { "value": "material_print_temperature" },
|
||||
"prime_blob_enable": { "enabled": true },
|
||||
"prime_tower_min_volume": { "default_value": 50 },
|
||||
"prime_tower_position_x": { "value": "175" },
|
||||
"prime_tower_position_y": { "value": "178" },
|
||||
"prime_tower_wipe_enabled": { "default_value": false },
|
||||
"retraction_amount": { "default_value": 3 },
|
||||
"retraction_speed": { "default_value": 15 },
|
||||
|
|
|
@ -80,8 +80,6 @@
|
|||
"material_standby_temperature": { "value": "material_print_temperature" },
|
||||
"prime_blob_enable": { "enabled": true },
|
||||
"prime_tower_min_volume": { "default_value": 50 },
|
||||
"prime_tower_position_x": { "value": "175" },
|
||||
"prime_tower_position_y": { "value": "178" },
|
||||
"prime_tower_wipe_enabled": { "default_value": false },
|
||||
"retraction_amount": { "default_value": 3 },
|
||||
"retraction_speed": { "default_value": 15 },
|
||||
|
|
|
@ -66,8 +66,6 @@
|
|||
"optimize_wall_printing_order": { "default_value": true },
|
||||
"prime_blob_enable": { "default_value": false },
|
||||
"prime_tower_min_volume": { "value": "0.7" },
|
||||
"prime_tower_position_x": { "value": "125" },
|
||||
"prime_tower_position_y": { "value": "70" },
|
||||
"prime_tower_size": { "value": 24.0 },
|
||||
"retraction_extra_prime_amount": { "minimum_value_warning": "-2.0" }
|
||||
}
|
||||
|
|
|
@ -55,8 +55,6 @@
|
|||
"machine_shape": { "default_value": "elliptic" },
|
||||
"machine_start_gcode": { "default_value": ";---------------------------------------\n;Deltacomb start script\n;---------------------------------------\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nG28 ;Home all axes (max endstops)\nM420 S1; Bed Level Enable\nG92 E0 ;zero the extruded length\nG1 Z15.0 F9000 ;move to the platform down 15mm\nG1 F9000\n\n;Put printing message on LCD screen\nM117 In stampa...\nM140 S{print_bed_temperature} ;set the target bed temperature\n;---------------------------------------" },
|
||||
"prime_tower_brim_enable": { "value": false },
|
||||
"prime_tower_position_x": { "value": "prime_tower_size / 2" },
|
||||
"prime_tower_position_y": { "value": "machine_depth / 2 - prime_tower_size - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1" },
|
||||
"prime_tower_size": { "value": "math.sqrt(extruders_enabled_count * prime_tower_min_volume / layer_height / math.pi) * 2" },
|
||||
"retraction_amount": { "default_value": 3.5 },
|
||||
"retraction_combing": { "value": "'noskin'" },
|
||||
|
|
|
@ -131,8 +131,6 @@
|
|||
"machine_width": { "default_value": 238 },
|
||||
"material_adhesion_tendency": { "enabled": true },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"prime_tower_position_x": { "value": "180" },
|
||||
"prime_tower_position_y": { "value": "160" },
|
||||
"retraction_amount": { "default_value": 6.5 },
|
||||
"retraction_speed": { "default_value": 25 },
|
||||
"speed_support": { "value": "speed_wall_0" },
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
"minimum_interface_area": { "default_value": 10 },
|
||||
"minimum_support_area": { "value": "3 if support_structure == 'normal' else 0" },
|
||||
"optimize_wall_printing_order": { "default_value": true },
|
||||
"prime_tower_brim_enable": { "default_value": true },
|
||||
"prime_tower_brim_enable": { "value": true },
|
||||
"prime_tower_min_volume": { "value": "(layer_height) * (prime_tower_size / 2)**2 * 3 * 0.5 " },
|
||||
"prime_tower_size": { "default_value": 30 },
|
||||
"prime_tower_wipe_enabled": { "default_value": false },
|
||||
|
|
100
resources/definitions/elegoo_neptune_4.def.json
Normal file
100
resources/definitions/elegoo_neptune_4.def.json
Normal file
|
@ -0,0 +1,100 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "ELEGOO NEPTUNE 4",
|
||||
"inherits": "elegoo_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "mastercaution"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"acceleration_layer_0": { "value": 3000 },
|
||||
"acceleration_print": { "value": 3000 },
|
||||
"acceleration_travel": { "value": 5000 },
|
||||
"cool_fan_full_layer": { "value": 2 },
|
||||
"infill_line_width": { "value": "line_width + 0.05" },
|
||||
"infill_overlap": { "value": "0 if infill_sparse_density < 40.01 and infill_pattern != 'concentric' else -5" },
|
||||
"initial_layer_line_width_factor": { "value": "100.0 if resolveOrValue('adhesion_type') == 'raft' else 125 if line_width < 0.5 else 110" },
|
||||
"machine_acceleration": { "value": 3000 },
|
||||
"machine_depth": { "default_value": 230 },
|
||||
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z2 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
|
||||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
"machine_head_with_fans_polygon":
|
||||
{
|
||||
"value": [
|
||||
[-40, 50],
|
||||
[-40, -30],
|
||||
[40, 50],
|
||||
[40, -30]
|
||||
]
|
||||
},
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_height": { "default_value": 270 },
|
||||
"machine_max_acceleration_e": { "value": 5000 },
|
||||
"machine_max_acceleration_x": { "value": 5000 },
|
||||
"machine_max_acceleration_y": { "value": 5000 },
|
||||
"machine_name": { "default_value": "ELEGOO NEPTUNE 4" },
|
||||
"machine_nozzle_cool_down_speed": { "value": 0.75 },
|
||||
"machine_nozzle_heat_up_speed": { "value": 1.6 },
|
||||
"machine_start_gcode": { "default_value": "G28 ;home\nG92 E0 ;Reset Extruder\nG1 Z4.0 F3000 ;Move Z Axis up\nG92 E0 ;Reset Extruder\nG1 X1.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X1.1 Y80.0 Z0.28 F1500.0 E10 ;Draw the first line\nG1 X1.4 Y80.0 Z0.28 F5000.0 ;Move to side a little\nG1 X1.4 Y20 Z0.28 F1500.0 E20 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up" },
|
||||
"machine_width": { "default_value": 235 },
|
||||
"retraction_amount": { "default_value": 0.5 },
|
||||
"retraction_count_max": { "value": 80 },
|
||||
"retraction_speed": { "default_value": 45 },
|
||||
"skirt_brim_speed": { "maximum_value_warning": "500" },
|
||||
"speed_infill":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": "speed_print"
|
||||
},
|
||||
"speed_layer_0":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": 60
|
||||
},
|
||||
"speed_prime_tower": { "maximum_value_warning": "500" },
|
||||
"speed_print":
|
||||
{
|
||||
"default_value": 250,
|
||||
"maximum_value_warning": "500"
|
||||
},
|
||||
"speed_print_layer_0": { "maximum_value_warning": "500" },
|
||||
"speed_roofing": { "maximum_value_warning": "500" },
|
||||
"speed_support": { "maximum_value_warning": "500" },
|
||||
"speed_support_bottom": { "maximum_value_warning": "500" },
|
||||
"speed_support_infill": { "maximum_value_warning": "500" },
|
||||
"speed_support_interface": { "maximum_value_warning": "500" },
|
||||
"speed_support_roof": { "maximum_value_warning": "500" },
|
||||
"speed_topbottom":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": "speed_wall"
|
||||
},
|
||||
"speed_travel":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": "speed_print"
|
||||
},
|
||||
"speed_travel_layer_0":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": "speed_layer_0*2"
|
||||
},
|
||||
"speed_wall":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": "speed_print / 2"
|
||||
},
|
||||
"speed_wall_0":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": "speed_wall"
|
||||
},
|
||||
"speed_wall_x":
|
||||
{
|
||||
"maximum_value_warning": "500",
|
||||
"value": "speed_wall + (speed_wall / 2)"
|
||||
}
|
||||
}
|
||||
}
|
15
resources/definitions/elegoo_neptune_4pro.def.json
Normal file
15
resources/definitions/elegoo_neptune_4pro.def.json
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "ELEGOO NEPTUNE 4 Pro",
|
||||
"inherits": "elegoo_neptune_4",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "mastercaution",
|
||||
"quality_definition": "elegoo_neptune_4"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_name": { "default_value": "ELEGOO NEPTUNE 4 Pro" }
|
||||
}
|
||||
}
|
|
@ -886,7 +886,7 @@
|
|||
"default_value": 0.4,
|
||||
"type": "float",
|
||||
"value": "line_width",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable') or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled')",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled')",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
|
@ -3198,7 +3198,7 @@
|
|||
"speed_wall_0_roofing":
|
||||
{
|
||||
"label": "Top Surface Outer Wall Speed",
|
||||
"description": "The speed at which the top surface outermost walls are printed.",
|
||||
"description": "The speed at which the top surface outermost wall is printed.",
|
||||
"unit": "mm/s",
|
||||
"type": "float",
|
||||
"minimum_value": "0.1",
|
||||
|
@ -5130,7 +5130,7 @@
|
|||
"support_z_distance":
|
||||
{
|
||||
"label": "Support Z Distance",
|
||||
"description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height.",
|
||||
"description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. The topmost support layer below the model might be a fraction of regular layers.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"minimum_value": "0",
|
||||
|
@ -5158,7 +5158,7 @@
|
|||
"support_bottom_distance":
|
||||
{
|
||||
"label": "Support Bottom Distance",
|
||||
"description": "Distance from the print to the bottom of the support.",
|
||||
"description": "Distance from the print to the bottom of the support. Note that this is rounded up to the next layer height.",
|
||||
"unit": "mm",
|
||||
"minimum_value": "0",
|
||||
"maximum_value_warning": "machine_nozzle_size",
|
||||
|
@ -5895,7 +5895,7 @@
|
|||
"type": "optional_extruder",
|
||||
"default_value": "-1",
|
||||
"value": "int(defaultExtruderPosition()) if resolveOrValue('adhesion_type') == 'raft' else -1",
|
||||
"enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') != 'none' or resolveOrValue('prime_tower_brim_enable'))",
|
||||
"enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') != 'none')",
|
||||
"resolve": "max(extruderValues('adhesion_extruder_nr'))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
|
@ -5908,7 +5908,7 @@
|
|||
"type": "optional_extruder",
|
||||
"default_value": "-1",
|
||||
"value": "adhesion_extruder_nr",
|
||||
"enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') in ['skirt', 'brim'] or resolveOrValue('prime_tower_brim_enable'))",
|
||||
"enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') in ['skirt', 'brim'])",
|
||||
"resolve": "max(extruderValues('skirt_brim_extruder_nr'))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
|
@ -6005,7 +6005,7 @@
|
|||
"minimum_value": "0",
|
||||
"minimum_value_warning": "25",
|
||||
"maximum_value_warning": "2500",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim'",
|
||||
"limit_to_extruder": "skirt_brim_extruder_nr",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
|
@ -6019,7 +6019,7 @@
|
|||
"default_value": 8.0,
|
||||
"minimum_value": "0.0",
|
||||
"maximum_value_warning": "50.0",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'brim'",
|
||||
"limit_to_extruder": "skirt_brim_extruder_nr",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
|
@ -6034,7 +6034,7 @@
|
|||
"minimum_value": "0",
|
||||
"maximum_value_warning": "50 / skirt_brim_line_width",
|
||||
"value": "math.ceil(brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'brim'",
|
||||
"limit_to_extruder": "skirt_brim_extruder_nr",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
|
@ -6146,7 +6146,7 @@
|
|||
"layer_0_z_overlap":
|
||||
{
|
||||
"label": "Initial Layer Z Overlap",
|
||||
"description": "Make the first and second layer of the model overlap in the Z direction to compensate for the filament lost in the airgap. All models above the first model layer will be shifted down by this amount.",
|
||||
"description": "Make the first and second layer of the model overlap in the Z direction to compensate for the filament lost in the airgap. All models above the first model layer will be shifted down by this amount.\nIt may be noted that sometimes the second layer is printed below initial layer because of this setting. This is intended behavior",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.22,
|
||||
|
@ -6641,9 +6641,9 @@
|
|||
"unit": "mm",
|
||||
"enabled": "resolveOrValue('prime_tower_enable')",
|
||||
"default_value": 200,
|
||||
"value": "machine_width - max(extruderValue(skirt_brim_extruder_nr, 'brim_width') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_x'))) - 1",
|
||||
"maximum_value": "machine_width / 2 if machine_center_is_zero else machine_width",
|
||||
"minimum_value": "resolveOrValue('prime_tower_size') - machine_width / 2 if machine_center_is_zero else resolveOrValue('prime_tower_size')",
|
||||
"value": "(resolveOrValue('machine_width') / 2 + resolveOrValue('prime_tower_size') / 2) if resolveOrValue('machine_shape') == 'elliptic' else (resolveOrValue('machine_width') - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_x'))), 1)) - (resolveOrValue('machine_width') / 2 if resolveOrValue('machine_center_is_zero') else 0)",
|
||||
"maximum_value": "(machine_width / 2 if machine_center_is_zero else machine_width) - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0)",
|
||||
"minimum_value": "resolveOrValue('prime_tower_size') + (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - (machine_width / 2 if machine_center_is_zero else 0)",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
|
@ -6655,9 +6655,9 @@
|
|||
"unit": "mm",
|
||||
"enabled": "resolveOrValue('prime_tower_enable')",
|
||||
"default_value": 200,
|
||||
"value": "machine_depth - prime_tower_size - max(extruderValue(skirt_brim_extruder_nr, 'brim_width') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_y'))) - 3",
|
||||
"maximum_value": "machine_depth / 2 - resolveOrValue('prime_tower_size') if machine_center_is_zero else machine_depth - resolveOrValue('prime_tower_size')",
|
||||
"minimum_value": "machine_depth / -2 if machine_center_is_zero else 0",
|
||||
"value": "machine_depth - prime_tower_size - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_y'))), 1) - (resolveOrValue('machine_depth') / 2 if resolveOrValue('machine_center_is_zero') else 0)",
|
||||
"maximum_value": "(machine_depth / 2 - resolveOrValue('prime_tower_size') if machine_center_is_zero else machine_depth - resolveOrValue('prime_tower_size')) - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0)",
|
||||
"minimum_value": "(machine_depth / -2 if machine_center_is_zero else 0) + (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0)",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
|
@ -6673,15 +6673,71 @@
|
|||
},
|
||||
"prime_tower_brim_enable":
|
||||
{
|
||||
"label": "Prime Tower Brim",
|
||||
"description": "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type.",
|
||||
"value": "resolveOrValue('adhesion_type') in ['raft', 'brim']",
|
||||
"label": "Prime Tower Base",
|
||||
"description": "By enabling this setting, your prime-tower will get a brim, even if the model doesn't. If you want a sturdier base for a high tower, you can increase the base height.",
|
||||
"type": "bool",
|
||||
"enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('adhesion_type') != 'raft')",
|
||||
"resolve": "resolveOrValue('prime_tower_enable') and (resolveOrValue('adhesion_type') in ('none', 'skirt', 'brim'))",
|
||||
"enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('adhesion_type') != 'raft'",
|
||||
"default_value": false,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
"prime_tower_base_size":
|
||||
{
|
||||
"value": "resolveOrValue('raft_margin') if resolveOrValue('adhesion_type') == 'raft' else resolveOrValue('brim_width')",
|
||||
"label": "Prime Tower Base Size",
|
||||
"description": "The width of the prime tower brim/base. A larger base enhances adhesion to the build plate, but also reduces the effective print area.",
|
||||
"type": "float",
|
||||
"unit": "mm",
|
||||
"enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')",
|
||||
"default_value": "resolveOrValue('brim_width')",
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "min(0.5 * machine_width, 0.5 * machine_depth)",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
"prime_tower_base_height":
|
||||
{
|
||||
"value": "resolveOrValue('layer_height')",
|
||||
"label": "Prime Tower Base Height",
|
||||
"description": "The height of the prime tower base. Increasing this value will result in a more sturdy prime tower because the base will be wider. If this setting is too low, the prime tower will not have a sturdy base.",
|
||||
"type": "float",
|
||||
"unit": "mm",
|
||||
"enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "machine_height",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
"prime_tower_base_curve_magnitude":
|
||||
{
|
||||
"label": "Prime Tower Base Slope",
|
||||
"description": "The magnitude factor used for the slope of the prime tower base. If you increase this value, the base will become slimmer. If you decrease it, the base will become thicker.",
|
||||
"type": "float",
|
||||
"enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')",
|
||||
"default_value": 4,
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "10",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
"prime_tower_raft_base_line_spacing":
|
||||
{
|
||||
"label": "Prime Tower Raft Line Spacing",
|
||||
"description": "The distance between the raft lines for the unique prime tower raft layer. Wide spacing makes for easy removal of the raft from the build plate.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 1.6,
|
||||
"value": "raft_base_line_spacing",
|
||||
"minimum_value": "0",
|
||||
"minimum_value_warning": "raft_base_line_width",
|
||||
"maximum_value_warning": "100",
|
||||
"enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_base_extruder_nr"
|
||||
},
|
||||
"ooze_shield_enabled":
|
||||
{
|
||||
"label": "Enable Ooze Shield",
|
||||
|
|
|
@ -56,8 +56,6 @@
|
|||
"default_value": 110,
|
||||
"value": "material_flow * 1.1"
|
||||
},
|
||||
"prime_tower_position_x": { "value": "250" },
|
||||
"prime_tower_position_y": { "value": "200" },
|
||||
"retraction_amount": { "default_value": 1 },
|
||||
"retraction_speed": { "default_value": 50 },
|
||||
"skirt_brim_minimal_length": { "default_value": 130 },
|
||||
|
|
|
@ -30,8 +30,6 @@
|
|||
"machine_height": { "default_value": 420 },
|
||||
"machine_name": { "default_value": "Geeetech A30M" },
|
||||
"machine_start_gcode": { "default_value": ";Geeetech A30M 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_width": { "default_value": 320 },
|
||||
"prime_tower_position_x": { "value": 290 },
|
||||
"prime_tower_position_y": { "value": 260 }
|
||||
"machine_width": { "default_value": 320 }
|
||||
}
|
||||
}
|
|
@ -31,8 +31,6 @@
|
|||
"machine_height": { "default_value": 420 },
|
||||
"machine_name": { "default_value": "Geeetech A30T" },
|
||||
"machine_start_gcode": { "default_value": ";Geeetech A30T 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_width": { "default_value": 320 },
|
||||
"prime_tower_position_x": { "value": 290 },
|
||||
"prime_tower_position_y": { "value": 260 }
|
||||
"machine_width": { "default_value": 320 }
|
||||
}
|
||||
}
|
|
@ -31,8 +31,6 @@
|
|||
"machine_name": { "default_value": "Geeetech I3ProC" },
|
||||
"machine_start_gcode": { "default_value": ";Geeetech I3ProC 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 Y10 Z0.8 F5000 ; Move to start position\nG1 X0.1 Y180.0 Z1.2 F1500 E30 ; Draw the first line\nG92 E0 ; Reset Extruder\nG1 X0.4 Y180.0 Z1.2 F3000 ; Move to side a little\nG1 X0.4 Y10 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": 200 },
|
||||
"prime_tower_position_x": { "value": 170 },
|
||||
"prime_tower_position_y": { "value": 140 },
|
||||
"retraction_amount": { "value": 2 }
|
||||
}
|
||||
}
|
|
@ -31,8 +31,6 @@
|
|||
"machine_name": { "default_value": "Geeetech MizarM" },
|
||||
"machine_start_gcode": { "default_value": ";Official open-source firmware for MizarM: https://github.com/Geeetech3D/Mizar-M \n\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_width": { "default_value": 255 },
|
||||
"material_standby_temperature": { "value": 200 },
|
||||
"prime_tower_position_x": { "value": 225 },
|
||||
"prime_tower_position_y": { "value": 195 }
|
||||
"material_standby_temperature": { "value": 200 }
|
||||
}
|
||||
}
|
|
@ -137,8 +137,6 @@
|
|||
"minimum_polygon_circumference": { "value": 0.05 },
|
||||
"optimize_wall_printing_order": { "default_value": true },
|
||||
"prime_blob_enable": { "default_value": false },
|
||||
"prime_tower_position_x": { "value": 125 },
|
||||
"prime_tower_position_y": { "value": 70 },
|
||||
"prime_tower_size": { "value": 20.6 },
|
||||
"retract_at_layer_change": { "value": false },
|
||||
"retraction_combing": { "value": "'off'" },
|
||||
|
|
|
@ -81,8 +81,6 @@
|
|||
"material_initial_print_temperature": { "value": "default_material_print_temperature" },
|
||||
"material_standby_temperature": { "enabled": false },
|
||||
"prime_tower_enable": { "resolve": "extruders_enabled_count > 1" },
|
||||
"prime_tower_position_x": { "value": "169" },
|
||||
"prime_tower_position_y": { "value": "25" },
|
||||
"retraction_amount": { "default_value": 2 },
|
||||
"retraction_combing": { "value": "'all'" },
|
||||
"skirt_line_count": { "default_value": 3 },
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
"minimum_interface_area": { "value": 10 },
|
||||
"minimum_support_area": { "value": "2 if support_structure == 'normal' else 0" },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"prime_tower_brim_enable": { "default_value": true },
|
||||
"prime_tower_brim_enable": { "value": true },
|
||||
"prime_tower_wipe_enabled": { "default_value": false },
|
||||
"raft_airgap": { "default_value": 0.2 },
|
||||
"raft_margin": { "default_value": 2 },
|
||||
|
|
|
@ -17,8 +17,6 @@
|
|||
"machine_depth": { "default_value": 300 },
|
||||
"machine_height": { "default_value": 350 },
|
||||
"machine_name": { "default_value": "LNL3D D3" },
|
||||
"machine_width": { "default_value": 300 },
|
||||
"prime_tower_position_x": { "value": "155" },
|
||||
"prime_tower_position_y": { "value": "155" }
|
||||
"machine_width": { "default_value": 300 }
|
||||
}
|
||||
}
|
|
@ -17,8 +17,6 @@
|
|||
"machine_depth": { "default_value": 300 },
|
||||
"machine_height": { "default_value": 320 },
|
||||
"machine_name": { "default_value": "LNL3D D3 Vulcan" },
|
||||
"machine_width": { "default_value": 295 },
|
||||
"prime_tower_position_x": { "value": "155" },
|
||||
"prime_tower_position_y": { "value": "155" }
|
||||
"machine_width": { "default_value": 295 }
|
||||
}
|
||||
}
|
|
@ -17,8 +17,6 @@
|
|||
"machine_depth": { "default_value": 500 },
|
||||
"machine_height": { "default_value": 600 },
|
||||
"machine_name": { "default_value": "LNL3D D5" },
|
||||
"machine_width": { "default_value": 500 },
|
||||
"prime_tower_position_x": { "value": "155" },
|
||||
"prime_tower_position_y": { "value": "155" }
|
||||
"machine_width": { "default_value": 500 }
|
||||
}
|
||||
}
|
|
@ -17,8 +17,6 @@
|
|||
"machine_depth": { "default_value": 600 },
|
||||
"machine_height": { "default_value": 600 },
|
||||
"machine_name": { "default_value": "LNL3D D6" },
|
||||
"machine_width": { "default_value": 600 },
|
||||
"prime_tower_position_x": { "value": "155" },
|
||||
"prime_tower_position_y": { "value": "155" }
|
||||
"machine_width": { "default_value": 600 }
|
||||
}
|
||||
}
|
|
@ -46,8 +46,6 @@
|
|||
"optimize_wall_printing_order": { "value": true },
|
||||
"prime_tower_enable": { "value": true },
|
||||
"prime_tower_min_volume": { "value": 30 },
|
||||
"prime_tower_position_x": { "value": 50 },
|
||||
"prime_tower_position_y": { "value": 50 },
|
||||
"retract_at_layer_change": { "value": false },
|
||||
"retraction_amount": { "value": 4.5 },
|
||||
"roofing_layer_count": { "value": 1 },
|
||||
|
|
|
@ -43,8 +43,6 @@
|
|||
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG28 ;home\nG1 F200 E30 ;extrude 30 mm of feed stock\nG92 E0 ;zero the extruded length\nG1 E-5 ;retract 5 mm\nG28 SC ;Do homeing, clean nozzles and let printer to know that printing started\nG92 X-6 ;Sets Curas checker board to match printers heated bed coordinates\nG1 F{speed_travel}\nM117 Printing..." },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 305 },
|
||||
"prime_tower_position_x": { "value": "185" },
|
||||
"prime_tower_position_y": { "value": "160" },
|
||||
"print_sequence": { "enabled": true },
|
||||
"retraction_amount": { "default_value": 6 },
|
||||
"retraction_speed": { "default_value": 180 },
|
||||
|
|
|
@ -42,8 +42,6 @@
|
|||
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG28 ;home\nG1 F200 E30 ;extrude 30 mm of feed stock\nG92 E0 ;zero the extruded length\nG1 E-5 ;retract 5 mm\nG28 SC ;Do homeing, clean nozzles and let printer to know that printing started\nG92 X-6 ;Sets Curas checker board to match printers heated bed coordinates\nG1 F{speed_travel}\nM117 Printing..." },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 200 },
|
||||
"prime_tower_position_x": { "value": "185" },
|
||||
"prime_tower_position_y": { "value": "160" },
|
||||
"print_sequence": { "enabled": false },
|
||||
"retraction_amount": { "default_value": 6 },
|
||||
"retraction_speed": { "default_value": 180 },
|
||||
|
|
|
@ -42,8 +42,6 @@
|
|||
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG28 ;home\nG1 F200 E30 ;extrude 30 mm of feed stock\nG92 E0 ;zero the extruded length\nG1 E-5 ;retract 5 mm\nG28 SC ;Do homeing, clean nozzles and let printer to know that printing started\nG92 X-6 ;Sets Curas checker board to match printers heated bed coordinates\nG1 F{speed_travel}\nM117 Printing..." },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 200 },
|
||||
"prime_tower_position_x": { "value": "185" },
|
||||
"prime_tower_position_y": { "value": "160" },
|
||||
"print_sequence": { "enabled": false },
|
||||
"retraction_amount": { "default_value": 6 },
|
||||
"retraction_speed": { "default_value": 180 },
|
||||
|
|
|
@ -42,8 +42,6 @@
|
|||
"machine_start_gcode": { "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\nT1; left tool\n; set extruder steps per mm\nM92 E140\nT0; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\nT1; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 305 },
|
||||
"prime_tower_position_x": { "value": "195" },
|
||||
"prime_tower_position_y": { "value": "149" },
|
||||
"retraction_amount": { "default_value": 1.0 }
|
||||
}
|
||||
}
|
|
@ -42,8 +42,6 @@
|
|||
"machine_start_gcode": { "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\nT1; left tool\n; set extruder steps per mm\nM92 E140\nT0; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\nT1; left tool\nG92 E0 E1\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 305 },
|
||||
"prime_tower_position_x": { "value": "195" },
|
||||
"prime_tower_position_y": { "value": "149" },
|
||||
"retraction_amount": { "default_value": 1.0 }
|
||||
}
|
||||
}
|
|
@ -37,8 +37,6 @@
|
|||
"machine_start_gcode": { "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 305 },
|
||||
"prime_tower_position_x": { "value": "195" },
|
||||
"prime_tower_position_y": { "value": "149" },
|
||||
"retraction_amount": { "default_value": 1.0 }
|
||||
}
|
||||
}
|
|
@ -37,8 +37,6 @@
|
|||
"machine_start_gcode": { "default_value": "G90\nG21\n; home all axes\nG28\nG92 X0 Y0 Z0\n; move heatbed into position\nG1 X20.0 Y20.0 Z1.0 F1000\n; zero extruders\nG92 E0 E1\nT0; right tool\n; set extruder steps per mm\nM92 E140\n; purge nozzle\nG1 E25 F250\n; zero extruders\nG92 E0 E1\n; move heatbed down a little more\nG1 Z5.0 F20\n; wait 600ms\nG4 600\n; move to tack down the strands\nG1 X20.0 Y30.0 Z0 F9000\n; wait 600ms\nG4 600\n;move up a bit\nG1 Z5.0 F9000\n; wait 300ms\nG4 300\n;fast move to center\nG1 X152.5 Y152.5 F9000\nT0\n;Raise3D Job Start\nM117 Printing...\nM1001\n" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 305 },
|
||||
"prime_tower_position_x": { "value": "195" },
|
||||
"prime_tower_position_y": { "value": "149" },
|
||||
"retraction_amount": { "default_value": 1.0 }
|
||||
}
|
||||
}
|
|
@ -143,8 +143,6 @@
|
|||
"optimize_wall_printing_order": { "default_value": true },
|
||||
"prime_tower_flow": { "value": "99" },
|
||||
"prime_tower_min_volume": { "default_value": 4 },
|
||||
"prime_tower_position_x": { "value": "1" },
|
||||
"prime_tower_position_y": { "value": "1" },
|
||||
"prime_tower_size": { "default_value": 1 },
|
||||
"raft_acceleration": { "value": "400" },
|
||||
"raft_airgap": { "default_value": 0.2 },
|
||||
|
|
|
@ -45,8 +45,6 @@
|
|||
"machine_name": { "default_value": "Stereotech STE320" },
|
||||
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;homing\nG1 Z15.0 F9000 ;move the platform down 15mm\nT1 ;Switch to the 2nd extruder\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F200 E-{switch_extruder_retraction_amount}\nT0 ;Switch to the 1st extruder\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 218 },
|
||||
"prime_tower_position_x": { "value": "195" },
|
||||
"prime_tower_position_y": { "value": "149" }
|
||||
"machine_width": { "default_value": 218 }
|
||||
}
|
||||
}
|
|
@ -226,8 +226,6 @@
|
|||
"meshfix_maximum_deviation": { "default_value": 0.04 },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"prime_tower_min_volume": { "default_value": 35 },
|
||||
"prime_tower_position_x": { "value": "machine_width/2 + prime_tower_size/2" },
|
||||
"prime_tower_position_y": { "value": "machine_depth - prime_tower_size - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1" },
|
||||
"retraction_amount": { "default_value": 1.5 },
|
||||
"retraction_combing_max_distance": { "default_value": 5 },
|
||||
"retraction_count_max": { "default_value": 15 },
|
||||
|
|
|
@ -114,8 +114,6 @@
|
|||
"material_diameter": { "default_value": 1.75 },
|
||||
"prime_tower_enable": { "default_value": true },
|
||||
"prime_tower_min_volume": { "default_value": 35.6 },
|
||||
"prime_tower_position_x": { "value": "machine_depth / 2 - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_x'))) - 1" },
|
||||
"prime_tower_position_y": { "value": "machine_depth / 2 - prime_tower_size - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_y'))) - 3" },
|
||||
"raft_acceleration": { "value": "machine_acceleration" },
|
||||
"raft_base_acceleration": { "value": "machine_acceleration" },
|
||||
"raft_interface_acceleration": { "value": "machine_acceleration" },
|
||||
|
|
|
@ -150,7 +150,6 @@
|
|||
"value": "resolveOrValue('print_sequence') != 'one_at_a_time'"
|
||||
},
|
||||
"prime_tower_enable": { "default_value": true },
|
||||
"prime_tower_position_x": { "value": "machine_depth - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) - 30" },
|
||||
"prime_tower_wipe_enabled": { "default_value": false },
|
||||
"retraction_amount": { "value": "6.5" },
|
||||
"retraction_hop": { "value": "2" },
|
||||
|
|
437
resources/definitions/ultimaker_method_base.def.json
Normal file
437
resources/definitions/ultimaker_method_base.def.json
Normal file
|
@ -0,0 +1,437 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "UltiMaker Method Base Profile",
|
||||
"inherits": "ultimaker",
|
||||
"metadata":
|
||||
{
|
||||
"visible": false,
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"file_formats": "application/x-makerbot",
|
||||
"platform": "ultimaker_method_platform.stl",
|
||||
"exclude_materials": [
|
||||
"dsm_",
|
||||
"Essentium_",
|
||||
"imade3d_",
|
||||
"chromatik_",
|
||||
"3D-Fuel_",
|
||||
"bestfilament_",
|
||||
"emotiontech_",
|
||||
"eryone_",
|
||||
"eSUN_",
|
||||
"Extrudr_",
|
||||
"fabtotum_",
|
||||
"fdplast_",
|
||||
"filo3d_",
|
||||
"generic_bvoh_175",
|
||||
"generic_cpe_175",
|
||||
"generic_hips_175",
|
||||
"generic_pc_175",
|
||||
"ultimaker_rapidrinse_175",
|
||||
"ultimaker_sr30_175",
|
||||
"generic_tpu_175",
|
||||
"goofoo_",
|
||||
"ideagen3D_",
|
||||
"imade3d_",
|
||||
"innofill_",
|
||||
"layer_one_",
|
||||
"leapfrog_",
|
||||
"polyflex_pla",
|
||||
"polymax_pla",
|
||||
"polyplus_pla",
|
||||
"polywood_pla",
|
||||
"redd_",
|
||||
"tizyx_",
|
||||
"verbatim_",
|
||||
"Vertex_",
|
||||
"volumic_",
|
||||
"xyzprinting_",
|
||||
"zyyx_pro_",
|
||||
"octofiber_",
|
||||
"fiberlogy_"
|
||||
],
|
||||
"has_machine_materials": true,
|
||||
"has_machine_quality": true,
|
||||
"has_materials": true,
|
||||
"has_variants": true,
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "ultimaker_method_extruder_left",
|
||||
"1": "ultimaker_method_extruder_right"
|
||||
},
|
||||
"nozzle_offsetting_for_disallowed_areas": false,
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"platform_texture": "MakerbotMethod.png",
|
||||
"preferred_material": "generic_pla_175",
|
||||
"preferred_quality_type": "fast",
|
||||
"preferred_variant_name": "1A",
|
||||
"supports_material_export": true,
|
||||
"supports_network_connection": true,
|
||||
"supports_usb_connection": false,
|
||||
"variants_name": "Extruder",
|
||||
"weight": -1
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"acceleration_enabled":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": true
|
||||
},
|
||||
"acceleration_infill":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_layer_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_prime_tower":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_print":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": 300
|
||||
},
|
||||
"acceleration_print_layer_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_roofing":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_support":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_support_bottom":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_support_infill":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_support_interface":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_support_roof":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_topbottom":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_travel":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": 5000
|
||||
},
|
||||
"acceleration_travel_enabled":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": true
|
||||
},
|
||||
"acceleration_travel_layer_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_travel"
|
||||
},
|
||||
"acceleration_wall":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_wall_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_wall_0_roofing":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_wall_x":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"acceleration_wall_x_roofing":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "acceleration_print"
|
||||
},
|
||||
"adhesion_extruder_nr": { "value": 0 },
|
||||
"adhesion_type": { "value": "'raft'" },
|
||||
"bridge_enable_more_layers": { "value": true },
|
||||
"bridge_fan_speed": { "value": "cool_fan_speed_max" },
|
||||
"bridge_fan_speed_2": { "value": "(cool_fan_speed_max + cool_fan_speed_min) / 2" },
|
||||
"bridge_fan_speed_3": { "value": "cool_fan_speed_min" },
|
||||
"bridge_settings_enabled": { "value": true },
|
||||
"bridge_skin_density": { "value": 100 },
|
||||
"bridge_skin_density_2": { "value": 100 },
|
||||
"bridge_skin_density_3": { "value": 100 },
|
||||
"bridge_skin_material_flow": { "value": "material_flow" },
|
||||
"bridge_skin_material_flow_2": { "value": "material_flow" },
|
||||
"bridge_skin_material_flow_3": { "value": "material_flow" },
|
||||
"bridge_skin_speed": { "value": "speed_topbottom" },
|
||||
"bridge_skin_speed_2": { "value": "speed_topbottom" },
|
||||
"bridge_skin_speed_3": { "value": "speed_topbottom" },
|
||||
"bridge_sparse_infill_max_density": { "value": 50 },
|
||||
"bridge_wall_coast": { "value": 0 },
|
||||
"bridge_wall_material_flow": { "value": "material_flow" },
|
||||
"bridge_wall_speed": { "value": "speed_wall" },
|
||||
"brim_width": { "value": 5 },
|
||||
"extruder_prime_pos_abs": { "default_value": true },
|
||||
"gradual_support_infill_steps": { "value": 0 },
|
||||
"infill_before_walls": { "value": false },
|
||||
"infill_enable_travel_optimization": { "value": true },
|
||||
"infill_material_flow": { "value": "material_flow" },
|
||||
"infill_overlap": { "value": 0 },
|
||||
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'lines'" },
|
||||
"infill_wipe_dist": { "value": 0 },
|
||||
"inset_direction": { "value": "'inside_out'" },
|
||||
"jerk_enabled":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": true
|
||||
},
|
||||
"jerk_infill":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_layer_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_prime_tower":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_print":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": 12.5
|
||||
},
|
||||
"jerk_print_layer_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_roofing":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_support":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_support_bottom":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_support_infill":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_support_interface":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_support_roof":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_topbottom":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_travel":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": 12.5
|
||||
},
|
||||
"jerk_travel_enabled":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": true
|
||||
},
|
||||
"jerk_travel_layer_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_travel"
|
||||
},
|
||||
"jerk_wall":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_wall_0":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_wall_0_roofing":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_wall_x":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"jerk_wall_x_roofing":
|
||||
{
|
||||
"enabled": false,
|
||||
"value": "jerk_print"
|
||||
},
|
||||
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
|
||||
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
|
||||
"machine_acceleration": { "default_value": 3000 },
|
||||
"machine_center_is_zero": { "value": true },
|
||||
"machine_end_gcode": { "default_value": "" },
|
||||
"machine_extruder_count": { "default_value": 2 },
|
||||
"machine_gcode_flavor": { "default_value": "Griffin" },
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_heated_build_volume": { "default_value": true },
|
||||
"machine_min_cool_heat_time_window": { "value": 15 },
|
||||
"machine_name": { "default_value": "UltiMaker Method" },
|
||||
"machine_nozzle_cool_down_speed": { "value": 0.8 },
|
||||
"machine_nozzle_heat_up_speed": { "value": 3.5 },
|
||||
"machine_start_gcode": { "default_value": "" },
|
||||
"material_bed_temperature": { "enabled": "machine_heated_bed" },
|
||||
"material_bed_temperature_layer_0": { "enabled": "machine_heated_bed" },
|
||||
"material_final_print_temperature": { "value": "material_print_temperature-10" },
|
||||
"material_flow": { "value": 97 },
|
||||
"material_initial_print_temperature": { "value": "material_print_temperature-10" },
|
||||
"material_print_temperature": { "value": "default_material_print_temperature" },
|
||||
"material_shrinkage_percentage": { "enabled": true },
|
||||
"material_shrinkage_percentage_z": { "resolve": "0.9852*sum(extruderValues(\"material_shrinkage_percentage_z\")) / len(extruderValues(\"material_shrinkage_percentage_z\"))" },
|
||||
"min_wall_line_width": { "value": 0.4 },
|
||||
"minimum_support_area": { "value": 0.1 },
|
||||
"multiple_mesh_overlap": { "value": 0 },
|
||||
"optimize_wall_printing_order": { "value": true },
|
||||
"prime_blob_enable": { "enabled": false },
|
||||
"prime_tower_base_curve_magnitude": { "value": 2 },
|
||||
"prime_tower_base_height": { "value": 6 },
|
||||
"prime_tower_base_size": { "value": 10 },
|
||||
"prime_tower_enable": { "value": false },
|
||||
"prime_tower_flow": { "value": "material_flow" },
|
||||
"prime_tower_line_width": { "value": 1 },
|
||||
"prime_tower_raft_base_line_spacing": { "value": "raft_base_line_width" },
|
||||
"prime_tower_wipe_enabled": { "value": true },
|
||||
"print_sequence": { "enabled": false },
|
||||
"raft_base_line_spacing": { "value": "2*raft_base_line_width" },
|
||||
"raft_base_line_width": { "value": 1.4 },
|
||||
"raft_base_speed": { "value": 5 },
|
||||
"raft_base_thickness": { "value": 0.8 },
|
||||
"raft_interface_extruder_nr": { "value": "raft_surface_extruder_nr" },
|
||||
"raft_interface_layers": { "value": 2 },
|
||||
"raft_interface_line_width": { "value": 1.2 },
|
||||
"raft_interface_thickness": { "value": 0.3 },
|
||||
"raft_margin": { "value": 3 },
|
||||
"raft_surface_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material'))" },
|
||||
"retraction_amount": { "value": 0.75 },
|
||||
"retraction_combing": { "value": "'off'" },
|
||||
"retraction_combing_max_distance": { "value": "speed_travel / 10" },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_extrusion_window": { "value": 0 },
|
||||
"retraction_hop": { "value": 0.4 },
|
||||
"retraction_hop_enabled": { "value": true },
|
||||
"retraction_hop_only_when_collides": { "value": false },
|
||||
"retraction_min_travel": { "value": "line_width * 4" },
|
||||
"retraction_prime_speed": { "value": "retraction_speed" },
|
||||
"retraction_speed": { "value": 5 },
|
||||
"roofing_layer_count": { "value": 2 },
|
||||
"roofing_material_flow": { "value": "material_flow" },
|
||||
"roofing_monotonic": { "value": true },
|
||||
"skin_material_flow": { "value": "0.95*material_flow" },
|
||||
"skin_monotonic": { "value": true },
|
||||
"skin_outline_count": { "value": 0 },
|
||||
"skin_overlap": { "value": 0 },
|
||||
"skin_preshrink": { "value": 0 },
|
||||
"skirt_brim_material_flow": { "value": "material_flow" },
|
||||
"skirt_brim_minimal_length": { "value": 500 },
|
||||
"speed_equalize_flow_width_factor": { "value": 0 },
|
||||
"speed_prime_tower": { "value": "speed_topbottom" },
|
||||
"speed_print": { "value": 50 },
|
||||
"speed_roofing": { "value": "speed_wall_0" },
|
||||
"speed_support": { "value": "speed_wall" },
|
||||
"speed_support_interface": { "value": "speed_topbottom" },
|
||||
"speed_topbottom": { "value": "speed_wall" },
|
||||
"speed_travel": { "value": 250 },
|
||||
"speed_wall": { "value": "speed_print * 40/50" },
|
||||
"speed_wall_0": { "value": "speed_wall * 30/40" },
|
||||
"speed_wall_x": { "value": "speed_wall" },
|
||||
"support_angle": { "value": 40 },
|
||||
"support_bottom_distance": { "value": "support_z_distance / 2" },
|
||||
"support_bottom_material_flow": { "value": "material_flow" },
|
||||
"support_brim_enable": { "value": false },
|
||||
"support_conical_min_width": { "value": 10 },
|
||||
"support_enable": { "value": true },
|
||||
"support_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material'))" },
|
||||
"support_fan_enable": { "value": false },
|
||||
"support_infill_rate": { "value": 20.0 },
|
||||
"support_interface_enable": { "value": true },
|
||||
"support_interface_material_flow": { "value": "material_flow" },
|
||||
"support_interface_offset": { "value": 0 },
|
||||
"support_interface_pattern": { "value": "'lines'" },
|
||||
"support_interface_wall_count": { "value": 2 },
|
||||
"support_material_flow": { "value": "material_flow" },
|
||||
"support_pattern": { "value": "'lines'" },
|
||||
"support_roof_material_flow": { "value": "material_flow" },
|
||||
"support_supported_skin_fan_speed": { "value": "cool_fan_speed_max" },
|
||||
"support_top_distance": { "value": "support_z_distance" },
|
||||
"support_wall_count": { "value": "1 if support_conical_enabled or support_structure == 'tree' else 0" },
|
||||
"support_xy_distance": { "value": 0.2 },
|
||||
"support_z_distance": { "value": 0 },
|
||||
"switch_extruder_retraction_amount": { "value": 0.5 },
|
||||
"switch_extruder_retraction_speeds": { "value": "retraction_speed" },
|
||||
"top_bottom_thickness": { "value": "5*layer_height" },
|
||||
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
|
||||
"travel_avoid_supports": { "value": true },
|
||||
"wall_0_inset": { "value": 0 },
|
||||
"wall_0_material_flow": { "value": "material_flow" },
|
||||
"wall_0_wipe_dist": { "value": 0 },
|
||||
"wall_material_flow": { "value": "material_flow" },
|
||||
"wall_x_material_flow": { "value": "material_flow" },
|
||||
"xy_offset": { "value": 0 },
|
||||
"xy_offset_layer_0": { "value": "xy_offset" },
|
||||
"z_seam_corner": { "value": "'z_seam_corner_none'" },
|
||||
"z_seam_position": { "value": "'backright'" },
|
||||
"z_seam_type": { "value": "'sharpest_corner'" },
|
||||
"zig_zaggify_infill": { "value": true }
|
||||
}
|
||||
}
|
122
resources/definitions/ultimaker_methodx.def.json
Normal file
122
resources/definitions/ultimaker_methodx.def.json
Normal file
|
@ -0,0 +1,122 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "UltiMaker Method X",
|
||||
"inherits": "ultimaker_method_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"file_formats": "application/x-makerbot",
|
||||
"platform": "ultimaker_method_platform.stl",
|
||||
"exclude_materials": [
|
||||
"dsm_",
|
||||
"Essentium_",
|
||||
"imade3d_",
|
||||
"chromatik_",
|
||||
"3D-Fuel_",
|
||||
"bestfilament_",
|
||||
"emotiontech_",
|
||||
"eryone_",
|
||||
"eSUN_",
|
||||
"Extrudr_",
|
||||
"fabtotum_",
|
||||
"fdplast_",
|
||||
"filo3d_",
|
||||
"generic_asa_175",
|
||||
"generic_abs_175",
|
||||
"generic_bvoh_175",
|
||||
"generic_petg_175",
|
||||
"generic_pla_175",
|
||||
"generic_tough_pla_175",
|
||||
"generic_pva_175",
|
||||
"generic_cffpa_175",
|
||||
"generic_cpe_175",
|
||||
"generic_nylon_175",
|
||||
"generic_hips_175",
|
||||
"generic_pc_175",
|
||||
"ultimaker_sr30_175",
|
||||
"generic_tpu_175",
|
||||
"goofoo_",
|
||||
"ideagen3D_",
|
||||
"imade3d_",
|
||||
"innofill_",
|
||||
"layer_one_",
|
||||
"leapfrog_",
|
||||
"polyflex_pla",
|
||||
"polymax_pla",
|
||||
"polyplus_pla",
|
||||
"polywood_pla",
|
||||
"redd_",
|
||||
"tizyx_",
|
||||
"verbatim_",
|
||||
"Vertex_",
|
||||
"volumic_",
|
||||
"xyzprinting_",
|
||||
"zyyx_pro_",
|
||||
"octofiber_",
|
||||
"fiberlogy_"
|
||||
],
|
||||
"has_machine_materials": true,
|
||||
"has_machine_quality": true,
|
||||
"has_materials": true,
|
||||
"has_variants": true,
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "ultimaker_methodx_extruder_left",
|
||||
"1": "ultimaker_methodx_extruder_right"
|
||||
},
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
16
|
||||
],
|
||||
"platform_texture": "MakerbotMethod.png",
|
||||
"preferred_material": "ultimaker_absr_175",
|
||||
"preferred_quality_type": "draft",
|
||||
"preferred_variant_name": "1XA",
|
||||
"supports_network_connection": true,
|
||||
"supports_usb_connection": false,
|
||||
"variant_definition": "ultimaker_methodx",
|
||||
"variants_name": "Extruder",
|
||||
"weight": -1
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 236.48 },
|
||||
"machine_disallowed_areas":
|
||||
{
|
||||
"default_value": [
|
||||
[
|
||||
[-141.65, -118.11],
|
||||
[141.65, -118.11],
|
||||
[141.65, -95],
|
||||
[-141.65, -95]
|
||||
],
|
||||
[
|
||||
[-141.65, 118.37],
|
||||
[141.65, 118.37],
|
||||
[141.65, 95],
|
||||
[-141.65, 95]
|
||||
],
|
||||
[
|
||||
[-141.65, -118.11],
|
||||
[-75, -118.11],
|
||||
[-75, 118.37],
|
||||
[-141.65, 118.37]
|
||||
],
|
||||
[
|
||||
[75, -118.11],
|
||||
[141.65, -118.11],
|
||||
[141.65, 118.37],
|
||||
[75, 118.37]
|
||||
]
|
||||
]
|
||||
},
|
||||
"machine_height": { "default_value": 196 },
|
||||
"machine_name": { "default_value": "UltiMaker Method X" },
|
||||
"machine_width": { "default_value": 283.3 },
|
||||
"prime_tower_position_x": { "value": "(150 / 2 + resolveOrValue('prime_tower_size') / 2) if resolveOrValue('machine_shape') == 'elliptic' else (150 - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_x'))), 1)) - (150 / 2 if resolveOrValue('machine_center_is_zero') else 0)" },
|
||||
"prime_tower_position_y": { "value": "190 - prime_tower_size - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_y'))), 1) - (190 / 2 if resolveOrValue('machine_center_is_zero') else 0)" }
|
||||
}
|
||||
}
|
74
resources/definitions/ultimaker_methodxl.def.json
Normal file
74
resources/definitions/ultimaker_methodxl.def.json
Normal file
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "UltiMaker Method XL",
|
||||
"inherits": "ultimaker_methodx",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"file_formats": "application/x-makerbot",
|
||||
"platform": "ultimaker_method_xl_platform.stl",
|
||||
"has_machine_materials": true,
|
||||
"has_machine_quality": true,
|
||||
"has_materials": true,
|
||||
"has_variants": true,
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "ultimaker_methodxl_extruder_left",
|
||||
"1": "ultimaker_methodxl_extruder_right"
|
||||
},
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"platform_texture": "MakerbotMethod.png",
|
||||
"preferred_quality_type": "draft",
|
||||
"supports_network_connection": true,
|
||||
"supports_usb_connection": false,
|
||||
"variants_name": "Extruder",
|
||||
"weight": -1
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 320 },
|
||||
"machine_disallowed_areas":
|
||||
{
|
||||
"default_value": [
|
||||
[
|
||||
[-204, -160],
|
||||
[204, -160],
|
||||
[204, -152.5],
|
||||
[-204, -152.5]
|
||||
],
|
||||
[
|
||||
[-204, 160],
|
||||
[204, 160],
|
||||
[204, 152.5],
|
||||
[-204, 152.5]
|
||||
],
|
||||
[
|
||||
[-205, -160],
|
||||
[-152.5, -160],
|
||||
[-152.5, 160],
|
||||
[-205, 160]
|
||||
],
|
||||
[
|
||||
[152.5, -160],
|
||||
[205, -160],
|
||||
[205, 160],
|
||||
[152.5, 160]
|
||||
]
|
||||
]
|
||||
},
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_height": { "default_value": 317 },
|
||||
"machine_name": { "default_value": "UltiMaker Method XL" },
|
||||
"machine_width": { "default_value": 410 },
|
||||
"material_shrinkage_percentage_z": { "resolve": "sum(extruderValues(\"material_shrinkage_percentage_z\")) / len(extruderValues(\"material_shrinkage_percentage_z\"))" },
|
||||
"prime_tower_position_x": { "value": "(305 - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_x'))), 1)) - (305 / 2)" },
|
||||
"prime_tower_position_y": { "value": "305 - prime_tower_size - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_y'))), 1) - (305 / 2)" },
|
||||
"speed_travel": { "value": 500 }
|
||||
}
|
||||
}
|
|
@ -89,8 +89,6 @@
|
|||
"machine_name": { "default_value": "Ultimaker Original" },
|
||||
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nT1 ;Switch to the 2nd extruder\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F200 E-{switch_extruder_retraction_amount}\nT0 ;Switch to the 1st extruder\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
"machine_width": { "default_value": 205 },
|
||||
"prime_tower_position_x": { "value": "195" },
|
||||
"prime_tower_position_y": { "value": "149" }
|
||||
"machine_width": { "default_value": 205 }
|
||||
}
|
||||
}
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Ultimaker S3",
|
||||
"name": "UltiMaker S3",
|
||||
"inherits": "ultimaker",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "Ultimaker",
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"file_formats": "application/x-ufp;text/x-gcode",
|
||||
"platform": "ultimaker_s3_platform.obj",
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Ultimaker S5",
|
||||
"name": "UltiMaker S5",
|
||||
"inherits": "ultimaker",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "Ultimaker",
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"file_formats": "application/x-ufp;text/x-gcode",
|
||||
"platform": "ultimaker_s5_platform.obj",
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Ultimaker S7",
|
||||
"name": "UltiMaker S7",
|
||||
"inherits": "ultimaker_s5",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "Ultimaker",
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"file_formats": "application/x-ufp;text/x-gcode",
|
||||
"platform": "ultimaker_s7_platform.obj",
|
||||
|
|
24
resources/extruders/ultimaker_methodx_extruder_left.def.json
Normal file
24
resources/extruders/ultimaker_methodx_extruder_left.def.json
Normal file
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_methodx",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 0,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
|
||||
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" },
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 2",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_methodx",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 1,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
|
||||
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" },
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_methodxl",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 0,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
|
||||
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" },
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 2",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_methodxl",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 1,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
|
||||
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" },
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Cura 5.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-09-20 14:03+0000\n"
|
||||
"POT-Creation-Date: 2023-10-31 19:13+0100\n"
|
||||
"PO-Revision-Date: 2023-09-03 18:15+0200\n"
|
||||
"Last-Translator: Miroslav Šustek <sustmidown@centrum.cz>\n"
|
||||
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"
|
||||
|
@ -566,6 +566,10 @@ msgctxt "@action:inmenu menubar:edit"
|
|||
msgid "Arrange All Models in a grid"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@action:inmenu menubar:edit"
|
||||
msgid "Arrange Selection"
|
||||
msgstr "Uspořádat selekci"
|
||||
|
||||
msgctxt "@label:button"
|
||||
msgid "Ask a question"
|
||||
msgstr "Položit otázku"
|
||||
|
@ -630,6 +634,10 @@ msgctxt "@info:title"
|
|||
msgid "Backups"
|
||||
msgstr "Zálohy"
|
||||
|
||||
msgctxt "@label"
|
||||
msgid "Balanced"
|
||||
msgstr "Vyvážený"
|
||||
|
||||
msgctxt "@action:label"
|
||||
msgid "Base (mm)"
|
||||
msgstr "Základna (mm)"
|
||||
|
@ -1019,6 +1027,10 @@ msgctxt "@info:error"
|
|||
msgid "Could not interpret the server's response."
|
||||
msgstr "Nelze přečíst odpověď serveru."
|
||||
|
||||
msgctxt "@error:load"
|
||||
msgid "Could not load GCodeWriter plugin. Try to re-enable the plugin."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@info:error"
|
||||
msgid "Could not reach Marketplace."
|
||||
msgstr "Nelze se připojit k Obchodu."
|
||||
|
@ -1263,10 +1275,6 @@ msgctxt "@info:No intent profile selected"
|
|||
msgid "Default"
|
||||
msgstr "Výchozí"
|
||||
|
||||
msgctxt "@label"
|
||||
msgid "Default"
|
||||
msgstr "Výchozí"
|
||||
|
||||
msgctxt "@window:text"
|
||||
msgid "Default behavior for changed setting values when switching to a different profile: "
|
||||
msgstr "Výchozí chování pro změněné hodnoty nastavení při přepnutí na jiný profil: "
|
||||
|
@ -2354,6 +2362,22 @@ msgctxt "@info:generic"
|
|||
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
|
||||
msgstr "Před odesláním souboru se ujistěte, že je g-kód vhodný pro vaši tiskárnu a konfiguraci tiskárny. Reprezentace g-kódu nemusí být přesná."
|
||||
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Makerbot Printfile"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Makerbot Printfile Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@error"
|
||||
msgid "MakerbotWriter could not save to the designated path."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@error:not supported"
|
||||
msgid "MakerbotWriter does not support text mode."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Manage Materials..."
|
||||
msgstr "Spravovat materiály..."
|
||||
|
@ -3444,6 +3468,10 @@ msgctxt "description"
|
|||
msgid "Provides support for writing 3MF files."
|
||||
msgstr "Poskytuje podporu pro psaní souborů 3MF."
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for writing MakerBot Format Packages."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for writing Ultimaker Format Packages."
|
||||
msgstr "Poskytuje podporu pro psaní balíčků formátu UltiMaker."
|
||||
|
@ -4328,6 +4356,10 @@ msgctxt "@error:file_size"
|
|||
msgid "The backup exceeds the maximum file size."
|
||||
msgstr "Záloha překračuje maximální povolenou velikost soubor."
|
||||
|
||||
msgctxt "@text"
|
||||
msgid "The balanced profile is designed to strike a balance between productivity, surface quality, mechanical properties and dimensional accuracy."
|
||||
msgstr "Vyvážený profil je navržen tak, aby dosáhl rovnováhy mezi produktivitou, kvalitou povrchu, mechanickými vlastnostmi a rozměrnou přesností."
|
||||
|
||||
msgctxt "@info:tooltip"
|
||||
msgid "The base height from the build plate in millimeters."
|
||||
msgstr "Výška základny od podložky v milimetrech."
|
||||
|
@ -5569,10 +5601,6 @@ msgstr "Nepovedlo se stáhnout {} zásuvných modulů"
|
|||
#~ msgstr[1] "... a {0} další"
|
||||
#~ msgstr[2] "... a {0} dalších"
|
||||
|
||||
#~ msgctxt "@action:inmenu menubar:edit"
|
||||
#~ msgid "Arrange Selection"
|
||||
#~ msgstr "Uspořádat selekci"
|
||||
|
||||
#~ msgctxt "@tooltip:button"
|
||||
#~ msgid "Become a 3D printing expert with UltiMaker e-learning."
|
||||
#~ msgstr "Staňte se expertem na 3D tisk díky UltiMaker e-learningu."
|
||||
|
@ -5581,6 +5609,10 @@ msgstr "Nepovedlo se stáhnout {} zásuvných modulů"
|
|||
#~ msgid "Cura does not accurately display layers when Wire Printing is enabled."
|
||||
#~ msgstr "Když je aktivován síťový tisk, Cura přesně nezobrazuje vrstvy."
|
||||
|
||||
#~ msgctxt "@label"
|
||||
#~ msgid "Default"
|
||||
#~ msgstr "Výchozí"
|
||||
|
||||
#~ msgctxt "@label"
|
||||
#~ msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
|
||||
#~ msgstr "Umožňuje tisk okraje nebo voru. Tímto způsobem se kolem nebo pod objekt přidá plochá oblast, kterou lze snadno odříznout."
|
||||
|
|
|
@ -7,7 +7,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Cura 5.1\n"
|
||||
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
|
||||
"POT-Creation-Date: 2023-09-12 17:04+0000\n"
|
||||
"POT-Creation-Date: 2023-10-31 19:13+0000\n"
|
||||
"PO-Revision-Date: 2023-02-16 20:35+0100\n"
|
||||
"Last-Translator: Miroslav Šustek <sustmidown@centrum.cz>\n"
|
||||
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"
|
||||
|
@ -746,16 +746,16 @@ msgid "Distance between the printed support structure lines. This setting is cal
|
|||
msgstr "Vzdálenost mezi tištěnými liniemi podpůrné struktury. Toto nastavení se vypočítá podle hustoty podpory."
|
||||
|
||||
msgctxt "support_bottom_distance description"
|
||||
msgid "Distance from the print to the bottom of the support."
|
||||
msgstr "Vzdálenost od tisku ke spodní části podpěry."
|
||||
msgid "Distance from the print to the bottom of the support. Note that this is rounded up to the next layer height."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "support_top_distance description"
|
||||
msgid "Distance from the top of the support to the print."
|
||||
msgstr "Vzdálenost od horní strany podpory k tisku."
|
||||
|
||||
msgctxt "support_z_distance description"
|
||||
msgid "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height."
|
||||
msgstr "Vzdálenost od horní / dolní nosné struktury k tisku. Tato mezera poskytuje vůli pro odstranění podpěr po vytištění modelu. Tato hodnota je zaokrouhlena nahoru na násobek výšky vrstvy."
|
||||
msgid "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. The topmost support layer below the model might be a fraction of regular layers."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "infill_wipe_dist description"
|
||||
msgid "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line."
|
||||
|
@ -1097,6 +1097,14 @@ msgctxt "wall_0_material_flow description"
|
|||
msgid "Flow compensation on the outermost wall line."
|
||||
msgstr "Kompenzace průtoku na vnější linii stěny."
|
||||
|
||||
msgctxt "wall_0_material_flow_roofing description"
|
||||
msgid "Flow compensation on the top surface outermost wall line."
|
||||
msgstr "Kompensace toku na nejvíce vnější stěnové lince horní plochy."
|
||||
|
||||
msgctxt "wall_x_material_flow_roofing description"
|
||||
msgid "Flow compensation on top surface wall lines for all wall lines except the outermost one."
|
||||
msgstr "Kompensace toku na horní stěnové linky pro všechny stěnové linky kromě nejvnější."
|
||||
|
||||
msgctxt "skin_material_flow description"
|
||||
msgid "Flow compensation on top/bottom lines."
|
||||
msgstr "Kompenzace průtoku na horních / dolních řádcích."
|
||||
|
@ -1283,6 +1291,10 @@ msgctxt "machine_gcode_flavor option Griffin"
|
|||
msgid "Griffin"
|
||||
msgstr "Griffin"
|
||||
|
||||
msgctxt "group_outer_walls label"
|
||||
msgid "Group Outer Walls"
|
||||
msgstr "Seskupit vnější stěny"
|
||||
|
||||
msgctxt "infill_pattern option gyroid"
|
||||
msgid "Gyroid"
|
||||
msgstr "Gyroid"
|
||||
|
@ -2447,6 +2459,10 @@ msgctxt "wall_0_wipe_dist label"
|
|||
msgid "Outer Wall Wipe Distance"
|
||||
msgstr "Vzdálenost stírání vnější stěny"
|
||||
|
||||
msgctxt "group_outer_walls description"
|
||||
msgid "Outer walls of different islands in the same layer are printed in sequence. When enabled the amount of flow changes is limited because walls are printed one type at a time, when disabled the number of travels between islands is reduced because walls in the same islands are grouped."
|
||||
msgstr "Venkovní stěny různých ostrovů ve stejné vrstvě jsou tisknuty postupně. Když je povoleno, množství změn proudu je omezeno, protože stěny jsou tisknuty po jednom typu najednou, když je zakázáno, počet cest mezi ostrovy se snižuje, protože stěny na stejných ostrovech jsou seskupeny."
|
||||
|
||||
msgctxt "inset_direction option outside_in"
|
||||
msgid "Outside To Inside"
|
||||
msgstr "Zvenku dovnitř"
|
||||
|
@ -2500,8 +2516,20 @@ msgid "Prime Tower Acceleration"
|
|||
msgstr "Akcelerace tisku hlavní věže"
|
||||
|
||||
msgctxt "prime_tower_brim_enable label"
|
||||
msgid "Prime Tower Brim"
|
||||
msgstr "Límec hlavní věže"
|
||||
msgid "Prime Tower Base"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "prime_tower_base_curve_magnitude label"
|
||||
msgid "Prime Tower Base Curve Magnitude"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "prime_tower_base_height label"
|
||||
msgid "Prime Tower Base Height"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "prime_tower_base_size label"
|
||||
msgid "Prime Tower Base Size"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "prime_tower_flow label"
|
||||
msgid "Prime Tower Flow"
|
||||
|
@ -2519,6 +2547,10 @@ msgctxt "prime_tower_min_volume label"
|
|||
msgid "Prime Tower Minimum Volume"
|
||||
msgstr "Minimální objem hlavní věže"
|
||||
|
||||
msgctxt "prime_tower_raft_base_line_spacing label"
|
||||
msgid "Prime Tower Raft Line Spacing"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "prime_tower_size label"
|
||||
msgid "Prime Tower Size"
|
||||
msgstr "Velikost hlavní věže"
|
||||
|
@ -2536,8 +2568,8 @@ msgid "Prime Tower Y Position"
|
|||
msgstr "Pozice Y hlavní věže"
|
||||
|
||||
msgctxt "prime_tower_brim_enable description"
|
||||
msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
|
||||
msgstr "Hlavní věže mohou potřebovat zvláštní přilnavost, kterou poskytuje límec, i když to model neumožňuje. V současnosti nelze použít s adhezním typem „Raft“."
|
||||
msgid "Prime-towers might need the extra adhesion afforded by a brim or raft, even if the model doesn't."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "acceleration_print label"
|
||||
msgid "Print Acceleration"
|
||||
|
@ -3607,6 +3639,14 @@ msgctxt "raft_surface_acceleration description"
|
|||
msgid "The acceleration with which the top raft layers are printed."
|
||||
msgstr "Zrychlení, s nímž se tiskne horní vrstvy raftu."
|
||||
|
||||
msgctxt "acceleration_wall_x_roofing description"
|
||||
msgid "The acceleration with which the top surface inner walls are printed."
|
||||
msgstr "Zrychlení, kterým jsou tisknuty vnitřní stěny horní plochy."
|
||||
|
||||
msgctxt "acceleration_wall_0_roofing description"
|
||||
msgid "The acceleration with which the top surface outermost walls are printed."
|
||||
msgstr "Zrychlení, kterým jsou tisknuty nejvíce vnější stěny horní plochy."
|
||||
|
||||
msgctxt "acceleration_wall description"
|
||||
msgid "The acceleration with which the walls are printed."
|
||||
msgstr "Zrychlení, kterým jsou stěny potištěny."
|
||||
|
@ -3747,6 +3787,10 @@ msgctxt "raft_surface_line_spacing description"
|
|||
msgid "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid."
|
||||
msgstr "Vzdálenost mezi liniemi raftů pro horní vrstvy raftů. Rozestup by měl být roven šířce čáry, takže povrch je pevný."
|
||||
|
||||
msgctxt "prime_tower_raft_base_line_spacing description"
|
||||
msgid "The distance between the raft lines for the unique prime tower raft layer. Wide spacing makes for easy removal of the raft from the build plate."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "interlocking_depth description"
|
||||
msgid "The distance from the boundary between models to generate interlocking structure, measured in cells. Too few cells will result in poor adhesion."
|
||||
msgstr "Vzdálenost od hranic mezi modely, do jaké generovat vzájemně propletené struktury (měřeno v buňkách). Příliš málo buněk způsobí špatnou přilnavost."
|
||||
|
@ -3943,6 +3987,10 @@ msgctxt "layer_height_0 description"
|
|||
msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier."
|
||||
msgstr "Výška počáteční vrstvy v mm. Silnější počáteční vrstva usnadňuje přilnavost k montážní desce."
|
||||
|
||||
msgctxt "prime_tower_base_height description"
|
||||
msgid "The height of the prime tower base."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "support_bottom_stair_step_height description"
|
||||
msgid "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures. Set to zero to turn off the stair-like behaviour."
|
||||
msgstr "Výška stupňů schodišťového dna podpory spočívá na modelu. Nízká hodnota ztěžuje odstranění podpory, ale příliš vysoké hodnoty mohou vést k nestabilním podpůrným strukturám. Nastavením na nulu vypnete chování podobné schodišti."
|
||||
|
@ -4015,6 +4063,10 @@ msgctxt "retraction_amount description"
|
|||
msgid "The length of material retracted during a retraction move."
|
||||
msgstr "Délka materiálu zasunutého během pohybu zasunutí."
|
||||
|
||||
msgctxt "prime_tower_base_curve_magnitude description"
|
||||
msgid "The magnitude factor used for the curve of the prime tower foot."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "machine_buildplate_type description"
|
||||
msgid "The material of the build plate installed on the printer."
|
||||
msgstr "Materiál podložky nainstalované na tiskárně."
|
||||
|
@ -4107,6 +4159,14 @@ msgctxt "jerk_support description"
|
|||
msgid "The maximum instantaneous velocity change with which the support structure is printed."
|
||||
msgstr "Maximální okamžitá změna rychlosti, se kterou se tiskne nosná struktura."
|
||||
|
||||
msgctxt "jerk_wall_x_roofing description"
|
||||
msgid "The maximum instantaneous velocity change with which the top surface inner walls are printed."
|
||||
msgstr "Maximální okamžitá změna rychlosti, jakou jsou tisknuty nejvíce vnější stěny horní plochy."
|
||||
|
||||
msgctxt "jerk_wall_0_roofing description"
|
||||
msgid "The maximum instantaneous velocity change with which the top surface outermost walls are printed."
|
||||
msgstr "Maximální okamžitá změna rychlosti, jakou jsou tisknuty nejvíce vnitřní stěny horní plochy."
|
||||
|
||||
msgctxt "jerk_wall description"
|
||||
msgid "The maximum instantaneous velocity change with which the walls are printed."
|
||||
msgstr "Maximální okamžitá změna rychlosti, se kterou se stěny tisknou."
|
||||
|
@ -4491,6 +4551,14 @@ msgctxt "raft_surface_speed description"
|
|||
msgid "The speed at which the top raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines."
|
||||
msgstr "Rychlost tisku horních vrstev raftu. Ty by měly být vytištěny trochu pomaleji, aby tryska mohla pomalu vyhlazovat sousední povrchové linie."
|
||||
|
||||
msgctxt "speed_wall_x_roofing description"
|
||||
msgid "The speed at which the top surface inner walls are printed."
|
||||
msgstr "Rychlost, kterou jsou tisknuty vnitřní stěny horní plochy."
|
||||
|
||||
msgctxt "speed_wall_0_roofing description"
|
||||
msgid "The speed at which the top surface outermost wall is printed."
|
||||
msgstr "Rychlost, kterou jsou tisknuty nejvíce vnější stěny horní plochy."
|
||||
|
||||
msgctxt "speed_z_hop description"
|
||||
msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
|
||||
msgstr "Rychlost, při které se svislý pohyb Z provádí pro Z Hopy. To je obvykle nižší než rychlost tisku, protože stavba talíře nebo portálového zařízení je obtížnější se pohybovat."
|
||||
|
@ -4552,8 +4620,8 @@ msgid "The temperature to which to already start cooling down just before the en
|
|||
msgstr "Teplota, na kterou se má začít ochlazovat těsně před koncem tisku."
|
||||
|
||||
msgctxt "material_print_temperature_layer_0 description"
|
||||
msgid "The temperature used for printing the first layer. Set at 0 to disable special handling of the initial layer."
|
||||
msgstr "Teplota, která se používá pro tisk první vrstvy."
|
||||
msgid "The temperature used for printing the first layer."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "material_print_temperature description"
|
||||
msgid "The temperature used for printing."
|
||||
|
@ -4631,6 +4699,10 @@ msgctxt "interlocking_beam_width description"
|
|||
msgid "The width of the interlocking structure beams."
|
||||
msgstr "Šířka paprsků vzájemného propletení."
|
||||
|
||||
msgctxt "prime_tower_base_size description"
|
||||
msgid "The width of the prime tower base."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "prime_tower_size description"
|
||||
msgid "The width of the prime tower."
|
||||
msgstr "Šířka hlavní věže."
|
||||
|
@ -4699,6 +4771,38 @@ msgctxt "top_skin_preshrink label"
|
|||
msgid "Top Skin Removal Width"
|
||||
msgstr "Horní šířka odstranění povrchu"
|
||||
|
||||
msgctxt "acceleration_wall_x_roofing label"
|
||||
msgid "Top Surface Inner Wall Acceleration"
|
||||
msgstr "Zrychlení vnitřní stěny horní plochy"
|
||||
|
||||
msgctxt "jerk_wall_x_roofing label"
|
||||
msgid "Top Surface Inner Wall Jerk"
|
||||
msgstr "Rychlá změna nejvíce vnější stěny horní plochy"
|
||||
|
||||
msgctxt "speed_wall_x_roofing label"
|
||||
msgid "Top Surface Inner Wall Speed"
|
||||
msgstr "Rychlost vnitřní stěny horní plochy"
|
||||
|
||||
msgctxt "wall_x_material_flow_roofing label"
|
||||
msgid "Top Surface Inner Wall(s) Flow"
|
||||
msgstr "Tok vnitřní stěny horní plochy"
|
||||
|
||||
msgctxt "acceleration_wall_0_roofing label"
|
||||
msgid "Top Surface Outer Wall Acceleration"
|
||||
msgstr "Zrychlení vnější stěny horní plochy"
|
||||
|
||||
msgctxt "wall_0_material_flow_roofing label"
|
||||
msgid "Top Surface Outer Wall Flow"
|
||||
msgstr "Tok nejvíce vnější stěnové linky horní plochy"
|
||||
|
||||
msgctxt "jerk_wall_0_roofing label"
|
||||
msgid "Top Surface Outer Wall Jerk"
|
||||
msgstr "Rychlá změna nejvíce vnitřní stěny horní plochy"
|
||||
|
||||
msgctxt "speed_wall_0_roofing label"
|
||||
msgid "Top Surface Outer Wall Speed"
|
||||
msgstr "Rychlost nejvíce vnější stěny horní plochy"
|
||||
|
||||
msgctxt "acceleration_roofing label"
|
||||
msgid "Top Surface Skin Acceleration"
|
||||
msgstr "Akcelerace tisku horního povrchu"
|
||||
|
@ -5387,53 +5491,6 @@ msgctxt "travel description"
|
|||
msgid "travel"
|
||||
msgstr "cestování"
|
||||
|
||||
|
||||
|
||||
|
||||
### Settings added by bundled engine backend plugins. Add this manually for now. Should be removed whenever we handle it better.
|
||||
|
||||
msgctxt "gradual_flow_enabled label"
|
||||
msgid "Gradual flow enabled"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "gradual_flow_enabled description"
|
||||
msgid "Enable gradual flow changes. When enabled, the flow is gradually increased/decreased to the target flow. This is useful for printers with a bowden tube where the flow is not immediately changed when the extruder motor starts/stops."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "max_flow_acceleration label"
|
||||
msgid "Gradual flow max acceleration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "max_flow_acceleration description"
|
||||
msgid "Maximum acceleration for gradual flow changes"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "layer_0_max_flow_acceleration label"
|
||||
msgid "Initial layer max flow acceleration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "layer_0_max_flow_acceleration description"
|
||||
msgid "Minimum speed for gradual flow changes for the first layer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "gradual_flow_discretisation_step_size label"
|
||||
msgid "Gradual flow discretisation step size"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "gradual_flow_discretisation_step_size description"
|
||||
msgid "Duration of each step in the gradual flow change"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "reset_flow_duration label"
|
||||
msgid "Reset flow duration"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "reset_flow_duration description"
|
||||
msgid "For any travel move longer than this value, the material flow is reset to the paths target flow"
|
||||
msgstr ""
|
||||
|
||||
|
||||
|
||||
#~ msgctxt "machine_head_with_fans_polygon description"
|
||||
#~ msgid "A 2D silhouette of the print head (fan caps included)."
|
||||
#~ msgstr "2D silueta tiskové hlavy (včetně krytů ventilátoru)."
|
||||
|
@ -5530,6 +5587,14 @@ msgstr ""
|
|||
#~ msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing."
|
||||
#~ msgstr "Vzdálenost mezi tryskou a vodorovnými liniemi dolů. Větší vůle vede k diagonálně dolů směřujícím liniím s menším strmým úhlem, což zase vede k menšímu spojení nahoru s další vrstvou. Platí pouze pro drátový tisk."
|
||||
|
||||
#~ msgctxt "support_bottom_distance description"
|
||||
#~ msgid "Distance from the print to the bottom of the support."
|
||||
#~ msgstr "Vzdálenost od tisku ke spodní části podpěry."
|
||||
|
||||
#~ msgctxt "support_z_distance description"
|
||||
#~ msgid "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height."
|
||||
#~ msgstr "Vzdálenost od horní / dolní nosné struktury k tisku. Tato mezera poskytuje vůli pro odstranění podpěr po vytištění modelu. Tato hodnota je zaokrouhlena nahoru na násobek výšky vrstvy."
|
||||
|
||||
#~ msgctxt "wireframe_up_half_speed description"
|
||||
#~ msgid ""
|
||||
#~ "Distance of an upward move which is extruded with half speed.\n"
|
||||
|
@ -5550,6 +5615,14 @@ msgstr ""
|
|||
#~ msgid "Distance with which the material of an upward extrusion is dragged along with the diagonally downward extrusion. This distance is compensated for. Only applies to Wire Printing."
|
||||
#~ msgstr "Vzdálenost, se kterou je materiál vytlačování směrem vzhůru tažen spolu s diagonálně směrem dolů vytlačováním. Tato vzdálenost je kompenzována. Platí pouze pro drátový tisk."
|
||||
|
||||
#~ msgctxt "gradual_flow_discretisation_step_size description"
|
||||
#~ msgid "Duration of each step in the gradual flow change"
|
||||
#~ msgstr "Doba trvání každého kroku v postupné změně průtoku"
|
||||
|
||||
#~ msgctxt "gradual_flow_enabled description"
|
||||
#~ msgid "Enable gradual flow changes. When enabled, the flow is gradually increased/decreased to the target flow. This is useful for printers with a bowden tube where the flow is not immediately changed when the extruder motor starts/stops."
|
||||
#~ msgstr "Povolit postupné změny průtoku. Když je povoleno, průtok se postupně zvyšuje / snižuje na cílový průtok. Toto je užitečné pro tiskárny s Bowdenovou trubicí, kde se průtok okamžitě nezmění, když se spustí / zastaví extrudér."
|
||||
|
||||
#~ msgctxt "material_end_of_filament_purge_length label"
|
||||
#~ msgid "End Of Filament Purge Length"
|
||||
#~ msgstr "Délka proplachování konce filamentu"
|
||||
|
@ -5598,6 +5671,10 @@ msgstr ""
|
|||
#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing."
|
||||
#~ msgstr "Kompenzace toku: množství vytlačovaného materiálu se vynásobí touto hodnotou. Platí pouze pro drátový tisk."
|
||||
|
||||
#~ msgctxt "reset_flow_duration description"
|
||||
#~ msgid "For any travel move longer than this value, the material flow is reset to the paths target flow"
|
||||
#~ msgstr "Pro jakýkoli pohyb delší než tato hodnota se materiálový průtok resetuje na cílový průtok dráhy"
|
||||
|
||||
#~ msgctxt "material_guid description"
|
||||
#~ msgid "GUID of the material. This is set automatically. "
|
||||
#~ msgstr "GUID materiálu. Toto je nastaveno automaticky. "
|
||||
|
@ -5606,6 +5683,19 @@ msgstr ""
|
|||
#~ msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time."
|
||||
#~ msgstr "Vygenerujte stromovou podporu s větvemi, které podporují váš tisk. To může snížit spotřebu materiálu a dobu tisku, ale výrazně prodlužuje dobu slicování."
|
||||
|
||||
#~ msgctxt "gradual_flow_discretisation_step_size label"
|
||||
#~ msgid "Gradual flow discretisation step size"
|
||||
#~ msgstr "Velikost kroku diskretizace postupné změny průtoku"
|
||||
|
||||
# ## Settings added by bundled engine backend plugins. Add this manually for now. Should be removed whenever we handle it better.
|
||||
#~ msgctxt "gradual_flow_enabled label"
|
||||
#~ msgid "Gradual flow enabled"
|
||||
#~ msgstr "Postupné změny průtoku povoleny"
|
||||
|
||||
#~ msgctxt "max_flow_acceleration label"
|
||||
#~ msgid "Gradual flow max acceleration"
|
||||
#~ msgstr "Maximální zrychlení postupných změn průtoku"
|
||||
|
||||
#~ msgctxt "support_tree_branch_distance description"
|
||||
#~ msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove."
|
||||
#~ msgstr "Jak daleko od sebe musí být větve, když se dotýkají modelu. Zmenšení této vzdálenosti způsobí, že se stromová podpora dotkne modelu ve více bodech, což způsobí lepší přesah, ale těžší odstranění podpory."
|
||||
|
@ -5626,6 +5716,10 @@ msgstr ""
|
|||
#~ msgid "Infill Mesh Order"
|
||||
#~ msgstr "Pořadí sítě výplně"
|
||||
|
||||
#~ msgctxt "layer_0_max_flow_acceleration label"
|
||||
#~ msgid "Initial layer max flow acceleration"
|
||||
#~ msgstr "Maximální zrychlení průtoku pro první vrstvu"
|
||||
|
||||
#~ msgctxt "wireframe_strategy option knot"
|
||||
#~ msgid "Knot"
|
||||
#~ msgstr "Uzel"
|
||||
|
@ -5666,6 +5760,10 @@ msgstr ""
|
|||
#~ msgid "Maximum Speed for Flow Equalization"
|
||||
#~ msgstr "Maximální rychlost pro vyrovnávání průtoku"
|
||||
|
||||
#~ msgctxt "max_flow_acceleration description"
|
||||
#~ msgid "Maximum acceleration for gradual flow changes"
|
||||
#~ msgstr "Maximální zrychlení pro postupné změny průtoku"
|
||||
|
||||
#~ msgctxt "speed_equalize_flow_max description"
|
||||
#~ msgid "Maximum print speed when adjusting the print speed in order to equalize flow."
|
||||
#~ msgstr "Maximální rychlost tisku při úpravě rychlosti tisku za účelem vyrovnání toku."
|
||||
|
@ -5678,6 +5776,10 @@ msgstr ""
|
|||
#~ msgid "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls."
|
||||
#~ msgstr "Minimální povolený procentuální průtok pro linii stěny. Kompenzace překrytí stěny snižuje průtok stěny, když leží blízko ke stávající zdi. Stěny, jejichž průtok je menší než tato hodnota, budou nahrazeny pohybem. Při použití tohoto nastavení musíte povolit kompenzaci překrytí stěny a vnější stěnu vytisknout před vnitřními stěnami."
|
||||
|
||||
#~ msgctxt "layer_0_max_flow_acceleration description"
|
||||
#~ msgid "Minimum speed for gradual flow changes for the first layer"
|
||||
#~ msgstr "Minimální rychlost pro postupné změny průtoku pro první vrstvu"
|
||||
|
||||
#~ msgctxt "fill_perimeter_gaps option nowhere"
|
||||
#~ msgid "Nowhere"
|
||||
#~ msgstr "Nikde"
|
||||
|
@ -5698,6 +5800,14 @@ msgstr ""
|
|||
#~ msgid "Prefer Retract"
|
||||
#~ msgstr "Preferovat retrakci"
|
||||
|
||||
#~ msgctxt "prime_tower_brim_enable label"
|
||||
#~ msgid "Prime Tower Brim"
|
||||
#~ msgstr "Límec hlavní věže"
|
||||
|
||||
#~ msgctxt "prime_tower_brim_enable description"
|
||||
#~ msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
|
||||
#~ msgstr "Hlavní věže mohou potřebovat zvláštní přilnavost, kterou poskytuje límec, i když to model neumožňuje. V současnosti nelze použít s adhezním typem „Raft“."
|
||||
|
||||
#~ msgctxt "wireframe_enabled description"
|
||||
#~ msgid "Print only the outside surface with a sparse webbed structure, printing 'in thin air'. This is realized by horizontally printing the contours of the model at given Z intervals which are connected via upward and diagonally downward lines."
|
||||
#~ msgstr "Tiskněte pouze vnější povrch s řídkou strukturou struktury a tiskněte „na vzduchu“. To je realizováno horizontálním tiskem kontur modelu v daných intervalech Z, které jsou spojeny pomocí linií nahoru a diagonálně dolů."
|
||||
|
@ -5714,6 +5824,10 @@ msgstr ""
|
|||
#~ msgid "Prints walls in order of outside to inside when enabled. This can help improve dimensional accuracy in X and Y when using a high viscosity plastic like ABS; however it can decrease outer surface print quality, especially on overhangs."
|
||||
#~ msgstr "Když je povoleno, tiskne stěny v pořadí od vnějšku dovnitř. To může pomoci zlepšit rozměrovou přesnost v X a Y při použití plastu s vysokou viskozitou, jako je ABS; může však snížit kvalitu tisku vnějšího povrchu, zejména na převisy."
|
||||
|
||||
#~ msgctxt "reset_flow_duration label"
|
||||
#~ msgid "Reset flow duration"
|
||||
#~ msgstr "Doba trvání resetování průtoku"
|
||||
|
||||
#~ msgctxt "support_tree_collision_resolution description"
|
||||
#~ msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically."
|
||||
#~ msgstr "Rozlišení pro výpočet kolizí, aby nedošlo k nárazu do modelu. Nastavením této nižší se vytvoří přesnější stromy, které selhávají méně často, ale dramaticky se zvyšuje doba slicování."
|
||||
|
@ -5862,6 +5976,10 @@ msgstr ""
|
|||
#~ msgid "The speed for the initial layer. A lower value is advised to improve adhesion to the build plate."
|
||||
#~ msgstr "Rychlost počáteční vrstvy. Doporučuje se nižší hodnota pro zlepšení přilnavosti k montážní desce."
|
||||
|
||||
#~ msgctxt "material_print_temperature_layer_0 description"
|
||||
#~ msgid "The temperature used for printing the first layer. Set at 0 to disable special handling of the initial layer."
|
||||
#~ msgstr "Teplota, která se používá pro tisk první vrstvy."
|
||||
|
||||
#~ msgctxt "material_bed_temperature_layer_0 description"
|
||||
#~ msgid "The temperature used for the heated build plate at the first layer."
|
||||
#~ msgstr "Teplota použitá pro vyhřívanou podložku v první vrstvě."
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-09-20 14:03+0000\n"
|
||||
"POT-Creation-Date: 2023-10-31 19:13+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
@ -527,6 +528,10 @@ msgctxt "@action:inmenu menubar:edit"
|
|||
msgid "Arrange All Models in a grid"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@action:inmenu menubar:edit"
|
||||
msgid "Arrange Selection"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@label:button"
|
||||
msgid "Ask a question"
|
||||
msgstr ""
|
||||
|
@ -587,6 +592,10 @@ msgctxt "@info:title"
|
|||
msgid "Backups"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@label"
|
||||
msgid "Balanced"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@action:label"
|
||||
msgid "Base (mm)"
|
||||
msgstr ""
|
||||
|
@ -951,6 +960,10 @@ msgctxt "@info:error"
|
|||
msgid "Could not interpret the server's response."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@error:load"
|
||||
msgid "Could not load GCodeWriter plugin. Try to re-enable the plugin."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@info:error"
|
||||
msgid "Could not reach Marketplace."
|
||||
msgstr ""
|
||||
|
@ -1165,10 +1178,6 @@ msgctxt "@info:No intent profile selected"
|
|||
msgid "Default"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@label"
|
||||
msgid "Default"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@window:text"
|
||||
msgid "Default behavior for changed setting values when switching to a different profile: "
|
||||
msgstr ""
|
||||
|
@ -2212,6 +2221,18 @@ msgctxt "@info:generic"
|
|||
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@item:inlistbox"
|
||||
msgid "Makerbot Printfile"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@error"
|
||||
msgid "MakerbotWriter could not save to the designated path."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@error:not supported"
|
||||
msgid "MakerbotWriter does not support text mode."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@action:inmenu"
|
||||
msgid "Manage Materials..."
|
||||
msgstr ""
|
||||
|
@ -3998,6 +4019,10 @@ msgctxt "@error:file_size"
|
|||
msgid "The backup exceeds the maximum file size."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@text"
|
||||
msgid "The balanced profile is designed to strike a balance between productivity, surface quality, mechanical properties and dimensional accuracy."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "@info:tooltip"
|
||||
msgid "The base height from the build plate in millimeters."
|
||||
msgstr ""
|
||||
|
@ -4952,19 +4977,19 @@ msgctxt "@info:generic"
|
|||
msgid "{} plugins failed to download"
|
||||
msgstr ""
|
||||
msgctxt "description"
|
||||
msgid "Provides support for exporting Cura profiles."
|
||||
msgid "Extension that allows for user created scripts for post processing"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Cura Profile Writer"
|
||||
msgid "Post Processing"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Submits anonymous slice info. Can be disabled through preferences."
|
||||
msgid "Provides a normal solid mesh view."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Slice info"
|
||||
msgid "Solid View"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
|
@ -4976,235 +5001,11 @@ msgid "Legacy Cura Profile Reader"
|
|||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for reading X3D files."
|
||||
msgid "Provides the X-Ray view."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "X3D Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for writing Ultimaker Format Packages."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "UFP Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.5 to 4.0"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.1 to 4.2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.7 to Cura 4.8."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.7 to 4.8"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.9 to Cura 4.10."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.9 to 4.10"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.2 to 3.3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.7 to 3.0"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.11 to Cura 4.12."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.11 to 4.12"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.6 to 2.7"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.8 to Cura 4.9."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.8 to 4.9"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.3 to Cura 4.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.3 to 4.4"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.3 to 3.4"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.4 to Cura 4.5."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.4 to 4.5"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.5 to 2.6"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.1 to 2.2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.2 to Cura 4.3."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.2 to 4.3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 5.2 to Cura 5.3."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 5.2 to 5.3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.0 to 4.1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.2 to 2.4"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.4 to 3.5"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.13 to Cura 5.0."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.13 to 5.0"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 5.4 to Cura 5.5."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 5.4 to 5.5"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.5 to Cura 4.6."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.5 to 4.6"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.0 to 3.1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.6.0 to 4.6.2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.6.2 to Cura 4.7."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.6.2 to 4.7"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 5.3 to Cura 5.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 5.3 to 5.4"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Extension that allows for user created scripts for post processing"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Post Processing"
|
||||
msgid "X-Ray View"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
|
@ -5216,19 +5017,11 @@ msgid "Simulation View"
|
|||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for importing Cura profiles."
|
||||
msgid "Provides support for reading AMF files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Cura Profile Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides the Per Model Settings."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Per Model Settings Tool"
|
||||
msgid "AMF Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
|
@ -5240,107 +5033,19 @@ msgid "Preview Stage"
|
|||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Creates an eraser mesh to block the printing of support in certain places"
|
||||
msgid "Connects to the Digital Library, allowing Cura to open files from and save files to the Digital Library."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Support Eraser"
|
||||
msgid "Ultimaker Digital Library"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Allows loading and displaying G-code files."
|
||||
msgid "Provides a machine actions for updating firmware."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "G-code Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Backup and restore your configuration."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Cura Backups"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides removable drive hotplugging and writing support."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Removable Drive Output Device Plugin"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "CuraEngine plugin for gradually smoothing the flow to limit high-flow jumps"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "CuraEngineGradualFlow"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides capabilities to read and write XML-based material profiles."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Material Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "UltiMaker machine actions"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides the X-Ray view."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "X-Ray View"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Manages network connections to UltiMaker networked printers."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "UltiMaker Network Connection"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Machine Settings Action"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for reading model files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Trimesh Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Manages extensions to the application and allows browsing extensions from the UltiMaker website."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Marketplace"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides a monitor stage in Cura."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Monitor Stage"
|
||||
msgid "Firmware Updater"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
|
@ -5352,11 +5057,91 @@ msgid "Image Reader"
|
|||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides a machine actions for updating firmware."
|
||||
msgid "Backup and restore your configuration."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Firmware Updater"
|
||||
msgid "Cura Backups"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Manages extensions to the application and allows browsing extensions from the UltiMaker website."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Marketplace"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for reading X3D files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "X3D Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for writing 3MF files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "3MF Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Checks for firmware updates."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Firmware Update Checker"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for reading model files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Trimesh Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Allows loading and displaying G-code files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "G-code Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "UltiMaker machine actions"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Writes g-code to a compressed archive."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Compressed G-code Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Machine Settings Action"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for importing profiles from g-code files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "G-code Profile Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
|
@ -5376,75 +5161,11 @@ msgid "Prepare Stage"
|
|||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Connects to the Digital Library, allowing Cura to open files from and save files to the Digital Library."
|
||||
msgid "Provides support for writing Ultimaker Format Packages."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Ultimaker Digital Library"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Checks for firmware updates."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Firmware Update Checker"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Writes g-code to a file."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "G-code Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Checks models and print configuration for possible printing issues and give suggestions."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Model Checker"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for reading 3MF files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "3MF Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "USB printing"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for reading AMF files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "AMF Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for importing profiles from g-code files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "G-code Profile Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides a normal solid mesh view."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Solid View"
|
||||
msgid "UFP Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
|
@ -5456,11 +5177,99 @@ msgid "Sentry Logger"
|
|||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Reads g-code from a compressed archive."
|
||||
msgid "Provides removable drive hotplugging and writing support."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Compressed G-code Reader"
|
||||
msgid "Removable Drive Output Device Plugin"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides the Per Model Settings."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Per Model Settings Tool"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Writes g-code to a file."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "G-code Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for writing MakerBot Format Packages."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Makerbot Printfile Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "USB printing"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Submits anonymous slice info. Can be disabled through preferences."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Slice info"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for exporting Cura profiles."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Cura Profile Writer"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "CuraEngine plugin for gradually smoothing the flow to limit high-flow jumps"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "CuraEngineGradualFlow"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Manages network connections to UltiMaker networked printers."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "UltiMaker Network Connection"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides a monitor stage in Cura."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Monitor Stage"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for reading 3MF files."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "3MF Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides capabilities to read and write XML-based material profiles."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Material Profiles"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
|
@ -5472,18 +5281,242 @@ msgid "UFP Reader"
|
|||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Provides support for writing 3MF files."
|
||||
msgid "Checks models and print configuration for possible printing issues and give suggestions."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "3MF Writer"
|
||||
msgid "Model Checker"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Writes g-code to a compressed archive."
|
||||
msgid "Provides support for importing Cura profiles."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Compressed G-code Writer"
|
||||
msgid "Cura Profile Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Creates an eraser mesh to block the printing of support in certain places"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Support Eraser"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Reads g-code from a compressed archive."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Compressed G-code Reader"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.1 to 4.2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.2 to 2.4"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 5.3 to Cura 5.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 5.3 to 5.4"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 5.4 to Cura 5.5."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 5.4 to 5.5"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.13 to Cura 5.0."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.13 to 5.0"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.6 to 2.7"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.11 to Cura 4.12."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.11 to 4.12"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 5.2 to Cura 5.3."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 5.2 to 5.3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.6.2 to Cura 4.7."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.6.2 to 4.7"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.1 to 2.2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.0 to 3.1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.3 to Cura 4.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.3 to 4.4"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.9 to Cura 4.10."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.9 to 4.10"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.5 to Cura 4.6."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.5 to 4.6"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.2 to Cura 4.3."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.2 to 4.3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.7 to Cura 4.8."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.7 to 4.8"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.0 to 4.1"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.2 to 3.3"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.5 to 4.0"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.5 to 2.6"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.4 to Cura 4.5."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.4 to 4.5"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 2.7 to 3.0"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.4 to 3.5"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.6.0 to 4.6.2"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 4.8 to Cura 4.9."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 4.8 to 4.9"
|
||||
msgstr ""
|
||||
|
||||
msgctxt "description"
|
||||
msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
|
||||
msgstr ""
|
||||
|
||||
msgctxt "name"
|
||||
msgid "Version Upgrade 3.3 to 3.4"
|
||||
msgstr ""
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue