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:
value: |
### ✨Try our improved Cura 5.7✨
Before filling out the report below, we want you to try the latest Cura 5.7 Beta.
Before filling out the report below, we want you to try the latest Cura 5.7.
This version of Cura has become significantly more reliable and has an updated slicing engine that will automatically send a report to the Cura Team for analysis.
#### [You can find the downloads here](https://github.com/Ultimaker/Cura/releases/tag/5.7.0-beta.1) ####
#### [You can find the downloads here](https://github.com/Ultimaker/Cura/releases/latest) ####
If you still encounter a crash you are still welcome to report the issue so we can use your model as a test case, you can find instructions on how to do that below.
### Project File
@ -35,7 +35,7 @@ body:
- type: markdown
attributes:
value: |
We work hard on improving our slicing crashes. Our most recent release is 5.6.0.
We work hard on improving our slicing crashes. Our most recent release is 5.7.1.
If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
- type: input
attributes:

View File

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

View File

@ -34,10 +34,11 @@ on:
operating_system:
description: 'OS'
required: true
default: 'ubuntu-22.04'
default: 'self-hosted-Ubuntu22-X64'
type: choice
options:
- ubuntu-22.04
- self-hosted-Ubuntu22-X64
jobs:
linux-installer:
@ -49,4 +50,4 @@ jobs:
staging: ${{ inputs.staging }}
architecture: ${{ inputs.architecture }}
operating_system: ${{ inputs.operating_system }}
secrets: inherit
secrets: inherit

View File

@ -40,7 +40,6 @@ on:
options:
- self-hosted-X64
- self-hosted-ARM64
- macos-11
- macos-12
jobs:
@ -53,4 +52,4 @@ jobs:
staging: ${{ inputs.staging }}
architecture: ${{ inputs.architecture }}
operating_system: ${{ inputs.operating_system }}
secrets: inherit
secrets: inherit

View File

@ -5,6 +5,9 @@ on:
path:
- "resources/**"
permissions:
contents: read
jobs:
printer-linter-diagnose:
name: Printer linter PR diagnose
@ -50,7 +53,7 @@ jobs:
run: |
echo ${{ github.event.number }} > printer-linter-result/pr-id.txt
echo ${{ github.event.pull_request.head.repo.full_name }} > printer-linter-result/pr-head-repo.txt
echo ${{ github.event.pull_request.head.ref }} > printer-linter-result/pr-head-ref.txt
echo ${{ github.event.pull_request.head.sha }} > printer-linter-result/pr-head-sha.txt
- uses: actions/upload-artifact@v2
with:

View File

@ -6,88 +6,106 @@ on:
types: [completed]
jobs:
clang-tidy-results:
printer-linter-result:
# Trigger the job only if the previous (insecure) workflow completed successfully
if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- name: Download analysis results
uses: actions/github-script@v3.1.0
uses: actions/github-script@v7
with:
script: |
let artifacts = await github.actions.listWorkflowRunArtifacts({
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{github.event.workflow_run.id }},
});
let matchArtifact = artifacts.data.artifacts.filter((artifact) => {
const matchArtifact = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "printer-linter-result"
})[0];
let download = await github.actions.downloadArtifact({
const download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: "zip",
});
let fs = require("fs");
fs.writeFileSync("${{github.workspace}}/printer-linter-result.zip", Buffer.from(download.data));
- name: Set environment variables
run: |
mkdir printer-linter-result
unzip printer-linter-result.zip -d printer-linter-result
echo "pr_id=$(cat printer-linter-result/pr-id.txt)" >> $GITHUB_ENV
echo "pr_head_repo=$(cat printer-linter-result/pr-head-repo.txt)" >> $GITHUB_ENV
echo "pr_head_ref=$(cat printer-linter-result/pr-head-ref.txt)" >> $GITHUB_ENV
if [[ -f "printer-linter-result/comment.md" ]]; then
echo "commentFileExists=true" >> $GITHUB_ENV
else
echo "commentFileExists=false" >> $GITHUB_ENV
fi
- uses: actions/checkout@v3
with:
repository: ${{ env.pr_head_repo }}
ref: ${{ env.pr_head_ref }}
persist-credentials: false
- name: Redownload analysis results
uses: actions/github-script@v3.1.0
with:
script: |
let artifacts = await github.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{github.event.workflow_run.id }},
});
let matchArtifact = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "printer-linter-result"
})[0];
let download = await github.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: "zip",
});
let fs = require("fs");
fs.writeFileSync("${{github.workspace}}/printer-linter-result.zip", Buffer.from(download.data));
const fs = require("fs");
fs.writeFileSync("${{ github.workspace }}/printer-linter-result.zip", Buffer.from(download.data));
- name: Extract analysis results
run: |
mkdir printer-linter-result
unzip printer-linter-result.zip -d printer-linter-result
unzip -j printer-linter-result.zip -d printer-linter-result
- name: Set PR details environment variables
uses: actions/github-script@v7
with:
script: |
const assert = require("node:assert").strict;
const fs = require("fs");
function exportVar(varName, fileName, regEx) {
const val = fs.readFileSync("${{ github.workspace }}/printer-linter-result/" + fileName, {
encoding: "ascii"
}).trimEnd();
assert.ok(regEx.test(val), "Invalid value format for " + varName);
core.exportVariable(varName, val);
}
exportVar("PR_ID", "pr-id.txt", /^[0-9]+$/);
exportVar("PR_HEAD_REPO", "pr-head-repo.txt", /^[-./0-9A-Z_a-z]+$/);
exportVar("PR_HEAD_SHA", "pr-head-sha.txt", /^[0-9A-Fa-f]+$/);
fs.access("${{ github.workspace }}/printer-linter-result/comment.md", fs.constants.F_OK, (err) => {
if (err) {
core.exportVariable("commentFileExists", "false");
} else {
core.exportVariable("commentFileExists", "true");
}
});
- uses: actions/checkout@v4
with:
repository: ${{ env.PR_HEAD_REPO }}
ref: ${{ env.PR_HEAD_SHA }}
persist-credentials: false
- name: Redownload analysis results
uses: actions/github-script@v7
with:
script: |
const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{github.event.workflow_run.id }},
});
const matchArtifact = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "printer-linter-result"
})[0];
const download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: "zip",
});
const fs = require("fs");
fs.writeFileSync("${{ github.workspace }}/printer-linter-result.zip", Buffer.from(download.data));
- name: Extract analysis results
run: |
mkdir printer-linter-result
unzip -j printer-linter-result.zip -d printer-linter-result
- name: Run PR Comments
if: env.commentFileExists == 'true'
uses: peter-evans/create-or-update-comment@v4
with:
issue-number: ${{ env.pr_id }}
issue-number: ${{ env.PR_ID }}
body-path: 'printer-linter-result/comment.md'
- name: Run clang-tidy-pr-comments action
uses: platisd/clang-tidy-pr-comments@bc0bb7da034a8317d54e7fe1e819159002f4cc40
uses: platisd/clang-tidy-pr-comments@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
clang_tidy_fixes: printer-linter-result/fixes.yml
pull_request_id: ${{ env.pr_id }}
pull_request_id: ${{ env.PR_ID }}
request_changes: true

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

