mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 14:37:29 -06:00
Merge branch 'main' into InsertAtLayerChange
This commit is contained in:
commit
acd8444465
643 changed files with 78742 additions and 71010 deletions
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
|
||||
|
|
2
.github/workflows/printer-linter-format.yml
vendored
2
.github/workflows/printer-linter-format.yml
vendored
|
@ -16,7 +16,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- uses: technote-space/get-diff-action@v6
|
||||
with:
|
||||
|
|
|
@ -5,6 +5,9 @@ on:
|
|||
path:
|
||||
- "resources/**"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
printer-linter-diagnose:
|
||||
name: Printer linter PR diagnose
|
||||
|
@ -12,7 +15,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
|
@ -50,9 +53,9 @@ 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
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: printer-linter-result
|
||||
path: printer-linter-result/
|
||||
|
|
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
|
194
.github/workflows/release-process_release-candidate.yml
vendored
Normal file
194
.github/workflows/release-process_release-candidate.yml
vendored
Normal file
|
@ -0,0 +1,194 @@
|
|||
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
|
||||
|
||||
publish_release_description:
|
||||
description: 'Create the GitHub release (if existing, the description will be overridden based on the changelog)'
|
||||
required: true
|
||||
type: boolean
|
||||
|
||||
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]
|
||||
outputs:
|
||||
main_commit: ${{ steps.export-main-commit.outputs.main_commit }}
|
||||
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 RC tag
|
||||
run: |
|
||||
git tag ${{ needs.find-rc-tag.outputs.tag_name }}
|
||||
git push origin tag ${{ needs.find-rc-tag.outputs.tag_name }}
|
||||
|
||||
- name: Create or update release tag
|
||||
run: |
|
||||
git tag -f ${{ inputs.cura_version }}
|
||||
git push -f origin tag ${{ inputs.cura_version }}
|
||||
|
||||
- name: Export Cura tagged commit
|
||||
id: export-main-commit
|
||||
if: ${{ matrix.repository == 'Cura' }}
|
||||
run: |
|
||||
echo "main_commit=`git rev-parse HEAD`" >> "$GITHUB_OUTPUT"
|
||||
|
||||
|
||||
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, create-tags]
|
||||
steps:
|
||||
- name: Checkout Cura repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ needs.parse-version.outputs.branch_name }}
|
||||
|
||||
- name: Extract changelog
|
||||
if: ${{ inputs.publish_release_description }}
|
||||
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: Create release
|
||||
uses: notpeelz/action-gh-create-release@v5.0.1
|
||||
if: ${{ inputs.publish_release_description }}
|
||||
with:
|
||||
target: ${{ needs.create-tags.outputs.main_commit }}
|
||||
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,18 +1,16 @@
|
|||
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"
|
||||
- "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"
|
||||
- "fdm_materials/5.8.1"
|
||||
- "cura_private_data/(latest)@internal/testing"
|
||||
urls:
|
||||
default:
|
||||
|
@ -35,14 +33,6 @@ pyinstaller:
|
|||
package: "cura"
|
||||
src: "plugins"
|
||||
dst: "share/cura/plugins"
|
||||
curaengine_gradual_flow_plugin:
|
||||
package: "curaengine_plugin_gradual_flow"
|
||||
src: "res/plugins/CuraEngineGradualFlow"
|
||||
dst: "share/cura/plugins/CuraEngineGradualFlow"
|
||||
curaengine_gradual_flow_plugin_bundled:
|
||||
package: "curaengine_plugin_gradual_flow"
|
||||
src: "res/bundled_packages"
|
||||
dst: "share/cura/resources/bundled_packages"
|
||||
native_cad_plugin:
|
||||
package: "native_cad_plugin"
|
||||
src: "res/plugins/NativeCADplugin"
|
||||
|
@ -106,11 +96,6 @@ pyinstaller:
|
|||
src: "bin"
|
||||
dst: "."
|
||||
binary: "CuraEngine"
|
||||
curaengine_gradual_flow_plugin_service:
|
||||
package: "curaengine_plugin_gradual_flow"
|
||||
src: "bin"
|
||||
dst: "."
|
||||
binary: "curaengine_plugin_gradual_flow"
|
||||
hiddenimports:
|
||||
- "pySavitar"
|
||||
- "pyArcus"
|
||||
|
|
17
conanfile.py
17
conanfile.py
|
@ -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
|
||||
|
@ -391,17 +390,11 @@ class CuraConan(ConanFile):
|
|||
copy(self, "CuraEngine", curaengine.bindirs[0], self.source_folder, keep_path = False)
|
||||
|
||||
# Copy the external plugins that we want to bundle with Cura
|
||||
rmdir(self,str(self.source_path.joinpath("plugins", "CuraEngineGradualFlow")))
|
||||
curaengine_plugin_gradual_flow = self.dependencies["curaengine_plugin_gradual_flow"].cpp_info
|
||||
copy(self, "*", curaengine_plugin_gradual_flow.resdirs[0], str(self.source_path.joinpath("plugins", "CuraEngineGradualFlow")), keep_path = True)
|
||||
copy(self, "*", curaengine_plugin_gradual_flow.bindirs[0], self.source_folder, keep_path = False)
|
||||
copy(self, "bundled_*.json", curaengine_plugin_gradual_flow.resdirs[1], str(self.source_path.joinpath("resources", "bundled_packages")), keep_path = False)
|
||||
|
||||
if self._enterprise:
|
||||
rmdir(self, str(self.source_path.joinpath("plugins", "NativeCADplugin")))
|
||||
curaengine_plugin_gradual_flow = self.dependencies["native_cad_plugin"].cpp_info
|
||||
copy(self, "*", curaengine_plugin_gradual_flow.resdirs[0], str(self.source_path.joinpath("plugins", "NativeCADplugin")), keep_path = True)
|
||||
copy(self, "bundled_*.json", curaengine_plugin_gradual_flow.resdirs[1], str(self.source_path.joinpath("resources", "bundled_packages")), keep_path = False)
|
||||
native_cad_plugin = self.dependencies["native_cad_plugin"].cpp_info
|
||||
copy(self, "*", native_cad_plugin.resdirs[0], str(self.source_path.joinpath("plugins", "NativeCADplugin")), keep_path = True)
|
||||
copy(self, "bundled_*.json", native_cad_plugin.resdirs[1], str(self.source_path.joinpath("resources", "bundled_packages")), keep_path = False)
|
||||
|
||||
# Copy resources of cura_binary_data
|
||||
cura_binary_data = self.dependencies["cura_binary_data"].cpp_info
|
||||
|
@ -518,10 +511,6 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
|
|||
copy(self, "requirement*.txt", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.resdirs[-1]))
|
||||
copy(self, "*", src = os.path.join(self.source_folder, "packaging"), dst = os.path.join(self.package_folder, self.cpp.package.resdirs[2]))
|
||||
|
||||
# Remove the CuraEngineGradualFlow plugin from the package
|
||||
rmdir(self, os.path.join(self.package_folder, self.cpp.package.resdirs[1], "CuraEngineGradualFlow"))
|
||||
rm(self, "bundled_*.json", os.path.join(self.package_folder, self.cpp.package.resdirs[0], "bundled_packages"), recursive = False)
|
||||
|
||||
# Remove the fdm_materials from the package
|
||||
rmdir(self, os.path.join(self.package_folder, self.cpp.package.resdirs[0], "materials"))
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
@ -232,6 +232,7 @@ class Account(QObject):
|
|||
|
||||
def _onProfileChanged(self, profile: Optional[UserProfile]) -> None:
|
||||
self._user_profile = profile
|
||||
self._updatePermissions()
|
||||
self.userProfileChanged.emit()
|
||||
|
||||
def _sync(self) -> None:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
# Copyright (c) 2019 Ultimaker B.V.
|
||||
# Copyright (c) 2024 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import Dict, List
|
||||
|
||||
from UM.Decorators import deprecated
|
||||
from UM.Logger import Logger
|
||||
from UM.Signal import Signal
|
||||
from UM.Util import parseBool
|
||||
|
@ -168,13 +169,18 @@ class MachineNode(ContainerNode):
|
|||
|
||||
return self.global_qualities.get(self.preferred_quality_type, next(iter(self.global_qualities.values())))
|
||||
|
||||
def isExcludedMaterial(self, material: MaterialNode) -> bool:
|
||||
def isExcludedMaterialBaseFile(self, material_base_file: str) -> bool:
|
||||
"""Returns whether the material should be excluded from the list of materials."""
|
||||
for exclude_material in self.exclude_materials:
|
||||
if exclude_material in material["id"]:
|
||||
if exclude_material in material_base_file:
|
||||
return True
|
||||
return False
|
||||
|
||||
@deprecated("Use isExcludedMaterialBaseFile instead.", since = "5.9.0")
|
||||
def isExcludedMaterial(self, material: MaterialNode) -> bool:
|
||||
"""Returns whether the material should be excluded from the list of materials."""
|
||||
return self.isExcludedMaterialBaseFile(material.base_file)
|
||||
|
||||
@UM.FlameProfiler.profile
|
||||
def _loadAll(self) -> None:
|
||||
"""(Re)loads all variants under this printer."""
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -60,7 +60,7 @@ class VariantNode(ContainerNode):
|
|||
materials = list(materials_per_base_file.values())
|
||||
|
||||
# Filter materials based on the exclude_materials property.
|
||||
filtered_materials = [material for material in materials if not self.machine.isExcludedMaterial(material)]
|
||||
filtered_materials = [material for material in materials if not self.machine.isExcludedMaterialBaseFile(material["id"])]
|
||||
|
||||
for material in filtered_materials:
|
||||
base_file = material["base_file"]
|
||||
|
@ -127,7 +127,7 @@ class VariantNode(ContainerNode):
|
|||
material_definition = container.getMetaDataEntry("definition")
|
||||
|
||||
base_file = container.getMetaDataEntry("base_file")
|
||||
if base_file in self.machine.exclude_materials:
|
||||
if self.machine.isExcludedMaterialBaseFile(base_file):
|
||||
return # Material is forbidden for this printer.
|
||||
if base_file not in self.materials: # Completely new base file. Always better than not having a file as long as it matches our set-up.
|
||||
if material_definition != "fdmprinter" and material_definition != self.machine.container_id:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -5,7 +5,7 @@ from typing import Any, cast, List, Optional, Dict
|
|||
from PyQt6.QtCore import pyqtProperty, pyqtSignal, QObject
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Decorators import override
|
||||
from UM.Decorators import CachedMemberFunctions, override
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from UM.Logger import Logger
|
||||
from UM.Settings.ContainerStack import ContainerStack, InvalidContainerStackError
|
||||
|
@ -237,6 +237,7 @@ class CuraContainerStack(ContainerStack):
|
|||
:param new_value: The new value to set the property to.
|
||||
"""
|
||||
|
||||
CachedMemberFunctions.clearInstanceCache(self)
|
||||
container_index = _ContainerIndexes.UserChanges
|
||||
self._containers[container_index].setProperty(key, property_name, property_value, container, set_from_cache)
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ from typing import Any, Dict, TYPE_CHECKING, Optional
|
|||
|
||||
from PyQt6.QtCore import pyqtProperty, pyqtSignal
|
||||
|
||||
from UM.Decorators import override
|
||||
from UM.Decorators import CachedMemberFunctions, override
|
||||
from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase
|
||||
from UM.Settings.ContainerStack import ContainerStack
|
||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||
|
@ -86,6 +86,7 @@ class ExtruderStack(CuraContainerStack):
|
|||
def setCompatibleMaterialDiameter(self, value: float) -> None:
|
||||
old_approximate_diameter = self.getApproximateMaterialDiameter()
|
||||
if self.getCompatibleMaterialDiameter() != value:
|
||||
CachedMemberFunctions.clearInstanceCache(self)
|
||||
self.definitionChanges.setProperty("material_diameter", "value", value)
|
||||
self.compatibleMaterialDiameterChanged.emit()
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -49,7 +49,20 @@ class StartJobResult(IntEnum):
|
|||
ObjectsWithDisabledExtruder = 8
|
||||
|
||||
|
||||
class GcodeStartEndFormatter(Formatter):
|
||||
class GcodeConditionState(IntEnum):
|
||||
OutsideCondition = 1
|
||||
ConditionFalse = 2
|
||||
ConditionTrue = 3
|
||||
ConditionDone = 4
|
||||
|
||||
|
||||
class GcodeInstruction(IntEnum):
|
||||
Skip = 1
|
||||
Evaluate = 2
|
||||
EvaluateAndWrite = 3
|
||||
|
||||
|
||||
class GcodeStartEndFormatter:
|
||||
# Formatter class that handles token expansion in start/end gcode
|
||||
# Example of a start/end gcode string:
|
||||
# ```
|
||||
|
@ -63,22 +76,50 @@ class GcodeStartEndFormatter(Formatter):
|
|||
# will be used. Alternatively, if the expression is formatted as "{[expression], [extruder_nr]}",
|
||||
# then the expression will be evaluated with the extruder stack of the specified extruder_nr.
|
||||
|
||||
_extruder_regex = re.compile(r"^\s*(?P<expression>.*)\s*,\s*(?P<extruder_nr_expr>.*)\s*$")
|
||||
_instruction_regex = re.compile(r"{(?P<condition>if|else|elif|endif)?\s*(?P<expression>.*?)\s*(?:,\s*(?P<extruder_nr_expr>.*))?\s*}(?P<end_of_line>\n?)")
|
||||
|
||||
def __init__(self, all_extruder_settings: Dict[str, Any], default_extruder_nr: int = -1) -> None:
|
||||
def __init__(self, all_extruder_settings: Dict[str, Dict[str, Any]], default_extruder_nr: int = -1) -> None:
|
||||
super().__init__()
|
||||
self._all_extruder_settings: Dict[str, Any] = all_extruder_settings
|
||||
self._all_extruder_settings: Dict[str, Dict[str, Any]] = all_extruder_settings
|
||||
self._default_extruder_nr: int = default_extruder_nr
|
||||
self._cura_application = CuraApplication.getInstance()
|
||||
self._extruder_manager = ExtruderManager.getInstance()
|
||||
|
||||
def get_field(self, field_name, args: [str], kwargs: dict) -> Tuple[str, str]:
|
||||
# get_field method parses all fields in the format-string and parses them individually to the get_value method.
|
||||
# e.g. for a string "Hello {foo.bar}" would the complete field "foo.bar" would be passed to get_field, and then
|
||||
# the individual parts "foo" and "bar" would be passed to get_value. This poses a problem for us, because want
|
||||
# to parse the entire field as a single expression. To solve this, we override the get_field method and return
|
||||
# the entire field as the expression.
|
||||
return self.get_value(field_name, args, kwargs), field_name
|
||||
def format(self, text: str) -> str:
|
||||
remaining_text: str = text
|
||||
result: str = ""
|
||||
|
||||
def get_value(self, expression: str, args: [str], kwargs: dict) -> str:
|
||||
self._condition_state: GcodeConditionState = GcodeConditionState.OutsideCondition
|
||||
|
||||
while len(remaining_text) > 0:
|
||||
next_code_match = self._instruction_regex.search(remaining_text)
|
||||
if next_code_match is not None:
|
||||
expression_start, expression_end = next_code_match.span()
|
||||
|
||||
if expression_start > 0:
|
||||
result += self._process_statement(remaining_text[:expression_start])
|
||||
|
||||
result += self._process_code(next_code_match)
|
||||
|
||||
remaining_text = remaining_text[expression_end:]
|
||||
|
||||
else:
|
||||
result += self._process_statement(remaining_text)
|
||||
remaining_text = ""
|
||||
|
||||
return result
|
||||
|
||||
def _process_statement(self, statement: str) -> str:
|
||||
if self._condition_state in [GcodeConditionState.OutsideCondition, GcodeConditionState.ConditionTrue]:
|
||||
return statement
|
||||
else:
|
||||
return ""
|
||||
|
||||
def _process_code(self, code: re.Match) -> str:
|
||||
condition: Optional[str] = code.group("condition")
|
||||
expression: Optional[str] = code.group("expression")
|
||||
extruder_nr_expr: Optional[str] = code.group("extruder_nr_expr")
|
||||
end_of_line: Optional[str] = code.group("end_of_line")
|
||||
|
||||
# The following variables are not settings, but only become available after slicing.
|
||||
# when these variables are encountered, we return them as-is. They are replaced later
|
||||
|
@ -87,53 +128,100 @@ class GcodeStartEndFormatter(Formatter):
|
|||
if expression in post_slice_data_variables:
|
||||
return f"{{{expression}}}"
|
||||
|
||||
extruder_nr = str(self._default_extruder_nr)
|
||||
extruder_nr: str = str(self._default_extruder_nr)
|
||||
instruction: GcodeInstruction = GcodeInstruction.Skip
|
||||
|
||||
# The settings may specify a specific extruder to use. This is done by
|
||||
# formatting the expression as "{expression}, {extruder_nr_expr}". If the
|
||||
# expression is formatted like this, we extract the extruder_nr and use
|
||||
# it to get the value from the correct extruder stack.
|
||||
match = self._extruder_regex.match(expression)
|
||||
if match:
|
||||
expression = match.group("expression")
|
||||
extruder_nr_expr = match.group("extruder_nr_expr")
|
||||
|
||||
if extruder_nr_expr.isdigit():
|
||||
extruder_nr = extruder_nr_expr
|
||||
if condition is None:
|
||||
# This is a classic statement
|
||||
if self._condition_state in [GcodeConditionState.OutsideCondition, GcodeConditionState.ConditionTrue]:
|
||||
# Skip and move to next
|
||||
instruction = GcodeInstruction.EvaluateAndWrite
|
||||
else:
|
||||
# This is a condition statement, first check validity
|
||||
if condition == "if":
|
||||
if self._condition_state != GcodeConditionState.OutsideCondition:
|
||||
raise SyntaxError("Nested conditions are not supported")
|
||||
else:
|
||||
# We get the value of the extruder_nr_expr from `_all_extruder_settings` dictionary
|
||||
# rather than the global container stack. The `_all_extruder_settings["-1"]` is a
|
||||
# dict-representation of the global container stack, with additional properties such
|
||||
# as `initial_extruder_nr`. As users may enter such expressions we can't use the
|
||||
# global container stack.
|
||||
extruder_nr = str(self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1"))
|
||||
if self._condition_state == GcodeConditionState.OutsideCondition:
|
||||
raise SyntaxError("Condition should start with an 'if' statement")
|
||||
|
||||
if extruder_nr in self._all_extruder_settings:
|
||||
additional_variables = self._all_extruder_settings[extruder_nr].copy()
|
||||
else:
|
||||
Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings")
|
||||
additional_variables = self._all_extruder_settings["-1"].copy()
|
||||
if condition == "if":
|
||||
# First instruction, just evaluate it
|
||||
instruction = GcodeInstruction.Evaluate
|
||||
|
||||
# Add the arguments and keyword arguments to the additional settings. These
|
||||
# are currently _not_ used, but they are added for consistency with the
|
||||
# base Formatter class.
|
||||
for key, value in enumerate(args):
|
||||
additional_variables[key] = value
|
||||
for key, value in kwargs.items():
|
||||
additional_variables[key] = value
|
||||
else:
|
||||
if self._condition_state == GcodeConditionState.ConditionTrue:
|
||||
# We have reached the next condition after a valid one has been found, skip the rest
|
||||
self._condition_state = GcodeConditionState.ConditionDone
|
||||
|
||||
if extruder_nr == "-1":
|
||||
container_stack = CuraApplication.getInstance().getGlobalContainerStack()
|
||||
else:
|
||||
container_stack = ExtruderManager.getInstance().getExtruderStack(extruder_nr)
|
||||
if not container_stack:
|
||||
if condition == "elif":
|
||||
if self._condition_state == GcodeConditionState.ConditionFalse:
|
||||
# New instruction, and valid condition has not been reached so far => evaluate it
|
||||
instruction = GcodeInstruction.Evaluate
|
||||
else:
|
||||
# New instruction, but valid condition has already been reached => skip it
|
||||
instruction = GcodeInstruction.Skip
|
||||
|
||||
elif condition == "else":
|
||||
instruction = GcodeInstruction.Skip # Never evaluate, expression should be empty
|
||||
if self._condition_state == GcodeConditionState.ConditionFalse:
|
||||
# Fallback instruction, and valid condition has not been reached so far => active next
|
||||
self._condition_state = GcodeConditionState.ConditionTrue
|
||||
|
||||
elif condition == "endif":
|
||||
instruction = GcodeInstruction.Skip # Never evaluate, expression should be empty
|
||||
self._condition_state = GcodeConditionState.OutsideCondition
|
||||
|
||||
if instruction >= GcodeInstruction.Evaluate and extruder_nr_expr is not None:
|
||||
extruder_nr_function = SettingFunction(extruder_nr_expr)
|
||||
container_stack = self._cura_application.getGlobalContainerStack()
|
||||
|
||||
# We add the variables contained in `_all_extruder_settings["-1"]`, which is a dict-representation of the
|
||||
# global container stack, with additional properties such as `initial_extruder_nr`. As users may enter such
|
||||
# expressions we can't use the global container stack. The variables contained in the global container stack
|
||||
# will then be inserted twice, which is not optimal but works well.
|
||||
extruder_nr = str(extruder_nr_function(container_stack, additional_variables=self._all_extruder_settings["-1"]))
|
||||
|
||||
if instruction >= GcodeInstruction.Evaluate:
|
||||
if extruder_nr in self._all_extruder_settings:
|
||||
additional_variables = self._all_extruder_settings[extruder_nr].copy()
|
||||
else:
|
||||
Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings")
|
||||
container_stack = CuraApplication.getInstance().getGlobalContainerStack()
|
||||
additional_variables = self._all_extruder_settings["-1"].copy()
|
||||
|
||||
setting_function = SettingFunction(expression)
|
||||
value = setting_function(container_stack, additional_variables=additional_variables)
|
||||
if extruder_nr == "-1":
|
||||
container_stack = self._cura_application.getGlobalContainerStack()
|
||||
else:
|
||||
container_stack = self._extruder_manager.getExtruderStack(extruder_nr)
|
||||
if not container_stack:
|
||||
Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings")
|
||||
container_stack = self._cura_application.getGlobalContainerStack()
|
||||
|
||||
return value
|
||||
setting_function = SettingFunction(expression)
|
||||
value = setting_function(container_stack, additional_variables=additional_variables)
|
||||
|
||||
if instruction == GcodeInstruction.Evaluate:
|
||||
if value:
|
||||
self._condition_state = GcodeConditionState.ConditionTrue
|
||||
else:
|
||||
self._condition_state = GcodeConditionState.ConditionFalse
|
||||
|
||||
return ""
|
||||
else:
|
||||
value_str = str(value)
|
||||
|
||||
if end_of_line is not None:
|
||||
# If we are evaluating an expression that is not a condition, restore the end of line
|
||||
value_str += end_of_line
|
||||
|
||||
return value_str
|
||||
|
||||
else:
|
||||
return ""
|
||||
|
||||
|
||||
class StartSliceJob(Job):
|
||||
|
@ -146,6 +234,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 +242,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 +426,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 +454,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():
|
||||
|
@ -461,6 +558,9 @@ class StartSliceJob(Job):
|
|||
result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))]
|
||||
result["initial_extruder_nr"] = CuraApplication.getInstance().getExtruderManager().getInitialExtruderNr()
|
||||
|
||||
# If adding or changing a setting here, please update the associated wiki page
|
||||
# https://github.com/Ultimaker/Cura/wiki/Start-End-G%E2%80%90Code
|
||||
|
||||
return result
|
||||
|
||||
def _cacheAllExtruderSettings(self):
|
||||
|
@ -550,12 +650,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,14 @@ 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
|
||||
|
||||
// Pre-select the correct index, depending on the situation (see the model-property below):
|
||||
// - Don't select any post-slice-file-format when the engine isn't done.
|
||||
// - Choose either the S-series or the Makerbot-series of printers' format otherwise, depending on the active printer.
|
||||
// This way, the user can just click 'save' without having to worry about wether or not the format is right.
|
||||
property int isMakerbotFormat: Cura.MachineManager.activeMachine.getOutputFileFormats.includes("application/x-makerbot") || Cura.MachineManager.activeMachine.getOutputFileFormats.includes("application/x-makerbot-sketch")
|
||||
property int isBackendDone: UM.Backend.state == UM.Backend.Done
|
||||
currentIndex: isBackendDone ? (isMakerbotFormat ? 1 : 0) : 2
|
||||
|
||||
textRole: "text"
|
||||
valueRole: "value"
|
||||
|
|
|
@ -182,7 +182,7 @@ Item
|
|||
Cura.GcodeTextArea // "Extruder Start G-code"
|
||||
{
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottom: buttonLearnMore.top
|
||||
anchors.bottomMargin: UM.Theme.getSize("default_margin").height
|
||||
anchors.left: parent.left
|
||||
width: base.columnWidth - UM.Theme.getSize("default_margin").width
|
||||
|
@ -196,7 +196,7 @@ Item
|
|||
Cura.GcodeTextArea // "Extruder End G-code"
|
||||
{
|
||||
anchors.top: parent.top
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottom: buttonLearnMore.top
|
||||
anchors.bottomMargin: UM.Theme.getSize("default_margin").height
|
||||
anchors.right: parent.right
|
||||
width: base.columnWidth - UM.Theme.getSize("default_margin").width
|
||||
|
@ -206,5 +206,17 @@ Item
|
|||
settingKey: "machine_extruder_end_code"
|
||||
settingStoreIndex: propertyStoreIndex
|
||||
}
|
||||
|
||||
Cura.TertiaryButton
|
||||
{
|
||||
id: buttonLearnMore
|
||||
|
||||
text: catalog.i18nc("@button", "Learn more")
|
||||
iconSource: UM.Theme.getIcon("LinkExternal")
|
||||
isIconOnRightSide: true
|
||||
onClicked: Qt.openUrlExternally("https://github.com/Ultimaker/Cura/wiki/Start-End-G%E2%80%90Code")
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -376,7 +376,7 @@ Item
|
|||
anchors
|
||||
{
|
||||
top: upperBlock.bottom
|
||||
bottom: parent.bottom
|
||||
bottom: buttonLearnMore.top
|
||||
left: parent.left
|
||||
right: parent.right
|
||||
margins: UM.Theme.getSize("default_margin").width
|
||||
|
@ -403,5 +403,19 @@ Item
|
|||
settingKey: "machine_end_gcode"
|
||||
settingStoreIndex: propertyStoreIndex
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Cura.TertiaryButton
|
||||
{
|
||||
id: buttonLearnMore
|
||||
|
||||
text: catalog.i18nc("@button", "Learn more")
|
||||
iconSource: UM.Theme.getIcon("LinkExternal")
|
||||
isIconOnRightSide: true
|
||||
onClicked: Qt.openUrlExternally("https://github.com/Ultimaker/Cura/wiki/Start-End-G%E2%80%90Code")
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.margins: UM.Theme.getSize("default_margin").width
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 |
|
@ -42,7 +42,7 @@ class CloudApiClient:
|
|||
CLUSTER_API_ROOT = f"{ROOT_PATH}/connect/v1"
|
||||
CURA_API_ROOT = f"{ROOT_PATH}/cura/v1"
|
||||
|
||||
DEFAULT_REQUEST_TIMEOUT = 10 # seconds
|
||||
DEFAULT_REQUEST_TIMEOUT = 30 # seconds
|
||||
|
||||
# In order to avoid garbage collection we keep the callbacks in this list.
|
||||
_anti_gc_callbacks = [] # type: List[Callable[[Any], None]]
|
||||
|
|
|
@ -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]]:
|
||||
"""
|
||||
|
|
|
@ -11,12 +11,14 @@ import xml.etree.ElementTree as ET
|
|||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Resources import Resources
|
||||
from UM.Logger import Logger
|
||||
from UM.Decorators import CachedMemberFunctions
|
||||
import UM.Dictionary
|
||||
from UM.Settings.InstanceContainer import InstanceContainer
|
||||
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:
|
||||
|
@ -70,6 +72,8 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
Logger.log("w", "Can't change metadata {key} of material {material_id} because it's read-only.".format(key = key, material_id = self.getId()))
|
||||
return
|
||||
|
||||
CachedMemberFunctions.clearInstanceCache(self)
|
||||
|
||||
# Some metadata such as diameter should also be instantiated to be a setting. Go though all values for the
|
||||
# "properties" field and apply the new values to SettingInstances as well.
|
||||
new_setting_values_dict = {}
|
||||
|
@ -249,7 +253,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")
|
||||
|
@ -479,6 +483,7 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
first.append(element)
|
||||
|
||||
def clearData(self):
|
||||
CachedMemberFunctions.clearInstanceCache(self)
|
||||
self._metadata = {
|
||||
"id": self.getId(),
|
||||
"name": ""
|
||||
|
@ -518,6 +523,8 @@ class XmlMaterialProfile(InstanceContainer):
|
|||
def deserialize(self, serialized, file_name = None):
|
||||
"""Overridden from InstanceContainer"""
|
||||
|
||||
CachedMemberFunctions.clearInstanceCache(self)
|
||||
|
||||
containers_to_add = []
|
||||
# update the serialized data first
|
||||
from UM.Settings.Interfaces import ContainerInterface
|
||||
|
@ -647,7 +654,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 +930,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 +1090,8 @@ 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"
|
||||
if tag_name != "cura:setting" and isinstance(instance.value, bool):
|
||||
data = "yes" if instance.value else "no"
|
||||
else:
|
||||
data = str(instance.value)
|
||||
|
||||
|
@ -1129,29 +1134,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.9.0-alpha.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 }
|
||||
}
|
||||
}
|
|
@ -36,9 +36,9 @@
|
|||
},
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_height": { "default_value": 250 },
|
||||
"machine_max_acceleration_e": { "value": 5000 },
|
||||
"machine_max_acceleration_x": { "value": 5000.0 },
|
||||
"machine_max_acceleration_y": { "value": 5000.0 },
|
||||
"machine_max_acceleration_e": { "value": 2500 },
|
||||
"machine_max_acceleration_x": { "value": 2500.0 },
|
||||
"machine_max_acceleration_y": { "value": 2500.0 },
|
||||
"machine_max_acceleration_z": { "value": 500.0 },
|
||||
"machine_max_feedrate_e": { "value": 100 },
|
||||
"machine_max_feedrate_x": { "value": 500 },
|
||||
|
|
|
@ -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 },
|
||||
|
|
74
resources/definitions/eazao_m500.def.json
Normal file
74
resources/definitions/eazao_m500.def.json
Normal file
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Eazao M500",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "Eazao",
|
||||
"manufacturer": "Eazao",
|
||||
"file_formats": "text/x-gcode",
|
||||
"has_machine_quality": false,
|
||||
"has_materials": false,
|
||||
"machine_extruder_trains": { "0": "eazao_m500_extruder_0" },
|
||||
"preferred_quality_type": "normal"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"acceleration_print": { "value": 300 },
|
||||
"acceleration_travel": { "value": 300 },
|
||||
"adhesion_type": { "default_value": "'none'" },
|
||||
"bottom_layers": { "value": 2 },
|
||||
"cool_fan_enabled": { "value": false },
|
||||
"infill_sparse_density": { "value": 0 },
|
||||
"initial_bottom_layers": { "value": 2 },
|
||||
"jerk_print": { "value": 10 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
"layer_height": { "value": 1.0 },
|
||||
"layer_height_0": { "value": 1.0 },
|
||||
"line_width": { "value": 3.0 },
|
||||
"machine_acceleration": { "value": 300 },
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_depth": { "default_value": 320 },
|
||||
"machine_end_gcode": { "default_value": "G92 Z0\nG1 F1500 Z10\nG28 X0 Y300 ;move X Y to min endstops\nM82\nM84 ;steppers off\n" },
|
||||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_height": { "default_value": 520 },
|
||||
"machine_max_acceleration_e": { "value": 500 },
|
||||
"machine_max_acceleration_x": { "value": 500 },
|
||||
"machine_max_acceleration_y": { "value": 500 },
|
||||
"machine_max_acceleration_z": { "value": 50 },
|
||||
"machine_max_feedrate_e": { "value": 25 },
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 5 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.3 },
|
||||
"machine_name": { "default_value": "Eazao M500" },
|
||||
"machine_start_gcode": { "default_value": "G21 ;set units to millimeters\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ;Home\nG1 Z25.0 F1500 ;move the platform down 15mm\nG92 E0 ;extruder reset\nG1 F300 E5\nG92 E0 ;The extruder is forced to zero again\nM302\nM163 S0 P0.85; Set Mix Factor\nM163 S1 P0.15; Set Mix Factor\nM164 S0" },
|
||||
"machine_width": { "default_value": 320 },
|
||||
"magic_spiralize": { "value": true },
|
||||
"material_final_print_temperature": { "value": "0" },
|
||||
"material_initial_print_temperature": { "value": "0" },
|
||||
"material_print_temperature": { "value": "0" },
|
||||
"material_print_temperature_layer_0": { "value": "0" },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"retraction_amount": { "value": 7 },
|
||||
"retraction_combing": { "value": "'noskin'" },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_enable": { "value": false },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"speed_print": { "value": 20.0 },
|
||||
"speed_travel": { "value": 20.0 },
|
||||
"speed_wall": { "value": 20.0 },
|
||||
"speed_wall_0": { "value": 20.0 },
|
||||
"speed_wall_x": { "value": 20.0 },
|
||||
"speed_z_hop": { "value": "machine_max_feedrate_z" },
|
||||
"top_bottom_pattern": { "value": "concentric" },
|
||||
"top_bottom_thickness": { "value": 3 },
|
||||
"wall_thickness": { "value": 5.0 }
|
||||
}
|
||||
}
|
74
resources/definitions/eazao_m600.def.json
Normal file
74
resources/definitions/eazao_m600.def.json
Normal file
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Eazao M600",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "Eazao",
|
||||
"manufacturer": "Eazao",
|
||||
"file_formats": "text/x-gcode",
|
||||
"has_machine_quality": false,
|
||||
"has_materials": false,
|
||||
"machine_extruder_trains": { "0": "eazao_m600_extruder_0" },
|
||||
"preferred_quality_type": "normal"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"acceleration_print": { "value": 300 },
|
||||
"acceleration_travel": { "value": 300 },
|
||||
"adhesion_type": { "default_value": "'none'" },
|
||||
"bottom_layers": { "value": 2 },
|
||||
"cool_fan_enabled": { "value": false },
|
||||
"infill_sparse_density": { "value": 0 },
|
||||
"initial_bottom_layers": { "value": 2 },
|
||||
"jerk_print": { "value": 10 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
"layer_height": { "value": 1.0 },
|
||||
"layer_height_0": { "value": 1.0 },
|
||||
"line_width": { "value": 3.0 },
|
||||
"machine_acceleration": { "value": 300 },
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_depth": { "default_value": 420 },
|
||||
"machine_end_gcode": { "default_value": "G92 Z0\nG1 F1500 Z10\nG28 X0 Y400 ;move X Y to min endstops\nM82\nM84 ;steppers off\n" },
|
||||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_height": { "default_value": 620 },
|
||||
"machine_max_acceleration_e": { "value": 500 },
|
||||
"machine_max_acceleration_x": { "value": 500 },
|
||||
"machine_max_acceleration_y": { "value": 500 },
|
||||
"machine_max_acceleration_z": { "value": 50 },
|
||||
"machine_max_feedrate_e": { "value": 25 },
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 5 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.3 },
|
||||
"machine_name": { "default_value": "Eazao M600" },
|
||||
"machine_start_gcode": { "default_value": "G21 ;set units to millimeters\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ;Home\nG1 Z25.0 F1500 ;move the platform down 15mm\nG92 E0 ;extruder reset\nG1 F300 E5\nG92 E0 ;The extruder is forced to zero again\nM302\nM163 S0 P0.87; Set Mix Factor\nM163 S1 P0.13; Set Mix Factor\nM164 S0" },
|
||||
"machine_width": { "default_value": 420 },
|
||||
"magic_spiralize": { "value": true },
|
||||
"material_final_print_temperature": { "value": "0" },
|
||||
"material_initial_print_temperature": { "value": "0" },
|
||||
"material_print_temperature": { "value": "0" },
|
||||
"material_print_temperature_layer_0": { "value": "0" },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"retraction_amount": { "value": 7 },
|
||||
"retraction_combing": { "value": "'noskin'" },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_enable": { "value": false },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"speed_print": { "value": 20.0 },
|
||||
"speed_travel": { "value": 20.0 },
|
||||
"speed_wall": { "value": 20.0 },
|
||||
"speed_wall_0": { "value": 20.0 },
|
||||
"speed_wall_x": { "value": 20.0 },
|
||||
"speed_z_hop": { "value": "machine_max_feedrate_z" },
|
||||
"top_bottom_pattern": { "value": "concentric" },
|
||||
"top_bottom_thickness": { "value": 3 },
|
||||
"wall_thickness": { "value": 5.0 }
|
||||
}
|
||||
}
|
74
resources/definitions/eazao_m700.def.json
Normal file
74
resources/definitions/eazao_m700.def.json
Normal file
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Eazao M700",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "Eazao",
|
||||
"manufacturer": "Eazao",
|
||||
"file_formats": "text/x-gcode",
|
||||
"has_machine_quality": false,
|
||||
"has_materials": false,
|
||||
"machine_extruder_trains": { "0": "eazao_m700_extruder_0" },
|
||||
"preferred_quality_type": "normal"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"acceleration_print": { "value": 300 },
|
||||
"acceleration_travel": { "value": 300 },
|
||||
"adhesion_type": { "default_value": "none" },
|
||||
"bottom_layers": { "value": 2 },
|
||||
"cool_fan_enabled": { "value": false },
|
||||
"infill_sparse_density": { "value": 0 },
|
||||
"initial_bottom_layers": { "value": 2 },
|
||||
"jerk_print": { "value": 10 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
"layer_height": { "value": 1.0 },
|
||||
"layer_height_0": { "value": 1.0 },
|
||||
"line_width": { "value": 3.0 },
|
||||
"machine_acceleration": { "value": 300 },
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_depth": { "default_value": 520 },
|
||||
"machine_end_gcode": { "default_value": "G92 Z0\nG1 F1500 Z10\nG28 X0 Y500 ;move X Y to min endstops\nM82\nM84 ;steppers off\n" },
|
||||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_height": { "default_value": 720 },
|
||||
"machine_max_acceleration_e": { "value": 500 },
|
||||
"machine_max_acceleration_x": { "value": 500 },
|
||||
"machine_max_acceleration_y": { "value": 500 },
|
||||
"machine_max_acceleration_z": { "value": 50 },
|
||||
"machine_max_feedrate_e": { "value": 25 },
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 5 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.3 },
|
||||
"machine_name": { "default_value": "Eazao M700" },
|
||||
"machine_start_gcode": { "default_value": "G21 ;set units to millimeters\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ;Home\nG1 Z25.0 F1500 ;move the platform down 15mm\nG92 E0 ;extruder reset\nG1 F300 E5\nG92 E0 ;The extruder is forced to zero again\nM302\nM163 S0 P0.87; Set Mix Factor\nM163 S1 P0.13; Set Mix Factor\nM164 S0" },
|
||||
"machine_width": { "default_value": 520 },
|
||||
"magic_spiralize": { "value": true },
|
||||
"material_final_print_temperature": { "value": "0" },
|
||||
"material_initial_print_temperature": { "value": "0" },
|
||||
"material_print_temperature": { "value": "0" },
|
||||
"material_print_temperature_layer_0": { "value": "0" },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"retraction_amount": { "value": 7 },
|
||||
"retraction_combing": { "value": "'noskin'" },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_enable": { "value": false },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"speed_print": { "value": 20.0 },
|
||||
"speed_travel": { "value": 20.0 },
|
||||
"speed_wall": { "value": 20.0 },
|
||||
"speed_wall_0": { "value": 20.0 },
|
||||
"speed_wall_x": { "value": 20.0 },
|
||||
"speed_z_hop": { "value": "machine_max_feedrate_z" },
|
||||
"top_bottom_pattern": { "value": "concentric" },
|
||||
"top_bottom_thickness": { "value": 3 },
|
||||
"wall_thickness": { "value": 5.0 }
|
||||
}
|
||||
}
|
74
resources/definitions/eazao_potter.def.json
Normal file
74
resources/definitions/eazao_potter.def.json
Normal file
|
@ -0,0 +1,74 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Eazao Potter",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "Eazao",
|
||||
"manufacturer": "Eazao",
|
||||
"file_formats": "text/x-gcode",
|
||||
"has_machine_quality": false,
|
||||
"has_materials": false,
|
||||
"machine_extruder_trains": { "0": "eazao_potter_extruder_0" },
|
||||
"preferred_quality_type": "normal"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"acceleration_print": { "value": 300 },
|
||||
"acceleration_travel": { "value": 300 },
|
||||
"adhesion_type": { "default_value": "'none'" },
|
||||
"bottom_layers": { "value": 3 },
|
||||
"cool_fan_enabled": { "value": false },
|
||||
"infill_sparse_density": { "value": 0 },
|
||||
"initial_bottom_layers": { "value": 3 },
|
||||
"jerk_print": { "value": 10 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
"layer_height": { "value": 1.0 },
|
||||
"layer_height_0": { "value": 1.0 },
|
||||
"line_width": { "value": 3.0 },
|
||||
"machine_acceleration": { "value": 300 },
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_depth": { "default_value": 167 },
|
||||
"machine_end_gcode": { "default_value": "G92 Z0 E0\nG1 F1500 Z10 E-2\nM82\nM84 ;steppers off\n" },
|
||||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_height": { "default_value": 280 },
|
||||
"machine_max_acceleration_e": { "value": 500 },
|
||||
"machine_max_acceleration_x": { "value": 500 },
|
||||
"machine_max_acceleration_y": { "value": 500 },
|
||||
"machine_max_acceleration_z": { "value": 50 },
|
||||
"machine_max_feedrate_e": { "value": 25 },
|
||||
"machine_max_feedrate_x": { "value": 100 },
|
||||
"machine_max_feedrate_y": { "value": 100 },
|
||||
"machine_max_feedrate_z": { "value": 5 },
|
||||
"machine_max_jerk_e": { "value": 5 },
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.3 },
|
||||
"machine_name": { "default_value": "Eazao Potter" },
|
||||
"machine_start_gcode": { "default_value": "G21 ;set units to millimeters\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ;Home\nG1 Z25.0 F1500 ;move the platform down 25mm\nG92 E0 ;extruder reset\nG1 F1500 E2\nG92 E0 ;The extruder is forced to zero again\nM302\nM163 S0 P0.85; Set Mix Factor\nM163 S1 P0.15; Set Mix Factor\nM164 S0" },
|
||||
"machine_width": { "default_value": 167 },
|
||||
"magic_spiralize": { "value": true },
|
||||
"material_final_print_temperature": { "value": "0" },
|
||||
"material_initial_print_temperature": { "value": "0" },
|
||||
"material_print_temperature": { "value": "0" },
|
||||
"material_print_temperature_layer_0": { "value": "0" },
|
||||
"optimize_wall_printing_order": { "value": "True" },
|
||||
"retraction_amount": { "value": 7 },
|
||||
"retraction_combing": { "value": "'noskin'" },
|
||||
"retraction_count_max": { "value": 100 },
|
||||
"retraction_enable": { "value": false },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"speed_print": { "value": 25.0 },
|
||||
"speed_travel": { "value": 25.0 },
|
||||
"speed_wall": { "value": 25.0 },
|
||||
"speed_wall_0": { "value": 25.0 },
|
||||
"speed_wall_x": { "value": 25.0 },
|
||||
"speed_z_hop": { "value": "machine_max_feedrate_z" },
|
||||
"top_bottom_pattern": { "value": "concentric" },
|
||||
"top_bottom_thickness": { "value": 3 },
|
||||
"wall_thickness": { "value": 3.0 }
|
||||
}
|
||||
}
|
|
@ -9,9 +9,8 @@
|
|||
"manufacturer": "Eazao",
|
||||
"file_formats": "text/x-gcode",
|
||||
"has_machine_quality": false,
|
||||
"has_materials": true,
|
||||
"has_materials": false,
|
||||
"machine_extruder_trains": { "0": "eazao_zero_extruder_0" },
|
||||
"preferred_material": "generic_pla",
|
||||
"preferred_quality_type": "normal"
|
||||
},
|
||||
"overrides":
|
||||
|
@ -20,11 +19,10 @@
|
|||
"acceleration_print": { "value": 300 },
|
||||
"acceleration_travel": { "value": 300 },
|
||||
"adhesion_type": { "default_value": "none" },
|
||||
"bottom_layers": { "value": 2 },
|
||||
"bottom_layers": { "value": 3 },
|
||||
"cool_fan_enabled": { "value": false },
|
||||
"infill_sparse_density": { "value": 0 },
|
||||
"initial_bottom_layers": { "value": 2 },
|
||||
"jerk_enabled": { "value": false },
|
||||
"initial_bottom_layers": { "value": 3 },
|
||||
"jerk_print": { "value": 10 },
|
||||
"jerk_travel": { "value": "jerk_print" },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
|
@ -34,7 +32,7 @@
|
|||
"machine_acceleration": { "value": 300 },
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_depth": { "default_value": 150 },
|
||||
"machine_end_gcode": { "default_value": "G92 E10\nG1 E-10 F300\nG28 X0 Y0 ;move X Y to min endstops\nM82\nM84 ;steppers off\n" },
|
||||
"machine_end_gcode": { "default_value": "G92 Z0 E0\nG1 F1500 E-2\nG1 F1500 Z10\nG28 X0;move X Y to min endstops\nM82\nM84 ;steppers off\n" },
|
||||
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||
"machine_heated_bed": { "default_value": false },
|
||||
"machine_height": { "default_value": 240 },
|
||||
|
@ -49,9 +47,10 @@
|
|||
"machine_max_jerk_e": { "value": 5 },
|
||||
"machine_max_jerk_xy": { "value": 10 },
|
||||
"machine_max_jerk_z": { "value": 0.3 },
|
||||
"machine_name": { "default_value": "EAZAO Zero" },
|
||||
"machine_start_gcode": { "default_value": "G21 \nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ;Home \nG1 Z15.0 F1500 ;move the platform down 15mm\nG92 E0 \nG1 F300 E10\nG92 E0\nM302\nM163 S0 P0.9; Set Mix Factor\nM163 S1 P0.1; Set Mix Factor\nM164 S0\n" },
|
||||
"machine_name": { "default_value": "Eazao Zero" },
|
||||
"machine_start_gcode": { "default_value": "G21 \nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ;Home \nG1 Z15.0 F1500 ;move the platform down 15mm\nG92 E0 \nG1 F1500 E2\nG92 E0\nM302\nM163 S0 P0.8; Set Mix Factor\nM163 S1 P0.2; Set Mix Factor\nM164 S0\n" },
|
||||
"machine_width": { "default_value": 150 },
|
||||
"magic_spiralize": { "value": true },
|
||||
"material_final_print_temperature": { "value": "0" },
|
||||
"material_initial_print_temperature": { "value": "0" },
|
||||
"material_print_temperature": { "value": "0" },
|
||||
|
@ -64,18 +63,10 @@
|
|||
"retraction_enable": { "value": false },
|
||||
"retraction_extrusion_window": { "value": 10 },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"retraction_hop_enabled": { "value": false },
|
||||
"retraction_speed": { "value": 25 },
|
||||
"speed_print": { "value": 20.0 },
|
||||
"speed_travel": { "value": 20.0 },
|
||||
"speed_wall": { "value": 20.0 },
|
||||
"speed_wall_0": { "value": 20.0 },
|
||||
"speed_wall_x": { "value": 20.0 },
|
||||
"speed_print": { "value": 25.0 },
|
||||
"speed_z_hop": { "value": "machine_max_feedrate_z" },
|
||||
"top_bottom_thickness": { "value": 0 },
|
||||
"travel_avoid_other_parts": { "value": true },
|
||||
"travel_avoid_supports": { "value": false },
|
||||
"travel_retract_before_outer_wall": { "value": false },
|
||||
"top_bottom_pattern": { "value": "concentric" },
|
||||
"top_bottom_thickness": { "value": 3 },
|
||||
"wall_thickness": { "value": 3.0 }
|
||||
}
|
||||
}
|
|
@ -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",
|
||||
|
@ -764,6 +765,15 @@
|
|||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"reset_flow_duration":
|
||||
{
|
||||
"enabled": "gradual_flow_enabled",
|
||||
"value": 2.0,
|
||||
"label": "Reset flow duration",
|
||||
"description": "For any travel move longer than this value, the material flow is reset to the paths target flow",
|
||||
"unit": "s",
|
||||
"type": "float"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -1342,6 +1352,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",
|
||||
|
@ -2317,7 +2336,7 @@
|
|||
"label": "Skin Edge Support Thickness",
|
||||
"description": "The thickness of the extra infill that supports skin edges.",
|
||||
"unit": "mm",
|
||||
"default_value": 0.8,
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "machine_height",
|
||||
"maximum_value_warning": "resolveOrValue('infill_sparse_thickness') * 10",
|
||||
|
@ -2332,7 +2351,7 @@
|
|||
{
|
||||
"label": "Skin Edge Support Layers",
|
||||
"description": "The number of infill layers that supports skin edges.",
|
||||
"default_value": 4,
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
"maximum_value_warning": "10",
|
||||
"type": "int",
|
||||
|
@ -2344,6 +2363,21 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"extra_infill_lines_to_support_skins":
|
||||
{
|
||||
"label": "Extra Infill Lines To Support Skins",
|
||||
"description": "Add extra lines into the infill pattern to support skins above. This option prevents holes or plastic blobs that sometime show in complex shaped skins due to the infill below not correctly supporting the skin layer being printed above. 'Walls' supports just the outlines of the skin, whereas 'Walls and Lines' also supports the ends of the lines that make up the skin.",
|
||||
"type": "enum",
|
||||
"options":
|
||||
{
|
||||
"walls_and_lines": "Walls and Lines",
|
||||
"walls": "Walls Only",
|
||||
"none": "None"
|
||||
},
|
||||
"default_value": "walls_and_lines",
|
||||
"value": "'none' if infill_sparse_density > 50 else 'walls' if skin_edge_support_thickness > 0 else 'walls_and_lines'",
|
||||
"enabled": "infill_sparse_density > 0 and infill_pattern not in ('lightning', 'concentric', 'cross','cross_3d') and wall_line_count > 0 and top_layers > 0"
|
||||
},
|
||||
"lightning_infill_support_angle":
|
||||
{
|
||||
"label": "Lightning Infill Support Angle",
|
||||
|
@ -3130,6 +3164,60 @@
|
|||
"enabled": false,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"gradual_flow_enabled":
|
||||
{
|
||||
"label": "Gradual flow enabled",
|
||||
"description": "Enable gradual flow changes. When enabled, the flow is gradually increased/decreased to the target flow. This is useful for printers with a bowden tube where the flow is not immediately changed when the extruder motor starts/stops.",
|
||||
"type": "bool",
|
||||
"default_value": false,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"max_flow_acceleration":
|
||||
{
|
||||
"enabled": "gradual_flow_enabled",
|
||||
"label": "Gradual flow max acceleration",
|
||||
"description": "Maximum acceleration for gradual flow changes",
|
||||
"type": "float",
|
||||
"unit": "mm\u00b3/s\u00b2",
|
||||
"default_value": 1,
|
||||
"minimum_value_warning": 0.1,
|
||||
"maximum_value_warning": 99999,
|
||||
"minimum_value": 0.01,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"comments": "when enabled, each second the flow will at max be increased/decreased by this value"
|
||||
},
|
||||
"layer_0_max_flow_acceleration":
|
||||
{
|
||||
"enabled": "gradual_flow_enabled",
|
||||
"value": "max_flow_acceleration",
|
||||
"label": "Initial layer max flow acceleration",
|
||||
"description": "Minimum speed for gradual flow changes for the first layer",
|
||||
"type": "float",
|
||||
"unit": "mm\u00b3/s\u00b2",
|
||||
"default_value": 1,
|
||||
"minimum_value_warning": 0.1,
|
||||
"maximum_value_warning": 99999,
|
||||
"minimum_value": 0.01,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
},
|
||||
"gradual_flow_discretisation_step_size":
|
||||
{
|
||||
"enabled": "gradual_flow_enabled",
|
||||
"label": "Gradual flow discretisation step size",
|
||||
"description": "Duration of each step in the gradual flow change",
|
||||
"type": "float",
|
||||
"unit": "s",
|
||||
"default_value": 0.2,
|
||||
"maximum_value_warning": 1.0,
|
||||
"maximum_value": 5.0,
|
||||
"minimum_value_warning": 0.1,
|
||||
"minimum_value": 0.01,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -4363,6 +4451,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 +4464,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 +4546,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 +4724,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 +5254,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 +6356,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 +6369,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 +6381,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 +6393,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 +6534,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 +6627,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 +6736,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 +6764,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 +6805,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 +6818,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 +6830,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 +6842,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 +7101,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 +7185,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 +7238,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 +8375,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" },
|
||||
|
@ -107,7 +111,6 @@
|
|||
"roofing_layer_count": { "value": "1" },
|
||||
"roofing_material_flow": { "value": "material_flow" },
|
||||
"skin_angles": { "value": "[] if infill_pattern not in ['cross', 'cross_3d'] else [20, 110]" },
|
||||
"skin_edge_support_thickness": { "value": "4 * layer_height if infill_sparse_density < 30 else 0" },
|
||||
"skin_material_flow": { "value": "0.95 * material_flow" },
|
||||
"skin_material_flow_layer_0": { "value": "95" },
|
||||
"skin_monotonic": { "value": "roofing_layer_count == 0" },
|
||||
|
@ -134,7 +137,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": "" },
|
||||
|
@ -113,10 +112,10 @@
|
|||
"machine_head_with_fans_polygon":
|
||||
{
|
||||
"default_value": [
|
||||
[-30, -80],
|
||||
[-30, 20],
|
||||
[50, 20],
|
||||
[50, -80]
|
||||
[-35, -80],
|
||||
[-35, 30],
|
||||
[55, 30],
|
||||
[55, -80]
|
||||
]
|
||||
},
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
|
@ -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 }
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue