Merge branch 'main' into TIme-Lapse

This commit is contained in:
Erwan MATHIEU 2024-08-13 09:21:20 +02:00 committed by GitHub
commit ee65d93fb6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
498 changed files with 76813 additions and 69666 deletions

View File

@ -6,9 +6,9 @@ body:
attributes: attributes:
value: | value: |
### ✨Try our improved Cura 5.7✨ ### ✨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. 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. 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 ### Project File
@ -35,7 +35,7 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | 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) If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
- type: input - type: input
attributes: attributes:

View File

@ -30,6 +30,29 @@ on:
required: true required: true
type: boolean 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: schedule:
# Daily at 4:15 CET (main-branch) and 5:15 CET (release-branch) # Daily at 4:15 CET (main-branch) and 5:15 CET (release-branch)
- cron: '15 3 * * *' - cron: '15 3 * * *'
@ -70,7 +93,7 @@ jobs:
enterprise: ${{ github.event.inputs.enterprise == 'true' }} enterprise: ${{ github.event.inputs.enterprise == 'true' }}
staging: ${{ github.event.inputs.staging == 'true' }} staging: ${{ github.event.inputs.staging == 'true' }}
architecture: X64 architecture: X64
operating_system: ubuntu-22.04 operating_system: self-hosted-Ubuntu22-X64
secrets: inherit secrets: inherit
macos-installer: macos-installer:
@ -109,7 +132,7 @@ jobs:
fetch-depth: 1 fetch-depth: 1
- name: Download the run info - name: Download the run info
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: linux-run-info name: linux-run-info
@ -151,13 +174,13 @@ jobs:
f.writelines(f"NIGHTLY_TIME={nightly_creation_time}\n") f.writelines(f"NIGHTLY_TIME={nightly_creation_time}\n")
- name: Download linux installer jobs artifacts - name: Download linux installer jobs artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.LINUX }}-AppImage name: ${{ steps.filename.outputs.LINUX }}-AppImage
path: installers path: installers
- name: Download linux installer jobs asc artifacts - name: Download linux installer jobs asc artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.LINUX }}-asc name: ${{ steps.filename.outputs.LINUX }}-asc
path: installers path: installers
@ -175,13 +198,13 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download win msi installer jobs artifacts - name: Download win msi installer jobs artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.WIN_MSI }}-msi name: ${{ steps.filename.outputs.WIN_MSI }}-msi
path: installers path: installers
- name: Download win exe installer jobs artifacts - name: Download win exe installer jobs artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.WIN_EXE }}-exe name: ${{ steps.filename.outputs.WIN_EXE }}-exe
path: installers path: installers
@ -199,13 +222,13 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download MacOS (X64) dmg installer jobs artifacts - name: Download MacOS (X64) dmg installer jobs artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.MAC_X64_DMG }}-dmg name: ${{ steps.filename.outputs.MAC_X64_DMG }}-dmg
path: installers path: installers
- name: Download MacOS (X64) pkg installer jobs artifacts - name: Download MacOS (X64) pkg installer jobs artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.MAC_X64_PKG }}-pkg name: ${{ steps.filename.outputs.MAC_X64_PKG }}-pkg
path: installers path: installers
@ -223,13 +246,13 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Download MacOS (ARM-64) dmg installer jobs artifacts - name: Download MacOS (ARM-64) dmg installer jobs artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.MAC_ARM_DMG }}-dmg name: ${{ steps.filename.outputs.MAC_ARM_DMG }}-dmg
path: installers path: installers
- name: Download MacOS (ARM-64) pkg installer jobs artifacts - name: Download MacOS (ARM-64) pkg installer jobs artifacts
uses: actions/download-artifact@v2 uses: actions/download-artifact@v4
with: with:
name: ${{ steps.filename.outputs.MAC_ARM_PKG }}-pkg name: ${{ steps.filename.outputs.MAC_ARM_PKG }}-pkg
path: installers path: installers

View File

@ -34,10 +34,11 @@ on:
operating_system: operating_system:
description: 'OS' description: 'OS'
required: true required: true
default: 'ubuntu-22.04' default: 'self-hosted-Ubuntu22-X64'
type: choice type: choice
options: options:
- ubuntu-22.04 - ubuntu-22.04
- self-hosted-Ubuntu22-X64
jobs: jobs:
linux-installer: linux-installer:

View File

@ -40,7 +40,6 @@ on:
options: options:
- self-hosted-X64 - self-hosted-X64
- self-hosted-ARM64 - self-hosted-ARM64
- macos-11
- macos-12 - macos-12
jobs: jobs:

View File

@ -5,6 +5,9 @@ on:
path: path:
- "resources/**" - "resources/**"
permissions:
contents: read
jobs: jobs:
printer-linter-diagnose: printer-linter-diagnose:
name: Printer linter PR diagnose name: Printer linter PR diagnose
@ -50,7 +53,7 @@ jobs:
run: | run: |
echo ${{ github.event.number }} > printer-linter-result/pr-id.txt 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.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@v2
with: with:

View File

@ -6,88 +6,106 @@ on:
types: [completed] types: [completed]
jobs: jobs:
clang-tidy-results: printer-linter-result:
# Trigger the job only if the previous (insecure) workflow completed successfully # 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' }} if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
pull-requests: write
steps: steps:
- name: Download analysis results - name: Download analysis results
uses: actions/github-script@v3.1.0 uses: actions/github-script@v7
with: with:
script: | script: |
let artifacts = await github.actions.listWorkflowRunArtifacts({ const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
run_id: ${{github.event.workflow_run.id }}, 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" return artifact.name == "printer-linter-result"
})[0]; })[0];
let download = await github.actions.downloadArtifact({ const download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner, owner: context.repo.owner,
repo: context.repo.repo, repo: context.repo.repo,
artifact_id: matchArtifact.id, artifact_id: matchArtifact.id,
archive_format: "zip", archive_format: "zip",
}); });
let fs = require("fs"); const fs = require("fs");
fs.writeFileSync("${{github.workspace}}/printer-linter-result.zip", Buffer.from(download.data)); 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));
- name: Extract analysis results - name: Extract analysis results
run: | run: |
mkdir printer-linter-result 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 - name: Run PR Comments
if: env.commentFileExists == 'true' if: env.commentFileExists == 'true'
uses: peter-evans/create-or-update-comment@v4 uses: peter-evans/create-or-update-comment@v4
with: with:
issue-number: ${{ env.pr_id }} issue-number: ${{ env.PR_ID }}
body-path: 'printer-linter-result/comment.md' body-path: 'printer-linter-result/comment.md'
- name: Run clang-tidy-pr-comments action - name: Run clang-tidy-pr-comments action
uses: platisd/clang-tidy-pr-comments@bc0bb7da034a8317d54e7fe1e819159002f4cc40 uses: platisd/clang-tidy-pr-comments@v1
with: with:
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
clang_tidy_fixes: printer-linter-result/fixes.yml clang_tidy_fixes: printer-linter-result/fixes.yml
pull_request_id: ${{ env.pr_id }} pull_request_id: ${{ env.PR_ID }}
request_changes: true request_changes: true

View 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

View File