@ -50,4 +50,4 @@ jobs:
staging: ${{ inputs.staging }}
architecture: ${{ inputs.architecture }}
operating_system: ${{ inputs.operating_system }}
secrets: inherit
secrets: inherit

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,13 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import TYPE_CHECKING
from dataclasses import asdict
from typing import cast, Dict, TYPE_CHECKING
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Settings.SettingFunction import SettingFunction
from cura.Settings.GlobalStack import GlobalStack
if TYPE_CHECKING:
from cura.CuraApplication import CuraApplication
@ -47,3 +53,57 @@ class Settings:
"""
return self.application.getSidebarCustomMenuItems()
def getSliceMetadata(self) -> Dict[str, Dict[str, Dict[str, str]]]:
"""Get all changed settings and all settings. For each extruder and the global stack"""
print_information = self.application.getPrintInformation()
machine_manager = self.application.getMachineManager()
settings = {
"material": {
"length": print_information.materialLengths,
"weight": print_information.materialWeights,
"cost": print_information.materialCosts,
},
"global": {
"changes": {},
"all_settings": {},
},
"quality": asdict(machine_manager.activeQualityDisplayNameMap()),
}
def _retrieveValue(container: InstanceContainer, setting_: str):
value_ = container.getProperty(setting_, "value")
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
if not isinstance(value_, SettingFunction):
return value_ # Success!
value_ = value_(container)
return 0 # Fallback value after breaking possibly endless loop.
global_stack = cast(GlobalStack, self.application.getGlobalContainerStack())
# Add global user or quality changes
global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges)
for setting in global_flattened_changes.getAllKeys():
settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting)
# Get global all settings values without user or quality changes
for setting in global_stack.getAllKeys():
settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting)
for i, extruder in enumerate(global_stack.extruderList):
# Add extruder fields to settings dictionary
settings[f"extruder_{i}"] = {
"changes": {},
"all_settings": {},
}
# Add extruder user or quality changes
extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges)
for setting in extruder_flattened_changes.getAllKeys():
settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting)
# Get extruder all settings values without user or quality changes
for setting in extruder.getAllKeys():
settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting)
return settings

View File

@ -14,7 +14,7 @@ DEFAULT_CURA_LATEST_URL = "https://software.ultimaker.com/latest.json"
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
# CuraVersion.py.in template.
CuraSDKVersion = "8.7.0"
CuraSDKVersion = "8.8.0"
try:
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).
# It's more difficult to call sys.exit(0): That requires that it happens as the result of a pyqtSignal-emit.
# (See https://doc.qt.io/qt-6/qcoreapplication.html#quit)
# WARNING: With this in place you CAN NOT use cProfile. You will need to replace the next line with pass
# for it to work!
os._exit(0)
return super().event(event)

View File

@ -24,6 +24,10 @@ intent_translations["quick"] = {
"name": catalog.i18nc("@label", "Draft"),
"description": catalog.i18nc("@text", "The draft profile is designed to print initial prototypes and concept validation with the intent of significant print time reduction.")
}
intent_translations["annealing"] = {
"name": catalog.i18nc("@label", "Annealing"),
"description": catalog.i18nc("@text", "The annealing profile requires post-processing in an oven after the print is finished. This profile retains the dimensional accuracy of the printed part after annealing and improves strength, stiffness, and thermal resistance.")
}
intent_translations["solid"] = {
"name": catalog.i18nc("@label", "Solid"),
"description": catalog.i18nc("@text",

View File

@ -96,7 +96,7 @@ class AuthorizationHelpers:
return
if token_response.error() != QNetworkReply.NetworkError.NoError:
callback(AuthenticationResponse(success = False, err_message = token_data["error_description"]))
callback(AuthenticationResponse(success = False, err_message = token_data.get("error_description", "an unknown server error occurred")))
return
callback(AuthenticationResponse(success = True,

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

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.
from typing import Optional
from PyQt6.QtCore import pyqtProperty, QObject
from cura.PrinterOutput.FormatMaps import FormatMaps
class MaterialOutputModel(QObject):
@ -23,29 +24,9 @@ class MaterialOutputModel(QObject):
@staticmethod
def getMaterialFromDefinition(guid, type, brand, name):
_MATERIAL_MAP = { "abs" :{"name" :"ABS" ,"guid": "2780b345-577b-4a24-a2c5-12e6aad3e690"},
"abs-cf10" :{"name": "ABS-CF" ,"guid": "495a0ce5-9daf-4a16-b7b2-06856d82394d"},
"abs-wss1" :{"name" :"ABS-R" ,"guid": "88c8919c-6a09-471a-b7b6-e801263d862d"},
"asa" :{"name" :"ASA" ,"guid": "f79bc612-21eb-482e-ad6c-87d75bdde066"},
"nylon12-cf":{"name": "Nylon 12 CF" ,"guid": "3c6f2877-71cc-4760-84e6-4b89ab243e3b"},
"nylon" :{"name" :"Nylon" ,"guid": "283d439a-3490-4481-920c-c51d8cdecf9c"},
"pc" :{"name" :"PC" ,"guid": "62414577-94d1-490d-b1e4-7ef3ec40db02"},
"petg" :{"name" :"PETG" ,"guid": "69386c85-5b6c-421a-bec5-aeb1fb33f060"},
"pla" :{"name" :"PLA" ,"guid": "0ff92885-617b-4144-a03c-9989872454bc"},
"pva" :{"name" :"PVA" ,"guid": "a4255da2-cb2a-4042-be49-4a83957a2f9a"},
"wss1" :{"name" :"RapidRinse" ,"guid": "a140ef8f-4f26-4e73-abe0-cfc29d6d1024"},
"sr30" :{"name" :"SR-30" ,"guid": "77873465-83a9-4283-bc44-4e542b8eb3eb"},
"bvoh" :{"name" :"BVOH" ,"guid": "923e604c-8432-4b09-96aa-9bbbd42207f4"},
"cpe" :{"name" :"CPE" ,"guid": "da1872c1-b991-4795-80ad-bdac0f131726"},
"hips" :{"name" :"HIPS" ,"guid": "a468d86a-220c-47eb-99a5-bbb47e514eb0"},
"tpu" :{"name" :"TPU 95A" ,"guid": "19baa6a9-94ff-478b-b4a1-8157b74358d2"}
}
if guid is None and brand != "empty" and type in _MATERIAL_MAP:
name = _MATERIAL_MAP[type]["name"]
guid = _MATERIAL_MAP[type]["guid"]
if guid is None and brand != "empty" and type in FormatMaps.MATERIAL_MAP:
name = FormatMaps.MATERIAL_MAP[type]["name"]
guid = FormatMaps.MATERIAL_MAP[type]["guid"]
return name, guid

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

View File

@ -83,6 +83,15 @@ class GlobalStack(CuraContainerStack):
"""
return self.getMetaDataEntry("supports_material_export", False)
@pyqtProperty("QVariantList", constant = True)
def getOutputFileFormats(self) -> List[str]:
"""
Which output formats the printer supports.
:return: A list of strings with MIME-types.
"""
all_formats_str = self.getMetaDataEntry("file_formats", "")
return all_formats_str.split(";")
@classmethod
def getLoadingPriority(cls) -> int:
return 2

View File

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

View File

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

View File

@ -544,7 +544,7 @@ class CuraEngineBackend(QObject, Backend):
if job.getResult() == StartJobResult.ObjectsWithDisabledExtruder:
self._error_message = Message(catalog.i18nc("@info:status",
"Unable to slice because there are objects associated with disabled Extruder %s.") % job.getMessage(),
"Unable to slice because there are objects associated with disabled Extruder %s.") % job.getAssociatedDisabledExtruders(),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
self._error_message.show()

View File

@ -146,6 +146,7 @@ class StartSliceJob(Job):
self._slice_message: Arcus.PythonMessage = slice_message
self._is_cancelled: bool = False
self._build_plate_number: Optional[int] = None
self._associated_disabled_extruders: Optional[str] = None
# cache for all setting values from all stacks (global & extruder) for the current machine
self._all_extruders_settings: Optional[Dict[str, Any]] = None
@ -153,6 +154,9 @@ class StartSliceJob(Job):
def getSliceMessage(self) -> Arcus.PythonMessage:
return self._slice_message
def getAssociatedDisabledExtruders(self) -> Optional[str]:
return self._associated_disabled_extruders
def setBuildPlate(self, build_plate_number: int) -> None:
self._build_plate_number = build_plate_number
@ -334,7 +338,7 @@ class StartSliceJob(Job):
if has_model_with_disabled_extruders:
self.setResult(StartJobResult.ObjectsWithDisabledExtruder)
associated_disabled_extruders = {p + 1 for p in associated_disabled_extruders}
self.setMessage(", ".join(map(str, sorted(associated_disabled_extruders))))
self._associated_disabled_extruders = ", ".join(map(str, sorted(associated_disabled_extruders)))
return
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being
@ -362,7 +366,12 @@ class StartSliceJob(Job):
for extruder_stack in global_stack.extruderList:
self._buildExtruderMessage(extruder_stack)
for plugin in CuraApplication.getInstance().getBackendPlugins():
backend_plugins = CuraApplication.getInstance().getBackendPlugins()
# Sort backend plugins by name. Not a very good strategy, but at least it is repeatable. This will be improved later.
backend_plugins = sorted(backend_plugins, key=lambda backend_plugin: backend_plugin.getId())
for plugin in backend_plugins:
if not plugin.usePlugin():
continue
for slot in plugin.getSupportedSlots():
@ -550,12 +559,16 @@ class StartSliceJob(Job):
start_gcode = settings["machine_start_gcode"]
# Remove all the comments from the start g-code
start_gcode = re.sub(r";.+?(\n|$)", "\n", start_gcode)
bed_temperature_settings = ["material_bed_temperature", "material_bed_temperature_layer_0"]
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(bed_temperature_settings) # match {setting} as well as {setting, extruder_nr}
settings["material_bed_temp_prepend"] = re.search(pattern, start_gcode) == None
print_temperature_settings = ["material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature", "print_temperature"]
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(print_temperature_settings) # match {setting} as well as {setting, extruder_nr}
settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) is None
if settings["material_bed_temp_prepend"]:
bed_temperature_settings = ["material_bed_temperature", "material_bed_temperature_layer_0"]
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(bed_temperature_settings) # match {setting} as well as {setting, extruder_nr}
settings["material_bed_temp_prepend"] = re.search(pattern, start_gcode) == None
if settings["material_print_temp_prepend"]:
print_temperature_settings = ["material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature", "print_temperature"]
pattern = r"\{(%s)(,\s?\w+)?\}" % "|".join(print_temperature_settings) # match {setting} as well as {setting, extruder_nr}
settings["material_print_temp_prepend"] = re.search(pattern, start_gcode) is None
# Replace the setting tokens in start and end g-code.
# Use values from the first used extruder by default so we get the expected temperatures

