Merge branch 'main' into 5.7-merge-to-main

This commit is contained in:
Erwan MATHIEU 2024-06-12 12:02:35 +02:00 committed by GitHub
commit 772692250f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
78 changed files with 15278 additions and 258 deletions

View file

@ -5,11 +5,10 @@ body:
- type: markdown
attributes:
value: |
### 💥 Slicing Crash Analysis Tool 💥
We are taking steps to analyze an increase in reported crashes more systematically. We'll need some help with that. 😇
Before filling out the report below, we want you to try a special Cura 5.7 Alpha.
This version of Cura 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/discussions/18080) ####
### ✨Try our improved Cura 5.7✨
Before filling out the report below, we want you to try the latest Cura 5.7 Beta.
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) ####
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

View file

@ -0,0 +1,40 @@
name: conan-package-resources
on:
push:
paths:
- '.github/workflows/conan-package-resources.yml'
- 'resources/definitions/**'
- 'resources/extruders/**'
- 'resources/images/**'
- 'resources/intent/**'
- 'resources/meshes/**'
- 'resources/quality/**'
- 'resources/variants/**'
- 'resources/conanfile.py'
branches:
- 'main'
- 'CURA-*'
- 'PP-*'
- 'NP-*'
- '[0-9].[0-9]*'
- '[0-9].[0-9][0-9]*'
env:
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
jobs:
conan-recipe-version:
uses: ultimaker/cura-workflows/.github/workflows/conan-recipe-version.yml@main
with:
project_name: cura_resources
conan-package-export:
needs: [ conan-recipe-version ]
uses: ultimaker/cura-workflows/.github/workflows/conan-recipe-export.yml@main
with:
recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }}
recipe_id_latest: ${{ needs.conan-recipe-version.outputs.recipe_id_latest }}
conan_recipe_root: "./resources/"
secrets: inherit

View file

@ -4,12 +4,20 @@ on:
push:
paths:
- 'plugins/**'
- 'resources/**'
- 'cura/**'
- 'resources/bundled_packages/**'
- 'resources/i18n/**'
- 'resources/qml/**'
- 'resources/setting_visibility/**'
- 'resources/shaders/**'
- 'resources/texts/**'
- 'resources/themes/**'
- 'resources/public_key.pem'
- 'resources/README_resources.txt'
- 'icons/**'
- 'tests/**'
- 'packaging/**'
- '.github/workflows/conan-*.yml'
- '.github/workflows/conan-package.yml'
- '.github/workflows/notify.yml'
- '.github/workflows/requirements-runner.txt'
- 'requirements*.txt'
@ -20,6 +28,7 @@ on:
- 'main'
- 'CURA-*'
- 'PP-*'
- 'NP-*'
- '[0-9].[0-9]*'
- '[0-9].[0-9][0-9]*'

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 * * *'
@ -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

@ -5,6 +5,9 @@ on:
path:
- "resources/**"
permissions:
contents: read
jobs:
printer-linter-diagnose:
name: Printer linter PR diagnose
@ -18,6 +21,7 @@ jobs:
- uses: technote-space/get-diff-action@v6
with:
DIFF_FILTER: AMRCD
PATTERNS: |
resources/+(extruders|definitions)/*.def.json
resources/+(intent|quality|variants)/**/*.inst.cfg
@ -41,11 +45,15 @@ jobs:
if: env.GIT_DIFF && !env.MATCHED_FILES
run: python printer-linter/src/terminal.py --diagnose --report printer-linter-result/fixes.yml ${{ env.GIT_DIFF_FILTERED }}
- name: Check Deleted Files(s)
if: env.GIT_DIFF
run: python printer-linter/src/terminal.py --deleted --report printer-linter-result/comment.md ${{ env.GIT_DIFF_FILTERED }}
- name: Save PR metadata
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,76 +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
- 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 }}
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

@ -1,5 +1,5 @@
# NOTE: Best to keep all of these remarks in, they might prove useful in the future.
# This is basically just the standard one that is sugested on 'new workflow'.
# This is basically just the standard one that is suggested on 'new workflow'.
name: Scorecard supply-chain security
on:
@ -21,51 +21,42 @@ jobs:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
# Needed for Code scanning upload
security-events: write
# Needed to publish results and get a badge (see publish_results below).
# Needed for GitHub OIDC token if publish_results is true
id-token: write
# Uncomment the permissions below if installing in a private repository.
# contents: read
# actions: read
steps:
- name: "Checkout code"
uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@e38b1902ae4f44df626f11ba0734b14fb91f8f86 # v2.1.2
uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
# Scorecard team runs a weekly scan of public GitHub repos,
# see https://github.com/ossf/scorecard#public-data.
# Setting `publish_results: true` helps us scale by leveraging your workflow to
# extract the results instead of relying on our own infrastructure to run scans.
# And it's free for you!
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
# Upload the results as artifacts (optional). Commenting out will disable
# uploads of run results in SARIF format to the repository Actions tab.
# https://docs.github.com/en/actions/advanced-guides/storing-workflow-data-as-artifacts
- name: "Upload artifact"
uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # v3.1.0
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
# Upload the results to GitHub's code scanning dashboard (optional).
# Commenting out will disable upload of results to your repo's Code Scanning dashboard
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@17573ee1cc1b9d061760f3a006fc4aac4f944fd5 # v2.2.4
uses: github/codeql-action/upload-sarif@83a02f7883b12e0e4e1a146174f5e2292a01e601 # v2.16.4
with:
sarif_file: results.sarif

View file

@ -3,6 +3,10 @@ checks:
diagnostic-mesh-file-size: true
diagnostic-definition-redundant-override: true
diagnostic-resources-macos-app-directory-name: true
diagnostic-incorrect-formula: true
diagnostic-resource-file-deleted: true
diagnostic-material-temperature-defined: true
diagnostic-long-profile-names: true
fixes:
diagnostic-definition-redundant-override: true
format:

View file