@ -0,0 +1,179 @@
name: Prepare Release Candidate
run-name: Release Candidate for Cura ${{ inputs.cura_version }} by @${{ github.actor }}
on:
workflow_dispatch:
inputs:
cura_version:
description: 'Cura version number, e.g. 5.7.0, 5.7.2 or 5.8.0-beta.2'
required: true
type: string
jobs:
parse-version:
name: Parse input version string
runs-on: ubuntu-latest
outputs:
version_major: ${{ steps.version_parser.outputs.major }}
version_minor: ${{ steps.version_parser.outputs.minor }}
version_patch: ${{ steps.version_parser.outputs.patch }}
branch_name: ${{ steps.version_parser.outputs.major }}.${{ steps.version_parser.outputs.minor }}
steps:
- name: Parse version string
id: version_parser
uses: booxmedialtd/ws-action-parse-semver@v1.4.7
with:
input_string: ${{ inputs.cura_version }}
freeze-packages-versions:
name: Freeze packges versions
uses: Ultimaker/Cura-workflows/.github/workflows/cura-set-packages-versions.yml@main
needs: [parse-version]
with:
cura_version: ${{ inputs.cura_version }}
create_feature_branch: false
secrets: inherit
find-rc-tag:
name: Find RC tag name
runs-on: ubuntu-latest
needs: [freeze-packages-versions]
outputs:
tag_name: ${{ steps.find-available-tag-name.outputs.tag_name }}
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
fetch-tags: true
fetch-depth: 0
- name: Find available tag name
id: find-available-tag-name
run: |
VERSION=${{ inputs.cura_version }}
RC_INDEX=0
while
RC_INDEX=$((RC_INDEX+1))
TAG_NAME="$VERSION-RC$RC_INDEX"
[[ $(git tag -l "$TAG_NAME") ]]
do true; done
echo "tag_name=$TAG_NAME" >> "$GITHUB_OUTPUT"
create-tags:
name: Create tags
runs-on: ubuntu-latest
needs: [parse-version, find-rc-tag]
strategy:
matrix:
repository: [Cura, Uranium, CuraEngine, cura-binary-data, fdm_materials]
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
repository: Ultimaker/${{ matrix.repository }}
ref: ${{ needs.parse-version.outputs.branch_name }}
token: ${{ secrets.CURA_AUTORELEASE_PAT }}
- name: Create tag
run: |
git tag ${{ needs.find-rc-tag.outputs.tag_name }}
git push origin tag ${{ needs.find-rc-tag.outputs.tag_name }}
create-dependencies-packages:
name: Create conan packages for dependencies
uses: ultimaker/cura-workflows/.github/workflows/conan-package-release.yml@main
needs: [parse-version, freeze-packages-versions]
strategy:
matrix:
repository: [Cura, Uranium, CuraEngine, cura-binary-data, fdm_materials]
include:
- conan_recipe_root: "."
- repository: Cura
conan_recipe_root: "resources"
with:
repository: ${{ matrix.repository }}
ref_name: ${{ needs.parse-version.outputs.branch_name }}
version: ${{ inputs.cura_version }}
conan_release: true
conan_user_channel: ultimaker/stable
conan_internal: false
conan_latest: true
conan_recipe_root: ${{ matrix.conan_recipe_root }}
secrets: inherit
create-cura-package:
name: Create conan package for Cura
uses: ultimaker/cura-workflows/.github/workflows/conan-package-release.yml@main
needs: [parse-version, create-dependencies-packages]
with:
repository: Cura
ref_name: ${{ needs.parse-version.outputs.branch_name }}
version: ${{ inputs.cura_version }}
conan_release: true
conan_user_channel: ultimaker/stable
conan_internal: false
conan_latest: true
secrets: inherit
create-installers:
name: Create installers
uses: ./.github/workflows/installers.yml
needs: [parse-version, create-cura-package]
with:
cura_conan_version: cura/${{ inputs.cura_version }}@/
enterprise: false
staging: false
nightly: false
secrets: inherit
create-release-draft:
name: Create the release draft
runs-on: ubuntu-latest
needs: [create-installers, parse-version]
steps:
- name: Checkout Cura repo
uses: actions/checkout@v4
with:
ref: ${{ needs.parse-version.outputs.branch_name }}
- name: Extract changelog
run: python ./scripts/extract_changelog.py --version ${{ needs.parse-version.outputs.version_major }}.${{ needs.parse-version.outputs.version_minor }}.${{ needs.parse-version.outputs.version_patch }} --changelog ./resources/texts/change_log.txt > formatted_changelog.txt
- name: Get commit id for release
id: get-commit-id
uses: iawia002/get-tag-or-commit-id@v1.0.1
with:
length: 40
- name: Create release
uses: notpeelz/action-gh-create-release@v5.0.1
with:
target: ${{ steps.get-commit-id.outputs.id }}
tag: ${{ inputs.cura_version }}
strategy: replace
title: UltiMaker Cura ${{ inputs.cura_version }}
draft: true
body-source: file
body: formatted_changelog.txt
- name: Download artifacts
uses: actions/download-artifact@v4.1.7
with:
path: artifacts
merge-multiple: true
- name: Upload artifacts
working-directory: artifacts
run: |
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-linux-X64.AppImage --clobber
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-linux-X64.AppImage.asc --clobber
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-ARM64.dmg --clobber
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-ARM64.pkg --clobber
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-X64.dmg --clobber
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-macos-X64.pkg --clobber
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-win64-X64.exe --clobber
gh release upload ${{ inputs.cura_version }} UltiMaker-Cura-${{ inputs.cura_version }}-win64-X64.msi --clobber
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -2,10 +2,11 @@ checks:
diagnostic-mesh-file-extension: true diagnostic-mesh-file-extension: true
diagnostic-mesh-file-size: true diagnostic-mesh-file-size: true
diagnostic-definition-redundant-override: true diagnostic-definition-redundant-override: true
diagnostic-definition-experimental-setting: true
diagnostic-resources-macos-app-directory-name: true diagnostic-resources-macos-app-directory-name: true
diagnostic-incorrect-formula: true diagnostic-incorrect-formula: true
diagnostic-resource-file-deleted: true diagnostic-resource-file-deleted: true
diagnostic-material-temperature-defined: true diagnostic-material-temperature-defined: false
diagnostic-long-profile-names: true diagnostic-long-profile-names: true
fixes: fixes:
diagnostic-definition-redundant-override: true diagnostic-definition-redundant-override: true

View File

@ -1,15 +1,14 @@
version: "5.8.0-alpha.0" version: "5.9.0-alpha.0"
requirements: requirements:
- "cura_resources/(latest)@ultimaker/testing" - "cura_resources/(latest)@ultimaker/testing"
- "uranium/(latest)@ultimaker/testing" - "uranium/(latest)@ultimaker/testing"
- "curaengine/(latest)@ultimaker/testing" - "curaengine/(latest)@ultimaker/testing"
- "cura_binary_data/(latest)@ultimaker/testing" - "cura_binary_data/(latest)@ultimaker/testing"
- "fdm_materials/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing"
- "curaengine_plugin_gradual_flow/0.1.0-beta.3" - "curaengine_plugin_gradual_flow/0.1.0-beta.4"
- "dulcificum/latest@ultimaker/testing" - "dulcificum/0.2.1"
- "pysavitar/5.3.0" - "pysavitar/5.3.0"
- "pynest2d/5.3.0" - "pynest2d/5.3.0"
- "curaengine_grpc_definitions/0.2.0"
- "native_cad_plugin/2.0.0" - "native_cad_plugin/2.0.0"
requirements_internal: requirements_internal:
- "fdm_materials/(latest)@internal/testing" - "fdm_materials/(latest)@internal/testing"

View File

@ -329,7 +329,6 @@ class CuraConan(ConanFile):
self.options["cpython"].shared = True self.options["cpython"].shared = True
self.options["boost"].header_only = True self.options["boost"].header_only = True
if self.settings.os == "Linux": if self.settings.os == "Linux":
self.options["curaengine_grpc_definitions"].shared = True
self.options["openssl"].shared = True self.options["openssl"].shared = True
if self.conf.get("user.curaengine:sentry_url", "", check_type=str) != "": if self.conf.get("user.curaengine:sentry_url", "", check_type=str) != "":
self.options["curaengine"].enable_sentry = True self.options["curaengine"].enable_sentry = True

View File

@ -115,15 +115,15 @@ class Account(QObject):
self._update_timer.setSingleShot(True) self._update_timer.setSingleShot(True)
self._update_timer.timeout.connect(self.sync) self._update_timer.timeout.connect(self.sync)
self._sync_services: Dict[str, int] = {}
"""contains entries "service_name" : SyncState""" """contains entries "service_name" : SyncState"""
self.syncRequested.connect(self._updatePermissions) self._sync_services: Dict[str, int] = {}
def initialize(self) -> None: def initialize(self) -> None:
self._authorization_service.initialize(self._application.getPreferences()) self._authorization_service.initialize(self._application.getPreferences())
self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged) self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged)
self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged) self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged)
self._authorization_service.accessTokenChanged.connect(self._onAccessTokenChanged) self._authorization_service.accessTokenChanged.connect(self._onAccessTokenChanged)
self._authorization_service.accessTokenChanged.connect(self._updatePermissions)
self._authorization_service.loadAuthDataFromPreferences() self._authorization_service.loadAuthDataFromPreferences()
@pyqtProperty(int, notify=syncStateChanged) @pyqtProperty(int, notify=syncStateChanged)

View File

@ -1,7 +1,13 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # 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: if TYPE_CHECKING:
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
@ -47,3 +53,57 @@ class Settings:
""" """
return self.application.getSidebarCustomMenuItems() 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

View File

@ -14,7 +14,7 @@ DEFAULT_CURA_LATEST_URL = "https://software.ultimaker.com/latest.json"
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for # 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 # 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. # CuraVersion.py.in template.
CuraSDKVersion = "8.7.0" CuraSDKVersion = "8.8.0"
try: try:
from cura.CuraVersion import CuraLatestURL from cura.CuraVersion import CuraLatestURL

View File

@ -1218,6 +1218,8 @@ class CuraApplication(QtApplication):
# Once we're at this point, everything should have been flushed already (past OnExitCallbackManager). # 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. # 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) # (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) os._exit(0)
return super().event(event) return super().event(event)

View File

