mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-06-30 04:05:25 +08:00
Merge branch 'main' into TIme-Lapse
This commit is contained in:
commit
ee65d93fb6
6
.github/ISSUE_TEMPLATE/SlicingCrash.yaml
vendored
6
.github/ISSUE_TEMPLATE/SlicingCrash.yaml
vendored
@ -6,9 +6,9 @@ body:
|
||||
attributes:
|
||||
value: |
|
||||
### ✨Try our improved Cura 5.7✨
|
||||
Before filling out the report below, we want you to try the latest Cura 5.7 Beta.
|
||||
Before filling out the report below, we want you to try the latest Cura 5.7.
|
||||
This version of Cura has become significantly more reliable and has an updated slicing engine that will automatically send a report to the Cura Team for analysis.
|
||||
#### [You can find the downloads here](https://github.com/Ultimaker/Cura/releases/tag/5.7.0-beta.1) ####
|
||||
#### [You can find the downloads here](https://github.com/Ultimaker/Cura/releases/latest) ####
|
||||
If you still encounter a crash you are still welcome to report the issue so we can use your model as a test case, you can find instructions on how to do that below.
|
||||
|
||||
### Project File
|
||||
@ -35,7 +35,7 @@ body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
We work hard on improving our slicing crashes. Our most recent release is 5.6.0.
|
||||
We work hard on improving our slicing crashes. Our most recent release is 5.7.1.
|
||||
If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
|
||||
- type: input
|
||||
attributes:
|
||||
|
43
.github/workflows/installers.yml
vendored
43
.github/workflows/installers.yml
vendored
@ -30,6 +30,29 @@ on:
|
||||
required: true
|
||||
type: boolean
|
||||
|
||||
workflow_call:
|
||||
inputs:
|
||||
cura_conan_version:
|
||||
default: 'cura/latest@ultimaker/testing'
|
||||
required: true
|
||||
type: string
|
||||
conan_args:
|
||||
default: ''
|
||||
required: false
|
||||
type: string
|
||||
enterprise:
|
||||
default: false
|
||||
required: true
|
||||
type: boolean
|
||||
staging:
|
||||
default: false
|
||||
required: true
|
||||
type: boolean
|
||||
nightly:
|
||||
default: false
|
||||
required: true
|
||||
type: boolean
|
||||
|
||||
schedule:
|
||||
# Daily at 4:15 CET (main-branch) and 5:15 CET (release-branch)
|
||||
- cron: '15 3 * * *'
|
||||
@ -70,7 +93,7 @@ jobs:
|
||||
enterprise: ${{ github.event.inputs.enterprise == 'true' }}
|
||||
staging: ${{ github.event.inputs.staging == 'true' }}
|
||||
architecture: X64
|
||||
operating_system: ubuntu-22.04
|
||||
operating_system: self-hosted-Ubuntu22-X64
|
||||
secrets: inherit
|
||||
|
||||
macos-installer:
|
||||
@ -109,7 +132,7 @@ jobs:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Download the run info
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: linux-run-info
|
||||
|
||||
@ -151,13 +174,13 @@ jobs:
|
||||
f.writelines(f"NIGHTLY_TIME={nightly_creation_time}\n")
|
||||
|
||||
- name: Download linux installer jobs artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.LINUX }}-AppImage
|
||||
path: installers
|
||||
|
||||
- name: Download linux installer jobs asc artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.LINUX }}-asc
|
||||
path: installers
|
||||
@ -175,13 +198,13 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Download win msi installer jobs artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.WIN_MSI }}-msi
|
||||
path: installers
|
||||
|
||||
- name: Download win exe installer jobs artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.WIN_EXE }}-exe
|
||||
path: installers
|
||||
@ -199,13 +222,13 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Download MacOS (X64) dmg installer jobs artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.MAC_X64_DMG }}-dmg
|
||||
path: installers
|
||||
|
||||
- name: Download MacOS (X64) pkg installer jobs artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.MAC_X64_PKG }}-pkg
|
||||
path: installers
|
||||
@ -223,13 +246,13 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Download MacOS (ARM-64) dmg installer jobs artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.MAC_ARM_DMG }}-dmg
|
||||
path: installers
|
||||
|
||||
- name: Download MacOS (ARM-64) pkg installer jobs artifacts
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ${{ steps.filename.outputs.MAC_ARM_PKG }}-pkg
|
||||
path: installers
|
||||
|
5
.github/workflows/linux.yml
vendored
5
.github/workflows/linux.yml
vendored
@ -34,10 +34,11 @@ on:
|
||||
operating_system:
|
||||
description: 'OS'
|
||||
required: true
|
||||
default: 'ubuntu-22.04'
|
||||
default: 'self-hosted-Ubuntu22-X64'
|
||||
type: choice
|
||||
options:
|
||||
- ubuntu-22.04
|
||||
- self-hosted-Ubuntu22-X64
|
||||
|
||||
jobs:
|
||||
linux-installer:
|
||||
@ -49,4 +50,4 @@ jobs:
|
||||
staging: ${{ inputs.staging }}
|
||||
architecture: ${{ inputs.architecture }}
|
||||
operating_system: ${{ inputs.operating_system }}
|
||||
secrets: inherit
|
||||
secrets: inherit
|
||||
|
3
.github/workflows/macos.yml
vendored
3
.github/workflows/macos.yml
vendored
@ -40,7 +40,6 @@ on:
|
||||
options:
|
||||
- self-hosted-X64
|
||||
- self-hosted-ARM64
|
||||
- macos-11
|
||||
- macos-12
|
||||
|
||||
jobs:
|
||||
@ -53,4 +52,4 @@ jobs:
|
||||
staging: ${{ inputs.staging }}
|
||||
architecture: ${{ inputs.architecture }}
|
||||
operating_system: ${{ inputs.operating_system }}
|
||||
secrets: inherit
|
||||
secrets: inherit
|
||||
|
@ -5,6 +5,9 @@ on:
|
||||
path:
|
||||
- "resources/**"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
printer-linter-diagnose:
|
||||
name: Printer linter PR diagnose
|
||||
@ -50,7 +53,7 @@ jobs:
|
||||
run: |
|
||||
echo ${{ github.event.number }} > printer-linter-result/pr-id.txt
|
||||
echo ${{ github.event.pull_request.head.repo.full_name }} > printer-linter-result/pr-head-repo.txt
|
||||
echo ${{ github.event.pull_request.head.ref }} > printer-linter-result/pr-head-ref.txt
|
||||
echo ${{ github.event.pull_request.head.sha }} > printer-linter-result/pr-head-sha.txt
|
||||
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
|
120
.github/workflows/printer-linter-pr-post.yml
vendored
120
.github/workflows/printer-linter-pr-post.yml
vendored
@ -6,88 +6,106 @@ on:
|
||||
types: [completed]
|
||||
|
||||
jobs:
|
||||
clang-tidy-results:
|
||||
printer-linter-result:
|
||||
# Trigger the job only if the previous (insecure) workflow completed successfully
|
||||
if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }}
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Download analysis results
|
||||
uses: actions/github-script@v3.1.0
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
let artifacts = await github.actions.listWorkflowRunArtifacts({
|
||||
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: ${{github.event.workflow_run.id }},
|
||||
});
|
||||
let matchArtifact = artifacts.data.artifacts.filter((artifact) => {
|
||||
const matchArtifact = artifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name == "printer-linter-result"
|
||||
})[0];
|
||||
let download = await github.actions.downloadArtifact({
|
||||
const download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: matchArtifact.id,
|
||||
archive_format: "zip",
|
||||
});
|
||||
let fs = require("fs");
|
||||
fs.writeFileSync("${{github.workspace}}/printer-linter-result.zip", Buffer.from(download.data));
|
||||
|
||||
- name: Set environment variables
|
||||
run: |
|
||||
mkdir printer-linter-result
|
||||
unzip printer-linter-result.zip -d printer-linter-result
|
||||
echo "pr_id=$(cat printer-linter-result/pr-id.txt)" >> $GITHUB_ENV
|
||||
echo "pr_head_repo=$(cat printer-linter-result/pr-head-repo.txt)" >> $GITHUB_ENV
|
||||
echo "pr_head_ref=$(cat printer-linter-result/pr-head-ref.txt)" >> $GITHUB_ENV
|
||||
if [[ -f "printer-linter-result/comment.md" ]]; then
|
||||
echo "commentFileExists=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "commentFileExists=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
repository: ${{ env.pr_head_repo }}
|
||||
ref: ${{ env.pr_head_ref }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Redownload analysis results
|
||||
uses: actions/github-script@v3.1.0
|
||||
with:
|
||||
script: |
|
||||
let artifacts = await github.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: ${{github.event.workflow_run.id }},
|
||||
});
|
||||
let matchArtifact = artifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name == "printer-linter-result"
|
||||
})[0];
|
||||
let download = await github.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: matchArtifact.id,
|
||||
archive_format: "zip",
|
||||
});
|
||||
let fs = require("fs");
|
||||
fs.writeFileSync("${{github.workspace}}/printer-linter-result.zip", Buffer.from(download.data));
|
||||
const fs = require("fs");
|
||||
fs.writeFileSync("${{ github.workspace }}/printer-linter-result.zip", Buffer.from(download.data));
|
||||
|
||||
- name: Extract analysis results
|
||||
run: |
|
||||
mkdir printer-linter-result
|
||||
unzip printer-linter-result.zip -d printer-linter-result
|
||||
unzip -j printer-linter-result.zip -d printer-linter-result
|
||||
|
||||
- name: Set PR details environment variables
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const assert = require("node:assert").strict;
|
||||
const fs = require("fs");
|
||||
function exportVar(varName, fileName, regEx) {
|
||||
const val = fs.readFileSync("${{ github.workspace }}/printer-linter-result/" + fileName, {
|
||||
encoding: "ascii"
|
||||
}).trimEnd();
|
||||
assert.ok(regEx.test(val), "Invalid value format for " + varName);
|
||||
core.exportVariable(varName, val);
|
||||
}
|
||||
exportVar("PR_ID", "pr-id.txt", /^[0-9]+$/);
|
||||
exportVar("PR_HEAD_REPO", "pr-head-repo.txt", /^[-./0-9A-Z_a-z]+$/);
|
||||
exportVar("PR_HEAD_SHA", "pr-head-sha.txt", /^[0-9A-Fa-f]+$/);
|
||||
fs.access("${{ github.workspace }}/printer-linter-result/comment.md", fs.constants.F_OK, (err) => {
|
||||
if (err) {
|
||||
core.exportVariable("commentFileExists", "false");
|
||||
} else {
|
||||
core.exportVariable("commentFileExists", "true");
|
||||
}
|
||||
});
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
repository: ${{ env.PR_HEAD_REPO }}
|
||||
ref: ${{ env.PR_HEAD_SHA }}
|
||||
persist-credentials: false
|
||||
|
||||
- name: Redownload analysis results
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: ${{github.event.workflow_run.id }},
|
||||
});
|
||||
const matchArtifact = artifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name == "printer-linter-result"
|
||||
})[0];
|
||||
const download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: matchArtifact.id,
|
||||
archive_format: "zip",
|
||||
});
|
||||
const fs = require("fs");
|
||||
fs.writeFileSync("${{ github.workspace }}/printer-linter-result.zip", Buffer.from(download.data));
|
||||
|
||||
- name: Extract analysis results
|
||||
run: |
|
||||
mkdir printer-linter-result
|
||||
unzip -j printer-linter-result.zip -d printer-linter-result
|
||||
|
||||
- name: Run PR Comments
|
||||
if: env.commentFileExists == 'true'
|
||||
uses: peter-evans/create-or-update-comment@v4
|
||||
with:
|
||||
issue-number: ${{ env.pr_id }}
|
||||
issue-number: ${{ env.PR_ID }}
|
||||
body-path: 'printer-linter-result/comment.md'
|
||||
|
||||
- name: Run clang-tidy-pr-comments action
|
||||
uses: platisd/clang-tidy-pr-comments@bc0bb7da034a8317d54e7fe1e819159002f4cc40
|
||||
uses: platisd/clang-tidy-pr-comments@v1
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
clang_tidy_fixes: printer-linter-result/fixes.yml
|
||||
pull_request_id: ${{ env.pr_id }}
|
||||
pull_request_id: ${{ env.PR_ID }}
|
||||
request_changes: true
|
||||
|
32
.github/workflows/release-process_feature-freeze.yml
vendored
Normal file
32
.github/workflows/release-process_feature-freeze.yml
vendored
Normal file
@ -0,0 +1,32 @@
|
||||
name: Feature Freeze
|
||||
run-name: Feature freeze Cura ${{ inputs.cura_version }} by @${{ github.actor }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
cura_version:
|
||||
description: 'Cura version major and minor, e.g. 5.7'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
parse-version:
|
||||
name: Parse input version string
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
package_version: ${{ steps.version_parser.outputs.major }}.${{ steps.version_parser.outputs.minor }}.0-alpha.1
|
||||
steps:
|
||||
- name: Parse version string
|
||||
id: version_parser
|
||||
uses: booxmedialtd/ws-action-parse-semver@v1.4.7
|
||||
with:
|
||||
input_string: ${{ inputs.cura_version }}.0
|
||||
|
||||
feature-freeze:
|
||||
name: Process feature freeze
|
||||
uses: Ultimaker/Cura-workflows/.github/workflows/cura-set-packages-versions.yml@main
|
||||
needs: [parse-version]
|
||||
with:
|
||||
cura_version: ${{ needs.parse-version.outputs.package_version }}
|
||||
create_feature_branch: true
|
||||
secrets: inherit
|
179
.github/workflows/release-process_release-candidate.yml
vendored
Normal file
179
.github/workflows/release-process_release-candidate.yml
vendored
Normal file
@ -0,0 +1,179 @@
|
||||
name: Prepare Release Candidate
|
||||
run-name: Release Candidate for Cura ${{ inputs.cura_version }} by @${{ github.actor }}
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
cura_version:
|
||||
description: 'Cura version number, e.g. 5.7.0, 5.7.2 or 5.8.0-beta.2'
|
||||
required: true
|
||||
type: string
|
||||
|
||||
jobs:
|
||||
parse-version:
|
||||
name: Parse input version string
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
version_major: ${{ steps.version_parser.outputs.major }}
|
||||
version_minor: ${{ steps.version_parser.outputs.minor }}
|
||||
version_patch: ${{ steps.version_parser.outputs.patch }}
|
||||
branch_name: ${{ steps.version_parser.outputs.major }}.${{ steps.version_parser.outputs.minor }}
|
||||
steps:
|
||||
- name: Parse version string
|
||||
id: version_parser
|
||||
uses: booxmedialtd/ws-action-parse-semver@v1.4.7
|
||||
with:
|
||||
input_string: ${{ inputs.cura_version }}
|
||||
|
||||
freeze-packages-versions:
|
||||
name: Freeze packges versions
|
||||
uses: Ultimaker/Cura-workflows/.github/workflows/cura-set-packages-versions.yml@main
|
||||
needs: [parse-version]
|
||||
with:
|
||||
cura_version: ${{ inputs.cura_version }}
|
||||
create_feature_branch: false
|
||||
secrets: inherit
|
||||
|
||||
find-rc-tag:
|
||||
name: Find RC tag name
|
||||
runs-on: ubuntu-latest
|
||||
needs: [freeze-packages-versions]
|
||||
outputs:
|
||||
tag_name: ${{ steps.find-available-tag-name.outputs.tag_name }}
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-tags: true
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Find available tag name
|
||||
id: find-available-tag-name
|
||||
run: |
|
||||
VERSION=${{ inputs.cura_version }}
|
||||
|
||||
RC_INDEX=0
|
||||
while
|
||||
RC_INDEX=$((RC_INDEX+1))
|
||||
TAG_NAME="$VERSION-RC$RC_INDEX"
|
||||
[[ $(git tag -l "$TAG_NAME") ]]
|
||||
do true; done
|
||||
|
||||
echo "tag_name=$TAG_NAME" >> "$GITHUB_OUTPUT"
|
||||
|
||||
create-tags:
|
||||
name: Create tags
|
||||
runs-on: ubuntu-latest
|
||||
needs: [parse-version, find-rc-tag]
|
||||
strategy:
|
||||
matrix:
|
||||
repository: [Cura, Uranium, CuraEngine, cura-binary-data, fdm_materials]
|
||||
steps:
|
||||
- name: Checkout repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: Ultimaker/${{ matrix.repository }}
|
||||
ref: ${{ needs.parse-version.outputs.branch_name }}
|
||||
token: ${{ secrets.CURA_AUTORELEASE_PAT }}
|
||||
|
||||
- name: Create tag
|
||||
run: |
|
||||
git tag ${{ needs.find-rc-tag.outputs.tag_name }}
|
||||
git push origin tag ${{ needs.find-rc-tag.outputs.tag_name }}
|
||||
|
||||
create-dependencies-packages:
|
||||
name: Create conan packages for dependencies
|
||||
uses: ultimaker/cura-workflows/.github/workflows/conan-package-release.yml@main
|
||||
needs: [parse-version, freeze-packages-versions]
|
||||
strategy:
|
||||
matrix:
|
||||
repository: [Cura, Uranium, CuraEngine, cura-binary-data, fdm_materials]
|
||||
include:
|
||||
- conan_recipe_root: "."
|
||||
- repository: Cura
|
||||
conan_recipe_root: "resources"
|
||||
with:
|
||||
repository: ${{ matrix.repository }}
|
||||
ref_name: ${{ needs.parse-version.outputs.branch_name }}
|
||||
version: ${{ inputs.cura_version }}
|
||||
conan_release: true
|
||||
conan_user_channel: ultimaker/stable
|
||||
conan_internal: false
|
||||
conan_latest: true
|
||||
conan_recipe_root: ${{ matrix.conan_recipe_root }}
|
||||
secrets: inherit
|
||||
|
||||
create-cura-package:
|
||||
name: Create conan package for Cura
|
||||
uses: ultimaker/cura-workflows/.github/workflows/conan-package-release.yml@main
|
||||
needs: [parse-version, create-dependencies-packages]
|
||||
with:
|
||||
repository: Cura
|
||||
ref_name: ${{ needs.parse-version.outputs.branch_name }}
|
||||
version: ${{ inputs.cura_version }}
|
||||
conan_release: true
|
||||
conan_user_channel: ultimaker/stable
|
||||
conan_internal: false
|
||||
conan_latest: true
|
||||
secrets: inherit
|
||||
|
||||
create-installers:
|
||||
name: Create installers
|
||||
uses: ./.github/workflows/installers.yml
|
||||
needs: [parse-version, create-cura-package]
|
||||
with:
|
||||
cura_conan_version: cura/${{ inputs.cura_version }}@/
|
||||
enterprise: false
|
||||
staging: false
|
||||
nightly: false
|
||||
secrets: inherit
|
||||
|
||||
create-release-draft:
|
||||
name: Create the release draft
|
||||
runs-on: ubuntu-latest
|
||||
needs: [create-installers, parse-version]
|
||||
steps:
|
||||
- name: Checkout Cura repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ needs.parse-version.outputs.branch_name }}
|
||||
|
||||
- name: Extract changelog
|
||||
run: python ./scripts/extract_changelog.py --version ${{ needs.parse-version.outputs.version_major }}.${{ needs.parse-version.outputs.version_minor }}.${{ needs.parse-version.outputs.version_patch }} --changelog ./resources/texts/change_log.txt > formatted_changelog.txt
|
||||
|
||||
- name: Get commit id for release
|
||||
id: get-commit-id
|
||||
uses: iawia002/get-tag-or-commit-id@v1.0.1
|
||||
with:
|
||||
length: 40
|
||||
|
||||
- name: Create release
|
||||
uses: notpeelz/action-gh-create-release@v5.0.1
|
||||
with:
|
||||
target: ${{ steps.get-commit-id.outputs.id }}
|
||||
tag: ${{ inputs.cura_version }}
|
||||
strategy: replace
|
||||
title: UltiMaker Cura ${{ inputs.cura_version }}
|
||||
draft: true
|
||||
body-source: file
|
||||
body: formatted_changelog.txt
|
||||
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v4.1.7
|
||||
with:
|
||||
path: artifacts
|
||||
merge-multiple: true
|
||||
|
||||
- name: Upload artifacts
|
||||
working-directory: artifacts
|
||||
run: |
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-linux-X64.AppImage --clobber
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-linux-X64.AppImage.asc --clobber
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-ARM64.dmg --clobber
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-ARM64.pkg --clobber
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-X64.dmg --clobber
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-X64.pkg --clobber
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-win64-X64.exe --clobber
|
||||
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-win64-X64.msi --clobber
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
2
.github/workflows/windows.yml
vendored
2
.github/workflows/windows.yml
vendored
@ -50,4 +50,4 @@ jobs:
|
||||
staging: ${{ inputs.staging }}
|
||||
architecture: ${{ inputs.architecture }}
|
||||
operating_system: ${{ inputs.operating_system }}
|
||||
secrets: inherit
|
||||
secrets: inherit
|
||||
|
@ -2,10 +2,11 @@ checks:
|
||||
diagnostic-mesh-file-extension: true
|
||||
diagnostic-mesh-file-size: true
|
||||
diagnostic-definition-redundant-override: true
|
||||
diagnostic-definition-experimental-setting: true
|
||||
diagnostic-resources-macos-app-directory-name: true
|
||||
diagnostic-incorrect-formula: true
|
||||
diagnostic-resource-file-deleted: true
|
||||
diagnostic-material-temperature-defined: true
|
||||
diagnostic-material-temperature-defined: false
|
||||
diagnostic-long-profile-names: true
|
||||
fixes:
|
||||
diagnostic-definition-redundant-override: true
|
||||
|
@ -1,15 +1,14 @@
|
||||
version: "5.8.0-alpha.0"
|
||||
version: "5.9.0-alpha.0"
|
||||
requirements:
|
||||
- "cura_resources/(latest)@ultimaker/testing"
|
||||
- "uranium/(latest)@ultimaker/testing"
|
||||
- "curaengine/(latest)@ultimaker/testing"
|
||||
- "cura_binary_data/(latest)@ultimaker/testing"
|
||||
- "fdm_materials/(latest)@ultimaker/testing"
|
||||
- "curaengine_plugin_gradual_flow/0.1.0-beta.3"
|
||||
- "dulcificum/latest@ultimaker/testing"
|
||||
- "curaengine_plugin_gradual_flow/0.1.0-beta.4"
|
||||
- "dulcificum/0.2.1"
|
||||
- "pysavitar/5.3.0"
|
||||
- "pynest2d/5.3.0"
|
||||
- "curaengine_grpc_definitions/0.2.0"
|
||||
- "native_cad_plugin/2.0.0"
|
||||
requirements_internal:
|
||||
- "fdm_materials/(latest)@internal/testing"
|
||||
|
@ -329,7 +329,6 @@ class CuraConan(ConanFile):
|
||||
self.options["cpython"].shared = True
|
||||
self.options["boost"].header_only = True
|
||||
if self.settings.os == "Linux":
|
||||
self.options["curaengine_grpc_definitions"].shared = True
|
||||
self.options["openssl"].shared = True
|
||||
if self.conf.get("user.curaengine:sentry_url", "", check_type=str) != "":
|
||||
self.options["curaengine"].enable_sentry = True
|
||||
|
@ -115,15 +115,15 @@ class Account(QObject):
|
||||
self._update_timer.setSingleShot(True)
|
||||
self._update_timer.timeout.connect(self.sync)
|
||||
|
||||
self._sync_services: Dict[str, int] = {}
|
||||
"""contains entries "service_name" : SyncState"""
|
||||
self.syncRequested.connect(self._updatePermissions)
|
||||
self._sync_services: Dict[str, int] = {}
|
||||
|
||||
def initialize(self) -> None:
|
||||
self._authorization_service.initialize(self._application.getPreferences())
|
||||
self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged)
|
||||
self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged)
|
||||
self._authorization_service.accessTokenChanged.connect(self._onAccessTokenChanged)
|
||||
self._authorization_service.accessTokenChanged.connect(self._updatePermissions)
|
||||
self._authorization_service.loadAuthDataFromPreferences()
|
||||
|
||||
@pyqtProperty(int, notify=syncStateChanged)
|
||||
|
@ -1,7 +1,13 @@
|
||||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
from dataclasses import asdict
|
||||
|
||||
from typing import cast, Dict, TYPE_CHECKING
|
||||
|
||||
from UM.Settings.InstanceContainer import InstanceContainer
|
||||
from UM.Settings.SettingFunction import SettingFunction
|
||||
from cura.Settings.GlobalStack import GlobalStack
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from cura.CuraApplication import CuraApplication
|
||||
@ -47,3 +53,57 @@ class Settings:
|
||||
"""
|
||||
|
||||
return self.application.getSidebarCustomMenuItems()
|
||||
|
||||
def getSliceMetadata(self) -> Dict[str, Dict[str, Dict[str, str]]]:
|
||||
"""Get all changed settings and all settings. For each extruder and the global stack"""
|
||||
print_information = self.application.getPrintInformation()
|
||||
machine_manager = self.application.getMachineManager()
|
||||
settings = {
|
||||
"material": {
|
||||
"length": print_information.materialLengths,
|
||||
"weight": print_information.materialWeights,
|
||||
"cost": print_information.materialCosts,
|
||||
},
|
||||
"global": {
|
||||
"changes": {},
|
||||
"all_settings": {},
|
||||
},
|
||||
"quality": asdict(machine_manager.activeQualityDisplayNameMap()),
|
||||
}
|
||||
|
||||
def _retrieveValue(container: InstanceContainer, setting_: str):
|
||||
value_ = container.getProperty(setting_, "value")
|
||||
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
|
||||
if not isinstance(value_, SettingFunction):
|
||||
return value_ # Success!
|
||||
value_ = value_(container)
|
||||
return 0 # Fallback value after breaking possibly endless loop.
|
||||
|
||||
global_stack = cast(GlobalStack, self.application.getGlobalContainerStack())
|
||||
|
||||
# Add global user or quality changes
|
||||
global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges)
|
||||
for setting in global_flattened_changes.getAllKeys():
|
||||
settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting)
|
||||
|
||||
# Get global all settings values without user or quality changes
|
||||
for setting in global_stack.getAllKeys():
|
||||
settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting)
|
||||
|
||||
for i, extruder in enumerate(global_stack.extruderList):
|
||||
# Add extruder fields to settings dictionary
|
||||
settings[f"extruder_{i}"] = {
|
||||
"changes": {},
|
||||
"all_settings": {},
|
||||
}
|
||||
|
||||
# Add extruder user or quality changes
|
||||
extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges)
|
||||
for setting in extruder_flattened_changes.getAllKeys():
|
||||
settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting)
|
||||
|
||||
# Get extruder all settings values without user or quality changes
|
||||
for setting in extruder.getAllKeys():
|
||||
settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting)
|
||||
|
||||
return settings
|
||||
|
@ -14,7 +14,7 @@ DEFAULT_CURA_LATEST_URL = "https://software.ultimaker.com/latest.json"
|
||||
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
|
||||
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
|
||||
# CuraVersion.py.in template.
|
||||
CuraSDKVersion = "8.7.0"
|
||||
CuraSDKVersion = "8.8.0"
|
||||
|
||||
try:
|
||||
from cura.CuraVersion import CuraLatestURL
|
||||
|
@ -1218,6 +1218,8 @@ class CuraApplication(QtApplication):
|
||||
# Once we're at this point, everything should have been flushed already (past OnExitCallbackManager).
|
||||
# It's more difficult to call sys.exit(0): That requires that it happens as the result of a pyqtSignal-emit.
|
||||
# (See https://doc.qt.io/qt-6/qcoreapplication.html#quit)
|
||||
# WARNING: With this in place you CAN NOT use cProfile. You will need to replace the next line with pass
|
||||
# for it to work!
|
||||
os._exit(0)
|
||||
|
||||
return super().event(event)
|
||||
|
@ -24,6 +24,10 @@ intent_translations["quick"] = {
|
||||
"name": catalog.i18nc("@label", "Draft"),
|
||||
"description": catalog.i18nc("@text", "The draft profile is designed to print initial prototypes and concept validation with the intent of significant print time reduction.")
|
||||
}
|
||||
intent_translations["annealing"] = {
|
||||
"name": catalog.i18nc("@label", "Annealing"),
|
||||
"description": catalog.i18nc("@text", "The annealing profile requires post-processing in an oven after the print is finished. This profile retains the dimensional accuracy of the printed part after annealing and improves strength, stiffness, and thermal resistance.")
|
||||
}
|
||||
intent_translations["solid"] = {
|
||||
"name": catalog.i18nc("@label", "Solid"),
|
||||
"description": catalog.i18nc("@text",
|
||||
|
@ -96,7 +96,7 @@ class AuthorizationHelpers:
|
||||
return
|
||||
|
||||
if token_response.error() != QNetworkReply.NetworkError.NoError:
|
||||
callback(AuthenticationResponse(success = False, err_message = token_data["error_description"]))
|
||||
callback(AuthenticationResponse(success = False, err_message = token_data.get("error_description", "an unknown server error occurred")))
|
||||
return
|
||||
|
||||
callback(AuthenticationResponse(success = True,
|
||||
|
106
cura/PrinterOutput/FormatMaps.py
Normal file
106
cura/PrinterOutput/FormatMaps.py
Normal file
@ -0,0 +1,106 @@
|
||||
# Copyright (c) 2024 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from UM.Resources import Resources
|
||||
|
||||
import json
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
class FormatMaps:
|
||||
|
||||
# A map from the printer-type in their native file-formats to the internal name we use.
|
||||
PRINTER_TYPE_NAME = {
|
||||
"fire_e": "ultimaker_method",
|
||||
"lava_f": "ultimaker_methodx",
|
||||
"magma_10": "ultimaker_methodxl",
|
||||
"sketch": "ultimaker_sketch"
|
||||
}
|
||||
|
||||
# A map from the extruder-name in their native file-formats to the internal name we use.
|
||||
EXTRUDER_NAME_MAP = {
|
||||
"mk14_hot": "1XA",
|
||||
"mk14_hot_s": "2XA",
|
||||
"mk14_c": "1C",
|
||||
"mk14": "1A",
|
||||
"mk14_s": "2A",
|
||||
"mk14_e": "LABS"
|
||||
}
|
||||
|
||||
# A map from the material-name in their native file-formats to some info, including the internal name we use.
|
||||
MATERIAL_MAP = {
|
||||
"abs": {"name": "ABS", "guid": "2780b345-577b-4a24-a2c5-12e6aad3e690"},
|
||||
"abs-cf10": {"name": "ABS-CF", "guid": "495a0ce5-9daf-4a16-b7b2-06856d82394d"},
|
||||
"abs-wss1": {"name": "ABS-R", "guid": "88c8919c-6a09-471a-b7b6-e801263d862d"},
|
||||
"asa": {"name": "ASA", "guid": "f79bc612-21eb-482e-ad6c-87d75bdde066"},
|
||||
"nylon12-cf": {"name": "Nylon 12 CF", "guid": "3c6f2877-71cc-4760-84e6-4b89ab243e3b"},
|
||||
"nylon": {"name": "Nylon", "guid": "283d439a-3490-4481-920c-c51d8cdecf9c"},
|
||||
"pc": {"name": "PC", "guid": "62414577-94d1-490d-b1e4-7ef3ec40db02"},
|
||||
"petg": {"name": "PETG", "guid": "69386c85-5b6c-421a-bec5-aeb1fb33f060"},
|
||||
"pla": {"name": "PLA", "guid": "abb9c58e-1f56-48d1-bd8f-055fde3a5b56"},
|
||||
"pva": {"name": "PVA", "guid": "add51ef2-86eb-4c39-afd5-5586564f0715"},
|
||||
"wss1": {"name": "RapidRinse", "guid": "a140ef8f-4f26-4e73-abe0-cfc29d6d1024"},
|
||||
"sr30": {"name": "SR-30", "guid": "77873465-83a9-4283-bc44-4e542b8eb3eb"},
|
||||
"bvoh": {"name": "BVOH", "guid": "923e604c-8432-4b09-96aa-9bbbd42207f4"},
|
||||
"cpe": {"name": "CPE", "guid": "da1872c1-b991-4795-80ad-bdac0f131726"},
|
||||
"hips": {"name": "HIPS", "guid": "a468d86a-220c-47eb-99a5-bbb47e514eb0"},
|
||||
"tpu": {"name": "TPU 95A", "guid": "19baa6a9-94ff-478b-b4a1-8157b74358d2"},
|
||||
"im-pla": {"name": "Tough", "guid": "de031137-a8ca-4a72-bd1b-17bb964033ad"}
|
||||
}
|
||||
|
||||
__inverse_printer_name: Optional[Dict[str, str]] = None
|
||||
__inverse_extruder_type: Optional[Dict[str, str]] = None
|
||||
__inverse_material_map: Optional[Dict[str, str]] = None
|
||||
__product_to_id_map: Optional[Dict[str, List[str]]] = None
|
||||
|
||||
@classmethod
|
||||
def getInversePrinterNameMap(cls) -> Dict[str, str]:
|
||||
"""Returns the inverse of the printer name map, that is, from the internal name to the name used in output."""
|
||||
if cls.__inverse_printer_name is not None:
|
||||
return cls.__inverse_printer_name
|
||||
cls.__inverse_printer_name = {}
|
||||
for key, value in cls.PRINTER_TYPE_NAME.items():
|
||||
cls.__inverse_printer_name[value] = key
|
||||
return cls.__inverse_printer_name
|
||||
|
||||
@classmethod
|
||||
def getInverseExtruderTypeMap(cls) -> Dict[str, str]:
|
||||
"""Returns the inverse of the extruder type map, that is, from the internal name to the name used in output."""
|
||||
if cls.__inverse_extruder_type is not None:
|
||||
return cls.__inverse_extruder_type
|
||||
cls.__inverse_extruder_type = {}
|
||||
for key, value in cls.EXTRUDER_NAME_MAP.items():
|
||||
cls.__inverse_extruder_type[value] = key
|
||||
return cls.__inverse_extruder_type
|
||||
|
||||
@classmethod
|
||||
def getInverseMaterialMap(cls) -> Dict[str, str]:
|
||||
"""Returns the inverse of the material map, that is, from the internal name to the name used in output.
|
||||
|
||||
Note that this drops the extra info saved in the non-inverse material map, use that if you need it.
|
||||
"""
|
||||
if cls.__inverse_material_map is not None:
|
||||
return cls.__inverse_material_map
|
||||
cls.__inverse_material_map = {}
|
||||
for key, value in cls.MATERIAL_MAP.items():
|
||||
cls.__inverse_material_map[value["name"]] = key
|
||||
return cls.__inverse_material_map
|
||||
|
||||
@classmethod
|
||||
def getProductIdMap(cls) -> Dict[str, List[str]]:
|
||||
"""Gets a mapping from product names (for example, in the XML files) to their definition IDs.
|
||||
|
||||
This loads the mapping from a file.
|
||||
"""
|
||||
if cls.__product_to_id_map is not None:
|
||||
return cls.__product_to_id_map
|
||||
|
||||
product_to_id_file = Resources.getPath(Resources.Texts, "product_to_id.json")
|
||||
with open(product_to_id_file, encoding = "utf-8") as f:
|
||||
contents = ""
|
||||
for line in f:
|
||||
contents += line if "#" not in line else "".join([line.replace("#", str(n)) for n in range(1, 12)])
|
||||
cls.__product_to_id_map = json.loads(contents)
|
||||
cls.__product_to_id_map = {key: [value] for key, value in cls.__product_to_id_map.items()}
|
||||
#This also loads "Ultimaker S5" -> "ultimaker_s5" even though that is not strictly necessary with the default to change spaces into underscores.
|
||||
#However it is not always loaded with that default; this mapping is also used in serialize() without that default.
|
||||
return cls.__product_to_id_map
|
@ -1,9 +1,10 @@
|
||||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Copyright (c) 2024 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from typing import Optional
|
||||
|
||||
from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal
|
||||
|
||||
from cura.PrinterOutput.FormatMaps import FormatMaps
|
||||
from .MaterialOutputModel import MaterialOutputModel
|
||||
|
||||
|
||||
@ -45,15 +46,8 @@ class ExtruderConfigurationModel(QObject):
|
||||
|
||||
@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]
|
||||
if hotendId in FormatMaps.EXTRUDER_NAME_MAP:
|
||||
return FormatMaps.EXTRUDER_NAME_MAP[hotendId]
|
||||
return hotendId
|
||||
|
||||
@pyqtProperty(str, fset = setHotendID, notify = extruderConfigurationChanged)
|
||||
|
@ -1,9 +1,10 @@
|
||||
# Copyright (c) 2017 Ultimaker B.V.
|
||||
# Copyright (c) 2024 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from PyQt6.QtCore import pyqtProperty, QObject
|
||||
from cura.PrinterOutput.FormatMaps import FormatMaps
|
||||
|
||||
|
||||
class MaterialOutputModel(QObject):
|
||||
@ -23,29 +24,9 @@ class MaterialOutputModel(QObject):
|
||||
|
||||
@staticmethod
|
||||
def getMaterialFromDefinition(guid, type, brand, name):
|
||||
|
||||
_MATERIAL_MAP = { "abs" :{"name" :"ABS" ,"guid": "2780b345-577b-4a24-a2c5-12e6aad3e690"},
|
||||
"abs-cf10" :{"name": "ABS-CF" ,"guid": "495a0ce5-9daf-4a16-b7b2-06856d82394d"},
|
||||
"abs-wss1" :{"name" :"ABS-R" ,"guid": "88c8919c-6a09-471a-b7b6-e801263d862d"},
|
||||
"asa" :{"name" :"ASA" ,"guid": "f79bc612-21eb-482e-ad6c-87d75bdde066"},
|
||||
"nylon12-cf":{"name": "Nylon 12 CF" ,"guid": "3c6f2877-71cc-4760-84e6-4b89ab243e3b"},
|
||||
"nylon" :{"name" :"Nylon" ,"guid": "283d439a-3490-4481-920c-c51d8cdecf9c"},
|
||||
"pc" :{"name" :"PC" ,"guid": "62414577-94d1-490d-b1e4-7ef3ec40db02"},
|
||||
"petg" :{"name" :"PETG" ,"guid": "69386c85-5b6c-421a-bec5-aeb1fb33f060"},
|
||||
"pla" :{"name" :"PLA" ,"guid": "0ff92885-617b-4144-a03c-9989872454bc"},
|
||||
"pva" :{"name" :"PVA" ,"guid": "a4255da2-cb2a-4042-be49-4a83957a2f9a"},
|
||||
"wss1" :{"name" :"RapidRinse" ,"guid": "a140ef8f-4f26-4e73-abe0-cfc29d6d1024"},
|
||||
"sr30" :{"name" :"SR-30" ,"guid": "77873465-83a9-4283-bc44-4e542b8eb3eb"},
|
||||
"bvoh" :{"name" :"BVOH" ,"guid": "923e604c-8432-4b09-96aa-9bbbd42207f4"},
|
||||
"cpe" :{"name" :"CPE" ,"guid": "da1872c1-b991-4795-80ad-bdac0f131726"},
|
||||
"hips" :{"name" :"HIPS" ,"guid": "a468d86a-220c-47eb-99a5-bbb47e514eb0"},
|
||||
"tpu" :{"name" :"TPU 95A" ,"guid": "19baa6a9-94ff-478b-b4a1-8157b74358d2"}
|
||||
}
|
||||
|
||||
|
||||
if guid is None and brand != "empty" and type in _MATERIAL_MAP:
|
||||
name = _MATERIAL_MAP[type]["name"]
|
||||
guid = _MATERIAL_MAP[type]["guid"]
|
||||
if guid is None and brand != "empty" and type in FormatMaps.MATERIAL_MAP:
|
||||
name = FormatMaps.MATERIAL_MAP[type]["name"]
|
||||
guid = FormatMaps.MATERIAL_MAP[type]["guid"]
|
||||
return name, guid
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2021 Ultimaker B.V.
|
||||
# Copyright (c) 2024 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from UM.FileHandler.FileHandler import FileHandler #For typing.
|
||||
@ -6,6 +6,7 @@ from UM.Logger import Logger
|
||||
from UM.Scene.SceneNode import SceneNode #For typing.
|
||||
from cura.API import Account
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.PrinterOutput.FormatMaps import FormatMaps
|
||||
|
||||
from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionState, ConnectionType
|
||||
|
||||
@ -419,13 +420,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
||||
|
||||
@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]
|
||||
if printer_type in FormatMaps.PRINTER_TYPE_NAME:
|
||||
return FormatMaps.PRINTER_TYPE_NAME[printer_type]
|
||||
return printer_type
|
||||
|
||||
@pyqtProperty(str, constant = True)
|
||||
|
@ -83,6 +83,15 @@ class GlobalStack(CuraContainerStack):
|
||||
"""
|
||||
return self.getMetaDataEntry("supports_material_export", False)
|
||||
|
||||
@pyqtProperty("QVariantList", constant = True)
|
||||
def getOutputFileFormats(self) -> List[str]:
|
||||
"""
|
||||
Which output formats the printer supports.
|
||||
:return: A list of strings with MIME-types.
|
||||
"""
|
||||
all_formats_str = self.getMetaDataEntry("file_formats", "")
|
||||
return all_formats_str.split(";")
|
||||
|
||||
@classmethod
|
||||
def getLoadingPriority(cls) -> int:
|
||||
return 2
|
||||
|
@ -17,6 +17,7 @@ from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
|
||||
from UM.Scene.GroupDecorator import GroupDecorator
|
||||
from UM.Scene.SceneNode import SceneNode # For typing.
|
||||
from UM.Scene.SceneNodeSettings import SceneNodeSettings
|
||||
from UM.Util import parseBool
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Machines.ContainerTree import ContainerTree
|
||||
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
||||
@ -182,7 +183,7 @@ class ThreeMFReader(MeshReader):
|
||||
um_node.printOrder = int(setting_value)
|
||||
continue
|
||||
if key =="drop_to_buildplate":
|
||||
um_node.setSetting(SceneNodeSettings.AutoDropDown, eval(setting_value))
|
||||
um_node.setSetting(SceneNodeSettings.AutoDropDown, parseBool(setting_value))
|
||||
continue
|
||||
if key in known_setting_keys:
|
||||
setting_container.setProperty(key, "value", setting_value)
|
||||
|
@ -96,7 +96,8 @@ class ThreeMFWriter(MeshWriter):
|
||||
@staticmethod
|
||||
def _convertUMNodeToSavitarNode(um_node,
|
||||
transformation = Matrix(),
|
||||
exported_settings: Optional[Dict[str, Set[str]]] = None):
|
||||
exported_settings: Optional[Dict[str, Set[str]]] = None,
|
||||
center_mesh = False):
|
||||
"""Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode
|
||||
|
||||
:returns: Uranium Scene node.
|
||||
@ -111,20 +112,26 @@ class ThreeMFWriter(MeshWriter):
|
||||
savitar_node = Savitar.SceneNode()
|
||||
savitar_node.setName(um_node.getName())
|
||||
|
||||
node_matrix = Matrix()
|
||||
mesh_data = um_node.getMeshData()
|
||||
# compensate for original center position, if object(s) is/are not around its zero position
|
||||
if mesh_data is not None:
|
||||
extents = mesh_data.getExtents()
|
||||
if extents is not None:
|
||||
# We use a different coordinate space while writing, so flip Z and Y
|
||||
center_vector = Vector(extents.center.x, extents.center.z, extents.center.y)
|
||||
node_matrix.setByTranslation(center_vector)
|
||||
node_matrix.multiply(um_node.getLocalTransformation())
|
||||
|
||||
matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix.preMultiply(transformation))
|
||||
node_matrix = um_node.getLocalTransformation()
|
||||
node_matrix.preMultiply(transformation)
|
||||
|
||||
if center_mesh:
|
||||
center_matrix = Matrix()
|
||||
# compensate for original center position, if object(s) is/are not around its zero position
|
||||
if mesh_data is not None:
|
||||
extents = mesh_data.getExtents()
|
||||
if extents is not None:
|
||||
# We use a different coordinate space while writing, so flip Z and Y
|
||||
center_vector = Vector(-extents.center.x, -extents.center.y, -extents.center.z)
|
||||
center_matrix.setByTranslation(center_vector)
|
||||
node_matrix.preMultiply(center_matrix)
|
||||
|
||||
matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix)
|
||||
|
||||
savitar_node.setTransformation(matrix_string)
|
||||
|
||||
if mesh_data is not None:
|
||||
savitar_node.getMeshData().setVerticesFromBytes(mesh_data.getVerticesAsByteArray())
|
||||
indices_array = mesh_data.getIndicesAsByteArray()
|
||||
@ -147,7 +154,7 @@ class ThreeMFWriter(MeshWriter):
|
||||
for key in changed_setting_keys:
|
||||
savitar_node.setSetting("cura:" + key, str(stack.getProperty(key, "value")))
|
||||
else:
|
||||
# We want to export only the specified settings
|
||||
# We want to export only the specified settings
|
||||
if um_node.getName() in exported_settings:
|
||||
model_exported_settings = exported_settings[um_node.getName()]
|
||||
|
||||
@ -283,7 +290,8 @@ class ThreeMFWriter(MeshWriter):
|
||||
for root_child in node.getChildren():
|
||||
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child,
|
||||
transformation_matrix,
|
||||
exported_model_settings)
|
||||
exported_model_settings,
|
||||
center_mesh = True)
|
||||
if savitar_node:
|
||||
savitar_scene.addSceneNode(savitar_node)
|
||||
else:
|
||||
@ -442,7 +450,7 @@ class ThreeMFWriter(MeshWriter):
|
||||
def sceneNodesToString(scene_nodes: [SceneNode]) -> str:
|
||||
savitar_scene = Savitar.Scene()
|
||||
for scene_node in scene_nodes:
|
||||
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(scene_node)
|
||||
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(scene_node, center_mesh = True)
|
||||
savitar_scene.addSceneNode(savitar_node)
|
||||
parser = Savitar.ThreeMFParser()
|
||||
scene_string = parser.sceneToString(savitar_scene)
|
||||
|
@ -544,7 +544,7 @@ class CuraEngineBackend(QObject, Backend):
|
||||
|
||||
if job.getResult() == StartJobResult.ObjectsWithDisabledExtruder:
|
||||
self._error_message = Message(catalog.i18nc("@info:status",
|
||||
"Unable to slice because there are objects associated with disabled Extruder %s.") % job.getMessage(),
|
||||
"Unable to slice because there are objects associated with disabled Extruder %s.") % job.getAssociatedDisabledExtruders(),
|
||||
title = catalog.i18nc("@info:title", "Unable to slice"),
|
||||
message_type = Message.MessageType.WARNING)
|
||||
self._error_message.show()
|
||||
|
@ -146,6 +146,7 @@ class StartSliceJob(Job):
|
||||
self._slice_message: Arcus.PythonMessage = slice_message
|
||||
self._is_cancelled: bool = False
|
||||
self._build_plate_number: Optional[int] = None
|
||||
self._associated_disabled_extruders: Optional[str] = None
|
||||
|
||||
# cache for all setting values from all stacks (global & extruder) for the current machine
|
||||
self._all_extruders_settings: Optional[Dict[str, Any]] = None
|
||||
@ -153,6 +154,9 @@ class StartSliceJob(Job):
|
||||
def getSliceMessage(self) -> Arcus.PythonMessage:
|
||||
return self._slice_message
|
||||
|
||||
def getAssociatedDisabledExtruders(self) -> Optional[str]:
|
||||
return self._associated_disabled_extruders
|
||||
|
||||
def setBuildPlate(self, build_plate_number: int) -> None:
|
||||
self._build_plate_number = build_plate_number
|
||||
|
||||
@ -334,7 +338,7 @@ class StartSliceJob(Job):
|
||||
if has_model_with_disabled_extruders:
|
||||
self.setResult(StartJobResult.ObjectsWithDisabledExtruder)
|
||||
associated_disabled_extruders = {p + 1 for p in associated_disabled_extruders}
|
||||
self.setMessage(", ".join(map(str, sorted(associated_disabled_extruders))))
|
||||
self._associated_disabled_extruders = ", ".join(map(str, sorted(associated_disabled_extruders)))
|
||||
return
|
||||
|
||||
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being
|
||||
@ -362,7 +366,12 @@ class StartSliceJob(Job):
|
||||
for extruder_stack in global_stack.extruderList:
|
||||
self._buildExtruderMessage(extruder_stack)
|
||||
|
||||
for plugin in CuraApplication.getInstance().getBackendPlugins():
|
||||
backend_plugins = CuraApplication.getInstance().getBackendPlugins()
|
||||
|
||||
# Sort backend plugins by name. Not a very good strategy, but at least it is repeatable. This will be improved later.
|
||||
backend_plugins = sorted(backend_plugins, key=lambda backend_plugin: backend_plugin.getId())
|
||||
|
||||
for plugin in backend_plugins:
|
||||
if not plugin.usePlugin():
|
||||
continue
|
||||
for slot in plugin.getSupportedSlots():
|
||||
@ -550,12 +559,16 @@ class StartSliceJob(Job):
|
||||
start_gcode = settings["machine_start_gcode"]
|
||||
# Remove all the comments from the start g-code
|
||||
start_gcode = re.sub(r";.+?(\n|$)", "\n", start_gcode)
|
||||
bed_temperature_settings = ["material_bed_temperature", "material_bed_temperature_layer_0"]
|
||||
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(bed_temperature_settings) # match {setting} as well as {setting, extruder_nr}
|
||||
settings["material_bed_temp_prepend"] = re.search(pattern, start_gcode) == None
|
||||
print_temperature_settings = ["material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature", "print_temperature"]
|
||||
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(print_temperature_settings) # match {setting} as well as {setting, extruder_nr}
|
||||
settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) is None
|
||||
|
||||
if settings["material_bed_temp_prepend"]:
|
||||
bed_temperature_settings = ["material_bed_temperature", "material_bed_temperature_layer_0"]
|
||||
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(bed_temperature_settings) # match {setting} as well as {setting, extruder_nr}
|
||||
settings["material_bed_temp_prepend"] = re.search(pattern, start_gcode) == None
|
||||
|
||||
if settings["material_print_temp_prepend"]:
|
||||
print_temperature_settings = ["material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature", "print_temperature"]
|
||||
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(print_temperature_settings) # match {setting} as well as {setting, extruder_nr}
|
||||
settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) is None
|
||||
|
||||
# Replace the setting tokens in start and end g-code.
|
||||
# Use values from the first used extruder by default so we get the expected temperatures
|
||||
|
@ -208,7 +208,7 @@ Item
|
||||
anchors.rightMargin: UM.Theme.getSize("thin_margin").height
|
||||
|
||||
enabled: UM.Backend.state == UM.Backend.Done
|
||||
currentIndex: UM.Backend.state == UM.Backend.Done ? dfFilenameTextfield.text.startsWith("MM")? 1 : 0 : 2
|
||||
currentIndex: UM.Backend.state == UM.Backend.Done ? (Cura.MachineManager.activeMachine.getOutputFileFormats.includes("application/x-makerbot") ? 1 : 0) : 2
|
||||
|
||||
textRole: "text"
|
||||
valueRole: "value"
|
||||
|
@ -1,9 +1,8 @@
|
||||
# Copyright (c) 2023 UltiMaker
|
||||
# Copyright (c) 2024 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 typing import cast, List, Optional, Dict, Tuple
|
||||
from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED
|
||||
import pyDulcificum as du
|
||||
|
||||
@ -19,6 +18,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||
from UM.i18n import i18nCatalog
|
||||
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.PrinterOutput.FormatMaps import FormatMaps
|
||||
from cura.Snapshot import Snapshot
|
||||
from cura.Utils.Threading import call_on_qt_thread
|
||||
from cura.CuraVersion import ConanInstalls
|
||||
@ -39,16 +39,27 @@ class MakerbotWriter(MeshWriter):
|
||||
suffixes=["makerbot"]
|
||||
)
|
||||
)
|
||||
MimeTypeDatabase.addMimeType(
|
||||
MimeType(
|
||||
name="application/x-makerbot-sketch",
|
||||
comment="Makerbot Toolpath Package",
|
||||
suffixes=["makerbot"]
|
||||
)
|
||||
)
|
||||
|
||||
_PNG_FORMATS = [
|
||||
_PNG_FORMAT = [
|
||||
{"prefix": "isometric_thumbnail", "width": 120, "height": 120},
|
||||
{"prefix": "isometric_thumbnail", "width": 320, "height": 320},
|
||||
{"prefix": "isometric_thumbnail", "width": 640, "height": 640},
|
||||
{"prefix": "thumbnail", "width": 90, "height": 90},
|
||||
]
|
||||
|
||||
_PNG_FORMAT_METHOD = [
|
||||
{"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"
|
||||
|
||||
# must be called from the main thread because of OpenGL
|
||||
@ -74,6 +85,7 @@ class MakerbotWriter(MeshWriter):
|
||||
return None
|
||||
|
||||
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool:
|
||||
metadata, file_format = self._getMeta(nodes)
|
||||
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."))
|
||||
@ -92,14 +104,20 @@ class MakerbotWriter(MeshWriter):
|
||||
|
||||
gcode_text_io = StringIO()
|
||||
success = gcode_writer.write(gcode_text_io, None)
|
||||
|
||||
filename, filedata = "", ""
|
||||
# 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)
|
||||
match file_format:
|
||||
case "application/x-makerbot-sketch":
|
||||
filename, filedata = "print.gcode", gcode_text_io.getvalue()
|
||||
self._PNG_FORMATS = self._PNG_FORMAT
|
||||
case "application/x-makerbot":
|
||||
filename, filedata = "print.jsontoolpath", du.gcode_2_miracle_jtp(gcode_text_io.getvalue())
|
||||
self._PNG_FORMATS = self._PNG_FORMAT + self._PNG_FORMAT_METHOD
|
||||
case _:
|
||||
raise Exception("Unsupported Mime type")
|
||||
|
||||
png_files = []
|
||||
for png_format in self._PNG_FORMATS:
|
||||
@ -116,10 +134,34 @@ class MakerbotWriter(MeshWriter):
|
||||
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)
|
||||
zip_stream.writestr(filename, filedata)
|
||||
for png_file in png_files:
|
||||
file, data = png_file["file"], png_file["data"]
|
||||
zip_stream.writestr(file, data)
|
||||
api = CuraApplication.getInstance().getCuraAPI()
|
||||
metadata_json = api.interface.settings.getSliceMetadata()
|
||||
|
||||
# All the mapping stuff we have to do:
|
||||
product_to_id_map = FormatMaps.getProductIdMap()
|
||||
printer_name_map = FormatMaps.getInversePrinterNameMap()
|
||||
extruder_type_map = FormatMaps.getInverseExtruderTypeMap()
|
||||
material_map = FormatMaps.getInverseMaterialMap()
|
||||
for key, value in metadata_json.items():
|
||||
if "all_settings" in value:
|
||||
if "machine_name" in value["all_settings"]:
|
||||
machine_name = value["all_settings"]["machine_name"]
|
||||
if machine_name in product_to_id_map:
|
||||
machine_name = product_to_id_map[machine_name][0]
|
||||
value["all_settings"]["machine_name"] = printer_name_map.get(machine_name, machine_name)
|
||||
if "machine_nozzle_id" in value["all_settings"]:
|
||||
extruder_type = value["all_settings"]["machine_nozzle_id"]
|
||||
value["all_settings"]["machine_nozzle_id"] = extruder_type_map.get(extruder_type, extruder_type)
|
||||
if "material_type" in value["all_settings"]:
|
||||
material_type = value["all_settings"]["material_type"]
|
||||
value["all_settings"]["material_type"] = material_map.get(material_type, material_type)
|
||||
|
||||
slice_metadata = json.dumps(metadata_json, separators=(", ", ": "), indent=4)
|
||||
zip_stream.writestr("slicemetadata.json", slice_metadata)
|
||||
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."))
|
||||
@ -127,7 +169,7 @@ class MakerbotWriter(MeshWriter):
|
||||
|
||||
return True
|
||||
|
||||
def _getMeta(self, root_nodes: List[SceneNode]) -> Dict[str, any]:
|
||||
def _getMeta(self, root_nodes: List[SceneNode]) -> Tuple[Dict[str, any], str]:
|
||||
application = CuraApplication.getInstance()
|
||||
machine_manager = application.getMachineManager()
|
||||
global_stack = machine_manager.activeMachine
|
||||
@ -143,7 +185,9 @@ class MakerbotWriter(MeshWriter):
|
||||
nodes.append(node)
|
||||
|
||||
meta = dict()
|
||||
|
||||
# This is a bit of a "hack", the mime type should be passed through with the export writer but
|
||||
# since this is not the case we get the mime type from the global stack instead
|
||||
file_format = global_stack.definition.getMetaDataEntry("file_formats")
|
||||
meta["bot_type"] = global_stack.definition.getMetaDataEntry("reference_machine_id")
|
||||
|
||||
bounds: Optional[AxisAlignedBox] = None
|
||||
@ -155,7 +199,8 @@ class MakerbotWriter(MeshWriter):
|
||||
bounds = node_bounds
|
||||
else:
|
||||
bounds = bounds + node_bounds
|
||||
|
||||
if file_format == "application/x-makerbot-sketch":
|
||||
bounds = None
|
||||
if bounds is not None:
|
||||
meta["bounding_box"] = {
|
||||
"x_min": bounds.left,
|
||||
@ -196,7 +241,7 @@ class MakerbotWriter(MeshWriter):
|
||||
meta["extruder_temperature"] = materials_temps[0]
|
||||
meta["extruder_temperatures"] = materials_temps
|
||||
|
||||
meta["model_counts"] = [{"count": 1, "name": node.getName()} for node in nodes]
|
||||
meta["model_counts"] = [{"count": len(nodes), "name": "instance0"}]
|
||||
|
||||
tool_types = [extruder.variant.getMetaDataEntry("reference_extruder_id") for extruder in extruders]
|
||||
meta["tool_type"] = tool_types[0]
|
||||
@ -205,14 +250,13 @@ class MakerbotWriter(MeshWriter):
|
||||
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,
|
||||
}
|
||||
bounds = application.getBuildVolume().getBoundingBox()
|
||||
meta["preferences"]["instance0"] = {
|
||||
"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}}
|
||||
meta["miracle_config"] = {"gaggles": {"instance0": {}}}
|
||||
|
||||
version_info = dict()
|
||||
cura_engine_info = ConanInstalls.get("curaengine", {"version": "unknown", "revision": "unknown"})
|
||||
@ -245,7 +289,7 @@ class MakerbotWriter(MeshWriter):
|
||||
# platform_temperature
|
||||
# total_commands
|
||||
|
||||
return meta
|
||||
return meta, file_format
|
||||
|
||||
|
||||
def meterToMillimeter(value: float) -> float:
|
||||
|
@ -11,14 +11,23 @@ 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,
|
||||
}],
|
||||
}
|
||||
"mesh_writer":
|
||||
{
|
||||
"output": [
|
||||
{
|
||||
"extension": file_extension,
|
||||
"description": catalog.i18nc("@item:inlistbox", "Makerbot Printfile"),
|
||||
"mime_type": "application/x-makerbot",
|
||||
"mode": MakerbotWriter.MakerbotWriter.OutputMode.BinaryMode,
|
||||
},
|
||||
{
|
||||
"extension": file_extension,
|
||||
"description": catalog.i18nc("@item:inlistbox", "Makerbot Sketch Printfile"),
|
||||
"mime_type": "application/x-makerbot-sketch",
|
||||
"mode": MakerbotWriter.MakerbotWriter.OutputMode.BinaryMode,
|
||||
}
|
||||
]
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
|
@ -24,6 +24,7 @@ from UM.Settings.InstanceContainer import InstanceContainer
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.Settings.GlobalStack import GlobalStack
|
||||
from cura.Utils.Threading import call_on_qt_thread
|
||||
from cura.API import CuraAPI
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
|
||||
@ -85,7 +86,8 @@ class UFPWriter(MeshWriter):
|
||||
try:
|
||||
archive.addContentType(extension="json", mime_type="application/json")
|
||||
setting_textio = StringIO()
|
||||
json.dump(self._getSliceMetadata(), setting_textio, separators=(", ", ": "), indent=4)
|
||||
api = CuraApplication.getInstance().getCuraAPI()
|
||||
json.dump(api.interface.settings.getSliceMetadata(), setting_textio, separators=(", ", ": "), indent=4)
|
||||
steam = archive.getStream(SLICE_METADATA_PATH)
|
||||
steam.write(setting_textio.getvalue().encode("UTF-8"))
|
||||
except EnvironmentError as e:
|
||||
@ -210,57 +212,3 @@ class UFPWriter(MeshWriter):
|
||||
return [{"name": item.getName()}
|
||||
for item in DepthFirstIterator(node)
|
||||
if item.getMeshData() is not None and not item.callDecoration("isNonPrintingMesh")]
|
||||
|
||||
def _getSliceMetadata(self) -> Dict[str, Dict[str, Dict[str, str]]]:
|
||||
"""Get all changed settings and all settings. For each extruder and the global stack"""
|
||||
print_information = CuraApplication.getInstance().getPrintInformation()
|
||||
machine_manager = CuraApplication.getInstance().getMachineManager()
|
||||
settings = {
|
||||
"material": {
|
||||
"length": print_information.materialLengths,
|
||||
"weight": print_information.materialWeights,
|
||||
"cost": print_information.materialCosts,
|
||||
},
|
||||
"global": {
|
||||
"changes": {},
|
||||
"all_settings": {},
|
||||
},
|
||||
"quality": asdict(machine_manager.activeQualityDisplayNameMap()),
|
||||
}
|
||||
|
||||
def _retrieveValue(container: InstanceContainer, setting_: str):
|
||||
value_ = container.getProperty(setting_, "value")
|
||||
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
|
||||
if not isinstance(value_, SettingFunction):
|
||||
return value_ # Success!
|
||||
value_ = value_(container)
|
||||
return 0 # Fallback value after breaking possibly endless loop.
|
||||
|
||||
global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack())
|
||||
|
||||
# Add global user or quality changes
|
||||
global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges)
|
||||
for setting in global_flattened_changes.getAllKeys():
|
||||
settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting)
|
||||
|
||||
# Get global all settings values without user or quality changes
|
||||
for setting in global_stack.getAllKeys():
|
||||
settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting)
|
||||
|
||||
for i, extruder in enumerate(global_stack.extruderList):
|
||||
# Add extruder fields to settings dictionary
|
||||
settings[f"extruder_{i}"] = {
|
||||
"changes": {},
|
||||
"all_settings": {},
|
||||
}
|
||||
|
||||
# Add extruder user or quality changes
|
||||
extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges)
|
||||
for setting in extruder_flattened_changes.getAllKeys():
|
||||
settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting)
|
||||
|
||||
# Get extruder all settings values without user or quality changes
|
||||
for setting in extruder.getAllKeys():
|
||||
settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting)
|
||||
|
||||
return settings
|
||||
|
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Sketch.png
Normal file
BIN
plugins/UM3NetworkPrinting/resources/png/MakerBot Sketch.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 185 KiB |
@ -331,7 +331,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
||||
return False
|
||||
|
||||
[printer, *_] = self._printers
|
||||
return printer.type in ("MakerBot Method X", "MakerBot Method XL")
|
||||
return printer.type in ("MakerBot Method X", "MakerBot Method XL", "MakerBot Sketch")
|
||||
|
||||
@pyqtProperty(bool, notify=_cloudClusterPrintersChanged)
|
||||
def supportsPrintJobActions(self) -> bool:
|
||||
|
@ -2,5 +2,6 @@
|
||||
"ultimaker_method": "MakerBot Method",
|
||||
"ultimaker_methodx": "MakerBot Method X",
|
||||
"ultimaker_methodxl": "MakerBot Method XL",
|
||||
"ultimaker_factor4": "Ultimaker Factor 4"
|
||||
"ultimaker_factor4": "Ultimaker Factor 4",
|
||||
"ultimaker_sketch": "MakerBot Sketch"
|
||||
}
|
||||
|
@ -152,9 +152,3 @@ class VersionUpgrade22to24(VersionUpgrade):
|
||||
config.write(output)
|
||||
return [filename], [output.getvalue()]
|
||||
|
||||
def getCfgVersion(self, serialised: str) -> int:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialised)
|
||||
format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.
|
||||
setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
|
||||
return format_version * 1000000 + setting_version
|
||||
|
@ -33,23 +33,6 @@ _renamed_i18n = {
|
||||
|
||||
|
||||
class VersionUpgrade27to30(VersionUpgrade):
|
||||
## Gets the version number from a CFG file in Uranium's 2.7 format.
|
||||
#
|
||||
# Since the format may change, this is implemented for the 2.7 format only
|
||||
# and needs to be included in the version upgrade system rather than
|
||||
# globally in Uranium.
|
||||
#
|
||||
# \param serialised The serialised form of a CFG file.
|
||||
# \return The version number stored in the CFG file.
|
||||
# \raises ValueError The format of the version number in the file is
|
||||
# incorrect.
|
||||
# \raises KeyError The format of the file is incorrect.
|
||||
def getCfgVersion(self, serialised: str) -> int:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialised)
|
||||
format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.
|
||||
setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
|
||||
return format_version * 1000000 + setting_version
|
||||
|
||||
## Upgrades a preferences file from version 2.7 to 3.0.
|
||||
#
|
||||
|
@ -33,12 +33,6 @@ default_qualities_per_nozzle_and_material = {
|
||||
|
||||
|
||||
class VersionUpgrade460to462(VersionUpgrade):
|
||||
def getCfgVersion(self, serialised: str) -> int:
|
||||
parser = configparser.ConfigParser(interpolation = None)
|
||||
parser.read_string(serialised)
|
||||
format_version = int(parser.get("general", "version")) # Explicitly give an exception when this fails. That means that the file format is not recognised.
|
||||
setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
|
||||
return format_version * 1000000 + setting_version
|
||||
|
||||
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
|
||||
"""
|
||||
|
@ -17,6 +17,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||
from UM.ConfigurationErrorMessage import ConfigurationErrorMessage
|
||||
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.PrinterOutput.FormatMaps import FormatMaps
|
||||
from cura.Machines.VariantType import VariantType
|
||||
|
||||
try:
|
||||
@ -249,7 +250,7 @@ class XmlMaterialProfile(InstanceContainer):
|
||||
machine_variant_map[definition_id][variant_name] = variant_dict
|
||||
|
||||
# Map machine human-readable names to IDs
|
||||
product_id_map = self.getProductIdMap()
|
||||
product_id_map = FormatMaps.getProductIdMap()
|
||||
|
||||
for definition_id, container in machine_container_map.items():
|
||||
definition_id = container.getMetaDataEntry("definition")
|
||||
@ -647,7 +648,7 @@ class XmlMaterialProfile(InstanceContainer):
|
||||
self._dirty = False
|
||||
|
||||
# Map machine human-readable names to IDs
|
||||
product_id_map = self.getProductIdMap()
|
||||
product_id_map = FormatMaps.getProductIdMap()
|
||||
|
||||
machines = data.iterfind("./um:settings/um:machine", self.__namespaces)
|
||||
for machine in machines:
|
||||
@ -923,7 +924,7 @@ class XmlMaterialProfile(InstanceContainer):
|
||||
result_metadata.append(base_metadata)
|
||||
|
||||
# Map machine human-readable names to IDs
|
||||
product_id_map = cls.getProductIdMap()
|
||||
product_id_map = FormatMaps.getProductIdMap()
|
||||
|
||||
for machine in data.iterfind("./um:settings/um:machine", cls.__namespaces):
|
||||
machine_compatibility = common_compatibility
|
||||
@ -1083,10 +1084,9 @@ class XmlMaterialProfile(InstanceContainer):
|
||||
# Skip material properties (eg diameter) or metadata (eg GUID)
|
||||
return
|
||||
|
||||
if instance.value is True:
|
||||
data = "yes"
|
||||
elif instance.value is False:
|
||||
data = "no"
|
||||
truth_map = { True: "yes", False: "no" }
|
||||
if tag_name != "cura:setting" and instance.value in truth_map:
|
||||
data = truth_map[instance.value]
|
||||
else:
|
||||
data = str(instance.value)
|
||||
|
||||
@ -1129,29 +1129,6 @@ class XmlMaterialProfile(InstanceContainer):
|
||||
id_list = list(id_list)
|
||||
return id_list
|
||||
|
||||
__product_to_id_map: Optional[Dict[str, List[str]]] = None
|
||||
|
||||
@classmethod
|
||||
def getProductIdMap(cls) -> Dict[str, List[str]]:
|
||||
"""Gets a mapping from product names in the XML files to their definition IDs.
|
||||
|
||||
This loads the mapping from a file.
|
||||
"""
|
||||
if cls.__product_to_id_map is not None:
|
||||
return cls.__product_to_id_map
|
||||
|
||||
plugin_path = cast(str, PluginRegistry.getInstance().getPluginPath("XmlMaterialProfile"))
|
||||
product_to_id_file = os.path.join(plugin_path, "product_to_id.json")
|
||||
with open(product_to_id_file, encoding = "utf-8") as f:
|
||||
contents = ""
|
||||
for line in f:
|
||||
contents += line if "#" not in line else "".join([line.replace("#", str(n)) for n in range(1, 12)])
|
||||
cls.__product_to_id_map = json.loads(contents)
|
||||
cls.__product_to_id_map = {key: [value] for key, value in cls.__product_to_id_map.items()}
|
||||
#This also loads "Ultimaker S5" -> "ultimaker_s5" even though that is not strictly necessary with the default to change spaces into underscores.
|
||||
#However it is not always loaded with that default; this mapping is also used in serialize() without that default.
|
||||
return cls.__product_to_id_map
|
||||
|
||||
@staticmethod
|
||||
def _parseCompatibleValue(value: str):
|
||||
"""Parse the value of the "material compatible" property."""
|
||||
|
@ -14,10 +14,10 @@ def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]:
|
||||
if not file.exists():
|
||||
return [Directory(file, settings)]
|
||||
|
||||
if ".inst" in file.suffixes and ".cfg" in file.suffixes:
|
||||
if ".inst" in file.suffixes and file.suffixes[-1] == ".cfg":
|
||||
return [Directory(file, settings), Profile(file, settings), Formulas(file, settings)]
|
||||
|
||||
if ".def" in file.suffixes and ".json" in file.suffixes:
|
||||
if ".def" in file.suffixes and file.suffixes[-1] == ".json":
|
||||
if file.stem in ("fdmprinter.def", "fdmextruder.def"):
|
||||
return [Formulas(file, settings)]
|
||||
return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)]
|
||||
|
@ -13,8 +13,11 @@ class Definition(Linter):
|
||||
def __init__(self, file: Path, settings: dict) -> None:
|
||||
super().__init__(file, settings)
|
||||
self._definitions = {}
|
||||
self._definition_name = None
|
||||
self._experimental_settings = []
|
||||
self._loadDefinitionFiles(file)
|
||||
self._content = self._file.read_text()
|
||||
self._loadExperimentalSettings()
|
||||
self._loadBasePrinterSettings()
|
||||
|
||||
@property
|
||||
@ -32,6 +35,10 @@ class Definition(Linter):
|
||||
for check in self.checkMaterialTemperature():
|
||||
yield check
|
||||
|
||||
if self._settings["checks"].get("diagnostic-definition-experimental-setting", False):
|
||||
for check in self.checkExperimentalSetting():
|
||||
yield check
|
||||
|
||||
# Add other which will yield Diagnostic's
|
||||
# TODO: A check to determine if the user set value is with the min and max value defined in the parent and doesn't trigger a warning
|
||||
# TODO: A check if the key exist in the first place
|
||||
@ -41,9 +48,8 @@ class Definition(Linter):
|
||||
|
||||
def checkRedefineOverride(self) -> Iterator[Diagnostic]:
|
||||
""" Checks if definition file overrides its parents settings with the same value. """
|
||||
definition_name = list(self._definitions.keys())[0]
|
||||
definition = self._definitions[definition_name]
|
||||
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
|
||||
definition = self._definitions[self._definition_name]
|
||||
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
|
||||
for key, value_dict in definition["overrides"].items():
|
||||
is_redefined, child_key, child_value, parent, inherited_by= self._isDefinedInParent(key, value_dict, definition['inherits'])
|
||||
if is_redefined:
|
||||
@ -71,9 +77,8 @@ class Definition(Linter):
|
||||
|
||||
def checkMaterialTemperature(self) -> Iterator[Diagnostic]:
|
||||
"""Checks if definition file has material tremperature defined within them"""
|
||||
definition_name = list(self._definitions.keys())[0]
|
||||
definition = self._definitions[definition_name]
|
||||
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
|
||||
definition = self._definitions[self._definition_name]
|
||||
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
|
||||
for key, value_dict in definition["overrides"].items():
|
||||
if "temperature" in key and "material" in key:
|
||||
|
||||
@ -97,6 +102,22 @@ class Definition(Linter):
|
||||
replacements=replacements
|
||||
)
|
||||
|
||||
def checkExperimentalSetting(self) -> Iterator[Diagnostic]:
|
||||
"""Checks if definition uses experimental settings"""
|
||||
definition = self._definitions[self._definition_name]
|
||||
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
|
||||
for setting in definition["overrides"]:
|
||||
if setting in self._experimental_settings:
|
||||
redefined = re.compile(setting)
|
||||
found = redefined.search(self._content)
|
||||
yield Diagnostic(
|
||||
file=self._file,
|
||||
diagnostic_name="diagnostic-definition-experimental-setting",
|
||||
message=f"Setting {setting} is still experimental and should not be used in default profiles",
|
||||
level="Warning",
|
||||
offset=found.span(0)[0]
|
||||
)
|
||||
|
||||
def _loadDefinitionFiles(self, definition_file) -> None:
|
||||
""" Loads definition file contents into self._definitions. Also load parent definition if it exists. """
|
||||
definition_name = Path(definition_file.stem).stem
|
||||
@ -104,6 +125,9 @@ class Definition(Linter):
|
||||
if not definition_file.exists() or definition_name in self._definitions:
|
||||
return
|
||||
|
||||
if self._definition_name is None:
|
||||
self._definition_name = definition_name
|
||||
|
||||
# Load definition file into dictionary
|
||||
self._definitions[definition_name] = json.loads(definition_file.read_text())
|
||||
|
||||
@ -152,6 +176,12 @@ class Definition(Linter):
|
||||
return self._isDefinedInParent(key, value_dict, parent["inherits"])
|
||||
return False, None, None, None, None
|
||||
|
||||
def _loadExperimentalSettings(self):
|
||||
try:
|
||||
self._experimental_settings = self._definitions[self.base_def]["settings"]["experimental"]["children"].keys()
|
||||
except:
|
||||
pass
|
||||
|
||||
def _loadBasePrinterSettings(self):
|
||||
settings = {}
|
||||
for k, v in self._definitions[self.base_def]["settings"].items():
|
||||
|
@ -51,9 +51,17 @@ class Formulas(Linter):
|
||||
self._definition = {}
|
||||
|
||||
def getCuraSettingList(self) -> list:
|
||||
settings_list = []
|
||||
|
||||
with open(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "resources", "definitions", "fdmprinter.def.json")) as data:
|
||||
json_data = json.load(data)
|
||||
return self.extractKeys(json_data)
|
||||
settings_list += self.extractKeys(json_data)
|
||||
|
||||
with open(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "resources", "definitions", "fdmextruder.def.json")) as data:
|
||||
json_data = json.load(data)
|
||||
settings_list += self.extractKeys(json_data)
|
||||
|
||||
return settings_list
|
||||
|
||||
def extractKeys(self, json_obj, parent_key=''):
|
||||
keys_with_value = []
|
||||
@ -146,12 +154,13 @@ class Formulas(Linter):
|
||||
|
||||
available_sections = ["values"]
|
||||
for section in available_sections:
|
||||
options = config.options(section)
|
||||
for option in options:
|
||||
values ={}
|
||||
values["value"] = config.get(section, option)
|
||||
overrides[option] = values
|
||||
file_data["overrides"]= overrides# Process the value here
|
||||
if config.has_section(section):
|
||||
options = config.options(section)
|
||||
for option in options:
|
||||
values ={}
|
||||
values["value"] = config.get(section, option)
|
||||
overrides[option] = values
|
||||
file_data["overrides"]= overrides# Process the value here
|
||||
|
||||
return file_data
|
||||
|
||||
|
@ -37,6 +37,6 @@ class Profile(Linter):
|
||||
config = ConfigParser()
|
||||
config.read([self._file])
|
||||
name_of_profile = config.get("general", "name")
|
||||
redefined = re.compile(name_of_profile)
|
||||
redefined = re.compile(re.escape(name_of_profile))
|
||||
found = redefined.search(self._content)
|
||||
return name_of_profile, found
|
||||
|
@ -206,9 +206,9 @@ chardet==3.0.4 \
|
||||
idna==2.8 \
|
||||
--hash=sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407 \
|
||||
--hash=sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c
|
||||
attrs==21.2.0 \
|
||||
--hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \
|
||||
--hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb
|
||||
attrs==21.3.0 \
|
||||
--hash=sha256:8f7335278dedd26b58c38e006338242cc0977f06d51579b2b8b87b9b33bff66c \
|
||||
--hash=sha256:50f3c9b216dc9021042f71b392859a773b904ce1a029077f58f6598272432045
|
||||
requests==2.22.0 \
|
||||
--hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \
|
||||
--hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31
|
||||
@ -222,9 +222,9 @@ constantly==15.1.0 \
|
||||
hyperlink==21.0.0 \
|
||||
--hash=sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b \
|
||||
--hash=sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4
|
||||
incremental==21.3.0 \
|
||||
--hash=sha256:02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57 \
|
||||
--hash=sha256:92014aebc6a20b78a8084cdd5645eeaa7f74b8933f70fa3ada2cfbd1e3b54321
|
||||
incremental==22.10.0 \
|
||||
--hash=sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51 \
|
||||
--hash=sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0
|
||||
zope.interface==5.4.0 \
|
||||
--hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \
|
||||
--hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \
|
||||
|
@ -1914,6 +1914,25 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"UltimakerPPSCF": {
|
||||
"package_info": {
|
||||
"package_id": "UltimakerPPSCF",
|
||||
"package_type": "material",
|
||||
"display_name": "Ultimaker PPS-CF",
|
||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||
"package_version": "1.0.0",
|
||||
"sdk_version": "8.6.0",
|
||||
"website": "https://ultimaker.com/materials/factor-series-pps-carbon-fiber/",
|
||||
"author": {
|
||||
"author_id": "UltimakerPackages",
|
||||
"display_name": "UltiMaker",
|
||||
"email": "materials@ultimaker.com",
|
||||
"website": "https://ultimaker.com",
|
||||
"description": "Professional 3D printing made accessible.",
|
||||
"support_website": "https://support.ultimaker.com/s/article/How-to-print-with-UltiMaker-PPS-CF"
|
||||
}
|
||||
}
|
||||
},
|
||||
"ULTIMAKERBASCFMETHOD": {
|
||||
"package_info": {
|
||||
"package_id": "ULTIMAKERBASCFMETHOD",
|
||||
|
1
resources/conandata.yml
Normal file
1
resources/conandata.yml
Normal file
@ -0,0 +1 @@
|
||||
version: "5.8.0"
|
@ -28,8 +28,6 @@ class CuraResource(ConanFile):
|
||||
self.version = self.conan_data["version"]
|
||||
|
||||
def export(self):
|
||||
copy(self, pattern="conandata.yml", src=os.path.join(self.recipe_folder, ".."), dst=self.export_folder,
|
||||
keep_path=False)
|
||||
copy(self, pattern="LICENSE*", src=os.path.join(self.recipe_folder, ".."), dst=self.export_folder,
|
||||
keep_path=False)
|
||||
update_conandata(self, {"version": self.version})
|
||||
|
@ -67,13 +67,13 @@
|
||||
"layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
|
||||
"layer_start_x":
|
||||
{
|
||||
"default_value": 105.0,
|
||||
"enabled": false
|
||||
"enabled": false,
|
||||
"value": 105.0
|
||||
},
|
||||
"layer_start_y":
|
||||
{
|
||||
"default_value": 27.0,
|
||||
"enabled": false
|
||||
"enabled": false,
|
||||
"value": 27.0
|
||||
},
|
||||
"line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" },
|
||||
"machine_acceleration": { "default_value": 3000 },
|
||||
@ -130,7 +130,6 @@
|
||||
"machine_min_cool_heat_time_window": { "default_value": 15.0 },
|
||||
"machine_name": { "default_value": "Mark2_for_Ultimaker2" },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 1.5 },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 3.5 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"machine_show_variants": { "default_value": true },
|
||||
|
@ -65,7 +65,6 @@
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_height": { "default_value": 340 },
|
||||
"machine_name": { "default_value": "Atom 3" },
|
||||
"machine_nozzle_head_distance": { "default_value": 6 },
|
||||
"machine_shape": { "default_value": "elliptic" },
|
||||
"machine_show_variants": { "default_value": true },
|
||||
"machine_start_gcode": { "default_value": ";MACHINE START CODE\nG21 ;metric values\nG90 ;absolute positioning\nG28 ;home\nG1 Z5 F9000\n;MACHINE START CODE" },
|
||||
|
18
resources/definitions/creality_crm4.def.json
Normal file
18
resources/definitions/creality_crm4.def.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Creality CR-M4",
|
||||
"inherits": "creality_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"quality_definition": "creality_base"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"gantry_height": { "value": 35 },
|
||||
"machine_depth": { "default_value": 450 },
|
||||
"machine_height": { "default_value": 470 },
|
||||
"machine_name": { "default_value": "Creality CR-M4" },
|
||||
"machine_width": { "default_value": 450 }
|
||||
}
|
||||
}
|
59
resources/definitions/creality_ender3v3ke.def.json
Normal file
59
resources/definitions/creality_ender3v3ke.def.json
Normal file
@ -0,0 +1,59 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Creality Ender-3 V3 KE",
|
||||
"inherits": "creality_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"manufacturer": "Creality3D",
|
||||
"file_formats": "text/x-gcode",
|
||||
"platform": "creality_ender3.3mf",
|
||||
"first_start_actions": [ "MachineSettingsAction" ],
|
||||
"has_machine_quality": true,
|
||||
"has_materials": true,
|
||||
"has_variants": true,
|
||||
"machine_extruder_trains": { "0": "creality_base_extruder_0" },
|
||||
"preferred_material": "generic_pla",
|
||||
"preferred_quality_type": "standard",
|
||||
"preferred_variant_name": "0.4mm Nozzle",
|
||||
"quality_definition": "creality_base",
|
||||
"variants_name": "Nozzle Size"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"gantry_height": { "value": 38 },
|
||||
"machine_depth": { "default_value": 220 },
|
||||
"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 Z5 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X2 Y218 F3000 ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z" },
|
||||
"machine_head_with_fans_polygon":
|
||||
{
|
||||
"default_value": [
|
||||
[-20, 10],
|
||||
[10, 10],
|
||||
[10, -10],
|
||||
[-20, -10]
|
||||
]
|
||||
},
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_height": { "default_value": 240 },
|
||||
"machine_max_acceleration_e": { "value": 5000 },
|
||||
"machine_max_acceleration_x": { "value": 8000.0 },
|
||||
"machine_max_acceleration_y": { "value": 8000.0 },
|
||||
"machine_max_acceleration_z": { "value": 500.0 },
|
||||
"machine_max_feedrate_e": { "value": 100 },
|
||||
"machine_max_feedrate_x": { "value": 500 },
|
||||
"machine_max_feedrate_y": { "value": 500 },
|
||||
"machine_max_feedrate_z": { "value": 30 },
|
||||
"machine_name": { "default_value": "Creality Ender-3 V3 KE" },
|
||||
"machine_start_gcode": { "default_value": "M220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X-2.0 Y20 Z0.28 F5000.0 ;Move to start position\nM109 S{material_print_temperature_layer_0}\nG1 X-2.0 Y145.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X-1.7 Y145.0 Z0.28 F5000.0 ;Move to side a little\nG1 X-1.7 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 E-1 F1800 ;Retract a bit\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 E0 F1800" },
|
||||
"machine_width": { "default_value": 220 },
|
||||
"material_print_temp_wait": { "default_value": false },
|
||||
"retraction_amount": { "default_value": 0.8 },
|
||||
"retraction_combing": { "value": "no_outer_surfaces" },
|
||||
"retraction_combing_max_distance": { "value": 5.0 },
|
||||
"retraction_extrusion_window": { "value": "retraction_amount" },
|
||||
"retraction_min_travel": { "value": 2.0 },
|
||||
"retraction_speed": { "default_value": 40 },
|
||||
"speed_layer_0": { "value": 100 },
|
||||
"speed_print": { "value": 300 }
|
||||
}
|
||||
}
|
@ -35,7 +35,6 @@
|
||||
"machine_max_feedrate_y": { "default_value": 300 },
|
||||
"machine_max_feedrate_z": { "default_value": 40 },
|
||||
"machine_name": { "default_value": "Diytech 220" },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
|
||||
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28\nG1 Z15 F200\nT0\nG92 E0\nG1 E16 F250\nG92 E0\n" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
|
@ -52,13 +52,13 @@
|
||||
"layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
|
||||
"layer_start_x":
|
||||
{
|
||||
"default_value": 180.0,
|
||||
"enabled": false
|
||||
"enabled": false,
|
||||
"value": 180.0
|
||||
},
|
||||
"layer_start_y":
|
||||
{
|
||||
"default_value": 160.0,
|
||||
"enabled": false
|
||||
"enabled": false,
|
||||
"value": 160.0
|
||||
},
|
||||
"line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" },
|
||||
"machine_acceleration": { "default_value": 3000 },
|
||||
@ -122,7 +122,6 @@
|
||||
"machine_name": { "default_value": "dxu" },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 1.5 },
|
||||
"machine_nozzle_expansion_angle": { "default_value": 45 },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 3.5 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"machine_show_variants": { "default_value": true },
|
||||
|
@ -44,7 +44,6 @@
|
||||
"machine_max_jerk_xy": { "default_value": 10 },
|
||||
"machine_max_jerk_z": { "default_value": 10 },
|
||||
"machine_name": { "default_value": "Erzay3D" },
|
||||
"machine_nozzle_head_distance": { "default_value": 2.5 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"machine_shape": { "default_value": "elliptic" },
|
||||
"machine_start_gcode": { "default_value": "G28\nG1 Z15.0 F6000\nG92 E0" },
|
||||
|
@ -167,6 +167,17 @@
|
||||
"type": "float",
|
||||
"unit": "mm"
|
||||
},
|
||||
"machine_nozzle_head_distance":
|
||||
{
|
||||
"default_value": 3,
|
||||
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
|
||||
"label": "Nozzle Length",
|
||||
"settable_per_extruder": true,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_meshgroup": false,
|
||||
"type": "float",
|
||||
"unit": "mm"
|
||||
},
|
||||
"machine_nozzle_id":
|
||||
{
|
||||
"default_value": "unknown",
|
||||
|
@ -28,6 +28,18 @@
|
||||
"icon": "Printer",
|
||||
"children":
|
||||
{
|
||||
"build_volume_fan_nr":
|
||||
{
|
||||
"label": "Build volume fan number",
|
||||
"description": "The number of the fan that cools the build volume. If this is set to 0, it's means that there is no build volume fan",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "999999",
|
||||
"type": "int",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"machine_name":
|
||||
{
|
||||
"label": "Machine Type",
|
||||
@ -289,17 +301,6 @@
|
||||
"settable_per_meshgroup": false,
|
||||
"settable_globally": false
|
||||
},
|
||||
"machine_nozzle_head_distance":
|
||||
{
|
||||
"label": "Nozzle Length",
|
||||
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
|
||||
"unit": "mm",
|
||||
"default_value": 3,
|
||||
"type": "float",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"machine_nozzle_expansion_angle":
|
||||
{
|
||||
"label": "Nozzle Angle",
|
||||
@ -1342,6 +1343,15 @@
|
||||
"limit_to_extruder": "wall_0_extruder_nr",
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
"z_seam_on_vertex":
|
||||
{
|
||||
"label": "Z Seam On Vertex",
|
||||
"description": "Place the z-seam on a polygon vertex. Switching this off can place the seam between vertices as well. (Keep in mind that this won't override the restrictions on placing the seam on an unsupported overhang.)",
|
||||
"type": "bool",
|
||||
"default_value": false,
|
||||
"settable_per_mesh": true,
|
||||
"enabled": "z_seam_type == 'back' or z_seam_type == 'shortest'"
|
||||
},
|
||||
"z_seam_position":
|
||||
{
|
||||
"label": "Z Seam Position",
|
||||
@ -4363,6 +4373,7 @@
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.0,
|
||||
"value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))",
|
||||
"minimum_value": "machine_width / -2 if machine_center_is_zero else 0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
@ -4375,6 +4386,7 @@
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.0,
|
||||
"value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))",
|
||||
"minimum_value": "machine_depth / -2 if machine_center_is_zero else 0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
@ -4456,6 +4468,37 @@
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"build_fan_full_at_height":
|
||||
{
|
||||
"label": "Build Fan Speed at Height",
|
||||
"description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from Initial Fan Speed to Regular Fan Speed.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"enabled": "build_volume_fan_nr != 0",
|
||||
"maximum_value_warning": "10.0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false,
|
||||
"children":
|
||||
{
|
||||
"build_fan_full_layer":
|
||||
{
|
||||
"label": "Build Fan Speed at Layer",
|
||||
"description": "The layer at which the build fans spin on full fan speed. This value is calculated and rounded to a whole number.",
|
||||
"type": "int",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"enabled": "build_volume_fan_nr != 0",
|
||||
"maximum_value_warning": "10 / resolveOrValue('layer_height')",
|
||||
"value": "max(1, int(math.floor((build_fan_full_at_height - resolveOrValue('layer_height_0')) / resolveOrValue('layer_height')) + 2))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"cool_fan_speed":
|
||||
{
|
||||
"label": "Fan Speed",
|
||||
@ -4603,6 +4646,21 @@
|
||||
"maximum_value": "365",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"cool_during_extruder_switch":
|
||||
{
|
||||
"label": "Cooling during extruder switch",
|
||||
"description": "<html>Whether to activate the cooling fans during a nozzle switch. This can help reducing oozing by cooling the nozzle faster:<ul><li><b>Unchanged:</b> keep the fans as they were previously</li><li><b>Only last extruder:</b> turn on the fan of the last used extruder, but turn the others off (if any). This is useful if you have completely separate extruders.</li><li><b>All fans:</b> turn on all fans during nozzle switch. This is useful if you have a single cooling fan, or multiple fans that stay close to each other.</li></ul></html>",
|
||||
"type": "enum",
|
||||
"options":
|
||||
{
|
||||
"unchanged": "Unchanged",
|
||||
"only_last_extruder": "Only last extruder",
|
||||
"all_fans": "All fans"
|
||||
},
|
||||
"default_value": "unchanged",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -5118,6 +5176,18 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"support_infill_density_multiplier_initial_layer":
|
||||
{
|
||||
"label": "Support Infill Density Multiplier Initial Layer",
|
||||
"description": "Multiplier for the infill on the initial layers of the support. Increasing this may help for bed adhesion.",
|
||||
"type": "int",
|
||||
"minimum_value": "1",
|
||||
"default_value": 1,
|
||||
"enabled": "support_enable or support_meshes_present",
|
||||
"limit_to_extruder": "support_extruder_nr_layer_0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"support_infill_angles":
|
||||
{
|
||||
"label": "Support Infill Line Directions",
|
||||
@ -6208,6 +6278,7 @@
|
||||
"type": "bool",
|
||||
"default_value": false,
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"resolve": "any(extruderValues('raft_remove_inside_corners'))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"children":
|
||||
@ -6220,6 +6291,7 @@
|
||||
"value": "raft_remove_inside_corners",
|
||||
"default_value": false,
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"resolve": "any(extruderValues('raft_base_remove_inside_corners'))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
@ -6231,6 +6303,7 @@
|
||||
"value": "raft_remove_inside_corners",
|
||||
"default_value": false,
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"resolve": "any(extruderValues('raft_interface_remove_inside_corners'))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
@ -6242,6 +6315,7 @@
|
||||
"value": "raft_remove_inside_corners",
|
||||
"default_value": false,
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"resolve": "any(extruderValues('raft_surface_remove_inside_corners'))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
}
|
||||
@ -6382,6 +6456,38 @@
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_base_extruder_nr"
|
||||
},
|
||||
"raft_base_infill_overlap":
|
||||
{
|
||||
"label": "Raft Base Infill Overlap Percentage",
|
||||
"description": "The amount of overlap between the infill and the walls of the raft base, as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill.",
|
||||
"unit": "%",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value_warning": "-50",
|
||||
"maximum_value_warning": "100",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_base_extruder_nr",
|
||||
"children":
|
||||
{
|
||||
"raft_base_infill_overlap_mm":
|
||||
{
|
||||
"label": "Raft Base Infill Overlap",
|
||||
"description": "The amount of overlap between the infill and the walls of the raft base. A slight overlap allows the walls to connect firmly to the infill.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.0,
|
||||
"minimum_value_warning": "-0.5 * machine_nozzle_size",
|
||||
"maximum_value_warning": "machine_nozzle_size",
|
||||
"value": "raft_base_line_width * raft_base_infill_overlap / 100",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_base_extruder_nr"
|
||||
}
|
||||
}
|
||||
},
|
||||
"raft_interface_layers":
|
||||
{
|
||||
"label": "Raft Middle Layers",
|
||||
@ -6443,6 +6549,54 @@
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_interface_extruder_nr"
|
||||
},
|
||||
"raft_interface_z_offset":
|
||||
{
|
||||
"label": "Raft Interface Z Offset",
|
||||
"description": "When printing the first layer of the raft interface, translate by this offset to customize the adhesion between base and interface. A negative offset should improve the adhesion.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.0,
|
||||
"minimum_value_warning": "-raft_interface_thickness / 2",
|
||||
"minimum_value": "-raft_interface_thickness",
|
||||
"maximum_value_warning": "raft_interface_thickness / 2",
|
||||
"maximum_value": "raft_interface_thickness",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_interface_layers > 0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_interface_extruder_nr"
|
||||
},
|
||||
"raft_interface_infill_overlap":
|
||||
{
|
||||
"label": "Raft Interface Infill Overlap Percentage",
|
||||
"description": "The amount of overlap between the infill and the walls of the raft interface, as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill.",
|
||||
"unit": "%",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value_warning": "-50",
|
||||
"maximum_value_warning": "100",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_interface_extruder_nr",
|
||||
"children":
|
||||
{
|
||||
"raft_interface_infill_overlap_mm":
|
||||
{
|
||||
"label": "Raft Interface Infill Overlap",
|
||||
"description": "The amount of overlap between the infill and the walls of the raft interface. A slight overlap allows the walls to connect firmly to the infill.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.0,
|
||||
"minimum_value_warning": "-0.5 * machine_nozzle_size",
|
||||
"maximum_value_warning": "machine_nozzle_size",
|
||||
"value": "raft_interface_line_width * raft_interface_infill_overlap / 100",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_interface_extruder_nr"
|
||||
}
|
||||
}
|
||||
},
|
||||
"raft_surface_layers":
|
||||
{
|
||||
"label": "Raft Top Layers",
|
||||
@ -6504,6 +6658,22 @@
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
},
|
||||
"raft_surface_z_offset":
|
||||
{
|
||||
"label": "Raft Surface Z Offset",
|
||||
"description": "When printing the first layer of the raft surface, translate by this offset to customize the adhesion between interface and surface. A negative offset should improve the adhesion.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.0,
|
||||
"minimum_value_warning": "-raft_surface_thickness / 2",
|
||||
"minimum_value": "-raft_surface_thickness",
|
||||
"maximum_value_warning": "raft_surface_thickness / 2",
|
||||
"maximum_value": "raft_surface_thickness",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
},
|
||||
"raft_surface_monotonic":
|
||||
{
|
||||
"label": "Monotonic Raft Top Surface Order",
|
||||
@ -6516,6 +6686,38 @@
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
},
|
||||
"raft_surface_infill_overlap":
|
||||
{
|
||||
"label": "Raft Surface Infill Overlap Percentage",
|
||||
"description": "The amount of overlap between the infill and the walls of the raft surface, as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill.",
|
||||
"unit": "%",
|
||||
"type": "float",
|
||||
"default_value": 0,
|
||||
"minimum_value_warning": "-50",
|
||||
"maximum_value_warning": "100",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_surface_extruder_nr",
|
||||
"children":
|
||||
{
|
||||
"raft_surface_infill_overlap_mm":
|
||||
{
|
||||
"label": "Raft Surface Infill Overlap",
|
||||
"description": "The amount of overlap between the infill and the walls of the raft surface. A slight overlap allows the walls to connect firmly to the infill.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.0,
|
||||
"minimum_value_warning": "-0.5 * machine_nozzle_size",
|
||||
"maximum_value_warning": "machine_nozzle_size",
|
||||
"value": "raft_surface_line_width * raft_surface_infill_overlap / 100",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
}
|
||||
}
|
||||
},
|
||||
"raft_wall_count":
|
||||
{
|
||||
"label": "Raft Wall Count",
|
||||
@ -6525,7 +6727,7 @@
|
||||
"minimum_value": "0",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_extruder": true,
|
||||
"children":
|
||||
{
|
||||
"raft_base_wall_count":
|
||||
@ -6538,7 +6740,8 @@
|
||||
"minimum_value": "0",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_base_extruder_nr"
|
||||
},
|
||||
"raft_interface_wall_count":
|
||||
{
|
||||
@ -6549,7 +6752,8 @@
|
||||
"minimum_value": "0",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_interface_extruder_nr"
|
||||
},
|
||||
"raft_surface_wall_count":
|
||||
{
|
||||
@ -6560,7 +6764,8 @@
|
||||
"minimum_value": "0",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -6818,6 +7023,63 @@
|
||||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
}
|
||||
}
|
||||
},
|
||||
"raft_flow":
|
||||
{
|
||||
"label": "Raft Flow",
|
||||
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft printing. Having an increased flow may improve adhesion and raft structural strength.",
|
||||
"type": "float",
|
||||
"unit": "%",
|
||||
"default_value": 100.0,
|
||||
"minimum_value": "10",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"children":
|
||||
{
|
||||
"raft_base_flow":
|
||||
{
|
||||
"label": "Raft Base Flow",
|
||||
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft base printing. Having an increased flow may improve adhesion and raft structural strength.",
|
||||
"type": "float",
|
||||
"unit": "%",
|
||||
"default_value": 100.0,
|
||||
"value": "raft_flow",
|
||||
"minimum_value": "10",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_base_extruder_nr"
|
||||
},
|
||||
"raft_interface_flow":
|
||||
{
|
||||
"label": "Raft Interface Flow",
|
||||
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft interface printing. Having an increased flow may improve adhesion and raft structural strength.",
|
||||
"type": "float",
|
||||
"unit": "%",
|
||||
"default_value": 100.0,
|
||||
"value": "raft_flow",
|
||||
"minimum_value": "10",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_interface_extruder_nr"
|
||||
},
|
||||
"raft_surface_flow":
|
||||
{
|
||||
"label": "Raft Surface Flow",
|
||||
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft surface printing. Having an increased flow may improve adhesion and raft structural strength.",
|
||||
"type": "float",
|
||||
"unit": "%",
|
||||
"default_value": 100.0,
|
||||
"value": "raft_flow",
|
||||
"minimum_value": "10",
|
||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -6845,7 +7107,7 @@
|
||||
"label": "Prime Tower Type",
|
||||
"description": "<html>How to generate the prime tower:<ul><li><b>Normal:</b> create a bucket in which secondary materials are primed</li><li><b>Interleaved:</b> create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other</li></ul></html>",
|
||||
"type": "enum",
|
||||
"value": "'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'",
|
||||
"resolve": "'interleaved' if all(mode == 'interleaved' for mode in extruderValues('prime_tower_mode')) else 'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'",
|
||||
"options":
|
||||
{
|
||||
"normal": "Normal",
|
||||
@ -6898,6 +7160,20 @@
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"prime_tower_min_shell_thickness":
|
||||
{
|
||||
"label": "Prime Tower Minimum Shell Thickness",
|
||||
"description": "The minimum thickness of the prime tower shell. You may increase it to make the prime tower stronger.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
"default_value": 0.4,
|
||||
"minimum_value": "max(extruderValues('prime_tower_line_width'))",
|
||||
"maximum_value_warning": "10.0",
|
||||
"enabled": "prime_tower_enable and resolveOrValue('prime_tower_mode') == 'interleaved'",
|
||||
"resolve": "max(extruderValues('prime_tower_line_width'))",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false
|
||||
},
|
||||
"prime_tower_position_x":
|
||||
{
|
||||
"label": "Prime Tower X Position",
|
||||
@ -8021,6 +8297,19 @@
|
||||
"default_value": 90,
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
"seam_overhang_angle":
|
||||
{
|
||||
"label": "Seam Overhanging Wall Angle",
|
||||
"description": "Try to prevent seams on walls that overhang more than this angle. When the value is 90, no walls will be treated as overhanging.",
|
||||
"unit": "\u00b0",
|
||||
"type": "float",
|
||||
"minimum_value": "0",
|
||||
"minimum_value_warning": "2",
|
||||
"maximum_value": "90",
|
||||
"default_value": 90,
|
||||
"value": "support_angle",
|
||||
"settable_per_mesh": true
|
||||
},
|
||||
"wall_overhang_speed_factor":
|
||||
{
|
||||
"label": "Overhanging Wall Speed",
|
||||
|
@ -27,7 +27,6 @@
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_height": { "default_value": 200 },
|
||||
"machine_name": { "default_value": "3DMaker Starter" },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
|
||||
"machine_width": { "default_value": 210 },
|
||||
"raft_airgap": { "default_value": 0.2 },
|
||||
|
@ -37,7 +37,6 @@
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_height": { "default_value": 200 },
|
||||
"machine_name": { "default_value": "Mendel90" },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
|
||||
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;absolute extrusion\nM107 ;start with the fan off\nG28 ;home\nG92 E0 ;zero the extruded length\nM140 S{material_bed_temperature_layer_0} ; set the bed temperature and continue on\nG1 X-50 Y98 F9000 ;go to the left of the top\nG1 Z0.05 ; close to the bed\nM104 S{material_print_temperature_layer_0}; pre-heat the extruder continue on\nM190 S{material_bed_temperature_layer_0} ;set the bed temp & wait\nM109 S{material_print_temperature_layer_0};set the extruder temp for layer 0 & wait\nG92 E0 ;zero the extruded length\nG1 X50 E10 F300 ; make a thick line to prime extruder\nG92 E0 ; reset extruder\nG1 E-4 F1800\nG1 Z0.3 ;lift Z\n" },
|
||||
"machine_width": { "default_value": 200 },
|
||||
|
@ -157,8 +157,6 @@
|
||||
"value": "jerk_wall * 5 / 10"
|
||||
},
|
||||
"jerk_wall_x": { "maximum_value_warning": "0.01" },
|
||||
"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": 1500 },
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_depth": { "default_value": 420 },
|
||||
|
@ -78,7 +78,6 @@
|
||||
"machine_heat_zone_length": { "default_value": 20 },
|
||||
"machine_height": { "default_value": 205 },
|
||||
"machine_name": { "default_value": "Discov3ry Complete (Ultimaker 2+)" },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_show_variants": { "default_value": true },
|
||||
"machine_start_gcode": { "default_value": "\n;Updated Firmware (.hex and Marlin .ino) for \n;Ultimaker 2+ with Discov3ry Extruder available at: \n;https://github.com/Structur3d/UM2.1Discov3ry-Firmware-beta \n;**Learn more at https://www.structur3d.io** \n \nM104 S{material_print_temperature} ;Start heating extruder \nM140 S{material_bed_temperature} ;Start heating bed \nG21 ;metric values \nG90 ;absolute positioning \nM82 ;set extruder to absolute mode \nM107 ;start with the fan off \nM302 ;allow cold extrusion \nM92 E2589 ;set extruder EEPROM steps/mm for paste \nG28 Z0 ;move Z to bottom endstops \nG28 X0 Y0 ;move X/Y to endstops \nG1 X15 Y0 F4000 ;move X/Y to front of printer \nG1 Z15.0 F9000 ;move the platform to 15mm \nG92 E0 ;zero the extruded length \nG1 F200 E10 ;extrude 10 mm of feed stock \nG92 E0 ;zero the extruded length again \nG1 F9000 \n;Put printing message on LCD screen \nM117 Printing..." },
|
||||
"machine_width": { "default_value": 205 },
|
||||
|
@ -44,7 +44,6 @@
|
||||
"machine_max_acceleration_y": { "default_value": 6000 },
|
||||
"machine_max_acceleration_z": { "default_value": 12000 },
|
||||
"machine_name": { "default_value": "TypeAMachines" },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
|
||||
"machine_start_gcode": { "default_value": ";-- START GCODE --\n;Sliced for Type A Machines Series 1\n;Sliced at: {day} {date} {time}\n;Basic settings:\n;Layer height: {layer_height}\n;Walls: {wall_thickness}\n;Fill: {fill_distance}\n;Print Speed: {print_speed}\n;Support: {support}\n;Retraction Speed: {retraction_speed}\n;Retraction Distance: {retraction_amount}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Settings based on: {material_profile}\nG21 ;metric values\nG90 ;absolute positioning\nG28 ;move to endstops\nG29 ;allows for auto-levelling\nG1 Z15.0 F12000 ;move the platform down 15mm\nG1 X150 Y5 F9000 ;center\nM140 S{material_bed_temperature} ;Prep Heat Bed\nM109 S{default_material_print_temperature} ;Heat To temp\nM190 S{material_bed_temperature} ;Heat Bed to temp\nG1 X150 Y5 Z0.3 ;move the platform to purge extrusion\nG92 E0 ;zero the extruded length\nG1 F200 X250 E30 ;extrude 30mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 X150 Y150 Z25 F12000 ;recenter and begin\nG1 F9000" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
|
@ -80,6 +80,7 @@
|
||||
"maximum_value_warning": "120",
|
||||
"minimum_value": "0"
|
||||
},
|
||||
"material_print_temp_wait": { "value": false },
|
||||
"material_print_temperature": { "minimum_value": "0" },
|
||||
"material_standby_temperature":
|
||||
{
|
||||
@ -88,6 +89,9 @@
|
||||
},
|
||||
"meshfix_maximum_deviation": { "value": "machine_nozzle_size / 10" },
|
||||
"meshfix_maximum_resolution": { "value": "max(speed_wall_0 / 75, 0.5)" },
|
||||
"prime_tower_base_curve_magnitude": { "value": 2 },
|
||||
"prime_tower_base_height": { "value": 6 },
|
||||
"prime_tower_base_size": { "value": 10 },
|
||||
"raft_base_speed": { "value": "raft_speed" },
|
||||
"raft_base_thickness": { "value": "min(machine_nozzle_size * 0.75, 0.3)" },
|
||||
"raft_interface_fan_speed": { "value": "(raft_base_fan_speed + raft_surface_fan_speed) / 2" },
|
||||
@ -134,7 +138,8 @@
|
||||
"wall_x_material_flow_layer_0": { "value": "0.95 * material_flow_layer_0" },
|
||||
"xy_offset": { "value": "-layer_height * 0.1" },
|
||||
"xy_offset_layer_0": { "value": "-wall_line_width_0 / 5 + xy_offset" },
|
||||
"z_seam_corner": { "value": "'z_seam_corner_none'" },
|
||||
"z_seam_corner": { "value": "'z_seam_corner_weighted'" },
|
||||
"z_seam_relative": { "value": "True" },
|
||||
"zig_zaggify_support": { "value": true }
|
||||
}
|
||||
}
|
@ -95,7 +95,6 @@
|
||||
"machine_max_feedrate_y": { "default_value": 300 },
|
||||
"machine_max_feedrate_z": { "default_value": 40 },
|
||||
"machine_name": { "default_value": "Ultimaker 2" },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
|
||||
"machine_start_gcode": { "value": "\"G0 F3000 Y50 ;avoid prime blob\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nG28 Z0 ;move Z to bottom endstops\\nG28 X0 Y0 ;move X/Y to endstops\\nG1 X15 Y0 F4000 ;move X/Y to front of printer\\nG1 Z15.0 F9000 ;move the platform to 15mm\\nG92 E0 ;zero the extruded length\\nG1 F200 E10 ;extrude 10 mm of feed stock\\nG92 E0 ;zero the extruded length again\\nG1 Y50 F9000\\n;Put printing message on LCD screen\\nM117 Printing...\"" },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },
|
||||
|
@ -83,7 +83,6 @@
|
||||
"machine_heat_zone_length": { "default_value": 20 },
|
||||
"machine_height": { "default_value": 205 },
|
||||
"machine_name": { "default_value": "Ultimaker 2+" },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_show_variants": { "default_value": true },
|
||||
"speed_infill": { "value": "speed_print" },
|
||||
"speed_support": { "value": "speed_wall_0" },
|
||||
|
@ -92,7 +92,6 @@
|
||||
"machine_heat_zone_length": { "default_value": 20 },
|
||||
"machine_height": { "default_value": 205 },
|
||||
"machine_name": { "default_value": "Ultimaker 2+ Connect" },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_show_variants": { "default_value": true },
|
||||
"machine_start_gcode": { "value": "''" },
|
||||
"machine_width": { "default_value": 223 },
|
||||
|
@ -70,8 +70,6 @@
|
||||
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
|
||||
"infill_wipe_dist": { "value": "0" },
|
||||
"jerk_enabled": { "value": "True" },
|
||||
"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_depth": { "default_value": 215 },
|
||||
"machine_disallowed_areas":
|
||||
|
@ -64,6 +64,7 @@
|
||||
"bridge_skin_material_flow": { "maximum_value": "100" },
|
||||
"bridge_skin_material_flow_2": { "maximum_value": "100" },
|
||||
"bridge_skin_material_flow_3": { "maximum_value": "100" },
|
||||
"bridge_sparse_infill_max_density": { "value": "50" },
|
||||
"bridge_wall_material_flow": { "maximum_value": "100" },
|
||||
"bridge_wall_speed": { "value": "speed_wall" },
|
||||
"brim_width": { "value": "5" },
|
||||
@ -103,8 +104,6 @@
|
||||
},
|
||||
"jerk_travel_enabled": { "value": "True" },
|
||||
"layer_height": { "value": "min(min(extruderValues('machine_nozzle_size')) / 2, 0.2)" },
|
||||
"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_depth": { "default_value": 240 },
|
||||
"machine_end_gcode": { "default_value": "" },
|
||||
@ -130,7 +129,7 @@
|
||||
"machine_min_cool_heat_time_window": { "value": "15" },
|
||||
"machine_name": { "default_value": "Ultimaker Factor 4" },
|
||||
"machine_nozzle_cool_down_speed": { "value": "0.3 + 0.0025 * material_print_temperature" },
|
||||
"machine_nozzle_heat_up_speed": { "value": "2 - 0.0025 * material_print_temperature" },
|
||||
"machine_nozzle_heat_up_speed": { "value": "2.1 - 0.0025 * material_print_temperature" },
|
||||
"machine_start_gcode": { "default_value": "" },
|
||||
"machine_width": { "default_value": 330 },
|
||||
"material_bed_temperature": { "maximum_value": "120" },
|
||||
|
137
resources/definitions/ultimaker_method.def.json
Normal file
137
resources/definitions/ultimaker_method.def.json
Normal file
@ -0,0 +1,137 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "UltiMaker Method",
|
||||
"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",
|
||||
"generic_tpu_175",
|
||||
"goofoo_",
|
||||
"ideagen3D_",
|
||||
"imade3d_",
|
||||
"innofill_",
|
||||
"layer_one_",
|
||||
"leapfrog_",
|
||||
"polyflex_pla",
|
||||
"polymax_pla",
|
||||
"polyplus_pla",
|
||||
"polywood_pla",
|
||||
"redd_",
|
||||
"tizyx_",
|
||||
"ultimaker_asa_175",
|
||||
"ultimaker_abs_175",
|
||||
"ultimaker_absr_175",
|
||||
"ultimaker_abscf_175",
|
||||
"ultimaker_bvoh_175",
|
||||
"ultimaker_petg_175",
|
||||
"ultimaker_cffpa_175",
|
||||
"ultimaker_cpe_175",
|
||||
"ultimaker_nylon_175",
|
||||
"ultimaker_hips_175",
|
||||
"ultimaker_pc_175",
|
||||
"ultimaker_tpu_175",
|
||||
"ultimaker_tough_pla_175",
|
||||
"ultimaker_rapidrinse_175",
|
||||
"ultimaker_sr30",
|
||||
"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"
|
||||
},
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
16
|
||||
],
|
||||
"preferred_material": "ultimaker_pla_175",
|
||||
"preferred_quality_type": "draft",
|
||||
"preferred_variant_name": "1A",
|
||||
"reference_machine_id": "fire_e",
|
||||
"supports_network_connection": true,
|
||||
"supports_usb_connection": false,
|
||||
"variant_definition": "ultimaker_method",
|
||||
"variants_name": "Extruder",
|
||||
"weight": -1
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"build_volume_temperature": { "maximum_value": "67" },
|
||||
"machine_depth": { "default_value": 236.48 },
|
||||
"machine_disallowed_areas":
|
||||
{
|
||||
"default_value": [
|
||||
[
|
||||
[-141.65, -118.11],
|
||||
[141.65, -118.11],
|
||||
[141.65, -94],
|
||||
[-141.65, -94]
|
||||
],
|
||||
[
|
||||
[-141.65, 118.37],
|
||||
[141.65, 118.37],
|
||||
[141.65, 94],
|
||||
[-141.65, 94]
|
||||
],
|
||||
[
|
||||
[-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" },
|
||||
"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)" }
|
||||
}
|
||||
}
|
@ -23,12 +23,8 @@
|
||||
"fabtotum_",
|
||||
"fdplast_",
|
||||
"filo3d_",
|
||||
"generic_bvoh_175",
|
||||
"generic_cpe_175",
|
||||
"generic_hips_175",
|
||||
"generic_pc_175",
|
||||
"generic_",
|
||||
"ultimaker_rapidrinse_175",
|
||||
"generic_tpu_175",
|
||||
"goofoo_",
|
||||
"ideagen3D_",
|
||||
"imade3d_",
|
||||
@ -59,13 +55,7 @@
|
||||
"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_material": "ultimaker_pla_175",
|
||||
"preferred_quality_type": "fast",
|
||||
"preferred_variant_name": "1A",
|
||||
"supports_network_connection": true,
|
||||
@ -201,13 +191,17 @@
|
||||
"bridge_wall_material_flow": { "value": "material_flow" },
|
||||
"bridge_wall_speed": { "value": "speed_wall" },
|
||||
"brim_width": { "value": 5 },
|
||||
"cool_fan_enabled":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ]
|
||||
},
|
||||
"default_material_bed_temperature": { "resolve": "min(extruderValues('default_material_bed_temperature'))" },
|
||||
"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_pattern": { "value": "'grid' if infill_sparse_density < 80 else 'lines'" },
|
||||
"infill_wipe_dist": { "value": 0 },
|
||||
"inset_direction": { "value": "'inside_out'" },
|
||||
"jerk_enabled":
|
||||
@ -315,8 +309,6 @@
|
||||
"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": "" },
|
||||
@ -329,14 +321,16 @@
|
||||
"machine_nozzle_cool_down_speed": { "value": 0.8 },
|
||||
"machine_nozzle_heat_up_speed": { "value": 3.5 },
|
||||
"machine_scale_fan_speed_zero_to_one": { "value": true },
|
||||
"machine_start_gcode": { "default_value": "" },
|
||||
"machine_start_gcode": { "default_value": "G0 Z20" },
|
||||
"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_flow": { "value": 100 },
|
||||
"material_initial_print_temperature": { "value": "material_print_temperature-10" },
|
||||
"material_print_temperature": { "value": "default_material_print_temperature" },
|
||||
"material_print_temperature":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ]
|
||||
},
|
||||
"material_shrinkage_percentage": { "enabled": true },
|
||||
"min_bead_width": { "value": "0.75*line_width" },
|
||||
"min_wall_line_width": { "value": 0.4 },
|
||||
"minimum_support_area": { "value": 0.1 },
|
||||
"multiple_mesh_overlap": { "value": 0 },
|
||||
@ -351,19 +345,90 @@
|
||||
"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_airgap":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ]
|
||||
},
|
||||
"raft_base_fan_speed": { "value": 0 },
|
||||
"raft_base_line_spacing":
|
||||
{
|
||||
"force_depends_on_settings": [ "raft_interface_extruder_nr" ],
|
||||
"value": "2*raft_base_line_width"
|
||||
},
|
||||
"raft_base_line_width":
|
||||
{
|
||||
"force_depends_on_settings": [ "raft_interface_extruder_nr" ],
|
||||
"value": 1.4
|
||||
},
|
||||
"raft_base_speed": { "value": 10 },
|
||||
"raft_base_thickness": { "value": 0.8 },
|
||||
"raft_base_thickness":
|
||||
{
|
||||
"force_depends_on_settings": [
|
||||
"raft_interface_extruder_nr",
|
||||
"support_extruder_nr"
|
||||
],
|
||||
"value": 0.8
|
||||
},
|
||||
"raft_base_wall_count":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ],
|
||||
"value": "raft_wall_count"
|
||||
},
|
||||
"raft_interface_extruder_nr": { "value": "raft_surface_extruder_nr" },
|
||||
"raft_interface_fan_speed": { "value": 0 },
|
||||
"raft_interface_infill_overlap":
|
||||
{
|
||||
"force_depends_on_settings": [ "raft_interface_extruder_nr" ]
|
||||
},
|
||||
"raft_interface_layers": { "value": 2 },
|
||||
"raft_interface_line_width": { "value": 0.7 },
|
||||
"raft_interface_line_spacing":
|
||||
{
|
||||
"force_depends_on_settings": [
|
||||
"raft_base_thickness",
|
||||
"raft_interface_extruder_nr"
|
||||
]
|
||||
},
|
||||
"raft_interface_line_width":
|
||||
{
|
||||
"force_depends_on_settings": [
|
||||
"raft_base_thickness",
|
||||
"raft_interface_extruder_nr"
|
||||
],
|
||||
"value": 0.7
|
||||
},
|
||||
"raft_interface_speed": { "value": 90 },
|
||||
"raft_interface_thickness": { "value": 0.3 },
|
||||
"raft_interface_wall_count": { "value": "raft_wall_count" },
|
||||
"raft_interface_z_offset":
|
||||
{
|
||||
"force_depends_on_settings": [
|
||||
"raft_base_thickness",
|
||||
"raft_interface_extruder_nr"
|
||||
]
|
||||
},
|
||||
"raft_margin": { "value": 1.2 },
|
||||
"raft_smoothing": { "value": 9.5 },
|
||||
"raft_surface_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material')) if support_enable and extruderValue(support_extruder_nr,'material_is_support_material') else raft_base_extruder_nr" },
|
||||
"raft_surface_fan_speed": { "value": 0 },
|
||||
"raft_surface_flow":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ]
|
||||
},
|
||||
"raft_surface_speed":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ]
|
||||
},
|
||||
"raft_surface_thickness":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ]
|
||||
},
|
||||
"raft_surface_wall_count": { "value": "raft_wall_count" },
|
||||
"raft_surface_z_offset":
|
||||
{
|
||||
"force_depends_on_settings": [ "support_extruder_nr" ]
|
||||
},
|
||||
"raft_wall_count": { "value": 2 },
|
||||
"retract_at_layer_change": { "value": true },
|
||||
"retraction_amount": { "value": 0.75 },
|
||||
"retraction_combing": { "value": "'off'" },
|
||||
"retraction_combing_max_distance": { "value": "speed_travel / 10" },
|
||||
@ -372,11 +437,15 @@
|
||||
"retraction_hop": { "value": 0.4 },
|
||||
"retraction_hop_enabled": { "value": true },
|
||||
"retraction_hop_only_when_collides": { "value": false },
|
||||
"retraction_min_travel": { "value": "0.6" },
|
||||
"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_material_flow": { "value": "material_flow" },
|
||||
"skin_material_flow_layer_0": { "value": "material_flow" },
|
||||
"skin_monotonic": { "value": true },
|
||||
"skin_outline_count": { "value": 0 },
|
||||
"skin_overlap": { "value": 0 },
|
||||
"skin_preshrink": { "value": 0 },
|
||||
@ -395,27 +464,32 @@
|
||||
"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_height": { "value": "2*support_infill_sparse_thickness" },
|
||||
"support_bottom_material_flow": { "value": "material_flow" },
|
||||
"support_bottom_wall_count": { "value": "0" },
|
||||
"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_fan_enable": { "value": "True" },
|
||||
"support_infill_rate": { "value": 20.0 },
|
||||
"support_infill_sparse_thickness": { "value": "layer_height" },
|
||||
"support_interface_enable": { "value": true },
|
||||
"support_interface_height": { "value": "4*support_infill_sparse_thickness" },
|
||||
"support_interface_material_flow": { "value": "material_flow" },
|
||||
"support_interface_offset": { "value": 0 },
|
||||
"support_interface_offset": { "value": "1" },
|
||||
"support_interface_pattern": { "value": "'lines'" },
|
||||
"support_interface_wall_count": { "value": 2 },
|
||||
"support_interface_wall_count": { "value": "1" },
|
||||
"support_material_flow": { "value": "material_flow" },
|
||||
"support_offset": { "value": "1.8" },
|
||||
"support_pattern": { "value": "'lines'" },
|
||||
"support_roof_height": { "value": "4*layer_height" },
|
||||
"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_use_towers": { "value": "False" },
|
||||
"support_wall_count": { "value": "2 if support_conical_enabled or support_structure == 'tree' else 0" },
|
||||
"support_xy_distance": { "value": 0.2 },
|
||||
"support_z_distance": { "value": 0 },
|
||||
"support_xy_distance_overhang": { "value": "support_xy_distance" },
|
||||
"switch_extruder_retraction_amount": { "value": 0.5 },
|
||||
"switch_extruder_retraction_speeds": { "value": "retraction_speed" },
|
||||
"top_bottom_thickness": { "value": "5*layer_height" },
|
||||
@ -423,13 +497,15 @@
|
||||
"travel_avoid_other_parts": { "value": false },
|
||||
"wall_0_inset": { "value": 0 },
|
||||
"wall_0_material_flow": { "value": "material_flow" },
|
||||
"wall_0_material_flow_layer_0": { "value": "material_flow" },
|
||||
"wall_0_wipe_dist": { "value": 0.8 },
|
||||
"wall_material_flow": { "value": "material_flow" },
|
||||
"wall_x_material_flow": { "value": "material_flow" },
|
||||
"wall_x_material_flow_layer_0": { "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_relative": { "value": true },
|
||||
"z_seam_type": { "value": "'sharpest_corner'" },
|
||||
"zig_zaggify_infill": { "value": true }
|
||||
}
|
||||
|
@ -23,19 +23,7 @@
|
||||
"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",
|
||||
"generic_tpu_175",
|
||||
"generic_",
|
||||
"goofoo_",
|
||||
"ideagen3D_",
|
||||
"imade3d_",
|
||||
@ -48,6 +36,7 @@
|
||||
"polywood_pla",
|
||||
"redd_",
|
||||
"tizyx_",
|
||||
"ultimaker_tough_pla_175",
|
||||
"verbatim_",
|
||||
"Vertex_",
|
||||
"volumic_",
|
||||
@ -70,7 +59,6 @@
|
||||
0,
|
||||
16
|
||||
],
|
||||
"platform_texture": "MakerbotMethod.png",
|
||||
"preferred_material": "ultimaker_absr_175",
|
||||
"preferred_quality_type": "draft",
|
||||
"preferred_variant_name": "1XA",
|
||||
@ -83,6 +71,7 @@
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"build_volume_temperature": { "maximum_value": "107" },
|
||||
"machine_depth": { "default_value": 236.48 },
|
||||
"machine_disallowed_areas":
|
||||
{
|
||||
|
@ -18,12 +18,6 @@
|
||||
"0": "ultimaker_methodxl_extruder_left",
|
||||
"1": "ultimaker_methodxl_extruder_right"
|
||||
},
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"platform_texture": "MakerbotMethod.png",
|
||||
"preferred_quality_type": "draft",
|
||||
"reference_machine_id": "magma_10",
|
||||
"supports_network_connection": true,
|
||||
@ -33,6 +27,7 @@
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"build_volume_temperature": { "maximum_value": "100" },
|
||||
"machine_depth": { "default_value": 320 },
|
||||
"machine_disallowed_areas":
|
||||
{
|
||||
|
@ -70,8 +70,6 @@
|
||||
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
|
||||
"infill_wipe_dist": { "value": "0" },
|
||||
"jerk_enabled": { "value": "True" },
|
||||
"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_depth": { "default_value": 190 },
|
||||
"machine_end_gcode": { "default_value": "" },
|
||||
|
@ -74,8 +74,6 @@
|
||||
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
|
||||
"infill_wipe_dist": { "value": "0" },
|
||||
"jerk_enabled": { "value": "True" },
|
||||
"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_depth": { "default_value": 240 },
|
||||
"machine_end_gcode": { "default_value": "" },
|
||||
|
18
resources/definitions/voron2_stealthchanger_250.def.json
Normal file
18
resources/definitions/voron2_stealthchanger_250.def.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Voron2 StealthChanger 250",
|
||||
"inherits": "voron2_stealthchanger_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"platform": "voron2_250_bed.3mf",
|
||||
"quality_definition": "voron2_base"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 250 },
|
||||
"machine_height": { "default_value": 250 },
|
||||
"machine_name": { "default_value": "VORON2 StealthChanger 250" },
|
||||
"machine_width": { "default_value": 250 }
|
||||
}
|
||||
}
|
18
resources/definitions/voron2_stealthchanger_300.def.json
Normal file
18
resources/definitions/voron2_stealthchanger_300.def.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Voron2 StealthChanger 300",
|
||||
"inherits": "voron2_stealthchanger_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"platform": "voron2_300_bed.3mf",
|
||||
"quality_definition": "voron2_base"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 300 },
|
||||
"machine_height": { "default_value": 300 },
|
||||
"machine_name": { "default_value": "VORON2 StealthChanger 300" },
|
||||
"machine_width": { "default_value": 300 }
|
||||
}
|
||||
}
|
18
resources/definitions/voron2_stealthchanger_350.def.json
Normal file
18
resources/definitions/voron2_stealthchanger_350.def.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Voron2 StealthChanger 350",
|
||||
"inherits": "voron2_stealthchanger_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"platform": "voron2_350_bed.3mf",
|
||||
"quality_definition": "voron2_base"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 350 },
|
||||
"machine_height": { "default_value": 350 },
|
||||
"machine_name": { "default_value": "VORON2 StealthChanger 350" },
|
||||
"machine_width": { "default_value": 350 }
|
||||
}
|
||||
}
|
29
resources/definitions/voron2_stealthchanger_base.def.json
Normal file
29
resources/definitions/voron2_stealthchanger_base.def.json
Normal file
@ -0,0 +1,29 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Voron2 StealthChanger Base",
|
||||
"inherits": "voron2_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": false,
|
||||
"author": "Thessien",
|
||||
"manufacturer": "DraftShift Design",
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "voron2_stealthchanger_extruder_0",
|
||||
"1": "voron2_stealthchanger_extruder_1",
|
||||
"2": "voron2_stealthchanger_extruder_2",
|
||||
"3": "voron2_stealthchanger_extruder_3",
|
||||
"4": "voron2_stealthchanger_extruder_4",
|
||||
"5": "voron2_stealthchanger_extruder_5",
|
||||
"6": "voron2_stealthchanger_extruder_6",
|
||||
"7": "voron2_stealthchanger_extruder_7"
|
||||
}
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_end_gcode": { "default_value": "PRINT_END" },
|
||||
"machine_extruder_count": { "default_value": 1 },
|
||||
"machine_name": { "default_value": "VORON2 StealthChanger" },
|
||||
"machine_start_gcode": { "default_value": "PRINT_START TOOL_TEMP={material_print_temperature_layer_0} T{initial_extruder_nr}_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0} TOOL={initial_extruder_nr}" }
|
||||
}
|
||||
}
|
32
resources/definitions/weedo_f150s.def.json
Normal file
32
resources/definitions/weedo_f150s.def.json
Normal file
@ -0,0 +1,32 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "WEEDO F150S",
|
||||
"inherits": "weedo_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "WEEDO",
|
||||
"manufacturer": "WEEDO",
|
||||
"file_formats": "text/x-gcode",
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 150 },
|
||||
"machine_end_gcode": { "default_value": ";(**** end.gcode for 150s****)\nM203 Z15\nG1 X170 Y130 F3000\nG92 E0\nG1 E-10 F1680 ; Reduce filament pressure\nG28 Z F1500; Get extruder out of way. Uncomment to use!\nM107 ; Turn off fan\n; Disable all extruder\nM104 T0 S0\nG90 ; Absolute positioning\nG92 E0 ; Reset extruder position\nM140 S0 ; Disable heated bed\nM84 ; Turn steppers off" },
|
||||
"machine_height": { "default_value": 150 },
|
||||
"machine_name": { "default_value": "WEEDO F150S" },
|
||||
"machine_start_gcode": { "default_value": ";MachineType:{machine_name}\n;FilamentType:{material_type}\n;InfillDensity:{infill_sparse_density}\n;Extruder0Temperature:{material_print_temperature}\n;BedTemperature:{material_bed_temperature}\n\n;(**** start.gcode for (150S)****)\nM203 Z15\nM104 S170\nG28 ; Home extruder\nG1 Z140 F300\nG28 Z\nG29\nG1 Z15 F100\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nM109 S{material_print_temperature_layer_0}\nG92 E0 ; Reset extruder position\nG1 X140 Y7 Z0.27 F4000\nG1 X40 Y7 Z0.27 E23 F1000\nG92 E0\nM203 Z5" },
|
||||
"machine_width": { "default_value": 200 },
|
||||
"material_bed_temperature":
|
||||
{
|
||||
"maximum_value": "90",
|
||||
"maximum_value_warning": "70"
|
||||
},
|
||||
"retraction_amount": { "default_value": 1.2 }
|
||||
}
|
||||
}
|
27
resources/definitions/weedo_f152s.def.json
Normal file
27
resources/definitions/weedo_f152s.def.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "WEEDO F152S",
|
||||
"inherits": "weedo_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "WEEDO",
|
||||
"manufacturer": "WEEDO",
|
||||
"file_formats": "text/x-gcode",
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 185 },
|
||||
"machine_end_gcode": { "default_value": ";(**** end.gcode for F152S****)\nM203 Z15\nG1 X170 Y130 F3000\nG92 E0\nG1 E-10 F1680\nG28 Z F400; Get extruder out of way. Uncomment to use!\nM107 ; Turn off fan\n; Disable all extruder\nM104 T0 S0\nG90 ; Absolute positioning\nG92 E0 ; Reset extruder position\nM140 S0 ; Disable heated bed\nM84 ; Turn steppers off" },
|
||||
"machine_height": { "default_value": 195 },
|
||||
"machine_name": { "default_value": "WEEDO F152S" },
|
||||
"machine_start_gcode": { "default_value": ";MachineType:{machine_name}\n;FilamentType:{material_type}\n;InfillDensity:{infill_sparse_density}\n;Extruder0Temperature:{material_print_temperature}\n;BedTemperature:{material_bed_temperature}\n\n;(**** start.gcode for F152S ****)\nM203 Z15\nM104 S170\nG28 ; Home extruder\nG29\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nG1 Z20\nM109 S{material_print_temperature_layer_0}\nG92 E0 ; Reset extruder position\nG1 X140 Y7 Z0.27 F4000\nG1 X40 Y7 Z0.27 E25 F1000\nG92 E0\nM203 Z5" },
|
||||
"machine_width": { "default_value": 200 },
|
||||
"retraction_amount": { "default_value": 1.2 }
|
||||
}
|
||||
}
|
27
resources/definitions/weedo_f370.def.json
Normal file
27
resources/definitions/weedo_f370.def.json
Normal file
@ -0,0 +1,27 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "WEEDO F370",
|
||||
"inherits": "weedo_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "WEEDO",
|
||||
"manufacturer": "WEEDO",
|
||||
"file_formats": "text/x-gcode",
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 310 },
|
||||
"machine_end_gcode": { "default_value": ";(**** end.gcode for F370****)\nM203 Z15\nG1 X170 Y130 F3000\nG92 E0\nG1 E-10 F1680\nG28 Z F400; Get extruder out of way. Uncomment to use!\nM107 ; Turn off fan\nM104 T0 S0\nG90 ; Absolute positioning\nG92 E0 ; Reset extruder position\nM140 S0 ; Disable heated bed\nM84 ; Turn steppers off" },
|
||||
"machine_height": { "default_value": 370 },
|
||||
"machine_name": { "default_value": "WEEDO F370" },
|
||||
"machine_start_gcode": { "default_value": ";MachineType:{machine_name}\n;FilamentType:{material_type}\n;InfillDensity:{infill_sparse_density}\n;Extruder0Temperature:{material_print_temperature}\n;BedTemperature:{material_bed_temperature}\n\n;(**** start.gcode for 370 ****)\nM203 Z15\nM104 S170\nG28 ; Home extruder\nG29\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nG1 Z20\nM109 S{material_print_temperature_layer_0}\nG92 E0 ; Reset extruder position\nG1 X140 Y7 Z0.27 F4000\nG1 X40 Y7 Z0.27 E25 F1000\nG92 E0\nM203 Z2" },
|
||||
"machine_width": { "default_value": 310 },
|
||||
"retraction_amount": { "default_value": 1.2 }
|
||||
}
|
||||
}
|
30
resources/definitions/weedo_me40.def.json
Normal file
30
resources/definitions/weedo_me40.def.json
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "WEEDO ME40",
|
||||
"inherits": "weedo_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "WEEDO",
|
||||
"manufacturer": "WEEDO",
|
||||
"file_formats": "text/x-gcode",
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 300 },
|
||||
"machine_end_gcode": { "default_value": ";(**** end.gcode for ME40****)\nM203 Z15\nG1 X0 Y150 F3000\nG28 Z\nG92 E0\nG1 E-1 F1680 ; Reduce filament pressure\nM107 ; Turn off fan\n; Disable all extruder\nM104 T0 S0\nG90 ; Absolute positioning\nG92 E0 ; Reset extruder position\nM140 S0 ; Disable heated bed\nM84 ; Turn steppers off" },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_name": { "default_value": "WEEDO ME40" },
|
||||
"machine_start_gcode": { "default_value": ";MachineType:{machine_name}\n;FilamentType:{material_type}\n;InfillDensity:{infill_sparse_density}\n;Extruder0Temperature:{material_print_temperature}\n;BedTemperature:{material_bed_temperature}\n\n;(**** start.gcode for ME40****)\nM203 Z15\nM104 S170\nG28 ; Home extruder\nG29\nG1 Z15\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nM109 S{material_print_temperature_layer_0}\nG92 E0 ; Reset extruder position\nG1 X140 Y7 Z0.27 F4000\nG1 X40 Y7 Z0.27 E23 F1000\nG92 E0\nM203 Z8" },
|
||||
"machine_width": { "default_value": 300 },
|
||||
"speed_print": { "value": 60.0 },
|
||||
"speed_support": { "value": "round(speed_print * 0.96, 1)" },
|
||||
"speed_topbottom": { "value": "round(speed_print * 0.58, 1)" },
|
||||
"speed_wall": { "value": "speed_print / 2" }
|
||||
}
|
||||
}
|
35
resources/definitions/weedo_me40_lite.def.json
Normal file
35
resources/definitions/weedo_me40_lite.def.json
Normal file
@ -0,0 +1,35 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "WEEDO ME40 Lite",
|
||||
"inherits": "weedo_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "WEEDO",
|
||||
"manufacturer": "WEEDO",
|
||||
"file_formats": "text/x-gcode",
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"machine_depth": { "default_value": 300 },
|
||||
"machine_end_gcode": { "default_value": ";(**** end.gcode for ME40****)\nM203 Z15\nG1 X0 Y130 F3000\nG92 E0\nG1 E-1 F1680 ; Reduce filament pressure\nM107 ; Turn off fan\n; Disable all extruder\nM104 T0 S0\nG90 ; Absolute positioning\nG92 E0 ; Reset extruder position\nM140 S0 ; Disable heated bed\nM84 ; Turn steppers off" },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_name": { "default_value": "WEEDO ME40 Lite" },
|
||||
"machine_start_gcode": { "default_value": ";MachineType:{machine_name}\n;FilamentType:{material_type}\n;InfillDensity:{infill_sparse_density}\n;Extruder0Temperature:{material_print_temperature}\n;BedTemperature:{material_bed_temperature}\n\n;(**** start.gcode for ME40 Lite****)\nM203 Z15\nM104 S170\nG28 ; Home extruder\nG1 Z15\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nM109 S{material_print_temperature_layer_0}\nG92 E0 ; Reset extruder position\nG1 X140 Y7 Z0.27 F4000\nG1 X40 Y7 Z0.27 E23 F1000\nG92 E0\nM203 Z8" },
|
||||
"machine_width": { "default_value": 300 },
|
||||
"material_bed_temperature":
|
||||
{
|
||||
"maximum_value": "90",
|
||||
"maximum_value_warning": "70"
|
||||
},
|
||||
"speed_print": { "value": 60.0 },
|
||||
"speed_support": { "value": "round(speed_print * 0.96, 1)" },
|
||||
"speed_topbottom": { "value": "round(speed_print * 0.58, 1)" },
|
||||
"speed_wall": { "value": "speed_print / 2" }
|
||||
}
|
||||
}
|
46
resources/definitions/weedo_x40v3.def.json
Normal file
46
resources/definitions/weedo_x40v3.def.json
Normal file
@ -0,0 +1,46 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "WEEDO X40 V3+",
|
||||
"inherits": "weedo_base",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "WEEDO",
|
||||
"manufacturer": "WEEDO",
|
||||
"file_formats": "text/x-gcode",
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "weedo_x40v3_extruder_left",
|
||||
"1": "weedo_x40v3_extruder_right"
|
||||
},
|
||||
"platform_offset": [
|
||||
0,
|
||||
0,
|
||||
0
|
||||
]
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"adhesion_type": { "default_value": "brim" },
|
||||
"machine_always_write_active_tool": { "default_value": true },
|
||||
"machine_depth": { "default_value": 300 },
|
||||
"machine_end_gcode": { "default_value": ";(*********end X40 End.gcode*******)\nM203 Z15\nM605 S1 ;Set to auto-park\nG28 X F3000\nG91 ; Relative positioning\nG1 E-1 ; Reduce filament pressure\nG90\nG1 Y300 F3000\nM104 S0 T0\nM104 S0 T1\nM140 S0\nM107 P0\nM107 P1\nM82" },
|
||||
"machine_extruder_count": { "default_value": 2 },
|
||||
"machine_height": { "default_value": 400 },
|
||||
"machine_name": { "default_value": "WEEDO X40" },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 1.7 },
|
||||
"machine_start_gcode": { "default_value": ";MachineType:{machine_name}\n;FilamentType:{material_type}\n;InfillDensity:{infill_sparse_density}\n;BedTemperature:{material_bed_temperature}\n\n;(**** start.gcode for X40 ****)\nM203 Z15\nM140 S{material_bed_temperature_layer_0}\nM104 S{material_print_temperature_layer_0} T{initial_extruder_nr}\nG28 ;This command will use tool0 to get the x endstop and setup coordinate system\nG29 ;Auto level\nM107 P0 ;Turn off fan\nM107 P1\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nG1 X-47 F3000\nG1 Z20 F600\nT{initial_extruder_nr} S ;Set start extruder nr after G28\nM109 S{material_print_temperature_layer_0} T{initial_extruder_nr}\nG92 E0\nG1 E22 F300\nG92 E0\nM203 Z2" },
|
||||
"machine_width": { "default_value": 300 },
|
||||
"material_print_temp_prepend": { "default_value": false },
|
||||
"material_standby_temperature": { "value": "max(0, material_print_temperature - 20)" },
|
||||
"ooze_shield_angle": { "default_value": 0 },
|
||||
"ooze_shield_dist": { "default_value": 3.0 },
|
||||
"ooze_shield_enabled": { "default_value": true },
|
||||
"retraction_amount": { "default_value": 4 },
|
||||
"speed_print": { "value": 60.0 },
|
||||
"speed_support": { "value": "round(speed_print * 0.96, 1)" },
|
||||
"speed_topbottom": { "value": "round(speed_print * 0.58, 1)" },
|
||||
"speed_wall": { "value": "speed_print / 2" },
|
||||
"switch_extruder_retraction_amount": { "value": 0 }
|
||||
}
|
||||
}
|
@ -14,6 +14,7 @@
|
||||
"default_value": 0,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_offset_x": { "default_value": 0.0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0.0 }
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
"default_value": 1,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_offset_x": { "default_value": 0.0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0.0 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 6 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
"default_value": 0,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_offset_x": { "default_value": 0.0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0.0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
|
@ -14,6 +14,7 @@
|
||||
"default_value": 1,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_offset_x": { "default_value": 19.0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0.0 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 2.5 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_size": { "default_value": 0.84 },
|
||||
"material_diameter": { "default_value": 3.175 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 3 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 2.85 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 2.85 }
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_nozzle_head_distance": { "default_value": 5 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"material_diameter": { "default_value": 2.85 }
|
||||
}
|
||||
|
26
resources/extruders/ultimaker_method_extruder_left.def.json
Normal file
26
resources/extruders/ultimaker_method_extruder_left.def.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_method",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 0,
|
||||
"maximum_value": 1
|
||||
},
|
||||
"machine_extruder_cooling_fan_number": { "default_value": 0 },
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\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\nM104 S{material_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_0/100}" },
|
||||
"machine_extruder_start_code_duration": { "default_value": 8 },
|
||||
"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 }
|
||||
}
|
||||
}
|
26
resources/extruders/ultimaker_method_extruder_right.def.json
Normal file
26
resources/extruders/ultimaker_method_extruder_right.def.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 2",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_method",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 1,
|
||||
"maximum_value": 1
|
||||
},
|
||||
"machine_extruder_cooling_fan_number": { "default_value": 1 },
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\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\nM104 S{material_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_0/100}" },
|
||||
"machine_extruder_start_code_duration": { "default_value": 8 },
|
||||
"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 }
|
||||
}
|
||||
}
|
@ -14,8 +14,9 @@
|
||||
"default_value": 0,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_extruder_cooling_fan_number": { "default_value": 0 },
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\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\nM104 S{material_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/100}" },
|
||||
"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\nM104 S{material_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_0/100}" },
|
||||
"machine_extruder_start_code_duration": { "default_value": 8 },
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
|
@ -14,8 +14,9 @@
|
||||
"default_value": 1,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"machine_extruder_cooling_fan_number": { "default_value": 1 },
|
||||
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\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\nM104 S{material_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/100}" },
|
||||
"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\nM104 S{material_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_0/100}" },
|
||||
"machine_extruder_start_code_duration": { "default_value": 8 },
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 },
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user