View File

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

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.
from io import StringIO, BufferedIOBase
import json
from typing import cast, List, Optional, Dict
from typing import cast, List, Optional, Dict, Tuple
from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED
import pyDulcificum as du
@ -19,6 +18,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.i18n import i18nCatalog
from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.FormatMaps import FormatMaps
from cura.Snapshot import Snapshot
from cura.Utils.Threading import call_on_qt_thread
from cura.CuraVersion import ConanInstalls
@ -39,16 +39,27 @@ class MakerbotWriter(MeshWriter):
suffixes=["makerbot"]
)
)
MimeTypeDatabase.addMimeType(
MimeType(
name="application/x-makerbot-sketch",
comment="Makerbot Toolpath Package",
suffixes=["makerbot"]
)
)
_PNG_FORMATS = [
_PNG_FORMAT = [
{"prefix": "isometric_thumbnail", "width": 120, "height": 120},
{"prefix": "isometric_thumbnail", "width": 320, "height": 320},
{"prefix": "isometric_thumbnail", "width": 640, "height": 640},
{"prefix": "thumbnail", "width": 90, "height": 90},
]
_PNG_FORMAT_METHOD = [
{"prefix": "thumbnail", "width": 140, "height": 106},
{"prefix": "thumbnail", "width": 212, "height": 300},
{"prefix": "thumbnail", "width": 960, "height": 1460},
{"prefix": "thumbnail", "width": 90, "height": 90},
]
_META_VERSION = "3.0.0"
# must be called from the main thread because of OpenGL
@ -74,6 +85,7 @@ class MakerbotWriter(MeshWriter):
return None
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool:
metadata, file_format = self._getMeta(nodes)
if mode != MeshWriter.OutputMode.BinaryMode:
Logger.log("e", "MakerbotWriter does not support text mode.")
self.setInformation(catalog.i18nc("@error:not supported", "MakerbotWriter does not support text mode."))
@ -92,14 +104,20 @@ class MakerbotWriter(MeshWriter):
gcode_text_io = StringIO()
success = gcode_writer.write(gcode_text_io, None)
filename, filedata = "", ""
# Writing the g-code failed. Then I can also not write the gzipped g-code.
if not success:
self.setInformation(gcode_writer.getInformation())
return False
json_toolpaths = du.gcode_2_miracle_jtp(gcode_text_io.getvalue())
metadata = self._getMeta(nodes)
match file_format:
case "application/x-makerbot-sketch":
filename, filedata = "print.gcode", gcode_text_io.getvalue()
self._PNG_FORMATS = self._PNG_FORMAT
case "application/x-makerbot":
filename, filedata = "print.jsontoolpath", du.gcode_2_miracle_jtp(gcode_text_io.getvalue())
self._PNG_FORMATS = self._PNG_FORMAT + self._PNG_FORMAT_METHOD
case _:
raise Exception("Unsupported Mime type")
png_files = []
for png_format in self._PNG_FORMATS:
@ -116,10 +134,34 @@ class MakerbotWriter(MeshWriter):
try:
with ZipFile(stream, "w", compression=ZIP_DEFLATED) as zip_stream:
zip_stream.writestr("meta.json", json.dumps(metadata, indent=4))
zip_stream.writestr("print.jsontoolpath", json_toolpaths)
zip_stream.writestr(filename, filedata)
for png_file in png_files:
file, data = png_file["file"], png_file["data"]
zip_stream.writestr(file, data)
api = CuraApplication.getInstance().getCuraAPI()
metadata_json = api.interface.settings.getSliceMetadata()
# All the mapping stuff we have to do:
product_to_id_map = FormatMaps.getProductIdMap()
printer_name_map = FormatMaps.getInversePrinterNameMap()
extruder_type_map = FormatMaps.getInverseExtruderTypeMap()
material_map = FormatMaps.getInverseMaterialMap()
for key, value in metadata_json.items():
if "all_settings" in value:
if "machine_name" in value["all_settings"]:
machine_name = value["all_settings"]["machine_name"]
if machine_name in product_to_id_map:
machine_name = product_to_id_map[machine_name][0]
value["all_settings"]["machine_name"] = printer_name_map.get(machine_name, machine_name)
if "machine_nozzle_id" in value["all_settings"]:
extruder_type = value["all_settings"]["machine_nozzle_id"]
value["all_settings"]["machine_nozzle_id"] = extruder_type_map.get(extruder_type, extruder_type)
if "material_type" in value["all_settings"]:
material_type = value["all_settings"]["material_type"]
value["all_settings"]["material_type"] = material_map.get(material_type, material_type)
slice_metadata = json.dumps(metadata_json, separators=(", ", ": "), indent=4)
zip_stream.writestr("slicemetadata.json", slice_metadata)
except (IOError, OSError, BadZipFile) as ex:
Logger.log("e", f"Could not write to (.makerbot) file because: '{ex}'.")
self.setInformation(catalog.i18nc("@error", "MakerbotWriter could not save to the designated path."))
@ -127,7 +169,7 @@ class MakerbotWriter(MeshWriter):
return True
def _getMeta(self, root_nodes: List[SceneNode]) -> Dict[str, any]:
def _getMeta(self, root_nodes: List[SceneNode]) -> Tuple[Dict[str, any], str]:
application = CuraApplication.getInstance()
machine_manager = application.getMachineManager()
global_stack = machine_manager.activeMachine
@ -143,7 +185,9 @@ class MakerbotWriter(MeshWriter):
nodes.append(node)
meta = dict()
# This is a bit of a "hack", the mime type should be passed through with the export writer but
# since this is not the case we get the mime type from the global stack instead
file_format = global_stack.definition.getMetaDataEntry("file_formats")
meta["bot_type"] = global_stack.definition.getMetaDataEntry("reference_machine_id")
bounds: Optional[AxisAlignedBox] = None
@ -155,7 +199,8 @@ class MakerbotWriter(MeshWriter):
bounds = node_bounds
else:
bounds = bounds + node_bounds
if file_format == "application/x-makerbot-sketch":
bounds = None
if bounds is not None:
meta["bounding_box"] = {
"x_min": bounds.left,
@ -196,7 +241,7 @@ class MakerbotWriter(MeshWriter):
meta["extruder_temperature"] = materials_temps[0]
meta["extruder_temperatures"] = materials_temps
meta["model_counts"] = [{"count": 1, "name": node.getName()} for node in nodes]
meta["model_counts"] = [{"count": len(nodes), "name": "instance0"}]
tool_types = [extruder.variant.getMetaDataEntry("reference_extruder_id") for extruder in extruders]
meta["tool_type"] = tool_types[0]
@ -205,14 +250,13 @@ class MakerbotWriter(MeshWriter):
meta["version"] = MakerbotWriter._META_VERSION
meta["preferences"] = dict()
for node in nodes:
bounds = node.getBoundingBox()
meta["preferences"][str(node.getName())] = {
"machineBounds": [bounds.right, bounds.back, bounds.left, bounds.front] if bounds is not None else None,
"printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory,
}
bounds = application.getBuildVolume().getBoundingBox()
meta["preferences"]["instance0"] = {
"machineBounds": [bounds.right, bounds.back, bounds.left, bounds.front] if bounds is not None else None,
"printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory,
}
meta["miracle_config"] = {"gaggles": {str(node.getName()): {} for node in nodes}}
meta["miracle_config"] = {"gaggles": {"instance0": {}}}
version_info = dict()
cura_engine_info = ConanInstalls.get("curaengine", {"version": "unknown", "revision": "unknown"})
@ -245,7 +289,7 @@ class MakerbotWriter(MeshWriter):
# platform_temperature
# total_commands
return meta
return meta, file_format
def meterToMillimeter(value: float) -> float:

View File

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

View File

@ -24,6 +24,7 @@ from UM.Settings.InstanceContainer import InstanceContainer
from cura.CuraApplication import CuraApplication
from cura.Settings.GlobalStack import GlobalStack
from cura.Utils.Threading import call_on_qt_thread
from cura.API import CuraAPI
from UM.i18n import i18nCatalog
@ -85,7 +86,8 @@ class UFPWriter(MeshWriter):
try:
archive.addContentType(extension="json", mime_type="application/json")
setting_textio = StringIO()
json.dump(self._getSliceMetadata(), setting_textio, separators=(", ", ": "), indent=4)
api = CuraApplication.getInstance().getCuraAPI()
json.dump(api.interface.settings.getSliceMetadata(), setting_textio, separators=(", ", ": "), indent=4)
steam = archive.getStream(SLICE_METADATA_PATH)
steam.write(setting_textio.getvalue().encode("UTF-8"))
except EnvironmentError as e:
@ -210,57 +212,3 @@ class UFPWriter(MeshWriter):
return [{"name": item.getName()}
for item in DepthFirstIterator(node)
if item.getMeshData() is not None and not item.callDecoration("isNonPrintingMesh")]
def _getSliceMetadata(self) -> Dict[str, Dict[str, Dict[str, str]]]:
"""Get all changed settings and all settings. For each extruder and the global stack"""
print_information = CuraApplication.getInstance().getPrintInformation()
machine_manager = CuraApplication.getInstance().getMachineManager()
settings = {
"material": {
"length": print_information.materialLengths,
"weight": print_information.materialWeights,
"cost": print_information.materialCosts,
},
"global": {
"changes": {},
"all_settings": {},
},
"quality": asdict(machine_manager.activeQualityDisplayNameMap()),
}
def _retrieveValue(container: InstanceContainer, setting_: str):
value_ = container.getProperty(setting_, "value")
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
if not isinstance(value_, SettingFunction):
return value_ # Success!
value_ = value_(container)
return 0 # Fallback value after breaking possibly endless loop.
global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack())
# Add global user or quality changes
global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges)
for setting in global_flattened_changes.getAllKeys():
settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting)
# Get global all settings values without user or quality changes
for setting in global_stack.getAllKeys():
settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting)
for i, extruder in enumerate(global_stack.extruderList):
# Add extruder fields to settings dictionary
settings[f"extruder_{i}"] = {
"changes": {},
"all_settings": {},
}
# Add extruder user or quality changes
extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges)
for setting in extruder_flattened_changes.getAllKeys():
settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting)
# Get extruder all settings values without user or quality changes
for setting in extruder.getAllKeys():
settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting)
return settings

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@ -331,7 +331,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
return False
[printer, *_] = self._printers
return printer.type in ("MakerBot Method X", "MakerBot Method XL")
return printer.type in ("MakerBot Method X", "MakerBot Method XL", "MakerBot Sketch")
@pyqtProperty(bool, notify=_cloudClusterPrintersChanged)
def supportsPrintJobActions(self) -> bool:

View File

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

View File

@ -152,9 +152,3 @@ class VersionUpgrade22to24(VersionUpgrade):
config.write(output)
return [filename], [output.getvalue()]
def getCfgVersion(self, serialised: str) -> int:
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialised)
format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.
setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
return format_version * 1000000 + setting_version

View File

@ -33,23 +33,6 @@ _renamed_i18n = {
class VersionUpgrade27to30(VersionUpgrade):
## Gets the version number from a CFG file in Uranium's 2.7 format.
#
# Since the format may change, this is implemented for the 2.7 format only
# and needs to be included in the version upgrade system rather than
# globally in Uranium.
#
# \param serialised The serialised form of a CFG file.
# \return The version number stored in the CFG file.
# \raises ValueError The format of the version number in the file is
# incorrect.
# \raises KeyError The format of the file is incorrect.
def getCfgVersion(self, serialised: str) -> int:
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialised)
format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised.
setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
return format_version * 1000000 + setting_version
## Upgrades a preferences file from version 2.7 to 3.0.
#

View File

@ -33,12 +33,6 @@ default_qualities_per_nozzle_and_material = {
class VersionUpgrade460to462(VersionUpgrade):
def getCfgVersion(self, serialised: str) -> int:
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialised)
format_version = int(parser.get("general", "version")) # Explicitly give an exception when this fails. That means that the file format is not recognised.
setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
return format_version * 1000000 + setting_version
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""

View File

@ -17,6 +17,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.ConfigurationErrorMessage import ConfigurationErrorMessage
from cura.CuraApplication import CuraApplication
from cura.PrinterOutput.FormatMaps import FormatMaps
from cura.Machines.VariantType import VariantType
try:
@ -249,7 +250,7 @@ class XmlMaterialProfile(InstanceContainer):
machine_variant_map[definition_id][variant_name] = variant_dict
# Map machine human-readable names to IDs
product_id_map = self.getProductIdMap()
product_id_map = FormatMaps.getProductIdMap()
for definition_id, container in machine_container_map.items():
definition_id = container.getMetaDataEntry("definition")
@ -647,7 +648,7 @@ class XmlMaterialProfile(InstanceContainer):
self._dirty = False
# Map machine human-readable names to IDs
product_id_map = self.getProductIdMap()
product_id_map = FormatMaps.getProductIdMap()
machines = data.iterfind("./um:settings/um:machine", self.__namespaces)
for machine in machines:
@ -923,7 +924,7 @@ class XmlMaterialProfile(InstanceContainer):
result_metadata.append(base_metadata)
# Map machine human-readable names to IDs
product_id_map = cls.getProductIdMap()
product_id_map = FormatMaps.getProductIdMap()
for machine in data.iterfind("./um:settings/um:machine", cls.__namespaces):
machine_compatibility = common_compatibility
@ -1083,10 +1084,9 @@ class XmlMaterialProfile(InstanceContainer):
# Skip material properties (eg diameter) or metadata (eg GUID)
return
if instance.value is True:
data = "yes"
elif instance.value is False:
data = "no"
truth_map = { True: "yes", False: "no" }
if tag_name != "cura:setting" and instance.value in truth_map:
data = truth_map[instance.value]
else:
data = str(instance.value)
@ -1129,29 +1129,6 @@ class XmlMaterialProfile(InstanceContainer):
id_list = list(id_list)
return id_list
__product_to_id_map: Optional[Dict[str, List[str]]] = None
@classmethod
def getProductIdMap(cls) -> Dict[str, List[str]]:
"""Gets a mapping from product names in the XML files to their definition IDs.
This loads the mapping from a file.
"""
if cls.__product_to_id_map is not None:
return cls.__product_to_id_map
plugin_path = cast(str, PluginRegistry.getInstance().getPluginPath("XmlMaterialProfile"))
product_to_id_file = os.path.join(plugin_path, "product_to_id.json")
with open(product_to_id_file, encoding = "utf-8") as f:
contents = ""
for line in f:
contents += line if "#" not in line else "".join([line.replace("#", str(n)) for n in range(1, 12)])
cls.__product_to_id_map = json.loads(contents)
cls.__product_to_id_map = {key: [value] for key, value in cls.__product_to_id_map.items()}
#This also loads "Ultimaker S5" -> "ultimaker_s5" even though that is not strictly necessary with the default to change spaces into underscores.
#However it is not always loaded with that default; this mapping is also used in serialize() without that default.
return cls.__product_to_id_map
@staticmethod
def _parseCompatibleValue(value: str):
"""Parse the value of the "material compatible" property."""

View File

@ -14,10 +14,10 @@ def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]:
if not file.exists():
return [Directory(file, settings)]
if ".inst" in file.suffixes and ".cfg" in file.suffixes:
if ".inst" in file.suffixes and file.suffixes[-1] == ".cfg":
return [Directory(file, settings), Profile(file, settings), Formulas(file, settings)]
if ".def" in file.suffixes and ".json" in file.suffixes:
if ".def" in file.suffixes and file.suffixes[-1] == ".json":
if file.stem in ("fdmprinter.def", "fdmextruder.def"):
return [Formulas(file, settings)]
return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)]

View File

@ -13,8 +13,11 @@ class Definition(Linter):
def __init__(self, file: Path, settings: dict) -> None:
super().__init__(file, settings)
self._definitions = {}
self._definition_name = None
self._experimental_settings = []
self._loadDefinitionFiles(file)
self._content = self._file.read_text()
self._loadExperimentalSettings()
self._loadBasePrinterSettings()
@property
@ -32,6 +35,10 @@ class Definition(Linter):
for check in self.checkMaterialTemperature():
yield check
if self._settings["checks"].get("diagnostic-definition-experimental-setting", False):
for check in self.checkExperimentalSetting():
yield check
# Add other which will yield Diagnostic's
# TODO: A check to determine if the user set value is with the min and max value defined in the parent and doesn't trigger a warning
# TODO: A check if the key exist in the first place
@ -41,9 +48,8 @@ class Definition(Linter):
def checkRedefineOverride(self) -> Iterator[Diagnostic]:
""" Checks if definition file overrides its parents settings with the same value. """
definition_name = list(self._definitions.keys())[0]
definition = self._definitions[definition_name]
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
definition = self._definitions[self._definition_name]
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
for key, value_dict in definition["overrides"].items():
is_redefined, child_key, child_value, parent, inherited_by= self._isDefinedInParent(key, value_dict, definition['inherits'])
if is_redefined:
@ -71,9 +77,8 @@ class Definition(Linter):
def checkMaterialTemperature(self) -> Iterator[Diagnostic]:
"""Checks if definition file has material tremperature defined within them"""
definition_name = list(self._definitions.keys())[0]
definition = self._definitions[definition_name]
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
definition = self._definitions[self._definition_name]
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
for key, value_dict in definition["overrides"].items():
if "temperature" in key and "material" in key:
@ -97,6 +102,22 @@ class Definition(Linter):
replacements=replacements
)
def checkExperimentalSetting(self) -> Iterator[Diagnostic]:
"""Checks if definition uses experimental settings"""
definition = self._definitions[self._definition_name]
if "overrides" in definition and self._definition_name not in ("fdmprinter", "fdmextruder"):
for setting in definition["overrides"]:
if setting in self._experimental_settings:
redefined = re.compile(setting)
found = redefined.search(self._content)
yield Diagnostic(
file=self._file,
diagnostic_name="diagnostic-definition-experimental-setting",
message=f"Setting {setting} is still experimental and should not be used in default profiles",
level="Warning",
offset=found.span(0)[0]
)
def _loadDefinitionFiles(self, definition_file) -> None:
""" Loads definition file contents into self._definitions. Also load parent definition if it exists. """
definition_name = Path(definition_file.stem).stem
@ -104,6 +125,9 @@ class Definition(Linter):
if not definition_file.exists() or definition_name in self._definitions:
return
if self._definition_name is None:
self._definition_name = definition_name
# Load definition file into dictionary
self._definitions[definition_name] = json.loads(definition_file.read_text())
@ -152,6 +176,12 @@ class Definition(Linter):
return self._isDefinedInParent(key, value_dict, parent["inherits"])
return False, None, None, None, None
def _loadExperimentalSettings(self):
try:
self._experimental_settings = self._definitions[self.base_def]["settings"]["experimental"]["children"].keys()
except:
pass
def _loadBasePrinterSettings(self):
settings = {}
for k, v in self._definitions[self.base_def]["settings"].items():