@ -26,7 +26,9 @@
*With hundreds of settings & community-managed print profiles,* <br>
*Ultimaker Cura is sure to lead your next project to a success.*
<br>
**Contribute Printer Profiles?** -- Please [look here](https://github.com/Ultimaker/Cura/wiki/Adding-new-machine-profiles-to-Cura) first. <br>
**Contribute Translations?** -- Please [look here](https://github.com/Ultimaker/Cura/wiki/Translating-Cura) first.
<br>
[![Button Building]][Building]

View file

@ -1,11 +1,12 @@
version: "5.7.2"
version: "5.8.0-alpha.0"
requirements:
- "uranium/5.7.2"
- "curaengine/5.7.2"
- "cura_binary_data/5.7.2"
- "fdm_materials/5.7.2"
- "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/0.2.0-alpha.0"
- "dulcificum/latest@ultimaker/testing"
- "pysavitar/5.3.0"
- "pynest2d/5.3.0"
- "curaengine_grpc_definitions/0.2.0"
@ -54,6 +55,10 @@ pyinstaller:
package: "cura"
src: "resources"
dst: "share/cura/resources"
cura_shared_resources:
package: "cura_resources"
src: "res"
dst: "share/cura/resources"
cura_private_data:
package: "cura_private_data"
src: "res"

View file

@ -468,6 +468,12 @@ class CuraConan(ConanFile):
copy(self, "*", os.path.join(self.package_folder, self.cpp_info.resdirs[0]), str(self._share_dir.joinpath("cura", "resources")), keep_path = True)
copy(self, "*", os.path.join(self.package_folder, self.cpp_info.resdirs[1]), str(self._share_dir.joinpath("cura", "plugins")), keep_path = True)
# Copy the cura_resources resources from the package
rm(self, "conanfile.py", os.path.join(self.package_folder, self.cpp.package.resdirs[0]))
cura_resources = self.dependencies["cura_resources"].cpp_info
for res_dir in cura_resources.resdirs:
copy(self, "*", res_dir, str(self._share_dir.joinpath("cura", "resources", Path(res_dir).name)), keep_path = True)
# Copy resources of Uranium (keep folder structure)
uranium = self.dependencies["uranium"].cpp_info
copy(self, "*", uranium.resdirs[0], str(self._share_dir.joinpath("uranium", "resources")), keep_path = True)
@ -519,6 +525,12 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
# Remove the fdm_materials from the package
rmdir(self, os.path.join(self.package_folder, self.cpp.package.resdirs[0], "materials"))
# Remove the cura_resources resources from the package
rm(self, "conanfile.py", os.path.join(self.package_folder, self.cpp.package.resdirs[0]))
cura_resources = self.dependencies["cura_resources"].cpp_info
for res_dir in cura_resources.resdirs:
rmdir(self, os.path.join(self.package_folder, self.cpp.package.resdirs[0], Path(res_dir).name))
def package_info(self):
self.user_info.pip_requirements = "requirements.txt"
self.user_info.pip_requirements_git = "requirements-ultimaker.txt"

View file

@ -422,7 +422,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
_PRINTER_TYPE_NAME = {
"fire_e": "ultimaker_method",
"lava_f": "ultimaker_methodx",
"magma_10": "ultimaker_methodxl"
"magma_10": "ultimaker_methodxl",
"sketch": "ultimaker_sketch"
}
if printer_type in _PRINTER_TYPE_NAME:
return _PRINTER_TYPE_NAME[printer_type]

View file

@ -1,9 +1,8 @@
# Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from io import StringIO, BufferedIOBase
import json
from typing import cast, List, Optional, Dict
from typing import cast, List, Optional, Dict, Tuple
from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED
import pyDulcificum as du
@ -39,16 +38,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 +84,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 +103,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,7 +133,7 @@ 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)
@ -127,7 +144,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 +160,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 +174,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 +216,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,9 +225,8 @@ class MakerbotWriter(MeshWriter):
meta["version"] = MakerbotWriter._META_VERSION
meta["preferences"] = dict()
for node in nodes:
bounds = node.getBoundingBox()
meta["preferences"][str(node.getName())] = {
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,
}
@ -245,7 +264,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": [{
"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

@ -26,27 +26,40 @@ class InsertAtLayerChange(Script):
},
"gcode_to_add":
{
"label": "G-code to insert.",
"label": "G-code to insert",
"description": "G-code to add before or after layer change.",
"type": "str",
"default_value": ""
},
"skip_layers":
{
"label": "Skip layers",
"description": "Number of layers to skip between insertions (0 for every layer).",
"type": "int",
"default_value": 0,
"minimum_value": 0
}
}
}"""
def execute(self, data):
gcode_to_add = self.getSettingValueByKey("gcode_to_add") + "\n"
skip_layers = self.getSettingValueByKey("skip_layers")
count = 0
for layer in data:
# Check that a layer is being printed
lines = layer.split("\n")
for line in lines:
if ";LAYER:" in line:
index = data.index(layer)
if count == 0:
if self.getSettingValueByKey("insert_location") == "before":
layer = gcode_to_add + layer
else:
layer = layer + gcode_to_add
data[index] = layer
count = (count + 1) % (skip_layers + 1)
break
return data

View file

@ -356,7 +356,10 @@ geometry41core =
EndPrimitive();
}
if ((u_show_starts == 1) && (v_prev_line_type[0] != 1) && (v_line_type[0] == 1)) {
if ((u_show_starts == 1) && (
((v_prev_line_type[0] != 1) && (v_line_type[0] == 1)) ||
((v_prev_line_type[0] != 4) && (v_line_type[0] == 4))
)) {
float w = size_x;
float h = size_y;

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

@ -1,7 +1,7 @@
[project]
name = "printerlinter"
description = "Cura UltiMaker printer linting tool"
version = "0.1.1"
version = "0.1.2"
authors = [
{ name = "UltiMaker", email = "cura@ultimaker.com" }
]

View file

@ -32,3 +32,13 @@ class Diagnostic:
},
"Level": self.level
}
class GitComment:
def __init__(self, comment: str) -> None:
"""
@param comment: The comment text.
"""
self.comment = comment
def toDict(self) -> Dict[str, Any]:
return self.comment

View file

@ -6,20 +6,21 @@ from .linters.defintion import Definition
from .linters.linter import Linter
from .linters.meshes import Meshes
from .linters.directory import Directory
from .linters.formulas import Formulas
def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]:
""" Returns a Linter depending on the file format """
if not file.exists():
return None
return [Directory(file, settings)]
if ".inst" in file.suffixes and ".cfg" in file.suffixes:
return [Directory(file, settings), Profile(file, settings)]
return [Directory(file, settings), Profile(file, settings), Formulas(file, settings)]
if ".def" in file.suffixes and ".json" in file.suffixes:
if file.stem in ("fdmprinter.def", "fdmextruder.def"):
return None
return [Directory(file, settings), Definition(file, settings)]
return [Formulas(file, settings)]
return [Directory(file, settings), Definition(file, settings), Formulas(file, settings)]
if file.parent.stem == "meshes":
return [Meshes(file, settings)]

View file

@ -28,6 +28,10 @@ class Definition(Linter):
for check in self.checkRedefineOverride():
yield check
if self._settings["checks"].get("diagnostic-material-temperature-defined", False):
for check in self.checkMaterialTemperature():
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,7 +45,7 @@ class Definition(Linter):
definition = self._definitions[definition_name]
if "overrides" in definition and definition_name not in ("fdmprinter", "fdmextruder"):
for key, value_dict in definition["overrides"].items():
is_redefined, child_key, child_value, parent = self._isDefinedInParent(key, value_dict, definition['inherits'])
is_redefined, child_key, child_value, parent, inherited_by= self._isDefinedInParent(key, value_dict, definition['inherits'])
if is_redefined:
redefined = re.compile(r'.*(\"' + key + r'\"[\s\:\S]*?)\{[\s\S]*?\},?')
found = redefined.search(self._content)
@ -59,12 +63,40 @@ class Definition(Linter):
yield Diagnostic(
file = self._file,
diagnostic_name = "diagnostic-definition-redundant-override",
message = f"Overriding {key} with the same value ({child_key}: {child_value}) as defined in parent definition: {definition['inherits']}",
message = f"Overriding {key} with the same value ({child_key}: {child_value}) as defined in parent definition: {inherited_by}",
level = "Warning",
offset = found.span(0)[0],
replacements = replacements
)
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"):
for key, value_dict in definition["overrides"].items():
if "temperature" in key and "material" in key:
redefined = re.compile(r'.*(\"' + key + r'\"[\s\:\S]*?)\{[\s\S]*?\},?')
found = redefined.search(self._content)
if len(found.group().splitlines()) > 1:
replacements = []
else:
replacements = [Replacement(
file=self._file,
offset=found.span(1)[0],
length=len(found.group()),
replacement_text="")]
yield Diagnostic(
file=self._file,
diagnostic_name="diagnostic-material-temperature-defined",
message=f"Overriding {key} as it belongs to material temperature catagory and shouldn't be placed in machine definitions",
level="Warning",
offset=found.span(0)[0],
replacements=replacements
)
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
@ -85,7 +117,7 @@ class Definition(Linter):
def _isDefinedInParent(self, key, value_dict, inherits_from):
if self._ignore(key, "diagnostic-definition-redundant-override"):
return False, None, None, None
return False, None, None, None, None
if "overrides" not in self._definitions[inherits_from]:
return self._isDefinedInParent(key, value_dict, self._definitions[inherits_from]["inherits"])
@ -114,11 +146,11 @@ class Definition(Linter):
v = child_value
cv = check_value
if v == cv:
return True, child_key, child_value, parent
return True, child_key, child_value, parent, inherits_from
if "inherits" in parent:
return self._isDefinedInParent(key, value_dict, parent["inherits"])
return False, None, None, None
return False, None, None, None, None
def _loadBasePrinterSettings(self):
settings = {}

View file

@ -1,7 +1,7 @@
from pathlib import Path
from typing import Iterator
from ..diagnostic import Diagnostic
from ..diagnostic import Diagnostic, GitComment
from .linter import Linter
@ -11,9 +11,12 @@ class Directory(Linter):
super().__init__(file, settings)
def check(self) -> Iterator[Diagnostic]:
if self._settings["checks"].get("diagnostic-resources-macos-app-directory-name", False):
if self._file.exists() and self._settings["checks"].get("diagnostic-resources-macos-app-directory-name", False):
for check in self.checkForDotInDirName():
yield check
elif self._settings["checks"].get("diagnostic-resource-file-deleted", False):
for check in self.checkFilesDeleted():
yield check
yield
@ -29,3 +32,8 @@ class Directory(Linter):
)
yield
def checkFilesDeleted(self) -> Iterator[GitComment]:
if not self._file.exists():
""" Check if there is a file that is deleted, this causes upgrade scripts to not work properly """
yield GitComment( f'File: **{self._file}** must not be deleted as it is not allowed. It will create issues upgrading Cura' )
yield

View file

@ -0,0 +1,177 @@
import difflib
import json
import os
import re
from configparser import ConfigParser
from pathlib import Path
from typing import Iterator
from ..diagnostic import Diagnostic
from ..replacement import Replacement
from .linter import Linter
FORMULA_NAMES = [
"extruderValue",
"extruderValues",
"anyExtruderWithMaterial",
"anyExtruderNrWithOrDefault",
"resolveOrValue",
"defaultExtruderPosition",
"valueFromContainer",
"extruderValueFromContainer",
"math",
"round",
"max",
"ceil",
"min",
"sqrt",
"log",
"tan",
"cos",
"sin",
"atan",
"acos",
"asin",
"floor",
"sum",
"len",
"radians",
"degrees"
]
DELIMITERS = [r'\+', '-', '=', '/', '\*', r'\(', r'\)', r'\[', r'\]', '{', '}', ' ', '^']
class Formulas(Linter):
"""Finds Typos in the definition files and their formulas."""
def __init__(self, file: Path, settings: dict) -> None:
super().__init__(file, settings)
self._cura_correction_strings = FORMULA_NAMES + list(self.getCuraSettingList())
self._definition = {}
def getCuraSettingList(self) -> 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)
def extractKeys(self, json_obj, parent_key=''):
keys_with_value = []
for key, values in json_obj.items():
new_key = key
if isinstance(values, dict):
if 'label' in values:
keys_with_value.append(new_key)
keys_with_value.extend(self.extractKeys(values, new_key))
return keys_with_value
def check(self) -> Iterator[Diagnostic]:
if self._settings["checks"].get("diagnostic-incorrect-formula", False):
for check in self.checkFormulas():
yield check
yield
def checkFormulas(self) -> Iterator[Diagnostic]:
self._loadDefinitionFiles(self._file)
self._content = self._file.read_text()
definition_name = list(self._definition.keys())[0]
definition = self._definition[definition_name]
if "overrides" in definition:
for key, value_dict in definition["overrides"].items():
for value in value_dict:
if value in ("enable", "resolve", "value", "minimum_value_warning", "maximum_value_warning",
"maximum_value", "minimum_value"):
key_incorrect = self.checkValueIncorrect(key)
if key_incorrect:
found = self._appendCorrections(key, key)
value_incorrect = self.checkValueIncorrect(value_dict[value])
if value_incorrect:
found = self._appendCorrections(key, value_dict[value])
if key_incorrect or value_incorrect:
if len(found.group().splitlines()) > 1:
replacements = []
else:
replacements = [Replacement(
file=self._file,
offset=found.span(1)[0],
length=len(found.group()),
replacement_text=self._replacement_text)]
yield Diagnostic(
file=self._file,
diagnostic_name="diagnostic-incorrect-formula",
message=f"Given formula {found.group()} seems incorrect, Do you mean {self._correct_formula}? please correct the formula and try again.",
level="Error",
offset=found.span(0)[0],
replacements=replacements
)
yield
def _appendCorrections(self, key, incorrectString):
if self._file.suffix == '.cfg':
key_with_incorrectValue = re.compile(r'(\b' + key + r'\b\s*=\s*[^=\n]+.*)')
else:
key_with_incorrectValue = re.compile(r'.*(\"' + key + r'\"[\s\:\S]*?)\{[\s\S]*?\},?')
found = key_with_incorrectValue.search(self._content)
if len(found.group().splitlines()) > 1:
self._replacement_text = ''
else:
self._replacement_text = found.group().replace(incorrectString, self._correct_formula).strip(' ')
return found
def _loadDefinitionFiles(self, definition_file) -> None:
""" Loads definition file contents into self._definition. Also load parent definition if it exists. """
definition_name = Path(definition_file.stem).stem
if not definition_file.exists() or definition_name in self._definition:
return
if definition_file.suffix == ".json":
# Load definition file into dictionary
self._definition[definition_name] = json.loads(definition_file.read_text())
if definition_file.suffix == ".cfg":
self._definition[definition_name] = self._parseCfg(definition_file)
def _parseCfg(self, file_path:Path) -> dict:
config = ConfigParser()
config.read([file_path])
file_data ={}
overrides = {}
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
return file_data
def checkValueIncorrect(self, formula) -> bool:
if isinstance(formula, str):
self._correct_formula = self._correctTyposInFormula(formula)
return self._correct_formula != formula
else:
return False
def _correctTyposInFormula(self, formula):
pattern = '|'.join(DELIMITERS)
tokens = re.split(pattern, formula)
output = formula
for token in tokens:
if '(' not in token and ')' not in token:
cleaned_token = re.sub(r'[^\w\s]', '', token)
possible_matches = difflib.get_close_matches(cleaned_token, self._cura_correction_strings, n=1, cutoff=0.8)
if possible_matches:
output = output.replace(cleaned_token, possible_matches[0])
return output

View file

@ -1,9 +1,42 @@
from typing import Iterator
import re
from typing import Iterator, Tuple
from ..diagnostic import Diagnostic
from .linter import Linter
from pathlib import Path
from configparser import ConfigParser
class Profile(Linter):
MAX_SIZE_OF_NAME = 20
def __init__(self, file: Path, settings: dict) -> None:
""" Finds issues in the parent directory"""
super().__init__(file, settings)
self._content = self._file.read_text()
def check(self) -> Iterator[Diagnostic]:
yield
if self._file.exists() and self._settings["checks"].get("diagnostic-long-profile-names", False):
for check in self.checklengthofProfileName():
yield check
def checklengthofProfileName(self) -> Iterator[Diagnostic]:
""" check the name of profile and where it is found"""
name_of_profile, found = self._getprofileName()
if len(name_of_profile) > Profile.MAX_SIZE_OF_NAME:
yield Diagnostic(
file=self._file,
diagnostic_name="diagnostic-long-profile-names",
message = f"The profile name **{name_of_profile}** exceeds the maximum length limit. For optimal results, please limit it to 20 characters or fewer.",
level="Warning",
offset = found.span(0)[0]
)
def _getprofileName(self) -> Tuple[str, bool]:
config = ConfigParser()
config.read([self._file])
name_of_profile = config.get("general", "name")
redefined = re.compile(name_of_profile)
found = redefined.search(self._content)
return name_of_profile, found

View file

@ -19,6 +19,7 @@ def main() -> None:
parser.add_argument("--report", required=False, type=Path, help="Path where the diagnostic report should be stored")
parser.add_argument("--format", action="store_true", help="Format the files")
parser.add_argument("--diagnose", action="store_true", help="Diagnose the files")
parser.add_argument("--deleted", action="store_true", help="Check for deleted files")
parser.add_argument("--fix", action="store_true", help="Attempt to apply the suggested fixes on the files")
parser.add_argument("Files", metavar="F", type=Path, nargs="+", help="Files or directories to format")
@ -41,12 +42,26 @@ def main() -> None:
settings = yaml.load(f, yaml.FullLoader)
full_body_check = {"Diagnostics": []}
comments_check = {"Error Files": []}
for file in files:
if not path.exists(file):
print(f"Can't find the file: {file}")
return
if args.deleted:
for file in args.Files:
if file not in files:
deletedFiles = diagnoseIssuesWithFile(file, settings)
comments_check["Error Files"].extend([d.toDict() for d in deletedFiles])
results = yaml.dump(comments_check, default_flow_style=False, indent=4, width=240)
if report:
report.write_text(results)
else:
print(results)
if to_fix or to_diagnose:
for file in files:
diagnostics = diagnoseIssuesWithFile(file, settings)
@ -82,7 +97,6 @@ def diagnoseIssuesWithFile(file: Path, settings: dict) -> List[Diagnostic]:
return linter_results
def applyFixesToFile(file, settings, full_body_check) -> None:
if not file.exists():
return

View file

@ -213,9 +213,9 @@ requests==2.22.0 \
--hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \
--hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31
# twisted
Twisted==21.2.0 \
--hash=sha256:77544a8945cf69b98d2946689bbe0c75de7d145cdf11f391dd487eae8fc95a12 \
--hash=sha256:aab38085ea6cda5b378b519a0ec99986874921ee8881318626b0a3414bb2631e
Twisted==23.8.0 \
--hash=sha256:3c73360add17336a622c0d811c2a2ce29866b6e59b1125fd6509b17252098a24 \
--hash=sha256:b8bdba145de120ffb36c20e6e071cce984e89fba798611ed0704216fb7f884cd
constantly==15.1.0 \
--hash=sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35 \
--hash=sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d

1
resources/conandata.yml Normal file
View file

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

62
resources/conanfile.py Normal file
View file

@ -0,0 +1,62 @@
import os
from conan import ConanFile
from conan.tools.files import copy, update_conandata
from conan.tools.scm import Version
from conan.errors import ConanInvalidConfiguration
required_conan_version = ">=1.58.0 <2.0.0"
class CuraResource(ConanFile):
name = "cura_resources"
license = ""
author = "UltiMaker"
url = "https://github.com/Ultimaker/cura"
description = "Cura Resources"
topics = ("conan", "cura")
settings = "os", "compiler", "build_type", "arch"
no_copy_source = True
@property
def _shared_resources(self):
return ["definitions", "extruders", "images", "intent", "meshes", "quality", "variants"]
def set_version(self):
if not self.version:
self.version = self.conan_data["version"]
def export(self):
copy(self, pattern="LICENSE*", src=os.path.join(self.recipe_folder, ".."), dst=self.export_folder,
keep_path=False)
update_conandata(self, {"version": self.version})
def export_sources(self):
for shared_resources in self._shared_resources:
copy(self, pattern="*", src=os.path.join(self.recipe_folder, shared_resources),
dst=os.path.join(self.export_sources_folder, shared_resources))
def validate(self):
if Version(self.version) <= Version("4"):
raise ConanInvalidConfiguration("Only versions 5+ are support")
def layout(self):
self.cpp.source.resdirs = self._shared_resources
self.cpp.package.resdirs = [f"res/{res}" for res in self._shared_resources]
def package(self):
copy(self, "*", os.path.join(self.export_sources_folder),
os.path.join(self.package_folder, "res"))
def package_info(self):
self.cpp_info.includedirs = []
self.runenv_info.append_path("CURA_RESOURCES", os.path.join(self.package_folder, "res"))
self.runenv_info.append_path("CURA_ENGINE_SEARCH_PATH", os.path.join(self.package_folder, "res", "definitions"))
self.runenv_info.append_path("CURA_ENGINE_SEARCH_PATH", os.path.join(self.package_folder, "res", "extruders"))
self.env_info.CURA_RESOURCES.append(os.path.join(self.package_folder, "res"))
self.env_info.CURA_ENGINE_SEARCH_PATH.append(os.path.join(self.package_folder, "res", "definitions"))
self.env_info.CURA_ENGINE_SEARCH_PATH.append(os.path.join(self.package_folder, "res", "definitions"))
def package_id(self):
self.info.clear()

View file

@ -0,0 +1,246 @@
{
"version": 2,
"name": "AnkerMake M5C",
"inherits": "fdmprinter",
"metadata":
{
"visible": true,
"author": "just-trey",
"manufacturer": "AnkerMake",
"file_formats": "text/x-gcode",
"platform": "ankermake_m5c_platform.obj",
"has_machine_quality": true,
"machine_extruder_trains": { "0": "ankermake_m5c_extruder_0" },
"platform_texture": "ankermake_m5c.png",
"preferred_material": "generic_pla",
"preferred_quality_type": "normal"
},
"overrides":
{
"acceleration_enabled": { "value": true },
"acceleration_infill": { "value": 5000 },
"acceleration_layer_0": { "value": 2500 },
"acceleration_prime_tower": { "value": 5000 },
"acceleration_print": { "value": 5000 },
"acceleration_print_layer_0": { "value": 2500 },
"acceleration_roofing": { "value": 2500 },
"acceleration_skirt_brim": { "value": 2500 },
"acceleration_support": { "value": 5000 },
"acceleration_support_bottom": { "value": 5000 },
"acceleration_support_infill": { "value": 5000 },
"acceleration_support_interface": { "value": 5000 },
"acceleration_support_roof": { "value": 5000 },
"acceleration_topbottom": { "value": 2500 },
"acceleration_travel_layer_0": { "value": 2500 },
"acceleration_wall": { "value": 5000 },
"acceleration_wall_x": { "value": 5000 },
"adhesion_type": { "default_value": "skirt" },
"alternate_extra_perimeter": { "value": true },
"bottom_layers": { "value": 3 },
"bottom_skin_expand_distance": { "value": 0.84 },
"bottom_skin_preshrink": { "value": 0.84 },
"bottom_thickness": { "value": 0.8 },
"bridge_fan_speed_2": { "value": 100 },
"bridge_fan_speed_3": { "value": 100 },
"bridge_settings_enabled": { "value": true },
"bridge_skin_density_2": { "value": 80 },
"bridge_skin_material_flow": { "value": 100 },
"bridge_skin_material_flow_2": { "value": 80 },
"bridge_skin_speed": { "value": 20 },
"bridge_skin_speed_2": { "value": 50 },
"bridge_skin_speed_3": { "value": 50 },
"bridge_wall_material_flow": { "value": 100 },
"bridge_wall_speed": { "value": 20 },
"connect_infill_polygons": { "value": false },
"cool_fan_full_at_height": { "value": 0.14 },
"cool_min_layer_time": { "value": 6 },
"cool_min_speed": { "value": 30 },
"cross_infill_pocket_size": { "value": 8 },
"expand_skins_expand_distance": { "value": 0.84 },
"fill_outline_gaps": { "value": false },
"gantry_height": { "value": 25 },
"gradual_infill_step_height": { "value": 2 },
"infill_angles":
{
"value": [
90
]
},
"infill_extruder_nr": { "value": -1 },
"infill_line_distance": { "value": 8 },
"infill_material_flow": { "value": 90 },
"infill_pattern": { "value": "'lines' if infill_sparse_density >= 25 else 'grid'" },
"infill_sparse_density": { "value": 10 },
"infill_sparse_thickness": { "value": 0.25 },
"infill_wipe_dist": { "value": 0.1 },
"initial_bottom_layers": { "value": 3 },
"jerk_enabled": { "value": true },
"jerk_infill": { "value": 15 },
"jerk_layer_0": { "value": 15 },
"jerk_prime_tower": { "value": 15 },
"jerk_print": { "value": 15 },
"jerk_print_layer_0": { "value": 15 },
"jerk_roofing": { "value": 15 },
"jerk_skirt_brim": { "value": 15 },
"jerk_support": { "value": 15 },
"jerk_support_bottom": { "value": 15 },
"jerk_support_infill": { "value": 15 },
"jerk_support_interface": { "value": 15 },
"jerk_support_roof": { "value": 15 },
"jerk_topbottom": { "value": 15 },
"jerk_travel": { "value": 15 },
"jerk_travel_layer_0": { "value": 15 },
"jerk_wall": { "value": 15 },
"jerk_wall_0": { "value": 15 },
"jerk_wall_x": { "value": 15 },
"machine_buildplate_type": { "value": "glass" },
"machine_depth": { "value": 220 },
"machine_heated_bed": { "value": true },
"machine_height": { "value": 250 },
"machine_max_jerk_e": { "value": 5 },
"machine_max_jerk_xy": { "value": 30 },
"machine_max_jerk_z": { "value": 0.3 },
"machine_name": { "default_value": "AnkerMake M5" },
"machine_shape": { "value": "rectangular" },
"machine_show_variants": { "value": false },
"machine_start_gcode": { "default_value": "M104 S{material_print_temperature_layer_0} ; set final nozzle temp\nM190 S{material_bed_temperature_layer_0} ; set and wait for nozzle temp to stabilize\nM109 S{material_print_temperature_layer_0} ; wait for nozzle temp to stabilize\nG28 ;Home\nG1 E10 F3600; push out retracted filament(fix for over retraction after prime)" },
"machine_width": { "value": 220 },
"material_diameter": { "default_value": 1.75 },
"material_flow_layer_0": { "value": 120 },
"material_no_load_move_factor": { "value": 0.94 },
"minimum_interface_area": { "value": 10 },
"minimum_support_area": { "value": "2 if support_structure == 'normal' else 0" },
"retract_at_layer_change": { "value": true },
"retraction_amount": { "value": 0.8 },
"retraction_combing": { "value": "noskin" },
"retraction_combing_max_distance": { "value": 3 },
"retraction_extrusion_window": { "value": 0.8 },
"retraction_min_travel": { "value": 0.8 },
"retraction_prime_speed": { "value": 60 },
"retraction_retract_speed": { "value": 60 },
"retraction_speed": { "value": 60 },
"roofing_angles": { "value": [] },
"roofing_monotonic": { "value": false },
"roofing_pattern": { "value": "zigzag" },
"skin_material_flow": { "value": 97 },
"skin_monotonic": { "default_value": true },
"skirt_brim_speed":
{
"maximum_value_warning": "550",
"value": 50
},
"skirt_line_count": { "value": 3 },
"small_feature_max_length": { "value": 9.42 },
"small_hole_max_size": { "value": 3 },
"speed_infill":
{
"maximum_value_warning": "550",
"value": 270
},
"speed_layer_0":
{
"maximum_value_warning": "550",
"value": 50
},
"speed_prime_tower":
{
"maximum_value_warning": "550",
"value": 500
},
"speed_print":
{
"maximum_value_warning": "550",
"value": 500
},
"speed_print_layer_0":
{
"maximum_value_warning": "550",
"value": 50
},
"speed_roofing":
{
"maximum_value_warning": "550",
"value": 150
},
"speed_support":
{
"maximum_value_warning": "550",
"value": 250
},
"speed_support_bottom":
{
"maximum_value_warning": "550",
"value": 166.667
},
"speed_support_infill":
{
"maximum_value_warning": "550",
"value": 250
},
"speed_support_interface":
{
"maximum_value_warning": "550",
"value": 166.667
},
"speed_support_roof":
{
"maximum_value_warning": "550",
"value": 166.667
},
"speed_topbottom":
{
"maximum_value_warning": "550",
"value": 150
},
"speed_travel":
{
"maximum_value_warning": "550",
"value": 500
},
"speed_travel_layer_0":
{
"maximum_value_warning": "550",
"value": 150
},
"speed_wall":
{
"maximum_value_warning": "550",
"value": 250
},
"speed_wall_0":
{
"maximum_value_warning": "550",
"value": 150
},
"speed_wall_x":
{
"maximum_value_warning": "550",
"value": 250
},
"speed_wall_x_roofing": { "maximum_value_warning": "550" },
"support_bottom_distance": { "value": 0.2 },
"support_brim_enable": { "value": false },
"support_brim_line_count": { "value": 20 },
"support_brim_width": { "value": 8 },
"support_infill_angles": { "value": [] },
"support_infill_rate": { "value": 30 },
"support_initial_layer_line_distance": { "value": 1.333 },
"support_line_distance": { "value": 1.333 },
"support_offset": { "value": 2 },
"support_top_distance": { "value": 0.2 },
"support_xy_distance": { "value": 0.8 },
"support_xy_overrides_z": { "value": "xy_overrides_z" },
"top_layers": { "value": 4 },
"top_skin_expand_distance": { "value": 0.84 },
"top_skin_preshrink": { "value": 0.84 },
"travel_avoid_distance": { "value": 0.63 },
"wall_0_extruder_nr": { "value": -1 },
"wall_extruder_nr": { "value": -1 },
"wall_line_width_0": { "value": 0.44 },
"wall_overhang_angle": { "value": 45 },
"wall_overhang_speed_factor": { "value": 40 },
"wall_thickness": { "value": 0.84 },
"wall_x_extruder_nr": { "value": -1 },
"zig_zaggify_infill": { "value": true }
}
}

View file

@ -13,7 +13,7 @@
"cool_min_layer_time": { "value": 5 },
"gantry_height": { "value": 25 },
"machine_depth": { "default_value": 225 },
"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 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y0 ;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\n" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\n\nG1 X0 Y0 ;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\n" },
"machine_head_with_fans_polygon":
{
"default_value": [

View file

@ -0,0 +1,55 @@
{
"version": 2,
"name": "Creality K1 Max",
"inherits": "creality_base",
"metadata":
{
"visible": true,
"author": "Itay Grudev",
"manufacturer": "Creality3D",
"file_formats": "text/x-gcode",
"first_start_actions": [ "MachineSettingsAction" ],
"has_machine_quality": true,
"has_materials": true,
"has_variants": true,
"machine_extruder_trains": { "0": "creality_k1max_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": 45 },
"machine_depth": { "default_value": 300 },
"machine_end_gcode": { "default_value": "END_PRINT" },
"machine_head_with_fans_polygon":
{
"default_value": [
[-50, 40],
[-50, -62],
[25, 40],
[25, -62]
]
},
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 300 },
"machine_max_acceleration_e": { "value": 5000 },
"machine_max_acceleration_x": { "value": 20000.0 },
"machine_max_acceleration_y": { "value": 20000.0 },
"machine_max_acceleration_z": { "value": 500.0 },
"machine_max_feedrate_e": { "value": 100 },
"machine_max_feedrate_x": { "value": 800 },
"machine_max_feedrate_y": { "value": 800 },
"machine_max_feedrate_z": { "value": 30 },
"machine_max_jerk_e": { "value": 2.5 },
"machine_max_jerk_xy": { "value": 9 },
"machine_max_jerk_z": { "value": 2 },
"machine_name": { "default_value": "Creality K1 Max" },
"machine_start_gcode": { "default_value": "M140 S0\nM104 S0 \nSTART_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0}\n" },
"machine_width": { "default_value": 300 },
"retraction_amount": { "default_value": 0.5 },
"retraction_speed": { "default_value": 40 }
}
}

View file

@ -11,7 +11,7 @@
"overrides":
{
"machine_depth": { "default_value": 210 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_head_with_fans_polygon":
{
"value": [

View file

@ -24,7 +24,7 @@
"brim_width": { "default_value": 5 },
"gantry_height": { "value": 30 },
"machine_depth": { "default_value": 235 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F1600 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F1600 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{

View file

@ -29,7 +29,7 @@
"gantry_height": { "value": 30 },
"machine_always_write_active_tool": { "default_value": true },
"machine_depth": { "default_value": 235 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-80 Z0.2 F1600 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-80 Z0.2 F1600 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_extruder_count": { "default_value": 2 },
"machine_extruders_share_heater": { "default_value": true },
"machine_extruders_share_nozzle": { "default_value": true },

View file

@ -11,7 +11,7 @@
"overrides":
{
"machine_depth": { "default_value": 235 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_head_with_fans_polygon":
{
"value": [

View file

@ -11,7 +11,7 @@
"overrides":
{
"machine_depth": { "default_value": 235 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_head_with_fans_polygon":
{
"value": [

View file

@ -12,7 +12,7 @@
{
"infill_overlap": { "value": "0 if infill_sparse_density < 40.01 and infill_pattern != 'concentric' else -5" },
"machine_depth": { "default_value": 235 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-8 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-8 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_head_with_fans_polygon":
{
"value": [

View file

@ -22,7 +22,7 @@
"initial_layer_line_width_factor": { "value": "100.0 if resolveOrValue('adhesion_type') == 'raft' else 125 if line_width < 0.5 else 110" },
"machine_acceleration": { "value": 5000 },
"machine_depth": { "default_value": 230 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z2 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth - 5} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z2 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth - 5} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_head_with_fans_polygon":
{

View file

@ -11,7 +11,7 @@
"overrides":
{
"machine_depth": { "default_value": 235 },
"machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-10 X5 Y5 Z3 F3000 ;Retract\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_head_with_fans_polygon":
{
"value": [

View file

@ -4775,6 +4775,34 @@
"settable_per_mesh": true,
"settable_per_extruder": true
},
"support_z_seam_away_from_model":
{
"label": "Support Z Seam Away from Model",
"description": "Manage the spatial relationship between the z seam of the support structure and the actual 3D model. This control is crucial as it allows users to ensure the seamless removal of support structures post-printing, without inflicting damage or leaving marks on the printed model.",
"type": "bool",
"default_value": true,
"enabled": "support_enable",
"settable_per_mesh": false,
"settable_per_extruder": true,
"settable_per_meshgroup": false,
"children":
{
"support_z_seam_min_distance":
{
"label": "Min Z Seam Distance from Model",
"description": "The distance between the model and its support structure at the z-axis seam.",
"unit": "mm",
"minimum_value": "0.001",
"value": "line_width * 2",
"default_value": 0.8,
"maximum_value_warning": "line_width * 4",
"type": "float",
"enabled": "support_z_seam_away_from_model and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": true
}
}
},
"support_type":
{
"label": "Support Placement",

View file

@ -14,7 +14,7 @@
"overrides":
{
"machine_depth": { "default_value": 302 },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_height": { "default_value": 402 },
"machine_name": { "default_value": "SV04 Copy Mode" },
"machine_start_gcode": { "default_value": ";SV04 start\nM140 S{material_bed_temperature};\nM104 S{material_print_temperature};\nM280 P0 S160;\nG4 P100;\nG28;\nM420 S1;\nM190 S{material_bed_temperature};\nM109 S{material_print_temperature};\nG92 E0;\nG1 X10.1 Y20 Z0.28 F5000.0;\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15;\nG1 X10.4 Y200.0 Z0.28 F5000.0;\nG1 X10.4 Y20 Z0.28 F1500.0 E30;\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000;" },

View file

@ -18,7 +18,7 @@
"overrides":
{
"machine_depth": { "default_value": 302 },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_extruder_count": { "default_value": 2 },
"machine_height": { "default_value": 402 },
"machine_name": { "default_value": "SV04 Dual Mode" },

View file

@ -14,7 +14,7 @@
"overrides":
{
"machine_depth": { "default_value": 302 },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_height": { "default_value": 402 },
"machine_name": { "default_value": "SV04 Mirror Mode" },
"machine_start_gcode": { "default_value": ";SV04 start\nM140 S{material_bed_temperature};\nM104 S{material_print_temperature};\nM280 P0 S160;\nG4 P100;\nG28;\nM420 S1;\nM190 S{material_bed_temperature};\nM109 S{material_print_temperature};\nG92 E0;\nG1 X10.1 Y20 Z0.28 F5000.0;\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15;\nG1 X10.4 Y200.0 Z0.28 F5000.0;\nG1 X10.4 Y20 Z0.28 F1500.0 E30;\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000;" },

View file

@ -14,7 +14,7 @@
"overrides":
{
"machine_depth": { "default_value": 302 },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_height": { "default_value": 402 },
"machine_name": { "default_value": "SV04 Single Mode 01" },
"machine_start_gcode": { "default_value": ";SV04 start\nM140 S{material_bed_temperature};\nM104 S{material_print_temperature};\nM280 P0 S160;\nG4 P100;\nG28;\nM420 S1;\nM190 S{material_bed_temperature};\nM109 S{material_print_temperature};\nG92 E0;\nG1 X10.1 Y20 Z0.28 F5000.0;\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15;\nG1 X10.4 Y200.0 Z0.28 F5000.0;\nG1 X10.4 Y20 Z0.28 F1500.0 E30;\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000;" },

View file

@ -14,7 +14,7 @@
"overrides":
{
"machine_depth": { "default_value": 302 },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_end_gcode": { "default_value": ";SV04 end\nG91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y240 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z" },
"machine_height": { "default_value": 402 },
"machine_name": { "default_value": "SV04 Single Mode 02" },
"machine_start_gcode": { "default_value": ";SV04 start\nM140 S{material_bed_temperature};\nM104 S{material_print_temperature};\nM280 P0 S160;\nG4 P100;\nG28;\nM420 S1;\nM190 S{material_bed_temperature};\nM109 S{material_print_temperature};\nG92 E0;\nG1 X10.1 Y20 Z0.28 F5000.0;\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15;\nG1 X10.4 Y200.0 Z0.28 F5000.0;\nG1 X10.4 Y20 Z0.28 F1500.0 E30;\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000;" },

View file

@ -20,7 +20,7 @@
"infill_wipe_dist": { "value": 0.1 },
"jerk_travel": { "value": "jerk_print" },
"machine_depth": { "default_value": 300 },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y220 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y{machine_depth} ;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\n" },
"machine_end_gcode": { "default_value": "G91 ;Relative positioning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X0 Y220 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positioning\n\nG1 X0 Y{machine_depth} ;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\n" },
"machine_head_with_fans_polygon":
{
"default_value": [

View file

@ -0,0 +1,259 @@
{
"version": 2,
"name": "UltiMaker Sketch",
"inherits": "ultimaker",
"metadata":
{
"visible": true,
"author": "Ultimaker",
"manufacturer": "Ultimaker B.V.",
"file_formats": "application/x-makerbot-sketch",
"platform": "ultimaker_sketch_platform.obj",
"exclude_materials": [
"dsm_175_novamidid1030cf",
"Essentium_175_UltrafuseZPCTG",
"imade3d_petg_175",
"imade3d_pla_175",
"imade3d_petg_green",
"imade3d_pla_green",
"imade3d_petg_pink",
"imade3d_pla_pink",
"chromatik_pla",
"3D-Fuel_PLA_PRO_Black",
"3D-Fuel_PLA_SnapSupport",
"bestfilament_abs_skyblue",
"bestfilament_petg_orange",
"bestfilament_pla_green",
"dsm_arnitel2045_175",
"dsm_novamid1070_175",
"emotiontech_abs",
"emotiontech_absx",
"emotiontech_acetate",
"emotiontech_asax",
"emotiontech_bvoh",
"emotiontech_copa",
"emotiontech_hips",
"emotiontech_nylon_1030",
"emotiontech_nylon_1030cf",
"emotiontech_nylon_1070",
"emotiontech_pc",
"emotiontech_pekk",
"emotiontech_petg",
"emotiontech_pla",
"emotiontech_pla_hr_870",
"emotiontech_pva-m",
"emotiontech_pva-s",
"emotiontech_tpu98a",
"eryone_petg",
"eryone_pla",
"eryone_pla_glow",
"eryone_pla_matte",
"eryone_pla_wood",
"eryone_tpu",
"eSUN_PETG_Black",
"eSUN_PETG_Grey",
"eSUN_PETG_Purple",
"eSUN_PLA_PRO_Black",
"eSUN_PLA_PRO_Grey",
"eSUN_PLA_PRO_Purple",
"eSUN_PLA_PRO_White",
"Extrudr_GreenTECPro_Anthracite_175",
"Extrudr_GreenTECPro_Black_175",
"Extrudr_GreenTECPro_Blue_175",
"Extrudr_GreenTECPro_Nature_175",
"Extrudr_GreenTECPro_Red_175",
"Extrudr_GreenTECPro_Silver_175",
"Extrudr_GreenTECPro_White_175",
"fabtotum_abs",
"fabtotum_nylon",
"fabtotum_pla",
"fabtotum_tpu",
"fdplast_abs_tomato",
"fdplast_petg_gray",
"fdplast_pla_olive",
"filo3d_pla",
"filo3d_pla_green",
"filo3d_pla_red",
"generic_asa_175",
"generic_abs_175",
"generic_absr_175",
"generic_bvoh_175",
"generic_cpe_175",
"generic_cffpa_175",
"generic_hips_175",
"generic_nylon_175",
"generic_pc_175",
"generic_petg_175",
"generic_pva_175",
"generic_rapidrinse_175",
"generic_sr30_175",
"generic_tpu_175",
"goofoo_abs",
"goofoo_asa",
"goofoo_bronze_pla",
"goofoo_emarble_pla",
"goofoo_esilk_pla",
"goofoo_hips",
"goofoo_pa",
"goofoo_pa_cf",
"goofoo_pc",
"goofoo_peek",
"goofoo_petg",
"goofoo_pla",
"goofoo_pva",
"goofoo_tpe_83a",
"goofoo_tpu_87a",
"goofoo_tpu_95a",
"goofoo_wood_pla",
"ideagen3D_ToughPLA",
"imade3d_petg_175",
"imade3d_pla_175",
"innofill_innoflex60_175",
"layer_one_black_pla",
"layer_one_dark_gray_pla",
"layer_one_white_pla",
"leapfrog_abs_natural",
"leapfrog_epla_natural",
"leapfrog_pva_natural",
"polyflex_pla",
"polymax_pla",
"polyplus_pla",
"polywood_pla",
"redd_abs",
"redd_asa",
"redd_hips",
"redd_nylon",
"redd_petg",
"redd_pla",
"redd_tpe",
"tizyx_abs",
"tizyx_flex",
"tizyx_petg",
"tizyx_pla",
"tizyx_pla_bois",
"tizyx_pva",
"verbatim_bvoh_175",
"Vertex_Delta_ABS",
"Vertex_Delta_PET",
"Vertex_Delta_PLA",
"Vertex_Delta_PLA_Glitter",
"Vertex_Delta_PLA_Mat",
"Vertex_Delta_PLA_Satin",
"Vertex_Delta_PLA_Wood",
"Vertex_Delta_TPU",
"volumic_abs_ultra",
"volumic_arma_ultra",
"volumic_asa_ultra",
"volumic_br80_ultra",
"volumic_bumper_ultra",
"volumic_cu80_ultra",
"volumic_flex93_ultra",
"volumic_medical_ultra",
"volumic_nylon_ultra",
"volumic_pekk_carbone",
"volumic_petgcarbone_ultra",
"volumic_petg_ultra",
"volumic_pla_ultra",
"volumic_pp_ultra",
"volumic_strong_ultra",
"volumic_support_ultra",
"xyzprinting_abs",
"xyzprinting_antibact_pla",
"xyzprinting_carbon_fiber",
"xyzprinting_colorinkjet_pla",
"xyzprinting_flexible",
"xyzprinting_metallic_pla",
"xyzprinting_nylon",
"xyzprinting_pahtcf15",
"xyzprinting_pc",
"xyzprinting_petcf15",
"xyzprinting_petg",
"xyzprinting_pla",
"xyzprinting_ppgf30",
"xyzprinting_tough_pla",
"xyzprinting_tpu",
"zyyx_pro_flex",
"zyyx_pro_pla",
"octofiber_pla",
"fiberlogy_hd_pla"
],
"has_machine_quality": true,
"has_materials": true,
"has_variants": false,
"machine_extruder_trains": { "0": "ultimaker_sketch_extruder" },
"platform_offset": [
0,
0,
0
],
"platform_texture": "MakerbotSketch.png",
"preferred_quality_type": "draft",
"preferred_variant_name": "0.4mm",
"reference_machine_id": "sketch",
"supports_network_connection": true,
"supports_usb_connection": false,
"variant_definition": "ultimaker_sketch",
"variants_name": "Extruder",
"weight": -1
},
"overrides":
{
"acceleration_enabled": { "value": false },
"adhesion_type": { "value": "'raft'" },
"brim_width": { "value": "3" },
"cool_fan_speed": { "value": "100" },
"extruder_prime_pos_abs": { "default_value": true },
"gantry_height": { "value": "60" },
"infill_overlap": { "value": 15 },
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'triangles'" },
"infill_sparse_density": { "value": 15 },
"jerk_enabled": { "value": false },
"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_center_is_zero": { "default_value": true },
"machine_depth": { "default_value": 150 },
"machine_end_gcode": { "default_value": "M107; Disable Fan; \n; End of print; \n; End GCode\nM104 S0 T0; Set Toolhead Temp to 0\nM140 S0 T0; Set Platform Temp to 0\nG162 Z F1800; Move to max axes position\nG28 X Y; Home\nM652; Turn off back fan\nM132 X Y Z A B; Set Home Position\nG91; Use Relative Positioning\nM18; Disable Axes\n\n" },
"machine_extruder_count": { "default_value": 1 },
"machine_gcode_flavor": { "default_value": "Griffin" },
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 150 },
"machine_max_feedrate_x": { "default_value": 300 },
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_min_cool_heat_time_window": { "value": "15" },
"machine_name": { "default_value": "UltiMaker Sketch" },
"machine_nozzle_cool_down_speed": { "default_value": 0.8 },
"machine_nozzle_heat_up_speed": { "default_value": 1.4 },
"machine_start_gcode": { "default_value": "M140 S50 T0; Set Platform Temp\nM104 S220 T0; Set Extruder Temp\nG90; Use Absolute Positioning\nG28; Home\nM132 X Y Z A B; Set Current Position to Home\nG161 X Y F3300; Move to min axes positions\nM7 T0; Wait For Platform to Heat\nM6 T0; Wait For Extruders to Heat\nM651; Turn on back fan\nM907 X100 Y100 Z40 A80 B20; Set Stepper Currents\nM106; Enable Cooling Fan\n; Purge Line\nG92 E0; Reset Extruder Axis Position\nG1 X-26.18 Y-75.90 Z0.200 F420\nG1 X26.18 Y-75.90 E10\nG92 E0; Reset Extruder Axis Position\n; Start GCode\n" },
"machine_width": { "default_value": 150 },
"material_diameter": { "default_value": 1.75 },
"material_flow": { "default_value": 109 },
"multiple_mesh_overlap": { "value": "0" },
"optimize_wall_printing_order": { "value": "True" },
"prime_blob_enable":
{
"default_value": true,
"enabled": true,
"value": "resolveOrValue('print_sequence') != 'one_at_a_time'"
},
"raft_margin": { "value": "5" },
"retraction_amount": { "value": "5.5" },
"retraction_prime_speed": { "value": "15" },
"retraction_speed": { "value": "25" },
"speed_print": { "value": 60 },
"speed_support": { "value": "0.7 * speed_print" },
"speed_support_interface": { "value": "speed_topbottom" },
"speed_topbottom": { "value": "0.7 * speed_print" },
"speed_travel": { "value": 80 },
"speed_wall": { "value": "0.7 * speed_print" },
"speed_wall_0": { "value": "0.5 * speed_print " },
"speed_wall_x": { "value": "speed_wall" },
"speed_z_hop": { "value": 7 },
"support_angle": { "value": "45" },
"top_bottom_thickness": { "value": "4 * layer_height" },
"travel_avoid_distance": { "value": "machine_nozzle_tip_outer_diameter / 2 * 1.5" },
"wall_0_inset": { "value": "0" },
"wall_thickness": { "value": "2 * machine_nozzle_size" },
"zig_zaggify_infill": { "value": "gradual_infill_steps == 0" }
}
}

View file

@ -0,0 +1,15 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "ankermake_m5c",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,16 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata":
{
"machine": "creality_k1max",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View file

@ -0,0 +1,22 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "ultimaker_sketch",
"position": "0"
},
"overrides":
{
"extruder_nr":
{
"default_value": 0,
"maximum_value": "1"
},
"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 }
}
}

5
resources/i18n/README.md Normal file
View file

@ -0,0 +1,5 @@
If you aim to contribute translations please [look here](https://github.com/Ultimaker/Cura/wiki/Translating-Cura) first.
In particular, take heed of the following: <br>
When we're in the release-window (so that's when we have the beta out for the next Cura, but not the final release yet), we're also in the process of updating translations.
_**If you make a PR with updated or fixed translations within this timespan, it's likely that your additions/changes will be ignored in favour of the 'official' ones, due to how our process is set up.**_

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 517 KiB

View file

@ -0,0 +1,745 @@
# Exported from 3D Builder
mtllib D:\Documents\Projects\AnkerMake-M5-Profile\5.1\images\AM-M5-bed.mtl
o Object.1
v 121.092972 123.154205 -0.102764
v 119.840958 123.932068 -0.102778
v 119.840958 123.932068 0.097220
v 121.092972 123.154205 0.097234
v 78.657051 -126.525543 0.102253
v 78.012062 -126.955132 0.102262
v 78.012062 -126.955139 -0.097736
v 78.657051 -126.525551 -0.097745
v -75.704933 -141.014282 -0.097276
v -75.352928 -141.851379 -0.097260
v -75.352928 -141.851364 0.102738
v -75.704933 -141.014282 0.102722
v -74.881927 -142.616196 -0.097246
v -74.881927 -142.616180 0.102752
v 116.994965 124.874573 -0.102794
v 118.468956 124.512222 -0.102788
v 115.440956 125.000031 -0.102794
v 122.205963 122.196655 -0.102746
v 123.159973 121.079498 -0.102725
v 123.935974 119.821854 -0.102701
v 124.513977 118.444763 -0.102674
v 124.874969 116.966278 -0.102645
v 124.999969 115.405518 -0.102615
v 79.364059 -126.202339 0.102246
v 79.364059 -126.202347 -0.097752
v -76.946938 -128.027161 0.102464
v -76.946938 -128.027161 -0.097534
v -76.547928 -128.674576 -0.097521
v -76.547928 -128.674561 0.102477
v 80.123062 -125.999588 0.102241
v 80.123062 -125.999596 -0.097757
v 80.924057 -125.929337 -0.097759
v 80.924057 -125.929329 0.102239
v 125.000061 -116.334778 -0.098002
v 124.875061 -117.895561 -0.097971
v -115.441032 124.999939 -0.102525
v 75.924065 -140.114868 -0.097471
v 75.924065 -140.114868 0.102527
v 75.705070 -141.014221 0.102545
v 75.705070 -141.014221 -0.097453
v 74.301064 -143.294632 -0.097406
v 74.301064 -143.294632 0.102592
v 73.625069 -143.876816 -0.097394
v 118.468956 124.512222 0.097210
v 74.881050 -142.616135 -0.097420
v 74.881050 -142.616135 0.102578
v 116.994965 124.874573 0.097204
v 75.353065 -141.851318 -0.097436
v 75.353065 -141.851318 0.102562
v 115.440956 125.000031 0.097204
v 115.441055 -125.929314 0.102198
v 115.441055 -125.929321 -0.097800
v 116.995064 -125.803848 -0.097804
v 116.995064 -125.803841 0.102194
v 118.469055 -125.441521 -0.097813
v 118.469055 -125.441513 0.102185
v -124.999947 -116.334877 -0.097710
v -125.000031 115.405426 0.097675
v -125.000031 115.405418 -0.102323
v 119.841057 -124.861359 -0.097826
v 119.841057 -124.861351 0.102172
v 121.093071 -124.082481 -0.097843
v 121.093071 -124.082474 0.102155
v -124.874954 -117.895653 0.102319
v -124.513947 -119.374130 0.102348
v -124.999947 -116.334869 0.102288
v 124.514069 -119.374039 -0.097941
v 123.936066 -120.751137 -0.097913
v 123.160065 -122.008789 -0.097887
v 122.206055 -123.124947 -0.097863
v 122.206055 -123.124939 0.102135
v 74.000061 -122.918182 -0.097811
v -72.999939 -122.918236 -0.097640
v 123.160065 -122.008789 0.102111
v 123.936066 -120.751137 0.102085
v -116.996040 124.874481 0.097477
v -116.996040 124.874481 -0.102521
v -118.469032 124.512131 -0.102512
v -118.469032 124.512131 0.097486
v 124.514069 -119.374039 0.102057
v -119.841042 123.931976 -0.102499
v -119.841042 123.931976 0.097499
v 124.875061 -117.895561 0.102027
v -121.094032 123.154114 -0.102482
v -121.094032 123.154114 0.097516
v 125.000061 -116.334778 0.101996
v -122.207047 122.196564 -0.102462
v -122.207047 122.196564 0.097537
v -123.161026 121.079407 -0.102438
v -123.161026 121.079407 0.097560
v -123.936020 119.821762 -0.102412
v -123.936020 119.821762 0.097586
v 76.250061 -129.496536 -0.097683
v 76.548050 -128.762833 -0.097698
v 76.948059 -128.086334 -0.097712
v -124.514038 118.444664 -0.102384
v -124.514038 118.444672 0.097614
v -124.875038 116.966179 -0.102354
v -124.875038 116.966187 0.097644
v 77.439056 -127.480080 -0.097724
v 76.000069 -139.166367 0.102508
v 76.000069 -139.166367 -0.097490
v -115.441032 124.999939 0.097473
v 76.000061 -131.083420 0.102347
v 76.000061 -131.083420 -0.097651
v -80.121941 -126.071922 0.102429
v -80.922943 -126.007690 0.102429
v -80.922943 -126.007698 -0.097569
v -80.121941 -126.071930 -0.097569
v 124.874969 116.966278 0.097353
v 124.999969 115.405518 0.097383
v 76.064056 -130.274429 0.102331
v 76.064056 -130.274445 -0.097667
v 124.513977 118.444763 0.097324
v -79.363937 -126.258606 0.102432
v -79.363937 -126.258614 -0.097566
v 74.000069 -142.992523 -0.097412
v 123.935974 119.821869 0.097297
v 76.250061 -129.496536 0.102315
v -78.656929 -126.557716 0.102437
v -78.656929 -126.557724 -0.097561
v 123.159973 121.079514 0.097273
v 76.548050 -128.762817 0.102300
v 122.205963 122.196655 0.097252
v -78.011940 -126.959198 0.102444
v -78.011940 -126.959206 -0.097554
v 76.948059 -128.086319 0.102286
v -77.438934 -127.452026 0.102454
v -77.438934 -127.452034 -0.097544
v 77.439056 -127.480072 0.102274
v -74.301933 -143.294693 -0.097233
v -74.301933 -143.294678 0.102765
v -73.624931 -143.876877 -0.097222
v -73.624931 -143.876862 0.102776
v -88.022942 -125.929398 -0.097562
v -121.093933 -124.082565 0.102437
v -76.249939 -129.384201 -0.097507
v -88.022942 -126.007698 -0.097561
v -76.063942 -130.146011 -0.097492
v -75.999939 -130.948990 -0.097476
v -72.999931 -142.992584 -0.097240
v 71.133072 -144.923676 -0.097370
v 72.029060 -144.703873 -0.097375
v 70.188072 -144.999969 -0.097367
v 72.863068 -144.350555 -0.097383
v -70.187927 -145.000031 -0.097204
v -72.028931 -144.703934 -0.097207
v -71.133934 -144.923737 -0.097204
v -72.863922 -144.350616 -0.097213
v -75.999931 -139.166428 -0.097313
v -75.923935 -140.114929 -0.097294
v 70.188072 -144.999969 0.102631
v -70.187927 -145.000015 0.102794
v 71.133072 -144.923676 0.102628
v 72.029060 -144.703873 0.102623
v 72.863068 -144.350555 0.102615
v 73.625069 -143.876816 0.102604
v -72.863922 -144.350601 0.102785
v -72.028931 -144.703918 0.102791
v -71.133934 -144.923721 0.102794
v -115.440933 -125.929413 -0.097530
v -116.995941 -125.803940 -0.097531
v -118.468933 -125.441612 -0.097537
v -119.840942 -124.861450 -0.097547
v -121.093933 -124.082573 -0.097561
v -122.206947 -123.125038 -0.097578
v -123.160934 -122.008888 -0.097599
v -123.935928 -120.751236 -0.097624
v -124.513947 -119.374138 -0.097650
v -124.874954 -117.895660 -0.097679
v -76.249939 -129.384186 0.102491
v -76.063942 -130.145996 0.102506
v -75.999939 -130.948975 0.102522
v -75.999931 -139.166428 0.102685
v -88.022942 -125.929398 0.102436
v -88.022942 -126.007698 0.102437
v -123.935928 -120.751228 0.102374
v -123.160934 -122.008881 0.102399
v -122.206947 -123.125031 0.102420
v -119.840942 -124.861443 0.102451
v -118.468933 -125.441605 0.102461
v -116.995941 -125.803932 0.102467
v -115.440933 -125.929405 0.102468
v -75.923935 -140.114929 0.102704
usemtl Material.001_0
f 1 2 3
f 1 3 4
f 18 1 4
f 18 4 124
f 19 18 124
f 19 124 122
f 20 19 122
f 20 122 118
f 21 20 118
f 21 118 114
f 22 21 114
f 22 114 110
f 23 22 110
f 23 110 111
f 23 111 34
f 17 36 50
f 15 17 50
f 15 50 47
f 16 15 47
f 16 47 44
f 2 16 44
f 70 74 71
f 62 70 71
f 69 68 75
f 69 75 74
f 35 86 83
f 67 35 83
f 35 34 86
f 67 83 80
f 68 67 80
f 68 80 75
f 60 62 63
f 60 63 61
f 55 60 61
f 55 61 56
f 53 55 56
f 53 56 54
f 51 53 54
f 51 33 52
f 32 52 33
f 32 33 30
f 32 30 31
f 120 116 121
f 125 120 121
f 125 121 126
f 128 125 126
f 128 126 129
f 128 129 27
f 128 27 26
f 130 127 95
f 130 95 100
f 6 130 100
f 6 100 7
f 5 6 7
f 5 7 8
f 24 5 8
f 24 8 25
f 30 24 25
f 106 107 108
f 106 108 109
f 115 106 109
f 115 109 116
f 76 77 78
f 76 78 79
f 91 97 92
f 89 91 92
f 96 98 99
f 96 99 97
f 165 136 179
f 165 179 166
f 168 167 178
f 168 178 177
f 169 168 177
f 169 177 65
f 170 169 65
f 170 65 64
f 66 170 64
f 66 57 170
f 58 57 66
f 57 58 59
f 163 180 164
f 164 180 136
f 163 181 180
f 162 181 163
f 162 182 181
f 175 183 135
f 175 135 138
f 175 138 176
f 107 176 138
f 161 183 182
f 161 182 162
f 161 135 183
f 98 59 58
f 167 166 179
f 164 136 165
f 167 179 178
f 98 58 99
f 87 89 90
f 87 90 88
f 84 87 88
f 84 88 85
f 81 84 85
f 81 85 82
f 78 81 82
f 91 96 97
f 89 92 90
f 36 76 103
f 78 82 79
f 108 107 138
f 123 93 94
f 127 123 94
f 123 119 93
f 119 113 93
f 119 112 113
f 112 105 113
f 104 102 105
f 104 101 102
f 102 101 37
f 38 37 101
f 37 38 39
f 37 39 40
f 45 42 41
f 41 42 43
f 43 42 157
f 43 157 156
f 43 156 145
f 143 154 142
f 142 154 152
f 142 152 144
f 144 152 146
f 172 139 140
f 172 140 173
f 39 49 48
f 48 49 46
f 146 153 160
f 146 160 148
f 148 160 159
f 148 159 147
f 147 158 149
f 149 158 133
f 134 133 158
f 13 132 14
f 10 13 14
f 133 132 131
f 9 10 11
f 9 11 12
f 151 9 12
f 151 12 184
f 151 184 174
f 150 151 174
f 140 150 174
f 13 131 132
f 10 14 11
f 133 134 132
f 147 159 158
f 140 174 173
f 171 139 172
f 171 137 139
f 29 137 171
f 29 28 137
f 26 28 29
f 146 152 153
f 143 155 154
f 145 155 143
f 145 156 155
f 45 46 42
f 48 46 45
f 39 48 40
f 112 104 105
f 127 94 95
f 26 27 28
f 120 115 116
f 36 77 76
f 30 25 31
f 51 52 53
f 70 69 74
f 62 71 63
f 103 50 36
f 86 34 111
f 2 44 3
vt -0.000000 0.964465
vt 0.000000 0.106167
vt 0.961764 1.000000
vt 0.000500 0.100387
vt 0.001944 0.094911
vt 0.004256 0.089810
vt 0.007360 0.085152
vt 0.011176 0.081019
vt 0.015628 0.077472
vt 0.020636 0.074587
vt 0.026124 0.072439
vt 0.032020 0.071097
vt 0.038236 0.070632
vt 0.176304 0.070632
vt 0.204000 0.081784
vt 0.179508 0.070372
vt 0.182544 0.069621
vt 0.185372 0.068424
vt 0.187952 0.066833
vt 0.190244 0.064888
vt 0.192208 0.062643
vt 0.193808 0.060138
vt 0.195000 0.057420
vt 0.195744 0.054539
vt 0.196000 0.051543
vt 0.204000 0.007435
vt 0.196000 0.021606
vt 0.196304 0.018093
vt 0.197180 0.014762
vt 0.198588 0.011662
vt 0.200476 0.008829
vt 0.202796 0.006316
vt 0.205500 0.004160
vt 0.208548 0.002405
vt 0.211884 0.001097
vt 0.215468 0.000283
vt 0.219248 0.000000
vt 0.792000 0.007435
vt 0.780752 0.000000
vt 0.784536 0.000283
vt 0.788116 0.001097
vt 0.791456 0.002405
vt 0.794500 0.004160
vt 0.797208 0.006316
vt 0.799528 0.008829
vt 0.801412 0.011662
vt 0.802820 0.014762
vt 0.803696 0.018093
vt 0.804000 0.021606
vt 0.804000 0.052041
vt 0.792000 0.081784
vt 0.967984 0.999535
vt 0.814628 0.068305
vt 0.812048 0.066818
vt 0.809756 0.064993
vt 0.807788 0.062863
vt 0.806192 0.060465
vt 0.805000 0.057837
vt 0.804256 0.055015
vt 0.817456 0.069413
vt 0.820488 0.070104
vt 0.823692 0.070342
vt 0.852092 0.070632
vt 0.852092 0.070342
vt 0.973876 0.998193
vt 0.979364 0.996045
vt 0.984376 0.993164
vt 0.988828 0.989617
vt 0.992644 0.985480
vt 0.995744 0.980822
vt 0.998056 0.975721
vt 0.999500 0.970245
vt 1.000000 0.964465
vt 1.000000 0.106167
vt 0.961764 0.070632
vt 0.967984 0.071097
vt 0.973876 0.072439
vt 0.979364 0.074587
vt 0.984376 0.077472
vt 0.988828 0.081019
vt 0.992644 0.085152
vt 0.995744 0.089810
vt 0.998056 0.094911
vt 0.999500 0.100387
vt 0.038236 1.000000
vt 0.000500 0.970245
vt 0.001944 0.975721
vt 0.004256 0.980821
vt 0.007360 0.985479
vt 0.011176 0.989617
vt 0.015628 0.993164
vt 0.020636 0.996045
vt 0.026124 0.998193
vt 0.032020 0.999535
usemtl Mat_0
f 23/1 34/2 36/3
f 17/85 23/1 36/3
f 16/93 2/92 17/85
f 62/9 36/3 70/8
f 70/8 36/3 69/7
f 69/7 36/3 68/6
f 67/5 36/3 35/4
f 68/6 36/3 67/5
f 60/10 36/3 62/9
f 32/14 31/16 72/15
f 32/14 72/15 36/3
f 72/15 73/51 36/3
f 77/52 36/3 73/51
f 77/52 73/51 121/53
f 116/60 77/52 121/53
f 77/52 109/61 108/62
f 108/62 135/63 77/52
f 77/52 135/63 78/65
f 89/69 135/63 91/70
f 91/70 135/63 96/71
f 96/71 135/63 98/72
f 57/74 165/79 166/80
f 57/74 166/80 167/81
f 168/82 57/74 167/81
f 57/74 59/73 135/63
f 135/63 161/75 57/74
f 161/75 162/76 57/74
f 162/76 163/77 57/74
f 57/74 163/77 164/78
f 170/84 57/74 169/83
f 169/83 57/74 168/82
f 57/74 164/78 165/79
f 59/73 98/72 135/63
f 87/68 135/63 89/69
f 81/66 135/63 84/67
f 84/67 135/63 87/68
f 78/65 135/63 81/66
f 138/64 135/63 108/62
f 25/17 8/18 72/15
f 7/19 72/15 8/18
f 7/19 100/20 72/15
f 95/21 72/15 100/20
f 95/21 94/22 72/15
f 93/23 72/15 94/22
f 105/25 72/15 113/24
f 72/15 105/25 117/26
f 102/27 117/26 105/25
f 117/26 37/28 40/29
f 117/26 40/29 48/30
f 117/26 48/30 45/31
f 41/32 117/26 45/31
f 43/33 145/34 117/26
f 145/34 143/35 117/26
f 142/36 117/26 143/35
f 146/39 141/38 144/37
f 117/26 144/37 141/38
f 141/38 73/51 117/26
f 141/38 140/50 73/51
f 139/59 73/51 140/50
f 147/41 141/38 148/40
f 149/42 141/38 147/41
f 10/46 141/38 13/45
f 131/44 13/45 141/38
f 133/43 131/44 141/38
f 9/47 141/38 10/46
f 150/49 141/38 151/48
f 151/48 141/38 9/47
f 133/43 141/38 149/42
f 137/58 28/57 73/51
f 28/57 27/56 73/51
f 139/59 137/58 73/51
f 140/50 141/38 150/49
f 146/39 148/40 141/38
f 144/37 117/26 142/36
f 43/33 117/26 41/32
f 117/26 102/27 37/28
f 93/23 113/24 72/15
f 27/56 129/55 73/51
f 129/55 126/54 73/51
f 77/52 116/60 109/61
f 126/54 121/53 73/51
f 72/15 117/26 73/51
f 25/17 72/15 31/16
f 52/13 32/14 36/3
f 53/12 52/13 36/3
f 55/11 53/12 36/3
f 55/11 36/3 60/10
f 15/94 16/93 17/85
f 34/2 35/4 36/3
f 17/85 22/86 23/1
f 17/85 21/87 22/86
f 17/85 20/88 21/87
f 17/85 19/89 20/88
f 17/85 18/90 19/89
f 17/85 1/91 18/90
f 2/92 1/91 17/85
vt 0.992640 0.085152
vt 0.038236 1.000000
vt 0.015624 0.077472
vt 0.995744 0.980822
vt 0.979364 0.996045
vt 0.967980 0.999535
vt 0.973876 0.998193
vt 0.961764 1.000000
vt 0.988824 0.989617
vt 0.992640 0.985480
vt 0.984372 0.993164
vt 1.000000 0.106167
vt 0.998056 0.094911
vt 0.995744 0.089810
vt 0.999500 0.100387
vt 0.999500 0.970245
vt 1.000000 0.964465
vt 0.998056 0.975721
vt 0.001944 0.975721
vt 0.015624 0.993164
vt 0.026124 0.998193
vt 0.032016 0.999535
vt 0.020636 0.996045
vt 0.007356 0.985479
vt 0.011172 0.989617
vt 0.004256 0.980821
vt 0.001944 0.094911
vt -0.000000 0.964465
vt 0.000500 0.970245
vt 0.000000 0.106167
vt 0.000500 0.100387
vt 0.007356 0.085152
vt 0.004256 0.089810
vt 0.011172 0.081019
vt 0.147908 0.070632
vt 0.026124 0.072439
vt 0.020636 0.074587
vt 0.032016 0.071097
vt 0.038236 0.070632
vt 0.973876 0.072439
vt 0.823696 0.070632
vt 0.176308 0.070342
vt 0.147908 0.070342
vt 0.820492 0.070372
vt 0.179512 0.070104
vt 0.817456 0.069621
vt 0.182544 0.069413
vt 0.814628 0.068424
vt 0.185372 0.068305
vt 0.812048 0.066833
vt 0.187952 0.066818
vt 0.809756 0.064889
vt 0.190244 0.064993
vt 0.807792 0.062643
vt 0.192212 0.062862
vt 0.806192 0.060138
vt 0.193808 0.060465
vt 0.805000 0.057420
vt 0.195000 0.057836
vt 0.804256 0.054539
vt 0.195744 0.055015
vt 0.794500 0.004160
vt 0.196000 0.052041
vt 0.208544 0.002405
vt 0.198588 0.011662
vt 0.202792 0.006316
vt 0.205500 0.004160
vt 0.200472 0.008829
vt 0.196304 0.018093
vt 0.196000 0.021606
vt 0.197180 0.014762
vt 0.780752 0.000000
vt 0.215464 0.000283
vt 0.211884 0.001097
vt 0.219248 0.000000
vt 0.788116 0.001097
vt 0.784532 0.000283
vt 0.791452 0.002405
vt 0.804000 0.051543
vt 0.802820 0.014762
vt 0.799524 0.008829
vt 0.797204 0.006316
vt 0.801412 0.011662
vt 0.804000 0.021606
vt 0.803696 0.018093
vt 0.967980 0.071097
vt 0.961764 0.070632
vt 0.984372 0.077472
vt 0.979364 0.074587
vt 0.988824 0.081019
usemtl Mat_0
f 3/99 44/101 47/100
f 3/99 47/100 103/96
f 118/98 3/99 103/96
f 74/95 118/98 103/96
f 74/95 103/96 136/97
f 136/97 175/129 74/95
f 175/129 56/134 74/95
f 56/134 63/182 74/95
f 63/182 71/184 74/95
f 74/95 75/108 80/107
f 74/95 80/107 86/106
f 80/107 83/109 86/106
f 33/135 51/181 54/180
f 128/147 26/149 127/148
f 128/147 127/148 130/146
f 106/139 24/140 30/138
f 107/136 106/139 30/138
f 103/96 76/116 79/115
f 103/96 79/115 85/114
f 103/96 85/114 97/113
f 85/114 90/118 97/113
f 90/118 92/120 97/113
f 97/113 99/123 58/122
f 97/113 58/122 65/121
f 97/113 65/121 136/97
f 65/121 178/126 136/97
f 178/126 179/128 136/97
f 136/97 180/131 181/130
f 181/130 182/132 175/129
f 182/132 183/133 175/129
f 175/129 176/137 107/136
f 175/129 107/136 33/135
f 64/125 65/121 66/124
f 65/121 177/127 178/126
f 58/122 66/124 65/121
f 85/114 88/119 90/118
f 79/115 82/117 85/114
f 106/139 115/141 24/140
f 115/141 5/142 24/140
f 115/141 120/143 5/142
f 120/143 6/144 5/142
f 125/145 130/146 6/144
f 39/174 38/179 101/178
f 172/155 173/157 157/156
f 172/155 157/156 112/154
f 171/153 172/155 112/154
f 157/156 104/173 112/154
f 157/156 39/174 104/173
f 157/156 46/175 39/174
f 46/175 49/177 39/174
f 173/157 158/158 157/156
f 158/158 152/166 157/156
f 152/166 155/170 157/156
f 158/158 160/167 152/166
f 160/167 153/169 152/166
f 132/160 134/161 158/158
f 11/159 132/160 158/158
f 11/159 14/162 132/160
f 173/157 174/164 184/163
f 173/157 184/163 11/159
f 184/163 12/165 11/159
f 158/158 159/168 160/167
f 173/157 11/159 158/158
f 29/151 171/153 119/152
f 26/149 29/151 123/150
f 152/166 154/171 155/170
f 155/170 156/172 157/156
f 157/156 42/176 46/175
f 39/174 101/178 104/173
f 171/153 112/154 119/152
f 29/151 119/152 123/150
f 26/149 123/150 127/148
f 125/145 128/147 130/146
f 120/143 125/145 6/144
f 107/136 30/138 33/135
f 33/135 54/180 56/134
f 56/134 61/183 63/182
f 175/129 33/135 56/134
f 136/97 181/130 175/129
f 103/96 97/113 136/97
f 74/95 86/106 118/98
f 86/106 110/110 118/98
f 118/98 124/103 3/99
f 47/100 50/102 103/96
f 86/106 111/111 110/110
f 110/110 114/112 118/98
f 118/98 122/104 124/103
f 124/103 4/105 3/99

File diff suppressed because it is too large Load diff

View file

@ -85,7 +85,7 @@ UM.Dialog
id: questionText
width: parent.width
text: base.is_ucp
? catalog.i18nc("@text:window", "This is a Cura Universal project file. Would you like to open it as a Cura project or Cura Universal Project or import the models from it?")
? catalog.i18nc("@text:window", "This is a Cura Universal project file. Would you like to open it as a Cura Universal Project or import the models from it?")
: catalog.i18nc("@text:window", "This is a Cura project file. Would you like to open it as a project or import the models from it?")
wrapMode: Text.WordWrap
}

View file

@ -129,7 +129,7 @@ ScrollView
{
id: bedTemperature
containerStack: Cura.MachineManager.activeMachine
key: "material_bed_temperature"
key: "material_bed_temperature_layer_0"
watchedProperties: ["value", "minimum_value", "maximum_value", "resolve"]
storeIndex: 0
}

View file

@ -22,7 +22,7 @@ Item
{
id: extruderTemperature
containerStackId: Cura.ExtruderManager.extruderIds[position]
key: "material_print_temperature"
key: "material_print_temperature_layer_0"
watchedProperties: ["value", "minimum_value", "maximum_value", "resolve"]
storeIndex: 0
}

View file

@ -15,7 +15,7 @@ import Cura 1.1 as Cura
Item
{
id: base
property bool hasSearchFilter: false
// The currently selected machine item in the local machine list.
property var currentItem: machineList.currentIndex >= 0 ? machineList.model.getItem(machineList.currentIndex) : null
// The currently active (expanded) section/category, where section/category is the grouping of local machine items.
@ -32,7 +32,7 @@ Item
onCurrentItemChanged:
{
printerName = currentItem == null ? "" : currentItem.name
printerName = currentItem && currentItem.name? currentItem.name: ""
}
function updateCurrentItemUponSectionChange(section)
@ -43,25 +43,28 @@ Item
const item = machineList.model.getItem(i);
if (item.section == section)
{
machineList.currentIndex = i;
updateCurrentItem(i)
break;
}
}
}
function getMachineName()
function updateCurrentItem(index)
{
return machineList.model.getItem(machineList.currentIndex) != undefined ? machineList.model.getItem(machineList.currentIndex).name : "";
machineList.currentIndex = index;
currentItem = machineList.model.getItem(index);
if (currentItem && currentItem.name)
{
machineName.text = currentItem.name
manufacturer.text = currentItem.metadata["manufacturer"]
author.text = currentItem.metadata["author"]
}
function getMachineMetaDataEntry(key)
else
{
var metadata = machineList.model.getItem(machineList.currentIndex) != undefined ? machineList.model.getItem(machineList.currentIndex).metadata : undefined;
if (metadata)
{
return metadata[key];
machineName.text = "No printers Found"
manufacturer.text = ""
author.text = ""
}
return undefined;
}
Component.onCompleted:
@ -78,13 +81,118 @@ Item
id: localPrinterSelectionItem
anchors.fill: parent
Column
{
id: root
width: Math.floor(parent.width * 0.48)
height: parent.height
Item
{
width: root.width
height: filter.height
Cura.TextField
{
id: filter
width: parent.width
implicitHeight: parent.height
background: Rectangle {
id: background
color: UM.Theme.getColor("main_background")
radius: UM.Theme.getSize("default_radius").width
border.color: UM.Theme.getColor("primary_button")
}
height: UM.Theme.getSize("small_button_icon").height * 2
placeholderText: catalog.i18nc("@label:textbox", "Search Printer")
placeholderTextColor: UM.Theme.getColor("primary_button")
font: UM.Theme.getFont("medium_italic")
leftPadding: searchIcon.width + UM.Theme.getSize("default_margin").width * 2
UM.ColorImage
{
id: searchIcon
source: UM.Theme.getIcon("Magnifier")
anchors
{
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: UM.Theme.getSize("default_margin").width
}
height: UM.Theme.getSize("small_button_icon").height
width: height
color: UM.Theme.getColor("text")
}
onTextChanged: editingFinished()
onEditingFinished:
{
machineDefinitionsModel.filter = {"name" : "*" + text.toLowerCase() + "*", "visible": true}
base.hasSearchFilter = (text.length > 0)
updateDefinitionModel()
}
Keys.onEscapePressed: filter.text = ""
function updateDefinitionModel()
{
if (base.hasSearchFilter)
{
base.currentSections.clear()
for (var i = 0; i < machineDefinitionsModel.count; i++)
{
var sectionexpanded = machineDefinitionsModel.getItem(i)["section"]
if (!base.currentSections.has(sectionexpanded))
{
base.currentSections.add(sectionexpanded);
}
}
base.updateCurrentItem(0)
// Trigger update on base.currentSections
base.currentSections = base.currentSections;
}
else
{
const initialSection = "Ultimaker B.V.";
base.currentSections.clear();
base.currentSections.add(initialSection);
updateCurrentItemUponSectionChange(initialSection);
updateCurrentItem(0)
// Trigger update on base.currentSections
base.currentSections = base.currentSections;
}
}
}
UM.SimpleButton
{
id: clearFilterButton
iconSource: UM.Theme.getIcon("Cancel")
visible: base.hasSearchFilter
height: Math.round(filter.height * 0.5)
width: visible ? height : 0
anchors.verticalCenter: filter.verticalCenter
anchors.right: filter.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width
color: UM.Theme.getColor("setting_control_button")
hoverColor: UM.Theme.getColor("setting_control_button_hover")
onClicked:
{
filter.text = ""
filter.forceActiveFocus()
}
}
}
//Selecting a local printer to add from this list.
ListView
{
id: machineList
width: Math.floor(parent.width * 0.48)
height: parent.height
width: root.width
height: root.height - filter.height
clip: true
ScrollBar.vertical: UM.ScrollBar {}
@ -169,7 +277,8 @@ Item
checked: machineList.currentIndex == index
text: name
visible: base.currentSections.has(section)
onClicked: machineList.currentIndex = index
onClicked: base.updateCurrentItem(index)
}
}
}
@ -193,8 +302,8 @@ Item
UM.Label
{
id: machineName
width: parent.width - (2 * UM.Theme.getSize("default_margin").width)
text: base.getMachineName()
color: UM.Theme.getColor("primary_button")
font: UM.Theme.getFont("huge")
elide: Text.ElideRight
@ -215,7 +324,7 @@ Item
}
UM.Label
{
text: base.getMachineMetaDataEntry("manufacturer")
id: manufacturer
width: parent.width - manufacturerLabel.width
wrapMode: Text.WordWrap
}
@ -226,7 +335,7 @@ Item
}
UM.Label
{
text: base.getMachineMetaDataEntry("author")
id: author
width: parent.width - profileAuthorLabel.width
wrapMode: Text.WordWrap
}

View file

@ -0,0 +1,76 @@
[general]
definition = ankermake_m5c
name = Fast
version = 4
[metadata]
global_quality = True
quality_type = fast
setting_version = 23
type = quality
weight = -2
[values]
acceleration_enabled = true
acceleration_infill = 5000
acceleration_layer_0 = 2500
acceleration_prime_tower = 5000
acceleration_print = 5000
acceleration_print_layer_0 = 2500
acceleration_roofing = 2500
acceleration_skirt_brim = 2500
acceleration_support = 5000
acceleration_support_bottom = 5000
acceleration_support_infill = 5000
acceleration_support_interface = 5000
acceleration_support_roof = 5000
acceleration_topbottom = 2500
acceleration_travel = 5000
acceleration_travel_layer_0 = 2500
acceleration_wall = 5000
acceleration_wall_0 = 3000
acceleration_wall_x = 5000
jerk_enabled = true
jerk_infill = 15
jerk_layer_0 = 15
jerk_prime_tower = 15
jerk_print = 15
jerk_print_layer_0 = 15
jerk_roofing = 15
jerk_skirt_brim = 15
jerk_support = 15
jerk_support_bottom = 15
jerk_support_infill = 15
jerk_support_interface = 15
jerk_support_roof = 15
jerk_topbottom = 15
jerk_travel = 15
jerk_travel_layer_0 = 15
jerk_wall = 15
jerk_wall_0 = 15
jerk_wall_x = 15
layer_height = 0.25
layer_height_0 = 0.14
skirt_brim_speed = 50
speed_equalize_flow_enabled = false
speed_equalize_flow_max = 300
speed_infill = 270
speed_layer_0 = 50
speed_prime_tower = 500
speed_print = 500
speed_print_layer_0 = 50
speed_roofing = 150
speed_slowdown_layers = 2
speed_support = 250
speed_support_bottom = 166.667
speed_support_infill = 250
speed_support_interface = 166.667
speed_support_roof = 166.667
speed_topbottom = 150
speed_travel = 500
speed_travel_layer_0 = 150
speed_wall = 250
speed_wall_0 = 150
speed_wall_x = 250
speed_z_hop = 10

View file

@ -0,0 +1,94 @@
[general]
definition = ankermake_m5c
name = Normal
version = 4
[metadata]
global_quality = True
quality_type = normal
setting_version = 23
type = quality
weight = 0
[values]
acceleration_infill = 2500
acceleration_layer_0 = 2500
acceleration_prime_tower = 2500
acceleration_print = 2500
acceleration_print_layer_0 = 2500
acceleration_roofing = 2500
acceleration_skirt_brim = 2500
acceleration_support = 2500
acceleration_support_bottom = 2500
acceleration_support_infill = 2500
acceleration_support_interface = 2500
acceleration_support_roof = 2500
acceleration_topbottom = 2500
acceleration_travel = 2500
acceleration_travel_layer_0 = 2500
acceleration_wall = 2500
acceleration_wall_0 = 2500
acceleration_wall_x = 2500
bottom_layers = 4
infill_line_width = 0.40
initial_layer_line_width_factor = 100
jerk_enabled = true
jerk_infill = 10
jerk_layer_0 = 10
jerk_prime_tower = 10
jerk_print = 10
jerk_print_layer_0 = 10
jerk_roofing = 10
jerk_skirt_brim = 10
jerk_support = 10
jerk_support_bottom = 10
jerk_support_infill = 10
jerk_support_interface = 10
jerk_support_roof = 10
jerk_topbottom = 10
jerk_travel = 10
jerk_travel_layer_0 = 10
jerk_wall = 10
jerk_wall_0 = 8
jerk_wall_x = 8
layer_height = 0.2
layer_height_0 = 0.14
line_width = 0.40
min_wall_line_width = 0.10
prime_tower_line_width = 0.40
skin_line_width = 0.40
skirt_brim_line_width = 0.40
skirt_brim_speed = 50
speed_infill = 250
speed_layer_0 = 50
speed_prime_tower = 250
speed_print = 250
speed_print_layer_0 = 50
speed_roofing = 150
speed_support = 150
speed_support_bottom = 100
speed_support_infill = 150
speed_support_interface = 100
speed_support_roof = 100
speed_topbottom = 150
speed_travel = 250
speed_travel_layer_0 = 50
speed_wall = 150
speed_wall_0 = 150
speed_wall_x = 250
support_bottom_line_width = 0.40
support_interface_line_width = 0.40
support_line_width = 0.40
support_roof_line_width = 0.40
top_layers = 4
wall_0_extruder_nr = -1
wall_0_inset = 0
wall_0_wipe_dist = 0.20
wall_extruder_nr = -1
wall_line_count = 3
wall_line_width = 0.40
wall_line_width_0 = 0.44
wall_line_width_x = 0.40
wall_thickness = 1.24
wall_x_extruder_nr = -1

View file

@ -0,0 +1,98 @@
[general]
definition = ankermake_m5c
name = Precision
version = 4
[metadata]
global_quality = True
quality_type = precision
setting_version = 23
type = quality
weight = 1
[values]
acceleration_enabled = true
acceleration_infill = 4000
acceleration_layer_0 = 2500
acceleration_prime_tower = 4000
acceleration_print = 4000
acceleration_print_layer_0 = 2500
acceleration_roofing = 1000
acceleration_skirt_brim = 2500
acceleration_support = 4000
acceleration_support_bottom = 4000
acceleration_support_infill = 4000
acceleration_support_interface = 4000
acceleration_support_roof = 4000
acceleration_topbottom = 2500
acceleration_travel = 4000
acceleration_travel_layer_0 = 2500
acceleration_wall = 4000
acceleration_wall_0 = 3000
acceleration_wall_x = 3000
bottom_layers = 3
infill_line_width = 0.30
initial_layer_line_width_factor = 100
jerk_enabled = true
jerk_infill = 8
jerk_layer_0 = 8
jerk_prime_tower = 8
jerk_print = 8
jerk_print_layer_0 = 8
jerk_roofing = 8
jerk_skirt_brim = 8
jerk_support = 8
jerk_support_bottom = 8
jerk_support_infill = 8
jerk_support_interface = 8
jerk_support_roof = 8
jerk_topbottom = 8
jerk_travel = 8
jerk_travel_layer_0 = 8
jerk_wall = 8
jerk_wall_0 = 8
jerk_wall_x = 8
layer_height = 0.16
layer_height_0 = 0.14
line_width = 0.40
prime_tower_line_width = 0.40
skin_line_width = 0.40
skirt_brim_line_width = 0.40
skirt_brim_speed = 50
speed_equalize_flow_enabled = false
speed_equalize_flow_max = 300
speed_infill = 250
speed_layer_0 = 150
speed_prime_tower = 250
speed_print = 500
speed_print_layer_0 = 50
speed_roofing = 50
speed_slowdown_layers = 2
speed_support = 150
speed_support_bottom = 100
speed_support_infill = 150
speed_support_interface = 100
speed_support_roof = 100
speed_topbottom = 150
speed_travel = 500
speed_travel_layer_0 = 150
speed_wall = 250
speed_wall_0 = 150
speed_wall_x = 200
speed_z_hop = 10
support_bottom_line_width = 0.40
support_interface_line_width = 0.40
support_line_width = 0.40
support_roof_line_width = 0.40
top_layers = 5
wall_0_extruder_nr = -1
wall_0_inset = 0
wall_0_wipe_dist = 0.20
wall_extruder_nr = -1
wall_line_count = 2
wall_line_width = 0.40
wall_line_width_0 = 0.40
wall_line_width_x = 0.40
wall_thickness = 0.84
wall_x_extruder_nr = -1

View file

@ -0,0 +1,14 @@
[general]
definition = ultimaker_sketch
name = Fast
version = 4
[metadata]
material = generic_pla_175
quality_type = draft
setting_version = 23
type = quality
weight = -2
[values]

View file

@ -0,0 +1,14 @@
[general]
definition = ultimaker_sketch
name = Fast
version = 4
[metadata]
material = generic_tough_pla_175
quality_type = draft
setting_version = 23
type = quality
weight = -2
[values]

View file

@ -0,0 +1,15 @@
[general]
definition = ultimaker_sketch
name = Fast
version = 4
[metadata]
global_quality = True
quality_type = draft
setting_version = 23
type = quality
weight = -2
[values]
layer_height = 0.2

View file

@ -265,6 +265,8 @@ support_type
support_angle
support_pattern
support_wall_count
support_z_seam_away_from_model
support_z_seam_min_distance
zig_zaggify_support
support_connect_zigzags
support_infill_rate

View file

@ -56,7 +56,7 @@
"secondary_button": "background_1",
"secondary_button_hover": "background_3",
"secondary_button_text": [255, 255, 255, 255],
"secondary_button_text": "text_secondary_button",
"icon": "text_default",
"toolbar_background": "background_1",
@ -71,8 +71,6 @@
"main_window_header_background_gradient": "background_4",
"main_window_header_button_background_hovered": [46, 46, 46, 255],
"secondary_button_text": "text_secondary_button",
"account_sync_state_icon": [255, 255, 255, 204],
"machine_selector_printer_icon": [204, 204, 204, 255],

View file

@ -110,6 +110,12 @@
"italic": true,
"family": "Noto Sans"
},
"medium_italic": {
"size": 1.16,
"weight": 400,
"italic": true,
"family": "Noto Sans"
},
"default_italic_ja_JP": {
"size": 1.0,
"weight": 400,

View file

@ -0,0 +1,13 @@
[general]
definition = creality_k1max
name = 0.4mm Nozzle
version = 4
[metadata]
hardware_type = nozzle
setting_version = 23
type = variant
[values]
machine_nozzle_size = 0.4

View file

@ -0,0 +1,13 @@
[general]
definition = creality_k1max
name = 0.6mm Nozzle
version = 4
[metadata]
hardware_type = nozzle
setting_version = 23
type = variant
[values]
machine_nozzle_size = 0.6

View file

@ -0,0 +1,13 @@
[general]
definition = creality_k1max
name = 0.8mm Nozzle
version = 4
[metadata]
hardware_type = nozzle
setting_version = 23
type = variant
[values]
machine_nozzle_size = 0.8

View file

@ -0,0 +1,15 @@
[general]
definition = ultimaker_sketch
name = 0.4mm
version = 4
[metadata]
hardware_type = nozzle
reference_extruder_id = sketch_extruder
setting_version = 23
type = variant
[values]
machine_nozzle_id = 0.4mm
machine_nozzle_size = 0.4

View file

@ -0,0 +1,38 @@
import argparse
import re
if __name__ == "__main__":
parser = argparse.ArgumentParser(description = 'Extract the changelog to be inserted to the release description')
parser.add_argument('--changelog', type = str, help = 'Path to the changelog file', required = True)
parser.add_argument('--version', type = str, help = 'Cura version to be extracted', required = True)
args = parser.parse_args()
# In the changelog we usually omit the patch number for minor release (i.e. 5.7.0 => 5.7)
if args.version.endswith('.0'):
args.version = args.version[:-2]
start_token = f"[{args.version}]"
pattern_stop_log = "\[\d+(\.\d+){1,2}\]"
log_line = False
first_chapter = True
with open(args.changelog, "r") as changelog_file:
for line in changelog_file.readlines():
line = line.strip()
if log_line:
if re.match(pattern_stop_log, line):
log_line = False
elif len(line) > 0:
if line.startswith('*'):
if not first_chapter:
print("")
first_chapter = False
line = line[1:].strip()
print(f"<H2>{line}</H2>\n")
else:
print(line)
elif line == start_token:
log_line = True