@ -24,6 +24,10 @@ intent_translations["quick"] = {
"name": catalog.i18nc("@label", "Draft"), "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.") "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"] = { intent_translations["solid"] = {
"name": catalog.i18nc("@label", "Solid"), "name": catalog.i18nc("@label", "Solid"),
"description": catalog.i18nc("@text", "description": catalog.i18nc("@text",

View File

@ -96,7 +96,7 @@ class AuthorizationHelpers:
return return
if token_response.error() != QNetworkReply.NetworkError.NoError: 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 return
callback(AuthenticationResponse(success = True, callback(AuthenticationResponse(success = True,

View 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

View File

@ -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. # Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional from typing import Optional
from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal
from cura.PrinterOutput.FormatMaps import FormatMaps
from .MaterialOutputModel import MaterialOutputModel from .MaterialOutputModel import MaterialOutputModel
@ -45,15 +46,8 @@ class ExtruderConfigurationModel(QObject):
@staticmethod @staticmethod
def applyNameMappingHotend(hotendId) -> str: def applyNameMappingHotend(hotendId) -> str:
_EXTRUDER_NAME_MAP = { if hotendId in FormatMaps.EXTRUDER_NAME_MAP:
"mk14_hot":"1XA", return FormatMaps.EXTRUDER_NAME_MAP[hotendId]
"mk14_hot_s":"2XA",
"mk14_c":"1C",
"mk14":"1A",
"mk14_s":"2A"
}
if hotendId in _EXTRUDER_NAME_MAP:
return _EXTRUDER_NAME_MAP[hotendId]
return hotendId return hotendId
@pyqtProperty(str, fset = setHotendID, notify = extruderConfigurationChanged) @pyqtProperty(str, fset = setHotendID, notify = extruderConfigurationChanged)

View File

@ -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. # Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional from typing import Optional
from PyQt6.QtCore import pyqtProperty, QObject from PyQt6.QtCore import pyqtProperty, QObject
from cura.PrinterOutput.FormatMaps import FormatMaps
class MaterialOutputModel(QObject): class MaterialOutputModel(QObject):
@ -23,29 +24,9 @@ class MaterialOutputModel(QObject):
@staticmethod @staticmethod
def getMaterialFromDefinition(guid, type, brand, name): def getMaterialFromDefinition(guid, type, brand, name):
if guid is None and brand != "empty" and type in FormatMaps.MATERIAL_MAP:
_MATERIAL_MAP = { "abs" :{"name" :"ABS" ,"guid": "2780b345-577b-4a24-a2c5-12e6aad3e690"}, name = FormatMaps.MATERIAL_MAP[type]["name"]
"abs-cf10" :{"name": "ABS-CF" ,"guid": "495a0ce5-9daf-4a16-b7b2-06856d82394d"}, guid = FormatMaps.MATERIAL_MAP[type]["guid"]
"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"]
return name, guid return name, guid

View File

@ -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. # Cura is released under the terms of the LGPLv3 or higher.
from UM.FileHandler.FileHandler import FileHandler #For typing. 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 UM.Scene.SceneNode import SceneNode #For typing.
from cura.API import Account from cura.API import Account
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.FormatMaps import FormatMaps
from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionState, ConnectionType from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionState, ConnectionType
@ -419,13 +420,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
@staticmethod @staticmethod
def applyPrinterTypeMapping(printer_type): def applyPrinterTypeMapping(printer_type):
_PRINTER_TYPE_NAME = { if printer_type in FormatMaps.PRINTER_TYPE_NAME:
"fire_e": "ultimaker_method", return FormatMaps.PRINTER_TYPE_NAME[printer_type]
"lava_f": "ultimaker_methodx",
"magma_10": "ultimaker_methodxl"
}
if printer_type in _PRINTER_TYPE_NAME:
return _PRINTER_TYPE_NAME[printer_type]
return printer_type return printer_type
@pyqtProperty(str, constant = True) @pyqtProperty(str, constant = True)

View File

@ -83,6 +83,15 @@ class GlobalStack(CuraContainerStack):
""" """
return self.getMetaDataEntry("supports_material_export", False) 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 @classmethod
def getLoadingPriority(cls) -> int: def getLoadingPriority(cls) -> int:
return 2 return 2

View File

@ -17,6 +17,7 @@ from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
from UM.Scene.GroupDecorator import GroupDecorator from UM.Scene.GroupDecorator import GroupDecorator
from UM.Scene.SceneNode import SceneNode # For typing. from UM.Scene.SceneNode import SceneNode # For typing.
from UM.Scene.SceneNodeSettings import SceneNodeSettings from UM.Scene.SceneNodeSettings import SceneNodeSettings
from UM.Util import parseBool
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
from cura.Machines.ContainerTree import ContainerTree from cura.Machines.ContainerTree import ContainerTree
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
@ -182,7 +183,7 @@ class ThreeMFReader(MeshReader):
um_node.printOrder = int(setting_value) um_node.printOrder = int(setting_value)
continue continue
if key =="drop_to_buildplate": if key =="drop_to_buildplate":
um_node.setSetting(SceneNodeSettings.AutoDropDown, eval(setting_value)) um_node.setSetting(SceneNodeSettings.AutoDropDown, parseBool(setting_value))
continue continue
if key in known_setting_keys: if key in known_setting_keys:
setting_container.setProperty(key, "value", setting_value) setting_container.setProperty(key, "value", setting_value)

View File

@ -96,7 +96,8 @@ class ThreeMFWriter(MeshWriter):
@staticmethod @staticmethod
def _convertUMNodeToSavitarNode(um_node, def _convertUMNodeToSavitarNode(um_node,
transformation = Matrix(), 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 """Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode
:returns: Uranium Scene node. :returns: Uranium Scene node.
@ -111,20 +112,26 @@ class ThreeMFWriter(MeshWriter):
savitar_node = Savitar.SceneNode() savitar_node = Savitar.SceneNode()
savitar_node.setName(um_node.getName()) savitar_node.setName(um_node.getName())
node_matrix = Matrix()
mesh_data = um_node.getMeshData() mesh_data = um_node.getMeshData()
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 # compensate for original center position, if object(s) is/are not around its zero position
if mesh_data is not None: if mesh_data is not None:
extents = mesh_data.getExtents() extents = mesh_data.getExtents()
if extents is not None: if extents is not None:
# We use a different coordinate space while writing, so flip Z and Y # 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) center_vector = Vector(-extents.center.x, -extents.center.y, -extents.center.z)
node_matrix.setByTranslation(center_vector) center_matrix.setByTranslation(center_vector)
node_matrix.multiply(um_node.getLocalTransformation()) node_matrix.preMultiply(center_matrix)
matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix.preMultiply(transformation)) matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix)
savitar_node.setTransformation(matrix_string) savitar_node.setTransformation(matrix_string)
if mesh_data is not None: if mesh_data is not None:
savitar_node.getMeshData().setVerticesFromBytes(mesh_data.getVerticesAsByteArray()) savitar_node.getMeshData().setVerticesFromBytes(mesh_data.getVerticesAsByteArray())
indices_array = mesh_data.getIndicesAsByteArray() indices_array = mesh_data.getIndicesAsByteArray()
@ -283,7 +290,8 @@ class ThreeMFWriter(MeshWriter):
for root_child in node.getChildren(): for root_child in node.getChildren():
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child, savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child,
transformation_matrix, transformation_matrix,
exported_model_settings) exported_model_settings,
center_mesh = True)
if savitar_node: if savitar_node:
savitar_scene.addSceneNode(savitar_node) savitar_scene.addSceneNode(savitar_node)
else: else:
@ -442,7 +450,7 @@ class ThreeMFWriter(MeshWriter):
def sceneNodesToString(scene_nodes: [SceneNode]) -> str: def sceneNodesToString(scene_nodes: [SceneNode]) -> str:
savitar_scene = Savitar.Scene() savitar_scene = Savitar.Scene()
for scene_node in scene_nodes: 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) savitar_scene.addSceneNode(savitar_node)
parser = Savitar.ThreeMFParser() parser = Savitar.ThreeMFParser()
scene_string = parser.sceneToString(savitar_scene) scene_string = parser.sceneToString(savitar_scene)

View File

@ -544,7 +544,7 @@ class CuraEngineBackend(QObject, Backend):
if job.getResult() == StartJobResult.ObjectsWithDisabledExtruder: if job.getResult() == StartJobResult.ObjectsWithDisabledExtruder:
self._error_message = Message(catalog.i18nc("@info:status", 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"), title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING) message_type = Message.MessageType.WARNING)
self._error_message.show() self._error_message.show()

View File

@ -146,6 +146,7 @@ class StartSliceJob(Job):
self._slice_message: Arcus.PythonMessage = slice_message self._slice_message: Arcus.PythonMessage = slice_message
self._is_cancelled: bool = False self._is_cancelled: bool = False
self._build_plate_number: Optional[int] = None 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 # cache for all setting values from all stacks (global & extruder) for the current machine
self._all_extruders_settings: Optional[Dict[str, Any]] = None self._all_extruders_settings: Optional[Dict[str, Any]] = None
@ -153,6 +154,9 @@ class StartSliceJob(Job):
def getSliceMessage(self) -> Arcus.PythonMessage: def getSliceMessage(self) -> Arcus.PythonMessage:
return self._slice_message return self._slice_message
def getAssociatedDisabledExtruders(self) -> Optional[str]:
return self._associated_disabled_extruders
def setBuildPlate(self, build_plate_number: int) -> None: def setBuildPlate(self, build_plate_number: int) -> None:
self._build_plate_number = build_plate_number self._build_plate_number = build_plate_number
@ -334,7 +338,7 @@ class StartSliceJob(Job):
if has_model_with_disabled_extruders: if has_model_with_disabled_extruders:
self.setResult(StartJobResult.ObjectsWithDisabledExtruder) self.setResult(StartJobResult.ObjectsWithDisabledExtruder)
associated_disabled_extruders = {p + 1 for p in associated_disabled_extruders} 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 return
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being # There are cases when there is nothing to slice. This can happen due to one at a time slicing not being
@ -362,7 +366,12 @@ class StartSliceJob(Job):
for extruder_stack in global_stack.extruderList: for extruder_stack in global_stack.extruderList:
self._buildExtruderMessage(extruder_stack) 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(): if not plugin.usePlugin():
continue continue
for slot in plugin.getSupportedSlots(): for slot in plugin.getSupportedSlots():
@ -550,9 +559,13 @@ class StartSliceJob(Job):
start_gcode = settings["machine_start_gcode"] start_gcode = settings["machine_start_gcode"]
# Remove all the comments from the start g-code # Remove all the comments from the start g-code
start_gcode = re.sub(r";.+?(\n|$)", "\n", start_gcode) start_gcode = re.sub(r";.+?(\n|$)", "\n", start_gcode)
if settings["material_bed_temp_prepend"]:
bed_temperature_settings = ["material_bed_temperature", "material_bed_temperature_layer_0"] 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} 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 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"] 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} 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 settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) is None

View File

@ -208,7 +208,7 @@ Item
anchors.rightMargin: UM.Theme.getSize("thin_margin").height anchors.rightMargin: UM.Theme.getSize("thin_margin").height
enabled: UM.Backend.state == UM.Backend.Done enabled: UM.Backend.state == UM.Backend.Done
currentIndex: UM.Backend.state == UM.Backend.Done ? dfFilenameTextfield.text.startsWith("MM")? 1 : 0 : 2 currentIndex: UM.Backend.state == UM.Backend.Done ? (Cura.MachineManager.activeMachine.getOutputFileFormats.includes("application/x-makerbot") ? 1 : 0) : 2
textRole: "text" textRole: "text"
valueRole: "value" valueRole: "value"

View File

@ -1,9 +1,8 @@
# Copyright (c) 2023 UltiMaker # Copyright (c) 2024 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from io import StringIO, BufferedIOBase from io import StringIO, BufferedIOBase
import json import json
from typing import cast, List, Optional, Dict from typing import cast, List, Optional, Dict, Tuple
from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED
import pyDulcificum as du import pyDulcificum as du
@ -19,6 +18,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.FormatMaps import FormatMaps
from cura.Snapshot import Snapshot from cura.Snapshot import Snapshot
from cura.Utils.Threading import call_on_qt_thread from cura.Utils.Threading import call_on_qt_thread
from cura.CuraVersion import ConanInstalls from cura.CuraVersion import ConanInstalls
@ -39,16 +39,27 @@ class MakerbotWriter(MeshWriter):
suffixes=["makerbot"] 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": 120, "height": 120},
{"prefix": "isometric_thumbnail", "width": 320, "height": 320}, {"prefix": "isometric_thumbnail", "width": 320, "height": 320},
{"prefix": "isometric_thumbnail", "width": 640, "height": 640}, {"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": 140, "height": 106},
{"prefix": "thumbnail", "width": 212, "height": 300}, {"prefix": "thumbnail", "width": 212, "height": 300},
{"prefix": "thumbnail", "width": 960, "height": 1460}, {"prefix": "thumbnail", "width": 960, "height": 1460},
{"prefix": "thumbnail", "width": 90, "height": 90},
] ]
_META_VERSION = "3.0.0" _META_VERSION = "3.0.0"
# must be called from the main thread because of OpenGL # must be called from the main thread because of OpenGL
@ -74,6 +85,7 @@ class MakerbotWriter(MeshWriter):
return None return None
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool: def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool:
metadata, file_format = self._getMeta(nodes)
if mode != MeshWriter.OutputMode.BinaryMode: if mode != MeshWriter.OutputMode.BinaryMode:
Logger.log("e", "MakerbotWriter does not support text mode.") Logger.log("e", "MakerbotWriter does not support text mode.")
self.setInformation(catalog.i18nc("@error:not supported", "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() gcode_text_io = StringIO()
success = gcode_writer.write(gcode_text_io, None) 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. # Writing the g-code failed. Then I can also not write the gzipped g-code.
if not success: if not success:
self.setInformation(gcode_writer.getInformation()) self.setInformation(gcode_writer.getInformation())
return False return False
match file_format:
json_toolpaths = du.gcode_2_miracle_jtp(gcode_text_io.getvalue()) case "application/x-makerbot-sketch":
metadata = self._getMeta(nodes) 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 = [] png_files = []
for png_format in self._PNG_FORMATS: for png_format in self._PNG_FORMATS:
@ -116,10 +134,34 @@ class MakerbotWriter(MeshWriter):
try: try:
with ZipFile(stream, "w", compression=ZIP_DEFLATED) as zip_stream: with ZipFile(stream, "w", compression=ZIP_DEFLATED) as zip_stream:
zip_stream.writestr("meta.json", json.dumps(metadata, indent=4)) 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: for png_file in png_files:
file, data = png_file["file"], png_file["data"] file, data = png_file["file"], png_file["data"]
zip_stream.writestr(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: except (IOError, OSError, BadZipFile) as ex:
Logger.log("e", f"Could not write to (.makerbot) file because: '{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.")) self.setInformation(catalog.i18nc("@error", "MakerbotWriter could not save to the designated path."))
@ -127,7 +169,7 @@ class MakerbotWriter(MeshWriter):
return True 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() application = CuraApplication.getInstance()
machine_manager = application.getMachineManager() machine_manager = application.getMachineManager()
global_stack = machine_manager.activeMachine global_stack = machine_manager.activeMachine
@ -143,7 +185,9 @@ class MakerbotWriter(MeshWriter):
nodes.append(node) nodes.append(node)
meta = dict() 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") meta["bot_type"] = global_stack.definition.getMetaDataEntry("reference_machine_id")
bounds: Optional[AxisAlignedBox] = None bounds: Optional[AxisAlignedBox] = None
@ -155,7 +199,8 @@ class MakerbotWriter(MeshWriter):
bounds = node_bounds bounds = node_bounds
else: else:
bounds = bounds + node_bounds bounds = bounds + node_bounds
if file_format == "application/x-makerbot-sketch":
bounds = None
if bounds is not None: if bounds is not None:
meta["bounding_box"] = { meta["bounding_box"] = {
"x_min": bounds.left, "x_min": bounds.left,
@ -196,7 +241,7 @@ class MakerbotWriter(MeshWriter):
meta["extruder_temperature"] = materials_temps[0] meta["extruder_temperature"] = materials_temps[0]
meta["extruder_temperatures"] = materials_temps 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] tool_types = [extruder.variant.getMetaDataEntry("reference_extruder_id") for extruder in extruders]
meta["tool_type"] = tool_types[0] meta["tool_type"] = tool_types[0]
@ -205,14 +250,13 @@ class MakerbotWriter(MeshWriter):
meta["version"] = MakerbotWriter._META_VERSION meta["version"] = MakerbotWriter._META_VERSION
meta["preferences"] = dict() meta["preferences"] = dict()
for node in nodes: bounds = application.getBuildVolume().getBoundingBox()
bounds = node.getBoundingBox() meta["preferences"]["instance0"] = {
meta["preferences"][str(node.getName())] = {
"machineBounds": [bounds.right, bounds.back, bounds.left, bounds.front] if bounds is not None else None, "machineBounds": [bounds.right, bounds.back, bounds.left, bounds.front] if bounds is not None else None,
"printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory, "printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory,
} }
meta["miracle_config"] = {"gaggles": {str(node.getName()): {} for node in nodes}} meta["miracle_config"] = {"gaggles": {"instance0": {}}}
version_info = dict() version_info = dict()
cura_engine_info = ConanInstalls.get("curaengine", {"version": "unknown", "revision": "unknown"}) cura_engine_info = ConanInstalls.get("curaengine", {"version": "unknown", "revision": "unknown"})
@ -245,7 +289,7 @@ class MakerbotWriter(MeshWriter):
# platform_temperature # platform_temperature
# total_commands # total_commands
return meta return meta, file_format
def meterToMillimeter(value: float) -> float: def meterToMillimeter(value: float) -> float:

View File

@ -11,14 +11,23 @@ catalog = i18nCatalog("cura")
def getMetaData(): def getMetaData():
file_extension = "makerbot" file_extension = "makerbot"
return { return {
"mesh_writer": { "mesh_writer":
"output": [{ {
"output": [
{
"extension": file_extension, "extension": file_extension,
"description": catalog.i18nc("@item:inlistbox", "Makerbot Printfile"), "description": catalog.i18nc("@item:inlistbox", "Makerbot Printfile"),
"mime_type": "application/x-makerbot", "mime_type": "application/x-makerbot",
"mode": MakerbotWriter.MakerbotWriter.OutputMode.BinaryMode, "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,
} }
]
},
} }

View File

@ -24,6 +24,7 @@ from UM.Settings.InstanceContainer import InstanceContainer
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
from cura.Settings.GlobalStack import GlobalStack from cura.Settings.GlobalStack import GlobalStack
from cura.Utils.Threading import call_on_qt_thread from cura.Utils.Threading import call_on_qt_thread
from cura.API import CuraAPI
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
@ -85,7 +86,8 @@ class UFPWriter(MeshWriter):
try: try:
archive.addContentType(extension="json", mime_type="application/json") archive.addContentType(extension="json", mime_type="application/json")
setting_textio = StringIO() 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 = archive.getStream(SLICE_METADATA_PATH)
steam.write(setting_textio.getvalue().encode("UTF-8")) steam.write(setting_textio.getvalue().encode("UTF-8"))
except EnvironmentError as e: except EnvironmentError as e:
@ -210,57 +212,3 @@ class UFPWriter(MeshWriter):
return [{"name": item.getName()} return [{"name": item.getName()}
for item in DepthFirstIterator(node) for item in DepthFirstIterator(node)
if item.getMeshData() is not None and not item.callDecoration("isNonPrintingMesh")] 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@ -331,7 +331,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
return False return False
[printer, *_] = self._printers [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) @pyqtProperty(bool, notify=_cloudClusterPrintersChanged)
def supportsPrintJobActions(self) -> bool: def supportsPrintJobActions(self) -> bool:

View File

@ -2,5 +2,6 @@
"ultimaker_method": "MakerBot Method", "ultimaker_method": "MakerBot Method",
"ultimaker_methodx": "MakerBot Method X", "ultimaker_methodx": "MakerBot Method X",
"ultimaker_methodxl": "MakerBot Method XL", "ultimaker_methodxl": "MakerBot Method XL",
"ultimaker_factor4": "Ultimaker Factor 4" "ultimaker_factor4": "Ultimaker Factor 4",
"ultimaker_sketch": "MakerBot Sketch"
} }

View File

@ -152,9 +152,3 @@ class VersionUpgrade22to24(VersionUpgrade):
config.write(output) config.write(output)
return [filename], [output.getvalue()] 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

View File

@ -33,23 +33,6 @@ _renamed_i18n = {
class VersionUpgrade27to30(VersionUpgrade): 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. ## Upgrades a preferences file from version 2.7 to 3.0.
# #

View File

@ -33,12 +33,6 @@ default_qualities_per_nozzle_and_material = {
class VersionUpgrade460to462(VersionUpgrade): 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]]: def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
""" """

View File

@ -17,6 +17,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.ConfigurationErrorMessage import ConfigurationErrorMessage from UM.ConfigurationErrorMessage import ConfigurationErrorMessage
from cura.CuraApplication import CuraApplication from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.FormatMaps import FormatMaps
from cura.Machines.VariantType import VariantType from cura.Machines.VariantType import VariantType
try: try:
@ -249,7 +250,7 @@ class XmlMaterialProfile(InstanceContainer):
machine_variant_map[definition_id][variant_name] = variant_dict machine_variant_map[definition_id][variant_name] = variant_dict
# Map machine human-readable names to IDs # 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(): for definition_id, container in machine_container_map.items():
definition_id = container.getMetaDataEntry("definition") definition_id = container.getMetaDataEntry("definition")
@ -647,7 +648,7 @@ class XmlMaterialProfile(InstanceContainer):
self._dirty = False self._dirty = False
# Map machine human-readable names to IDs # 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) machines = data.iterfind("./um:settings/um:machine", self.__namespaces)
for machine in machines: for machine in machines:
@ -923,7 +924,7 @@ class XmlMaterialProfile(InstanceContainer):
result_metadata.append(base_metadata) result_metadata.append(base_metadata)
# Map machine human-readable names to IDs # 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): for machine in data.iterfind("./um:settings/um:machine", cls.__namespaces):
machine_compatibility = common_compatibility machine_compatibility = common_compatibility
@ -1083,10 +1084,9 @@ class XmlMaterialProfile(InstanceContainer):
# Skip material properties (eg diameter) or metadata (eg GUID) # Skip material properties (eg diameter) or metadata (eg GUID)
return return
if instance.value is True: truth_map = { True: "yes", False: "no" }
data = "yes" if tag_name != "cura:setting" and instance.value in truth_map:
elif instance.value is False: data = truth_map[instance.value]
data = "no"
else: else:
data = str(instance.value) data = str(instance.value)
@ -1129,29 +1129,6 @@ class XmlMaterialProfile(InstanceContainer):
id_list = list(id_list) id_list = list(id_list)
return 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 @staticmethod
def _parseCompatibleValue(value: str): def _parseCompatibleValue(value: str):
"""Parse the value of the "material compatible" property.""" """Parse the value of the "material compatible" property."""

View File

@ -14,10 +14,10 @@ def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]:
if not file.exists(): if not file.exists():
return [Directory(file, settings)] 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)] 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"): if file.stem in ("fdmprinter.def", "fdmextruder.def"):
return [Formulas(file, settings)] return [Formulas(file, settings)]
return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)] return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)]

View File

@ -13,8 +13,11 @@ class Definition(Linter):
def __init__(self, file: Path, settings: dict) -> None: def __init__(self, file: Path, settings: dict) -> None:
super().__init__(file, settings) super().__init__(file, settings)
self._definitions = {} self._definitions = {}
self._definition_name = None
self._experimental_settings = []
self._loadDefinitionFiles(file) self._loadDefinitionFiles(file)
self._content = self._file.read_text() self._content = self._file.read_text()
self._loadExperimentalSettings()
self._loadBasePrinterSettings() self._loadBasePrinterSettings()
@property @property
@ -32,6 +35,10 @@ class Definition(Linter):
for check in self.checkMaterialTemperature(): for check in self.checkMaterialTemperature():
yield check 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 # 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 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 # TODO: A check if the key exist in the first place
@ -41,9 +48,8 @@ class Definition(Linter):
def checkRedefineOverride(self) -> Iterator[Diagnostic]: def checkRedefineOverride(self) -> Iterator[Diagnostic]:
""" Checks if definition file overrides its parents settings with the same value. """ """ Checks if definition file overrides its parents settings with the same value. """
definition_name = list(self._definitions.keys())[0] definition = self._definitions[self._definition_name]
definition = self._definitions[definition_name] if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
for key, value_dict in definition["overrides"].items(): for key, value_dict in definition["overrides"].items():
is_redefined, child_key, child_value, parent, inherited_by= self._isDefinedInParent(key, value_dict, definition['inherits']) is_redefined, child_key, child_value, parent, inherited_by= self._isDefinedInParent(key, value_dict, definition['inherits'])
if is_redefined: if is_redefined:
@ -71,9 +77,8 @@ class Definition(Linter):
def checkMaterialTemperature(self) -> Iterator[Diagnostic]: def checkMaterialTemperature(self) -> Iterator[Diagnostic]:
"""Checks if definition file has material tremperature defined within them""" """Checks if definition file has material tremperature defined within them"""
definition_name = list(self._definitions.keys())[0] definition = self._definitions[self._definition_name]
definition = self._definitions[definition_name] if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
for key, value_dict in definition["overrides"].items(): for key, value_dict in definition["overrides"].items():
if "temperature" in key and "material" in key: if "temperature" in key and "material" in key:
@ -97,6 +102,22 @@ class Definition(Linter):
replacements=replacements 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: def _loadDefinitionFiles(self, definition_file) -> None:
""" Loads definition file contents into self._definitions. Also load parent definition if it exists. """ """ Loads definition file contents into self._definitions. Also load parent definition if it exists. """
definition_name = Path(definition_file.stem).stem 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: if not definition_file.exists() or definition_name in self._definitions:
return return
if self._definition_name is None:
self._definition_name = definition_name
# Load definition file into dictionary # Load definition file into dictionary
self._definitions[definition_name] = json.loads(definition_file.read_text()) 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 self._isDefinedInParent(key, value_dict, parent["inherits"])
return False, None, None, None, None 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): def _loadBasePrinterSettings(self):
settings = {} settings = {}
for k, v in self._definitions[self.base_def]["settings"].items(): for k, v in self._definitions[self.base_def]["settings"].items():

View File

@ -51,9 +51,17 @@ class Formulas(Linter):
self._definition = {} self._definition = {}
def getCuraSettingList(self) -> list: def getCuraSettingList(self) -> list:
settings_list = []
with open(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "resources", "definitions", "fdmprinter.def.json")) as data: with open(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "resources", "definitions", "fdmprinter.def.json")) as data:
json_data = json.load(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=''): def extractKeys(self, json_obj, parent_key=''):
keys_with_value = [] keys_with_value = []
@ -146,6 +154,7 @@ class Formulas(Linter):
available_sections = ["values"] available_sections = ["values"]
for section in available_sections: for section in available_sections:
if config.has_section(section):
options = config.options(section) options = config.options(section)
for option in options: for option in options:
values ={} values ={}

View File

@ -37,6 +37,6 @@ class Profile(Linter):
config = ConfigParser() config = ConfigParser()
config.read([self._file]) config.read([self._file])
name_of_profile = config.get("general", "name") 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) found = redefined.search(self._content)
return name_of_profile, found return name_of_profile, found

View File

@ -206,9 +206,9 @@ chardet==3.0.4 \
idna==2.8 \ idna==2.8 \
--hash=sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407 \ --hash=sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407 \
--hash=sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c --hash=sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c
attrs==21.2.0 \ attrs==21.3.0 \
--hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \ --hash=sha256:8f7335278dedd26b58c38e006338242cc0977f06d51579b2b8b87b9b33bff66c \
--hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb --hash=sha256:50f3c9b216dc9021042f71b392859a773b904ce1a029077f58f6598272432045
requests==2.22.0 \ requests==2.22.0 \
--hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \ --hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \
--hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31 --hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31
@ -222,9 +222,9 @@ constantly==15.1.0 \
hyperlink==21.0.0 \ hyperlink==21.0.0 \
--hash=sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b \ --hash=sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b \
--hash=sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4 --hash=sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4
incremental==21.3.0 \ incremental==22.10.0 \
--hash=sha256:02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57 \ --hash=sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51 \
--hash=sha256:92014aebc6a20b78a8084cdd5645eeaa7f74b8933f70fa3ada2cfbd1e3b54321 --hash=sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0
zope.interface==5.4.0 \ zope.interface==5.4.0 \
--hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \ --hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \
--hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \ --hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \

View File

@ -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": { "ULTIMAKERBASCFMETHOD": {
"package_info": { "package_info": {
"package_id": "ULTIMAKERBASCFMETHOD", "package_id": "ULTIMAKERBASCFMETHOD",

1
resources/conandata.yml Normal file
View File

@ -0,0 +1 @@
version: "5.8.0"

View File

@ -28,8 +28,6 @@ class CuraResource(ConanFile):
self.version = self.conan_data["version"] self.version = self.conan_data["version"]
def export(self): 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, copy(self, pattern="LICENSE*", src=os.path.join(self.recipe_folder, ".."), dst=self.export_folder,
keep_path=False) keep_path=False)
update_conandata(self, {"version": self.version}) update_conandata(self, {"version": self.version})

View File

@ -67,13 +67,13 @@
"layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" }, "layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
"layer_start_x": "layer_start_x":
{ {
"default_value": 105.0, "enabled": false,
"enabled": false "value": 105.0
}, },
"layer_start_y": "layer_start_y":
{ {
"default_value": 27.0, "enabled": false,
"enabled": false "value": 27.0
}, },
"line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" }, "line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" },
"machine_acceleration": { "default_value": 3000 }, "machine_acceleration": { "default_value": 3000 },
@ -130,7 +130,6 @@
"machine_min_cool_heat_time_window": { "default_value": 15.0 }, "machine_min_cool_heat_time_window": { "default_value": 15.0 },
"machine_name": { "default_value": "Mark2_for_Ultimaker2" }, "machine_name": { "default_value": "Mark2_for_Ultimaker2" },
"machine_nozzle_cool_down_speed": { "default_value": 1.5 }, "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_heat_up_speed": { "default_value": 3.5 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"machine_show_variants": { "default_value": true }, "machine_show_variants": { "default_value": true },

View File

@ -65,7 +65,6 @@
"machine_heated_bed": { "default_value": true }, "machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 340 }, "machine_height": { "default_value": 340 },
"machine_name": { "default_value": "Atom 3" }, "machine_name": { "default_value": "Atom 3" },
"machine_nozzle_head_distance": { "default_value": 6 },
"machine_shape": { "default_value": "elliptic" }, "machine_shape": { "default_value": "elliptic" },
"machine_show_variants": { "default_value": true }, "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" }, "machine_start_gcode": { "default_value": ";MACHINE START CODE\nG21 ;metric values\nG90 ;absolute positioning\nG28 ;home\nG1 Z5 F9000\n;MACHINE START CODE" },

View 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 }
}
}

View 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 }
}
}

View File

@ -35,7 +35,6 @@
"machine_max_feedrate_y": { "default_value": 300 }, "machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 }, "machine_max_feedrate_z": { "default_value": 40 },
"machine_name": { "default_value": "Diytech 220" }, "machine_name": { "default_value": "Diytech 220" },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 }, "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_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 }, "machine_use_extruder_offset_to_offset_coords": { "default_value": true },

View File

@ -52,13 +52,13 @@
"layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" }, "layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
"layer_start_x": "layer_start_x":
{ {
"default_value": 180.0, "enabled": false,
"enabled": false "value": 180.0
}, },
"layer_start_y": "layer_start_y":
{ {
"default_value": 160.0, "enabled": false,
"enabled": false "value": 160.0
}, },
"line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" }, "line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" },
"machine_acceleration": { "default_value": 3000 }, "machine_acceleration": { "default_value": 3000 },
@ -122,7 +122,6 @@
"machine_name": { "default_value": "dxu" }, "machine_name": { "default_value": "dxu" },
"machine_nozzle_cool_down_speed": { "default_value": 1.5 }, "machine_nozzle_cool_down_speed": { "default_value": 1.5 },
"machine_nozzle_expansion_angle": { "default_value": 45 }, "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_heat_up_speed": { "default_value": 3.5 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"machine_show_variants": { "default_value": true }, "machine_show_variants": { "default_value": true },

View File

@ -44,7 +44,6 @@
"machine_max_jerk_xy": { "default_value": 10 }, "machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 10 }, "machine_max_jerk_z": { "default_value": 10 },
"machine_name": { "default_value": "Erzay3D" }, "machine_name": { "default_value": "Erzay3D" },
"machine_nozzle_head_distance": { "default_value": 2.5 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"machine_shape": { "default_value": "elliptic" }, "machine_shape": { "default_value": "elliptic" },
"machine_start_gcode": { "default_value": "G28\nG1 Z15.0 F6000\nG92 E0" }, "machine_start_gcode": { "default_value": "G28\nG1 Z15.0 F6000\nG92 E0" },

View File

@ -167,6 +167,17 @@
"type": "float", "type": "float",
"unit": "mm" "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": "machine_nozzle_id":
{ {
"default_value": "unknown", "default_value": "unknown",

View File

@ -28,6 +28,18 @@
"icon": "Printer", "icon": "Printer",
"children": "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": "machine_name":
{ {
"label": "Machine Type", "label": "Machine Type",
@ -289,17 +301,6 @@
"settable_per_meshgroup": false, "settable_per_meshgroup": false,
"settable_globally": 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": "machine_nozzle_expansion_angle":
{ {
"label": "Nozzle Angle", "label": "Nozzle Angle",
@ -1342,6 +1343,15 @@
"limit_to_extruder": "wall_0_extruder_nr", "limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true "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": "z_seam_position":
{ {
"label": "Z Seam Position", "label": "Z Seam Position",
@ -4363,6 +4373,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 0.0, "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", "minimum_value": "machine_width / -2 if machine_center_is_zero else 0",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true, "settable_per_extruder": true,
@ -4375,6 +4386,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 0.0, "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", "minimum_value": "machine_depth / -2 if machine_center_is_zero else 0",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true, "settable_per_extruder": true,
@ -4456,6 +4468,37 @@
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "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": "cool_fan_speed":
{ {
"label": "Fan Speed", "label": "Fan Speed",
@ -4603,6 +4646,21 @@
"maximum_value": "365", "maximum_value": "365",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
},
"cool_during_extruder_switch":
{
"label": "Cooling during extruder switch",
"description": "<html>Whether to activate the cooling fans during a nozzle switch. This can help reducing oozing by cooling the nozzle faster:<ul><li><b>Unchanged:</b> keep the fans as they were previously</li><li><b>Only last extruder:</b> turn on the fan of the last used extruder, but turn the others off (if any). This is useful if you have completely separate extruders.</li><li><b>All fans:</b> turn on all fans during nozzle switch. This is useful if you have a single cooling fan, or multiple fans that stay close to each other.</li></ul></html>",
"type": "enum",
"options":
{
"unchanged": "Unchanged",
"only_last_extruder": "Only last extruder",
"all_fans": "All fans"
},
"default_value": "unchanged",
"settable_per_mesh": false,
"settable_per_extruder": false
} }
} }
}, },
@ -5118,6 +5176,18 @@
} }
} }
}, },
"support_infill_density_multiplier_initial_layer":
{
"label": "Support Infill Density Multiplier Initial Layer",
"description": "Multiplier for the infill on the initial layers of the support. Increasing this may help for bed adhesion.",
"type": "int",
"minimum_value": "1",
"default_value": 1,
"enabled": "support_enable or support_meshes_present",
"limit_to_extruder": "support_extruder_nr_layer_0",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"support_infill_angles": "support_infill_angles":
{ {
"label": "Support Infill Line Directions", "label": "Support Infill Line Directions",
@ -6208,6 +6278,7 @@
"type": "bool", "type": "bool",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"children": "children":
@ -6220,6 +6291,7 @@
"value": "raft_remove_inside_corners", "value": "raft_remove_inside_corners",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_base_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
}, },
@ -6231,6 +6303,7 @@
"value": "raft_remove_inside_corners", "value": "raft_remove_inside_corners",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_interface_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
}, },
@ -6242,6 +6315,7 @@
"value": "raft_remove_inside_corners", "value": "raft_remove_inside_corners",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_surface_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
} }
@ -6382,6 +6456,38 @@
"settable_per_extruder": true, "settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr" "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": "raft_interface_layers":
{ {
"label": "Raft Middle Layers", "label": "Raft Middle Layers",
@ -6443,6 +6549,54 @@
"settable_per_extruder": true, "settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr" "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": "raft_surface_layers":
{ {
"label": "Raft Top Layers", "label": "Raft Top Layers",
@ -6504,6 +6658,22 @@
"settable_per_extruder": true, "settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr" "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": "raft_surface_monotonic":
{ {
"label": "Monotonic Raft Top Surface Order", "label": "Monotonic Raft Top Surface Order",
@ -6516,6 +6686,38 @@
"settable_per_extruder": true, "settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr" "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": "raft_wall_count":
{ {
"label": "Raft Wall Count", "label": "Raft Wall Count",
@ -6525,7 +6727,7 @@
"minimum_value": "0", "minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": true,
"children": "children":
{ {
"raft_base_wall_count": "raft_base_wall_count":
@ -6538,7 +6740,8 @@
"minimum_value": "0", "minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr"
}, },
"raft_interface_wall_count": "raft_interface_wall_count":
{ {
@ -6549,7 +6752,8 @@
"minimum_value": "0", "minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr"
}, },
"raft_surface_wall_count": "raft_surface_wall_count":
{ {
@ -6560,7 +6764,8 @@
"minimum_value": "0", "minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
} }
} }
}, },
@ -6818,6 +7023,63 @@
"limit_to_extruder": "raft_surface_extruder_nr" "limit_to_extruder": "raft_surface_extruder_nr"
} }
} }
},
"raft_flow":
{
"label": "Raft Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"children":
{
"raft_base_flow":
{
"label": "Raft Base Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft base printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"value": "raft_flow",
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr"
},
"raft_interface_flow":
{
"label": "Raft Interface Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft interface printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"value": "raft_flow",
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr"
},
"raft_surface_flow":
{
"label": "Raft Surface Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft surface printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"value": "raft_flow",
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
}
}
} }
} }
}, },
@ -6845,7 +7107,7 @@
"label": "Prime Tower Type", "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>", "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", "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": "options":
{ {
"normal": "Normal", "normal": "Normal",
@ -6898,6 +7160,20 @@
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "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": "prime_tower_position_x":
{ {
"label": "Prime Tower X Position", "label": "Prime Tower X Position",
@ -8021,6 +8297,19 @@
"default_value": 90, "default_value": 90,
"settable_per_mesh": true "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": "wall_overhang_speed_factor":
{ {
"label": "Overhanging Wall Speed", "label": "Overhanging Wall Speed",

View File

@ -27,7 +27,6 @@
"machine_heated_bed": { "default_value": false }, "machine_heated_bed": { "default_value": false },
"machine_height": { "default_value": 200 }, "machine_height": { "default_value": 200 },
"machine_name": { "default_value": "3DMaker Starter" }, "machine_name": { "default_value": "3DMaker Starter" },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 }, "machine_nozzle_tip_outer_diameter": { "default_value": 1 },
"machine_width": { "default_value": 210 }, "machine_width": { "default_value": 210 },
"raft_airgap": { "default_value": 0.2 }, "raft_airgap": { "default_value": 0.2 },

View File

@ -37,7 +37,6 @@
"machine_heated_bed": { "default_value": true }, "machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 200 }, "machine_height": { "default_value": 200 },
"machine_name": { "default_value": "Mendel90" }, "machine_name": { "default_value": "Mendel90" },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 }, "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_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 }, "machine_width": { "default_value": 200 },

View File

@ -157,8 +157,6 @@
"value": "jerk_wall * 5 / 10" "value": "jerk_wall * 5 / 10"
}, },
"jerk_wall_x": { "maximum_value_warning": "0.01" }, "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_acceleration": { "default_value": 1500 },
"machine_center_is_zero": { "default_value": false }, "machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 420 }, "machine_depth": { "default_value": 420 },

View File

@ -78,7 +78,6 @@
"machine_heat_zone_length": { "default_value": 20 }, "machine_heat_zone_length": { "default_value": 20 },
"machine_height": { "default_value": 205 }, "machine_height": { "default_value": 205 },
"machine_name": { "default_value": "Discov3ry Complete (Ultimaker 2+)" }, "machine_name": { "default_value": "Discov3ry Complete (Ultimaker 2+)" },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_show_variants": { "default_value": true }, "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_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 }, "machine_width": { "default_value": 205 },

View File

@ -44,7 +44,6 @@
"machine_max_acceleration_y": { "default_value": 6000 }, "machine_max_acceleration_y": { "default_value": 6000 },
"machine_max_acceleration_z": { "default_value": 12000 }, "machine_max_acceleration_z": { "default_value": 12000 },
"machine_name": { "default_value": "TypeAMachines" }, "machine_name": { "default_value": "TypeAMachines" },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 }, "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_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 }, "machine_use_extruder_offset_to_offset_coords": { "default_value": true },

View File

@ -80,6 +80,7 @@
"maximum_value_warning": "120", "maximum_value_warning": "120",
"minimum_value": "0" "minimum_value": "0"
}, },
"material_print_temp_wait": { "value": false },
"material_print_temperature": { "minimum_value": "0" }, "material_print_temperature": { "minimum_value": "0" },
"material_standby_temperature": "material_standby_temperature":
{ {
@ -88,6 +89,9 @@
}, },
"meshfix_maximum_deviation": { "value": "machine_nozzle_size / 10" }, "meshfix_maximum_deviation": { "value": "machine_nozzle_size / 10" },
"meshfix_maximum_resolution": { "value": "max(speed_wall_0 / 75, 0.5)" }, "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_speed": { "value": "raft_speed" },
"raft_base_thickness": { "value": "min(machine_nozzle_size * 0.75, 0.3)" }, "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" }, "raft_interface_fan_speed": { "value": "(raft_base_fan_speed + raft_surface_fan_speed) / 2" },
@ -134,7 +138,8 @@
"wall_x_material_flow_layer_0": { "value": "0.95 * material_flow_layer_0" }, "wall_x_material_flow_layer_0": { "value": "0.95 * material_flow_layer_0" },
"xy_offset": { "value": "-layer_height * 0.1" }, "xy_offset": { "value": "-layer_height * 0.1" },
"xy_offset_layer_0": { "value": "-wall_line_width_0 / 5 + xy_offset" }, "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 } "zig_zaggify_support": { "value": true }
} }
} }

View File

@ -95,7 +95,6 @@
"machine_max_feedrate_y": { "default_value": 300 }, "machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 }, "machine_max_feedrate_z": { "default_value": 40 },
"machine_name": { "default_value": "Ultimaker 2" }, "machine_name": { "default_value": "Ultimaker 2" },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 }, "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_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 }, "machine_use_extruder_offset_to_offset_coords": { "default_value": true },

View File

@ -83,7 +83,6 @@
"machine_heat_zone_length": { "default_value": 20 }, "machine_heat_zone_length": { "default_value": 20 },
"machine_height": { "default_value": 205 }, "machine_height": { "default_value": 205 },
"machine_name": { "default_value": "Ultimaker 2+" }, "machine_name": { "default_value": "Ultimaker 2+" },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_show_variants": { "default_value": true }, "machine_show_variants": { "default_value": true },
"speed_infill": { "value": "speed_print" }, "speed_infill": { "value": "speed_print" },
"speed_support": { "value": "speed_wall_0" }, "speed_support": { "value": "speed_wall_0" },

View File

@ -92,7 +92,6 @@
"machine_heat_zone_length": { "default_value": 20 }, "machine_heat_zone_length": { "default_value": 20 },
"machine_height": { "default_value": 205 }, "machine_height": { "default_value": 205 },
"machine_name": { "default_value": "Ultimaker 2+ Connect" }, "machine_name": { "default_value": "Ultimaker 2+ Connect" },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_show_variants": { "default_value": true }, "machine_show_variants": { "default_value": true },
"machine_start_gcode": { "value": "''" }, "machine_start_gcode": { "value": "''" },
"machine_width": { "default_value": 223 }, "machine_width": { "default_value": 223 },

View File

@ -70,8 +70,6 @@
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" }, "infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
"infill_wipe_dist": { "value": "0" }, "infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "True" }, "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_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 215 }, "machine_depth": { "default_value": 215 },
"machine_disallowed_areas": "machine_disallowed_areas":

View File

@ -64,6 +64,7 @@
"bridge_skin_material_flow": { "maximum_value": "100" }, "bridge_skin_material_flow": { "maximum_value": "100" },
"bridge_skin_material_flow_2": { "maximum_value": "100" }, "bridge_skin_material_flow_2": { "maximum_value": "100" },
"bridge_skin_material_flow_3": { "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_material_flow": { "maximum_value": "100" },
"bridge_wall_speed": { "value": "speed_wall" }, "bridge_wall_speed": { "value": "speed_wall" },
"brim_width": { "value": "5" }, "brim_width": { "value": "5" },
@ -103,8 +104,6 @@
}, },
"jerk_travel_enabled": { "value": "True" }, "jerk_travel_enabled": { "value": "True" },
"layer_height": { "value": "min(min(extruderValues('machine_nozzle_size')) / 2, 0.2)" }, "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_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 240 }, "machine_depth": { "default_value": 240 },
"machine_end_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" },
@ -130,7 +129,7 @@
"machine_min_cool_heat_time_window": { "value": "15" }, "machine_min_cool_heat_time_window": { "value": "15" },
"machine_name": { "default_value": "Ultimaker Factor 4" }, "machine_name": { "default_value": "Ultimaker Factor 4" },
"machine_nozzle_cool_down_speed": { "value": "0.3 + 0.0025 * material_print_temperature" }, "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_start_gcode": { "default_value": "" },
"machine_width": { "default_value": 330 }, "machine_width": { "default_value": 330 },
"material_bed_temperature": { "maximum_value": "120" }, "material_bed_temperature": { "maximum_value": "120" },

View 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)" }
}
}

View File

@ -23,12 +23,8 @@
"fabtotum_", "fabtotum_",
"fdplast_", "fdplast_",
"filo3d_", "filo3d_",
"generic_bvoh_175", "generic_",
"generic_cpe_175",
"generic_hips_175",
"generic_pc_175",
"ultimaker_rapidrinse_175", "ultimaker_rapidrinse_175",
"generic_tpu_175",
"goofoo_", "goofoo_",
"ideagen3D_", "ideagen3D_",
"imade3d_", "imade3d_",
@ -59,13 +55,7 @@
"1": "ultimaker_method_extruder_right" "1": "ultimaker_method_extruder_right"
}, },
"nozzle_offsetting_for_disallowed_areas": false, "nozzle_offsetting_for_disallowed_areas": false,
"platform_offset": [ "preferred_material": "ultimaker_pla_175",
0,
0,
0
],
"platform_texture": "MakerbotMethod.png",
"preferred_material": "generic_pla_175",
"preferred_quality_type": "fast", "preferred_quality_type": "fast",
"preferred_variant_name": "1A", "preferred_variant_name": "1A",
"supports_network_connection": true, "supports_network_connection": true,
@ -201,13 +191,17 @@
"bridge_wall_material_flow": { "value": "material_flow" }, "bridge_wall_material_flow": { "value": "material_flow" },
"bridge_wall_speed": { "value": "speed_wall" }, "bridge_wall_speed": { "value": "speed_wall" },
"brim_width": { "value": 5 }, "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 }, "extruder_prime_pos_abs": { "default_value": true },
"gradual_support_infill_steps": { "value": 0 }, "gradual_support_infill_steps": { "value": 0 },
"infill_before_walls": { "value": false }, "infill_before_walls": { "value": false },
"infill_enable_travel_optimization": { "value": true },
"infill_material_flow": { "value": "material_flow" }, "infill_material_flow": { "value": "material_flow" },
"infill_overlap": { "value": 0 }, "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 }, "infill_wipe_dist": { "value": 0 },
"inset_direction": { "value": "'inside_out'" }, "inset_direction": { "value": "'inside_out'" },
"jerk_enabled": "jerk_enabled":
@ -315,8 +309,6 @@
"enabled": false, "enabled": false,
"value": "jerk_print" "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_acceleration": { "default_value": 3000 },
"machine_center_is_zero": { "value": true }, "machine_center_is_zero": { "value": true },
"machine_end_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" },
@ -329,14 +321,16 @@
"machine_nozzle_cool_down_speed": { "value": 0.8 }, "machine_nozzle_cool_down_speed": { "value": 0.8 },
"machine_nozzle_heat_up_speed": { "value": 3.5 }, "machine_nozzle_heat_up_speed": { "value": 3.5 },
"machine_scale_fan_speed_zero_to_one": { "value": true }, "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": { "enabled": "machine_heated_bed" },
"material_bed_temperature_layer_0": { "enabled": "machine_heated_bed" }, "material_flow": { "value": 100 },
"material_final_print_temperature": { "value": "material_print_temperature-10" },
"material_flow": { "value": 97 },
"material_initial_print_temperature": { "value": "material_print_temperature-10" }, "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 }, "material_shrinkage_percentage": { "enabled": true },
"min_bead_width": { "value": "0.75*line_width" },
"min_wall_line_width": { "value": 0.4 }, "min_wall_line_width": { "value": 0.4 },
"minimum_support_area": { "value": 0.1 }, "minimum_support_area": { "value": 0.1 },
"multiple_mesh_overlap": { "value": 0 }, "multiple_mesh_overlap": { "value": 0 },
@ -351,19 +345,90 @@
"prime_tower_raft_base_line_spacing": { "value": "raft_base_line_width" }, "prime_tower_raft_base_line_spacing": { "value": "raft_base_line_width" },
"prime_tower_wipe_enabled": { "value": true }, "prime_tower_wipe_enabled": { "value": true },
"print_sequence": { "enabled": false }, "print_sequence": { "enabled": false },
"raft_base_line_spacing": { "value": "2*raft_base_line_width" }, "raft_airgap":
"raft_base_line_width": { "value": 1.4 }, {
"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_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_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_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_speed": { "value": 90 },
"raft_interface_thickness": { "value": 0.3 }, "raft_interface_thickness": { "value": 0.3 },
"raft_interface_wall_count": { "value": "raft_wall_count" }, "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_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_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_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_amount": { "value": 0.75 },
"retraction_combing": { "value": "'off'" }, "retraction_combing": { "value": "'off'" },
"retraction_combing_max_distance": { "value": "speed_travel / 10" }, "retraction_combing_max_distance": { "value": "speed_travel / 10" },
@ -372,11 +437,15 @@
"retraction_hop": { "value": 0.4 }, "retraction_hop": { "value": 0.4 },
"retraction_hop_enabled": { "value": true }, "retraction_hop_enabled": { "value": true },
"retraction_hop_only_when_collides": { "value": false }, "retraction_hop_only_when_collides": { "value": false },
"retraction_min_travel": { "value": "0.6" },
"retraction_prime_speed": { "value": "retraction_speed" }, "retraction_prime_speed": { "value": "retraction_speed" },
"retraction_speed": { "value": 5 }, "retraction_speed": { "value": 5 },
"roofing_layer_count": { "value": 2 }, "roofing_layer_count": { "value": 2 },
"roofing_material_flow": { "value": "material_flow" },
"roofing_monotonic": { "value": true }, "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_outline_count": { "value": 0 },
"skin_overlap": { "value": 0 }, "skin_overlap": { "value": 0 },
"skin_preshrink": { "value": 0 }, "skin_preshrink": { "value": 0 },
@ -395,27 +464,32 @@
"speed_wall_0": { "value": "speed_wall * 30/40" }, "speed_wall_0": { "value": "speed_wall * 30/40" },
"speed_wall_x": { "value": "speed_wall" }, "speed_wall_x": { "value": "speed_wall" },
"support_angle": { "value": 40 }, "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_material_flow": { "value": "material_flow" },
"support_bottom_wall_count": { "value": "0" },
"support_brim_enable": { "value": false }, "support_brim_enable": { "value": false },
"support_conical_min_width": { "value": 10 }, "support_conical_min_width": { "value": 10 },
"support_enable": { "value": true }, "support_enable": { "value": true },
"support_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material'))" }, "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_rate": { "value": 20.0 },
"support_infill_sparse_thickness": { "value": "layer_height" },
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "4*support_infill_sparse_thickness" },
"support_interface_material_flow": { "value": "material_flow" }, "support_interface_material_flow": { "value": "material_flow" },
"support_interface_offset": { "value": 0 }, "support_interface_offset": { "value": "1" },
"support_interface_pattern": { "value": "'lines'" }, "support_interface_pattern": { "value": "'lines'" },
"support_interface_wall_count": { "value": 2 }, "support_interface_wall_count": { "value": "1" },
"support_material_flow": { "value": "material_flow" }, "support_material_flow": { "value": "material_flow" },
"support_offset": { "value": "1.8" },
"support_pattern": { "value": "'lines'" }, "support_pattern": { "value": "'lines'" },
"support_roof_height": { "value": "4*layer_height" },
"support_roof_material_flow": { "value": "material_flow" }, "support_roof_material_flow": { "value": "material_flow" },
"support_supported_skin_fan_speed": { "value": "cool_fan_speed_max" }, "support_supported_skin_fan_speed": { "value": "cool_fan_speed_max" },
"support_top_distance": { "value": "support_z_distance" }, "support_use_towers": { "value": "False" },
"support_wall_count": { "value": "1 if support_conical_enabled or support_structure == 'tree' else 0" }, "support_wall_count": { "value": "2 if support_conical_enabled or support_structure == 'tree' else 0" },
"support_xy_distance": { "value": 0.2 }, "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_amount": { "value": 0.5 },
"switch_extruder_retraction_speeds": { "value": "retraction_speed" }, "switch_extruder_retraction_speeds": { "value": "retraction_speed" },
"top_bottom_thickness": { "value": "5*layer_height" }, "top_bottom_thickness": { "value": "5*layer_height" },
@ -423,13 +497,15 @@
"travel_avoid_other_parts": { "value": false }, "travel_avoid_other_parts": { "value": false },
"wall_0_inset": { "value": 0 }, "wall_0_inset": { "value": 0 },
"wall_0_material_flow": { "value": "material_flow" }, "wall_0_material_flow": { "value": "material_flow" },
"wall_0_material_flow_layer_0": { "value": "material_flow" },
"wall_0_wipe_dist": { "value": 0.8 }, "wall_0_wipe_dist": { "value": 0.8 },
"wall_material_flow": { "value": "material_flow" }, "wall_material_flow": { "value": "material_flow" },
"wall_x_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": { "value": 0 },
"xy_offset_layer_0": { "value": "xy_offset" }, "xy_offset_layer_0": { "value": "xy_offset" },
"z_seam_corner": { "value": "'z_seam_corner_none'" },
"z_seam_position": { "value": "'backright'" }, "z_seam_position": { "value": "'backright'" },
"z_seam_relative": { "value": true },
"z_seam_type": { "value": "'sharpest_corner'" }, "z_seam_type": { "value": "'sharpest_corner'" },
"zig_zaggify_infill": { "value": true } "zig_zaggify_infill": { "value": true }
} }

View File

@ -23,19 +23,7 @@
"fabtotum_", "fabtotum_",
"fdplast_", "fdplast_",
"filo3d_", "filo3d_",
"generic_asa_175", "generic_",
"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_", "goofoo_",
"ideagen3D_", "ideagen3D_",
"imade3d_", "imade3d_",
@ -48,6 +36,7 @@
"polywood_pla", "polywood_pla",
"redd_", "redd_",
"tizyx_", "tizyx_",
"ultimaker_tough_pla_175",
"verbatim_", "verbatim_",
"Vertex_", "Vertex_",
"volumic_", "volumic_",
@ -70,7 +59,6 @@
0, 0,
16 16
], ],
"platform_texture": "MakerbotMethod.png",
"preferred_material": "ultimaker_absr_175", "preferred_material": "ultimaker_absr_175",
"preferred_quality_type": "draft", "preferred_quality_type": "draft",
"preferred_variant_name": "1XA", "preferred_variant_name": "1XA",
@ -83,6 +71,7 @@
}, },
"overrides": "overrides":
{ {
"build_volume_temperature": { "maximum_value": "107" },
"machine_depth": { "default_value": 236.48 }, "machine_depth": { "default_value": 236.48 },
"machine_disallowed_areas": "machine_disallowed_areas":
{ {

View File

@ -18,12 +18,6 @@
"0": "ultimaker_methodxl_extruder_left", "0": "ultimaker_methodxl_extruder_left",
"1": "ultimaker_methodxl_extruder_right" "1": "ultimaker_methodxl_extruder_right"
}, },
"platform_offset": [
0,
0,
0
],
"platform_texture": "MakerbotMethod.png",
"preferred_quality_type": "draft", "preferred_quality_type": "draft",
"reference_machine_id": "magma_10", "reference_machine_id": "magma_10",
"supports_network_connection": true, "supports_network_connection": true,
@ -33,6 +27,7 @@
}, },
"overrides": "overrides":
{ {
"build_volume_temperature": { "maximum_value": "100" },
"machine_depth": { "default_value": 320 }, "machine_depth": { "default_value": 320 },
"machine_disallowed_areas": "machine_disallowed_areas":
{ {

View File

@ -70,8 +70,6 @@
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" }, "infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
"infill_wipe_dist": { "value": "0" }, "infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "True" }, "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_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 190 }, "machine_depth": { "default_value": 190 },
"machine_end_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" },

View File

@ -74,8 +74,6 @@
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" }, "infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
"infill_wipe_dist": { "value": "0" }, "infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "True" }, "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_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 240 }, "machine_depth": { "default_value": 240 },
"machine_end_gcode": { "default_value": "" }, "machine_end_gcode": { "default_value": "" },

View 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 }
}
}

View 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 }
}
}

View 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 }
}
}

View 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}" }
}
}

View 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 }
}
}

View 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 }
}
}

View 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 }
}
}

View 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" }
}
}

View 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" }
}
}

View 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 }
}
}

View File

@ -14,6 +14,7 @@
"default_value": 0, "default_value": 0,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 } "machine_nozzle_offset_y": { "default_value": 0.0 }
} }

View File

@ -14,6 +14,7 @@
"default_value": 1, "default_value": 1,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 } "machine_nozzle_offset_y": { "default_value": 0.0 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 6 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 } "material_diameter": { "default_value": 1.75 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 } "material_diameter": { "default_value": 1.75 }
} }

View File

@ -14,6 +14,7 @@
"default_value": 0, "default_value": 0,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },

View File

@ -14,6 +14,7 @@
"default_value": 1, "default_value": 1,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_offset_x": { "default_value": 19.0 }, "machine_nozzle_offset_x": { "default_value": 19.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 2.5 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 } "material_diameter": { "default_value": 1.75 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 } "material_diameter": { "default_value": 1.75 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 } "material_diameter": { "default_value": 1.75 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_size": { "default_value": 0.84 }, "machine_nozzle_size": { "default_value": 0.84 },
"material_diameter": { "default_value": 3.175 } "material_diameter": { "default_value": 3.175 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 } "material_diameter": { "default_value": 1.75 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 2.85 } "material_diameter": { "default_value": 2.85 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 2.85 } "material_diameter": { "default_value": 2.85 }
} }

View File

@ -10,6 +10,7 @@
"overrides": "overrides":
{ {
"extruder_nr": { "default_value": 0 }, "extruder_nr": { "default_value": 0 },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 2.85 } "material_diameter": { "default_value": 2.85 }
} }

View File

@ -0,0 +1,26 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "ultimaker_method",
"position": "0"
},
"overrides":
{
"extruder_nr":
{
"default_value": 0,
"maximum_value": 1
},
"machine_extruder_cooling_fan_number": { "default_value": 0 },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed_0/100}" },
"machine_extruder_start_code_duration": { "default_value": 8 },
"machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,26 @@
{
"version": 2,
"name": "Extruder 2",
"inherits": "fdmextruder",
"metadata":
{
"machine": "ultimaker_method",
"position": "1"
},
"overrides":
{
"extruder_nr":
{
"default_value": 1,
"maximum_value": 1
},
"machine_extruder_cooling_fan_number": { "default_value": 1 },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed_0/100}" },
"machine_extruder_start_code_duration": { "default_value": 8 },
"machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -14,8 +14,9 @@
"default_value": 0, "default_value": 0,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_extruder_cooling_fan_number": { "default_value": 0 },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed_0/100}" },
"machine_extruder_start_code_duration": { "default_value": 8 }, "machine_extruder_start_code_duration": { "default_value": 8 },
"machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 },

View File

@ -14,8 +14,9 @@
"default_value": 1, "default_value": 1,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_extruder_cooling_fan_number": { "default_value": 1 },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed_0/100}" },
"machine_extruder_start_code_duration": { "default_value": 8 }, "machine_extruder_start_code_duration": { "default_value": 8 },
"machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 },

View File

@ -14,8 +14,9 @@
"default_value": 0, "default_value": 0,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_extruder_cooling_fan_number": { "default_value": 0 },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed_0/100}" },
"machine_extruder_start_code_duration": { "default_value": 10 }, "machine_extruder_start_code_duration": { "default_value": 10 },
"machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 },

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