View File

@ -51,9 +51,17 @@ class Formulas(Linter):
self._definition = {}
def getCuraSettingList(self) -> list:
settings_list = []
with open(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "resources", "definitions", "fdmprinter.def.json")) as data:
json_data = json.load(data)
return self.extractKeys(json_data)
settings_list += self.extractKeys(json_data)
with open(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "resources", "definitions", "fdmextruder.def.json")) as data:
json_data = json.load(data)
settings_list += self.extractKeys(json_data)
return settings_list
def extractKeys(self, json_obj, parent_key=''):
keys_with_value = []
@ -146,12 +154,13 @@ class Formulas(Linter):
available_sections = ["values"]
for section in available_sections:
options = config.options(section)
for option in options:
values ={}
values["value"] = config.get(section, option)
overrides[option] = values
file_data["overrides"]= overrides# Process the value here
if config.has_section(section):
options = config.options(section)
for option in options:
values ={}
values["value"] = config.get(section, option)
overrides[option] = values
file_data["overrides"]= overrides# Process the value here
return file_data

View File

@ -37,6 +37,6 @@ class Profile(Linter):
config = ConfigParser()
config.read([self._file])
name_of_profile = config.get("general", "name")
redefined = re.compile(name_of_profile)
redefined = re.compile(re.escape(name_of_profile))
found = redefined.search(self._content)
return name_of_profile, found

View File

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

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": {
"package_info": {
"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"]
def export(self):
copy(self, pattern="conandata.yml", src=os.path.join(self.recipe_folder, ".."), dst=self.export_folder,
keep_path=False)
copy(self, pattern="LICENSE*", src=os.path.join(self.recipe_folder, ".."), dst=self.export_folder,
keep_path=False)
update_conandata(self, {"version": self.version})

View File

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

View File

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

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_z": { "default_value": 40 },
"machine_name": { "default_value": "Diytech 220" },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28\nG1 Z15 F200\nT0\nG92 E0\nG1 E16 F250\nG92 E0\n" },
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },

View File

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

View File

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

View File

@ -167,6 +167,17 @@
"type": "float",
"unit": "mm"
},
"machine_nozzle_head_distance":
{
"default_value": 3,
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
"label": "Nozzle Length",
"settable_per_extruder": true,
"settable_per_mesh": false,
"settable_per_meshgroup": false,
"type": "float",
"unit": "mm"
},
"machine_nozzle_id":
{
"default_value": "unknown",

View File

@ -28,6 +28,18 @@
"icon": "Printer",
"children":
{
"build_volume_fan_nr":
{
"label": "Build volume fan number",
"description": "The number of the fan that cools the build volume. If this is set to 0, it's means that there is no build volume fan",
"default_value": 0,
"minimum_value": "0",
"maximum_value": "999999",
"type": "int",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
"machine_name":
{
"label": "Machine Type",
@ -289,17 +301,6 @@
"settable_per_meshgroup": false,
"settable_globally": false
},
"machine_nozzle_head_distance":
{
"label": "Nozzle Length",
"description": "The height difference between the tip of the nozzle and the lowest part of the print head.",
"unit": "mm",
"default_value": 3,
"type": "float",
"settable_per_mesh": false,
"settable_per_extruder": true,
"settable_per_meshgroup": false
},
"machine_nozzle_expansion_angle":
{
"label": "Nozzle Angle",
@ -1342,6 +1343,15 @@
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
"z_seam_on_vertex":
{
"label": "Z Seam On Vertex",
"description": "Place the z-seam on a polygon vertex. Switching this off can place the seam between vertices as well. (Keep in mind that this won't override the restrictions on placing the seam on an unsupported overhang.)",
"type": "bool",
"default_value": false,
"settable_per_mesh": true,
"enabled": "z_seam_type == 'back' or z_seam_type == 'shortest'"
},
"z_seam_position":
{
"label": "Z Seam Position",
@ -4363,6 +4373,7 @@
"unit": "mm",
"type": "float",
"default_value": 0.0,
"value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))",
"minimum_value": "machine_width / -2 if machine_center_is_zero else 0",
"settable_per_mesh": false,
"settable_per_extruder": true,
@ -4375,6 +4386,7 @@
"unit": "mm",
"type": "float",
"default_value": 0.0,
"value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))",
"minimum_value": "machine_depth / -2 if machine_center_is_zero else 0",
"settable_per_mesh": false,
"settable_per_extruder": true,
@ -4456,6 +4468,37 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"build_fan_full_at_height":
{
"label": "Build Fan Speed at Height",
"description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from Initial Fan Speed to Regular Fan Speed.",
"unit": "mm",
"type": "float",
"default_value": 0,
"minimum_value": "0",
"enabled": "build_volume_fan_nr != 0",
"maximum_value_warning": "10.0",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false,
"children":
{
"build_fan_full_layer":
{
"label": "Build Fan Speed at Layer",
"description": "The layer at which the build fans spin on full fan speed. This value is calculated and rounded to a whole number.",
"type": "int",
"default_value": 0,
"minimum_value": "0",
"enabled": "build_volume_fan_nr != 0",
"maximum_value_warning": "10 / resolveOrValue('layer_height')",
"value": "max(1, int(math.floor((build_fan_full_at_height - resolveOrValue('layer_height_0')) / resolveOrValue('layer_height')) + 2))",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
}
}
},
"cool_fan_speed":
{
"label": "Fan Speed",
@ -4603,6 +4646,21 @@
"maximum_value": "365",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_during_extruder_switch":
{
"label": "Cooling during extruder switch",
"description": "<html>Whether to activate the cooling fans during a nozzle switch. This can help reducing oozing by cooling the nozzle faster:<ul><li><b>Unchanged:</b> keep the fans as they were previously</li><li><b>Only last extruder:</b> turn on the fan of the last used extruder, but turn the others off (if any). This is useful if you have completely separate extruders.</li><li><b>All fans:</b> turn on all fans during nozzle switch. This is useful if you have a single cooling fan, or multiple fans that stay close to each other.</li></ul></html>",
"type": "enum",
"options":
{
"unchanged": "Unchanged",
"only_last_extruder": "Only last extruder",
"all_fans": "All fans"
},
"default_value": "unchanged",
"settable_per_mesh": false,
"settable_per_extruder": false
}
}
},
@ -5118,6 +5176,18 @@
}
}
},
"support_infill_density_multiplier_initial_layer":
{
"label": "Support Infill Density Multiplier Initial Layer",
"description": "Multiplier for the infill on the initial layers of the support. Increasing this may help for bed adhesion.",
"type": "int",
"minimum_value": "1",
"default_value": 1,
"enabled": "support_enable or support_meshes_present",
"limit_to_extruder": "support_extruder_nr_layer_0",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"support_infill_angles":
{
"label": "Support Infill Line Directions",
@ -6208,6 +6278,7 @@
"type": "bool",
"default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_remove_inside_corners'))",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children":
@ -6220,6 +6291,7 @@
"value": "raft_remove_inside_corners",
"default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_base_remove_inside_corners'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -6231,6 +6303,7 @@
"value": "raft_remove_inside_corners",
"default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_interface_remove_inside_corners'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -6242,6 +6315,7 @@
"value": "raft_remove_inside_corners",
"default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_surface_remove_inside_corners'))",
"settable_per_mesh": false,
"settable_per_extruder": false
}
@ -6382,6 +6456,38 @@
"settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr"
},
"raft_base_infill_overlap":
{
"label": "Raft Base Infill Overlap Percentage",
"description": "The amount of overlap between the infill and the walls of the raft base, as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill.",
"unit": "%",
"type": "float",
"default_value": 0,
"minimum_value_warning": "-50",
"maximum_value_warning": "100",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr",
"children":
{
"raft_base_infill_overlap_mm":
{
"label": "Raft Base Infill Overlap",
"description": "The amount of overlap between the infill and the walls of the raft base. A slight overlap allows the walls to connect firmly to the infill.",
"unit": "mm",
"type": "float",
"default_value": 0.0,
"minimum_value_warning": "-0.5 * machine_nozzle_size",
"maximum_value_warning": "machine_nozzle_size",
"value": "raft_base_line_width * raft_base_infill_overlap / 100",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr"
}
}
},
"raft_interface_layers":
{
"label": "Raft Middle Layers",
@ -6443,6 +6549,54 @@
"settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr"
},
"raft_interface_z_offset":
{
"label": "Raft Interface Z Offset",
"description": "When printing the first layer of the raft interface, translate by this offset to customize the adhesion between base and interface. A negative offset should improve the adhesion.",
"unit": "mm",
"type": "float",
"default_value": 0.0,
"minimum_value_warning": "-raft_interface_thickness / 2",
"minimum_value": "-raft_interface_thickness",
"maximum_value_warning": "raft_interface_thickness / 2",
"maximum_value": "raft_interface_thickness",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_interface_layers > 0",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr"
},
"raft_interface_infill_overlap":
{
"label": "Raft Interface Infill Overlap Percentage",
"description": "The amount of overlap between the infill and the walls of the raft interface, as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill.",
"unit": "%",
"type": "float",
"default_value": 0,
"minimum_value_warning": "-50",
"maximum_value_warning": "100",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr",
"children":
{
"raft_interface_infill_overlap_mm":
{
"label": "Raft Interface Infill Overlap",
"description": "The amount of overlap between the infill and the walls of the raft interface. A slight overlap allows the walls to connect firmly to the infill.",
"unit": "mm",
"type": "float",
"default_value": 0.0,
"minimum_value_warning": "-0.5 * machine_nozzle_size",
"maximum_value_warning": "machine_nozzle_size",
"value": "raft_interface_line_width * raft_interface_infill_overlap / 100",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr"
}
}
},
"raft_surface_layers":
{
"label": "Raft Top Layers",
@ -6504,6 +6658,22 @@
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
},
"raft_surface_z_offset":
{
"label": "Raft Surface Z Offset",
"description": "When printing the first layer of the raft surface, translate by this offset to customize the adhesion between interface and surface. A negative offset should improve the adhesion.",
"unit": "mm",
"type": "float",
"default_value": 0.0,
"minimum_value_warning": "-raft_surface_thickness / 2",
"minimum_value": "-raft_surface_thickness",
"maximum_value_warning": "raft_surface_thickness / 2",
"maximum_value": "raft_surface_thickness",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
},
"raft_surface_monotonic":
{
"label": "Monotonic Raft Top Surface Order",
@ -6516,6 +6686,38 @@
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
},
"raft_surface_infill_overlap":
{
"label": "Raft Surface Infill Overlap Percentage",
"description": "The amount of overlap between the infill and the walls of the raft surface, as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill.",
"unit": "%",
"type": "float",
"default_value": 0,
"minimum_value_warning": "-50",
"maximum_value_warning": "100",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr",
"children":
{
"raft_surface_infill_overlap_mm":
{
"label": "Raft Surface Infill Overlap",
"description": "The amount of overlap between the infill and the walls of the raft surface. A slight overlap allows the walls to connect firmly to the infill.",
"unit": "mm",
"type": "float",
"default_value": 0.0,
"minimum_value_warning": "-0.5 * machine_nozzle_size",
"maximum_value_warning": "machine_nozzle_size",
"value": "raft_surface_line_width * raft_surface_infill_overlap / 100",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
}
}
},
"raft_wall_count":
{
"label": "Raft Wall Count",
@ -6525,7 +6727,7 @@
"minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_extruder": true,
"children":
{
"raft_base_wall_count":
@ -6538,7 +6740,8 @@
"minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": false
"settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr"
},
"raft_interface_wall_count":
{
@ -6549,7 +6752,8 @@
"minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": false
"settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr"
},
"raft_surface_wall_count":
{
@ -6560,7 +6764,8 @@
"minimum_value": "0",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": false
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
}
}
},
@ -6818,6 +7023,63 @@
"limit_to_extruder": "raft_surface_extruder_nr"
}
}
},
"raft_flow":
{
"label": "Raft Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"children":
{
"raft_base_flow":
{
"label": "Raft Base Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft base printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"value": "raft_flow",
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_base_extruder_nr"
},
"raft_interface_flow":
{
"label": "Raft Interface Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft interface printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"value": "raft_flow",
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_interface_extruder_nr"
},
"raft_surface_flow":
{
"label": "Raft Surface Flow",
"description": "The amount of material, relative to a normal extrusion line, to extrude during raft surface printing. Having an increased flow may improve adhesion and raft structural strength.",
"type": "float",
"unit": "%",
"default_value": 100.0,
"value": "raft_flow",
"minimum_value": "10",
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "raft_surface_extruder_nr"
}
}
}
}
},
@ -6845,7 +7107,7 @@
"label": "Prime Tower Type",
"description": "<html>How to generate the prime tower:<ul><li><b>Normal:</b> create a bucket in which secondary materials are primed</li><li><b>Interleaved:</b> create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other</li></ul></html>",
"type": "enum",
"value": "'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'",
"resolve": "'interleaved' if all(mode == 'interleaved' for mode in extruderValues('prime_tower_mode')) else 'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'",
"options":
{
"normal": "Normal",
@ -6898,6 +7160,20 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
"prime_tower_min_shell_thickness":
{
"label": "Prime Tower Minimum Shell Thickness",
"description": "The minimum thickness of the prime tower shell. You may increase it to make the prime tower stronger.",
"unit": "mm",
"type": "float",
"default_value": 0.4,
"minimum_value": "max(extruderValues('prime_tower_line_width'))",
"maximum_value_warning": "10.0",
"enabled": "prime_tower_enable and resolveOrValue('prime_tower_mode') == 'interleaved'",
"resolve": "max(extruderValues('prime_tower_line_width'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
"prime_tower_position_x":
{
"label": "Prime Tower X Position",
@ -8021,6 +8297,19 @@
"default_value": 90,
"settable_per_mesh": true
},
"seam_overhang_angle":
{
"label": "Seam Overhanging Wall Angle",
"description": "Try to prevent seams on walls that overhang more than this angle. When the value is 90, no walls will be treated as overhanging.",
"unit": "\u00b0",
"type": "float",
"minimum_value": "0",
"minimum_value_warning": "2",
"maximum_value": "90",
"default_value": 90,
"value": "support_angle",
"settable_per_mesh": true
},
"wall_overhang_speed_factor":
{
"label": "Overhanging Wall Speed",

View File

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

View File

@ -37,7 +37,6 @@
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 200 },
"machine_name": { "default_value": "Mendel90" },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
"machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;absolute extrusion\nM107 ;start with the fan off\nG28 ;home\nG92 E0 ;zero the extruded length\nM140 S{material_bed_temperature_layer_0} ; set the bed temperature and continue on\nG1 X-50 Y98 F9000 ;go to the left of the top\nG1 Z0.05 ; close to the bed\nM104 S{material_print_temperature_layer_0}; pre-heat the extruder continue on\nM190 S{material_bed_temperature_layer_0} ;set the bed temp & wait\nM109 S{material_print_temperature_layer_0};set the extruder temp for layer 0 & wait\nG92 E0 ;zero the extruded length\nG1 X50 E10 F300 ; make a thick line to prime extruder\nG92 E0 ; reset extruder\nG1 E-4 F1800\nG1 Z0.3 ;lift Z\n" },
"machine_width": { "default_value": 200 },

View File

@ -157,8 +157,6 @@
"value": "jerk_wall * 5 / 10"
},
"jerk_wall_x": { "maximum_value_warning": "0.01" },
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"machine_acceleration": { "default_value": 1500 },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 420 },

View File

@ -78,7 +78,6 @@
"machine_heat_zone_length": { "default_value": 20 },
"machine_height": { "default_value": 205 },
"machine_name": { "default_value": "Discov3ry Complete (Ultimaker 2+)" },
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_show_variants": { "default_value": true },
"machine_start_gcode": { "default_value": "\n;Updated Firmware (.hex and Marlin .ino) for \n;Ultimaker 2+ with Discov3ry Extruder available at: \n;https://github.com/Structur3d/UM2.1Discov3ry-Firmware-beta \n;**Learn more at https://www.structur3d.io** \n \nM104 S{material_print_temperature} ;Start heating extruder \nM140 S{material_bed_temperature} ;Start heating bed \nG21 ;metric values \nG90 ;absolute positioning \nM82 ;set extruder to absolute mode \nM107 ;start with the fan off \nM302 ;allow cold extrusion \nM92 E2589 ;set extruder EEPROM steps/mm for paste \nG28 Z0 ;move Z to bottom endstops \nG28 X0 Y0 ;move X/Y to endstops \nG1 X15 Y0 F4000 ;move X/Y to front of printer \nG1 Z15.0 F9000 ;move the platform to 15mm \nG92 E0 ;zero the extruded length \nG1 F200 E10 ;extrude 10 mm of feed stock \nG92 E0 ;zero the extruded length again \nG1 F9000 \n;Put printing message on LCD screen \nM117 Printing..." },
"machine_width": { "default_value": 205 },

View File

@ -44,7 +44,6 @@
"machine_max_acceleration_y": { "default_value": 6000 },
"machine_max_acceleration_z": { "default_value": 12000 },
"machine_name": { "default_value": "TypeAMachines" },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
"machine_start_gcode": { "default_value": ";-- START GCODE --\n;Sliced for Type A Machines Series 1\n;Sliced at: {day} {date} {time}\n;Basic settings:\n;Layer height: {layer_height}\n;Walls: {wall_thickness}\n;Fill: {fill_distance}\n;Print Speed: {print_speed}\n;Support: {support}\n;Retraction Speed: {retraction_speed}\n;Retraction Distance: {retraction_amount}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Settings based on: {material_profile}\nG21 ;metric values\nG90 ;absolute positioning\nG28 ;move to endstops\nG29 ;allows for auto-levelling\nG1 Z15.0 F12000 ;move the platform down 15mm\nG1 X150 Y5 F9000 ;center\nM140 S{material_bed_temperature} ;Prep Heat Bed\nM109 S{default_material_print_temperature} ;Heat To temp\nM190 S{material_bed_temperature} ;Heat Bed to temp\nG1 X150 Y5 Z0.3 ;move the platform to purge extrusion\nG92 E0 ;zero the extruded length\nG1 F200 X250 E30 ;extrude 30mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 X150 Y150 Z25 F12000 ;recenter and begin\nG1 F9000" },
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },

View File

@ -80,6 +80,7 @@
"maximum_value_warning": "120",
"minimum_value": "0"
},
"material_print_temp_wait": { "value": false },
"material_print_temperature": { "minimum_value": "0" },
"material_standby_temperature":
{
@ -88,6 +89,9 @@
},
"meshfix_maximum_deviation": { "value": "machine_nozzle_size / 10" },
"meshfix_maximum_resolution": { "value": "max(speed_wall_0 / 75, 0.5)" },
"prime_tower_base_curve_magnitude": { "value": 2 },
"prime_tower_base_height": { "value": 6 },
"prime_tower_base_size": { "value": 10 },
"raft_base_speed": { "value": "raft_speed" },
"raft_base_thickness": { "value": "min(machine_nozzle_size * 0.75, 0.3)" },
"raft_interface_fan_speed": { "value": "(raft_base_fan_speed + raft_surface_fan_speed) / 2" },
@ -134,7 +138,8 @@
"wall_x_material_flow_layer_0": { "value": "0.95 * material_flow_layer_0" },
"xy_offset": { "value": "-layer_height * 0.1" },
"xy_offset_layer_0": { "value": "-wall_line_width_0 / 5 + xy_offset" },
"z_seam_corner": { "value": "'z_seam_corner_none'" },
"z_seam_corner": { "value": "'z_seam_corner_weighted'" },
"z_seam_relative": { "value": "True" },
"zig_zaggify_support": { "value": true }
}
}

View File

@ -95,7 +95,6 @@
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_name": { "default_value": "Ultimaker 2" },
"machine_nozzle_head_distance": { "default_value": 3 },
"machine_nozzle_tip_outer_diameter": { "default_value": 1 },
"machine_start_gcode": { "value": "\"G0 F3000 Y50 ;avoid prime blob\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nG28 Z0 ;move Z to bottom endstops\\nG28 X0 Y0 ;move X/Y to endstops\\nG1 X15 Y0 F4000 ;move X/Y to front of printer\\nG1 Z15.0 F9000 ;move the platform to 15mm\\nG92 E0 ;zero the extruded length\\nG1 F200 E10 ;extrude 10 mm of feed stock\\nG92 E0 ;zero the extruded length again\\nG1 Y50 F9000\\n;Put printing message on LCD screen\\nM117 Printing...\"" },
"machine_use_extruder_offset_to_offset_coords": { "default_value": true },

View File

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

View File

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

View File

@ -70,8 +70,6 @@
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
"infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "True" },
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"machine_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 215 },
"machine_disallowed_areas":

View File

@ -64,6 +64,7 @@
"bridge_skin_material_flow": { "maximum_value": "100" },
"bridge_skin_material_flow_2": { "maximum_value": "100" },
"bridge_skin_material_flow_3": { "maximum_value": "100" },
"bridge_sparse_infill_max_density": { "value": "50" },
"bridge_wall_material_flow": { "maximum_value": "100" },
"bridge_wall_speed": { "value": "speed_wall" },
"brim_width": { "value": "5" },
@ -103,8 +104,6 @@
},
"jerk_travel_enabled": { "value": "True" },
"layer_height": { "value": "min(min(extruderValues('machine_nozzle_size')) / 2, 0.2)" },
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"machine_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 240 },
"machine_end_gcode": { "default_value": "" },
@ -130,7 +129,7 @@
"machine_min_cool_heat_time_window": { "value": "15" },
"machine_name": { "default_value": "Ultimaker Factor 4" },
"machine_nozzle_cool_down_speed": { "value": "0.3 + 0.0025 * material_print_temperature" },
"machine_nozzle_heat_up_speed": { "value": "2 - 0.0025 * material_print_temperature" },
"machine_nozzle_heat_up_speed": { "value": "2.1 - 0.0025 * material_print_temperature" },
"machine_start_gcode": { "default_value": "" },
"machine_width": { "default_value": 330 },
"material_bed_temperature": { "maximum_value": "120" },

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_",
"fdplast_",
"filo3d_",
"generic_bvoh_175",
"generic_cpe_175",
"generic_hips_175",
"generic_pc_175",
"generic_",
"ultimaker_rapidrinse_175",
"generic_tpu_175",
"goofoo_",
"ideagen3D_",
"imade3d_",
@ -59,13 +55,7 @@
"1": "ultimaker_method_extruder_right"
},
"nozzle_offsetting_for_disallowed_areas": false,
"platform_offset": [
0,
0,
0
],
"platform_texture": "MakerbotMethod.png",
"preferred_material": "generic_pla_175",
"preferred_material": "ultimaker_pla_175",
"preferred_quality_type": "fast",
"preferred_variant_name": "1A",
"supports_network_connection": true,
@ -201,13 +191,17 @@
"bridge_wall_material_flow": { "value": "material_flow" },
"bridge_wall_speed": { "value": "speed_wall" },
"brim_width": { "value": 5 },
"cool_fan_enabled":
{
"force_depends_on_settings": [ "support_extruder_nr" ]
},
"default_material_bed_temperature": { "resolve": "min(extruderValues('default_material_bed_temperature'))" },
"extruder_prime_pos_abs": { "default_value": true },
"gradual_support_infill_steps": { "value": 0 },
"infill_before_walls": { "value": false },
"infill_enable_travel_optimization": { "value": true },
"infill_material_flow": { "value": "material_flow" },
"infill_overlap": { "value": 0 },
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'lines'" },
"infill_pattern": { "value": "'grid' if infill_sparse_density < 80 else 'lines'" },
"infill_wipe_dist": { "value": 0 },
"inset_direction": { "value": "'inside_out'" },
"jerk_enabled":
@ -315,8 +309,6 @@
"enabled": false,
"value": "jerk_print"
},
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"machine_acceleration": { "default_value": 3000 },
"machine_center_is_zero": { "value": true },
"machine_end_gcode": { "default_value": "" },
@ -329,14 +321,16 @@
"machine_nozzle_cool_down_speed": { "value": 0.8 },
"machine_nozzle_heat_up_speed": { "value": 3.5 },
"machine_scale_fan_speed_zero_to_one": { "value": true },
"machine_start_gcode": { "default_value": "" },
"machine_start_gcode": { "default_value": "G0 Z20" },
"material_bed_temperature": { "enabled": "machine_heated_bed" },
"material_bed_temperature_layer_0": { "enabled": "machine_heated_bed" },
"material_final_print_temperature": { "value": "material_print_temperature-10" },
"material_flow": { "value": 97 },
"material_flow": { "value": 100 },
"material_initial_print_temperature": { "value": "material_print_temperature-10" },
"material_print_temperature": { "value": "default_material_print_temperature" },
"material_print_temperature":
{
"force_depends_on_settings": [ "support_extruder_nr" ]
},
"material_shrinkage_percentage": { "enabled": true },
"min_bead_width": { "value": "0.75*line_width" },
"min_wall_line_width": { "value": 0.4 },
"minimum_support_area": { "value": 0.1 },
"multiple_mesh_overlap": { "value": 0 },
@ -351,19 +345,90 @@
"prime_tower_raft_base_line_spacing": { "value": "raft_base_line_width" },
"prime_tower_wipe_enabled": { "value": true },
"print_sequence": { "enabled": false },
"raft_base_line_spacing": { "value": "2*raft_base_line_width" },
"raft_base_line_width": { "value": 1.4 },
"raft_airgap":
{
"force_depends_on_settings": [ "support_extruder_nr" ]
},
"raft_base_fan_speed": { "value": 0 },
"raft_base_line_spacing":
{
"force_depends_on_settings": [ "raft_interface_extruder_nr" ],
"value": "2*raft_base_line_width"
},
"raft_base_line_width":
{
"force_depends_on_settings": [ "raft_interface_extruder_nr" ],
"value": 1.4
},
"raft_base_speed": { "value": 10 },
"raft_base_thickness": { "value": 0.8 },
"raft_base_thickness":
{
"force_depends_on_settings": [
"raft_interface_extruder_nr",
"support_extruder_nr"
],
"value": 0.8
},
"raft_base_wall_count":
{
"force_depends_on_settings": [ "support_extruder_nr" ],
"value": "raft_wall_count"
},
"raft_interface_extruder_nr": { "value": "raft_surface_extruder_nr" },
"raft_interface_fan_speed": { "value": 0 },
"raft_interface_infill_overlap":
{
"force_depends_on_settings": [ "raft_interface_extruder_nr" ]
},
"raft_interface_layers": { "value": 2 },
"raft_interface_line_width": { "value": 0.7 },
"raft_interface_line_spacing":
{
"force_depends_on_settings": [
"raft_base_thickness",
"raft_interface_extruder_nr"
]
},
"raft_interface_line_width":
{
"force_depends_on_settings": [
"raft_base_thickness",
"raft_interface_extruder_nr"
],
"value": 0.7
},
"raft_interface_speed": { "value": 90 },
"raft_interface_thickness": { "value": 0.3 },
"raft_interface_wall_count": { "value": "raft_wall_count" },
"raft_interface_z_offset":
{
"force_depends_on_settings": [
"raft_base_thickness",
"raft_interface_extruder_nr"
]
},
"raft_margin": { "value": 1.2 },
"raft_smoothing": { "value": 9.5 },
"raft_surface_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material')) if support_enable and extruderValue(support_extruder_nr,'material_is_support_material') else raft_base_extruder_nr" },
"raft_surface_fan_speed": { "value": 0 },
"raft_surface_flow":
{
"force_depends_on_settings": [ "support_extruder_nr" ]
},
"raft_surface_speed":
{
"force_depends_on_settings": [ "support_extruder_nr" ]
},
"raft_surface_thickness":
{
"force_depends_on_settings": [ "support_extruder_nr" ]
},
"raft_surface_wall_count": { "value": "raft_wall_count" },
"raft_surface_z_offset":
{
"force_depends_on_settings": [ "support_extruder_nr" ]
},
"raft_wall_count": { "value": 2 },
"retract_at_layer_change": { "value": true },
"retraction_amount": { "value": 0.75 },
"retraction_combing": { "value": "'off'" },
"retraction_combing_max_distance": { "value": "speed_travel / 10" },
@ -372,11 +437,15 @@
"retraction_hop": { "value": 0.4 },
"retraction_hop_enabled": { "value": true },
"retraction_hop_only_when_collides": { "value": false },
"retraction_min_travel": { "value": "0.6" },
"retraction_prime_speed": { "value": "retraction_speed" },
"retraction_speed": { "value": 5 },
"roofing_layer_count": { "value": 2 },
"roofing_material_flow": { "value": "material_flow" },
"roofing_monotonic": { "value": true },
"skin_material_flow": { "value": "0.95*material_flow" },
"skin_material_flow": { "value": "material_flow" },
"skin_material_flow_layer_0": { "value": "material_flow" },
"skin_monotonic": { "value": true },
"skin_outline_count": { "value": 0 },
"skin_overlap": { "value": 0 },
"skin_preshrink": { "value": 0 },
@ -395,27 +464,32 @@
"speed_wall_0": { "value": "speed_wall * 30/40" },
"speed_wall_x": { "value": "speed_wall" },
"support_angle": { "value": 40 },
"support_bottom_distance": { "value": "support_z_distance / 2" },
"support_bottom_height": { "value": "2*support_infill_sparse_thickness" },
"support_bottom_material_flow": { "value": "material_flow" },
"support_bottom_wall_count": { "value": "0" },
"support_brim_enable": { "value": false },
"support_conical_min_width": { "value": 10 },
"support_enable": { "value": true },
"support_extruder_nr": { "value": "int(anyExtruderWithMaterial('material_is_support_material'))" },
"support_fan_enable": { "value": false },
"support_fan_enable": { "value": "True" },
"support_infill_rate": { "value": 20.0 },
"support_infill_sparse_thickness": { "value": "layer_height" },
"support_interface_enable": { "value": true },
"support_interface_height": { "value": "4*support_infill_sparse_thickness" },
"support_interface_material_flow": { "value": "material_flow" },
"support_interface_offset": { "value": 0 },
"support_interface_offset": { "value": "1" },
"support_interface_pattern": { "value": "'lines'" },
"support_interface_wall_count": { "value": 2 },
"support_interface_wall_count": { "value": "1" },
"support_material_flow": { "value": "material_flow" },
"support_offset": { "value": "1.8" },
"support_pattern": { "value": "'lines'" },
"support_roof_height": { "value": "4*layer_height" },
"support_roof_material_flow": { "value": "material_flow" },
"support_supported_skin_fan_speed": { "value": "cool_fan_speed_max" },
"support_top_distance": { "value": "support_z_distance" },
"support_wall_count": { "value": "1 if support_conical_enabled or support_structure == 'tree' else 0" },
"support_use_towers": { "value": "False" },
"support_wall_count": { "value": "2 if support_conical_enabled or support_structure == 'tree' else 0" },
"support_xy_distance": { "value": 0.2 },
"support_z_distance": { "value": 0 },
"support_xy_distance_overhang": { "value": "support_xy_distance" },
"switch_extruder_retraction_amount": { "value": 0.5 },
"switch_extruder_retraction_speeds": { "value": "retraction_speed" },
"top_bottom_thickness": { "value": "5*layer_height" },
@ -423,13 +497,15 @@
"travel_avoid_other_parts": { "value": false },
"wall_0_inset": { "value": 0 },
"wall_0_material_flow": { "value": "material_flow" },
"wall_0_material_flow_layer_0": { "value": "material_flow" },
"wall_0_wipe_dist": { "value": 0.8 },
"wall_material_flow": { "value": "material_flow" },
"wall_x_material_flow": { "value": "material_flow" },
"wall_x_material_flow_layer_0": { "value": "material_flow" },
"xy_offset": { "value": 0 },
"xy_offset_layer_0": { "value": "xy_offset" },
"z_seam_corner": { "value": "'z_seam_corner_none'" },
"z_seam_position": { "value": "'backright'" },
"z_seam_relative": { "value": true },
"z_seam_type": { "value": "'sharpest_corner'" },
"zig_zaggify_infill": { "value": true }
}

View File

@ -23,19 +23,7 @@
"fabtotum_",
"fdplast_",
"filo3d_",
"generic_asa_175",
"generic_abs_175",
"generic_bvoh_175",
"generic_petg_175",
"generic_pla_175",
"generic_tough_pla_175",
"generic_pva_175",
"generic_cffpa_175",
"generic_cpe_175",
"generic_nylon_175",
"generic_hips_175",
"generic_pc_175",
"generic_tpu_175",
"generic_",
"goofoo_",
"ideagen3D_",
"imade3d_",
@ -48,6 +36,7 @@
"polywood_pla",
"redd_",
"tizyx_",
"ultimaker_tough_pla_175",
"verbatim_",
"Vertex_",
"volumic_",
@ -70,7 +59,6 @@
0,
16
],
"platform_texture": "MakerbotMethod.png",
"preferred_material": "ultimaker_absr_175",
"preferred_quality_type": "draft",
"preferred_variant_name": "1XA",
@ -83,6 +71,7 @@
},
"overrides":
{
"build_volume_temperature": { "maximum_value": "107" },
"machine_depth": { "default_value": 236.48 },
"machine_disallowed_areas":
{

View File

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

View File

@ -70,8 +70,6 @@
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
"infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "True" },
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"machine_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 190 },
"machine_end_gcode": { "default_value": "" },

View File

@ -74,8 +74,6 @@
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
"infill_wipe_dist": { "value": "0" },
"jerk_enabled": { "value": "True" },
"layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
"layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
"machine_acceleration": { "default_value": 3000 },
"machine_depth": { "default_value": 240 },
"machine_end_gcode": { "default_value": "" },

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,
"maximum_value": "1"
},
"machine_nozzle_head_distance": { "default_value": 5 },
"machine_nozzle_offset_x": { "default_value": 0.0 },
"machine_nozzle_offset_y": { "default_value": 0.0 }
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

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