Merge branch 'main' into PP-476-Make-PPS-CF-a-bundled-package

This commit is contained in:
Erwan MATHIEU 2024-06-20 15:46:25 +02:00 committed by GitHub
commit b70e2aac4c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
57 changed files with 14837 additions and 142 deletions

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: push:
paths: paths:
- 'plugins/**' - 'plugins/**'
- 'resources/**'
- 'cura/**' - '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/**' - 'icons/**'
- 'tests/**' - 'tests/**'
- 'packaging/**' - 'packaging/**'
- '.github/workflows/conan-*.yml' - '.github/workflows/conan-package.yml'
- '.github/workflows/notify.yml' - '.github/workflows/notify.yml'
- '.github/workflows/requirements-runner.txt' - '.github/workflows/requirements-runner.txt'
- 'requirements*.txt' - 'requirements*.txt'
@ -20,6 +28,7 @@ on:
- 'main' - 'main'
- 'CURA-*' - 'CURA-*'
- 'PP-*' - 'PP-*'
- 'NP-*'
- '[0-9].[0-9]*' - '[0-9].[0-9]*'
- '[0-9].[0-9][0-9]*' - '[0-9].[0-9][0-9]*'

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,32 @@
name: Feature Freeze
run-name: Feature freeze Cura ${{ inputs.cura_version }} by @${{ github.actor }}
on:
workflow_dispatch:
inputs:
cura_version:
description: 'Cura version major and minor, e.g. 5.7'
required: true
type: string
jobs:
parse-version:
name: Parse input version string
runs-on: ubuntu-latest
outputs:
package_version: ${{ steps.version_parser.outputs.major }}.${{ steps.version_parser.outputs.minor }}.0-alpha.1
steps:
- name: Parse version string
id: version_parser
uses: booxmedialtd/ws-action-parse-semver@v1.4.7
with:
input_string: ${{ inputs.cura_version }}.0
feature-freeze:
name: Process feature freeze
uses: Ultimaker/Cura-workflows/.github/workflows/cura-set-packages-versions.yml@main
needs: [parse-version]
with:
cura_version: ${{ needs.parse-version.outputs.package_version }}
create_feature_branch: true
secrets: inherit

View File

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

View File

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

View File

@ -2,6 +2,7 @@ checks:
diagnostic-mesh-file-extension: true diagnostic-mesh-file-extension: true
diagnostic-mesh-file-size: true diagnostic-mesh-file-size: true
diagnostic-definition-redundant-override: true diagnostic-definition-redundant-override: true
diagnostic-definition-experimental-setting: true
diagnostic-resources-macos-app-directory-name: true diagnostic-resources-macos-app-directory-name: true
diagnostic-incorrect-formula: true diagnostic-incorrect-formula: true
diagnostic-resource-file-deleted: true diagnostic-resource-file-deleted: true

View File

@ -1,5 +1,6 @@
version: "5.8.0-alpha.0" version: "5.8.0-alpha.0"
requirements: requirements:
- "cura_resources/(latest)@ultimaker/testing"
- "uranium/(latest)@ultimaker/testing" - "uranium/(latest)@ultimaker/testing"
- "curaengine/(latest)@ultimaker/testing" - "curaengine/(latest)@ultimaker/testing"
- "cura_binary_data/(latest)@ultimaker/testing" - "cura_binary_data/(latest)@ultimaker/testing"
@ -54,6 +55,10 @@ pyinstaller:
package: "cura" package: "cura"
src: "resources" src: "resources"
dst: "share/cura/resources" dst: "share/cura/resources"
cura_shared_resources:
package: "cura_resources"
src: "res"
dst: "share/cura/resources"
cura_private_data: cura_private_data:
package: "cura_private_data" package: "cura_private_data"
src: "res" 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[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(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) # Copy resources of Uranium (keep folder structure)
uranium = self.dependencies["uranium"].cpp_info uranium = self.dependencies["uranium"].cpp_info
copy(self, "*", uranium.resdirs[0], str(self._share_dir.joinpath("uranium", "resources")), keep_path = True) 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 # Remove the fdm_materials from the package
rmdir(self, os.path.join(self.package_folder, self.cpp.package.resdirs[0], "materials")) 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): def package_info(self):
self.user_info.pip_requirements = "requirements.txt" self.user_info.pip_requirements = "requirements.txt"
self.user_info.pip_requirements_git = "requirements-ultimaker.txt" self.user_info.pip_requirements_git = "requirements-ultimaker.txt"

View File

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

View File

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

View File

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

View File

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

View File

@ -146,6 +146,7 @@ class StartSliceJob(Job):
self._slice_message: Arcus.PythonMessage = slice_message self._slice_message: Arcus.PythonMessage = slice_message
self._is_cancelled: bool = False self._is_cancelled: bool = False
self._build_plate_number: Optional[int] = None self._build_plate_number: Optional[int] = None
self._associated_disabled_extruders: Optional[str] = None
# cache for all setting values from all stacks (global & extruder) for the current machine # cache for all setting values from all stacks (global & extruder) for the current machine
self._all_extruders_settings: Optional[Dict[str, Any]] = None self._all_extruders_settings: Optional[Dict[str, Any]] = None
@ -153,6 +154,9 @@ class StartSliceJob(Job):
def getSliceMessage(self) -> Arcus.PythonMessage: def getSliceMessage(self) -> Arcus.PythonMessage:
return self._slice_message return self._slice_message
def getAssociatedDisabledExtruders(self) -> Optional[str]:
return self._associated_disabled_extruders
def setBuildPlate(self, build_plate_number: int) -> None: def setBuildPlate(self, build_plate_number: int) -> None:
self._build_plate_number = build_plate_number self._build_plate_number = build_plate_number
@ -334,7 +338,7 @@ class StartSliceJob(Job):
if has_model_with_disabled_extruders: if has_model_with_disabled_extruders:
self.setResult(StartJobResult.ObjectsWithDisabledExtruder) self.setResult(StartJobResult.ObjectsWithDisabledExtruder)
associated_disabled_extruders = {p + 1 for p in associated_disabled_extruders} associated_disabled_extruders = {p + 1 for p in associated_disabled_extruders}
self.setMessage(", ".join(map(str, sorted(associated_disabled_extruders)))) self._associated_disabled_extruders = ", ".join(map(str, sorted(associated_disabled_extruders)))
return return
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being # There are cases when there is nothing to slice. This can happen due to one at a time slicing not being

View File

@ -1,9 +1,8 @@
# Copyright (c) 2023 UltiMaker # Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from io import StringIO, BufferedIOBase from io import StringIO, BufferedIOBase
import json import json
from typing import cast, List, Optional, Dict from typing import cast, List, Optional, Dict, Tuple
from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED from zipfile import BadZipFile, ZipFile, ZIP_DEFLATED
import pyDulcificum as du import pyDulcificum as du
@ -39,16 +38,27 @@ class MakerbotWriter(MeshWriter):
suffixes=["makerbot"] suffixes=["makerbot"]
) )
) )
MimeTypeDatabase.addMimeType(
MimeType(
name="application/x-makerbot-sketch",
comment="Makerbot Toolpath Package",
suffixes=["makerbot"]
)
)
_PNG_FORMATS = [ _PNG_FORMAT = [
{"prefix": "isometric_thumbnail", "width": 120, "height": 120}, {"prefix": "isometric_thumbnail", "width": 120, "height": 120},
{"prefix": "isometric_thumbnail", "width": 320, "height": 320}, {"prefix": "isometric_thumbnail", "width": 320, "height": 320},
{"prefix": "isometric_thumbnail", "width": 640, "height": 640}, {"prefix": "isometric_thumbnail", "width": 640, "height": 640},
{"prefix": "thumbnail", "width": 90, "height": 90},
]
_PNG_FORMAT_METHOD = [
{"prefix": "thumbnail", "width": 140, "height": 106}, {"prefix": "thumbnail", "width": 140, "height": 106},
{"prefix": "thumbnail", "width": 212, "height": 300}, {"prefix": "thumbnail", "width": 212, "height": 300},
{"prefix": "thumbnail", "width": 960, "height": 1460}, {"prefix": "thumbnail", "width": 960, "height": 1460},
{"prefix": "thumbnail", "width": 90, "height": 90},
] ]
_META_VERSION = "3.0.0" _META_VERSION = "3.0.0"
# must be called from the main thread because of OpenGL # must be called from the main thread because of OpenGL
@ -74,6 +84,7 @@ class MakerbotWriter(MeshWriter):
return None return None
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool: def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool:
metadata, file_format = self._getMeta(nodes)
if mode != MeshWriter.OutputMode.BinaryMode: if mode != MeshWriter.OutputMode.BinaryMode:
Logger.log("e", "MakerbotWriter does not support text mode.") Logger.log("e", "MakerbotWriter does not support text mode.")
self.setInformation(catalog.i18nc("@error:not supported", "MakerbotWriter does not support text mode.")) self.setInformation(catalog.i18nc("@error:not supported", "MakerbotWriter does not support text mode."))
@ -92,14 +103,20 @@ class MakerbotWriter(MeshWriter):
gcode_text_io = StringIO() gcode_text_io = StringIO()
success = gcode_writer.write(gcode_text_io, None) success = gcode_writer.write(gcode_text_io, None)
filename, filedata = "", ""
# Writing the g-code failed. Then I can also not write the gzipped g-code. # Writing the g-code failed. Then I can also not write the gzipped g-code.
if not success: if not success:
self.setInformation(gcode_writer.getInformation()) self.setInformation(gcode_writer.getInformation())
return False return False
match file_format:
json_toolpaths = du.gcode_2_miracle_jtp(gcode_text_io.getvalue()) case "application/x-makerbot-sketch":
metadata = self._getMeta(nodes) filename, filedata = "print.gcode", gcode_text_io.getvalue()
self._PNG_FORMATS = self._PNG_FORMAT
case "application/x-makerbot":
filename, filedata = "print.jsontoolpath", du.gcode_2_miracle_jtp(gcode_text_io.getvalue())
self._PNG_FORMATS = self._PNG_FORMAT + self._PNG_FORMAT_METHOD
case _:
raise Exception("Unsupported Mime type")
png_files = [] png_files = []
for png_format in self._PNG_FORMATS: for png_format in self._PNG_FORMATS:
@ -116,7 +133,7 @@ class MakerbotWriter(MeshWriter):
try: try:
with ZipFile(stream, "w", compression=ZIP_DEFLATED) as zip_stream: with ZipFile(stream, "w", compression=ZIP_DEFLATED) as zip_stream:
zip_stream.writestr("meta.json", json.dumps(metadata, indent=4)) zip_stream.writestr("meta.json", json.dumps(metadata, indent=4))
zip_stream.writestr("print.jsontoolpath", json_toolpaths) zip_stream.writestr(filename, filedata)
for png_file in png_files: for png_file in png_files:
file, data = png_file["file"], png_file["data"] file, data = png_file["file"], png_file["data"]
zip_stream.writestr(file, data) zip_stream.writestr(file, data)
@ -127,7 +144,7 @@ class MakerbotWriter(MeshWriter):
return True return True
def _getMeta(self, root_nodes: List[SceneNode]) -> Dict[str, any]: def _getMeta(self, root_nodes: List[SceneNode]) -> Tuple[Dict[str, any], str]:
application = CuraApplication.getInstance() application = CuraApplication.getInstance()
machine_manager = application.getMachineManager() machine_manager = application.getMachineManager()
global_stack = machine_manager.activeMachine global_stack = machine_manager.activeMachine
@ -143,7 +160,9 @@ class MakerbotWriter(MeshWriter):
nodes.append(node) nodes.append(node)
meta = dict() meta = dict()
# This is a bit of a "hack", the mime type should be passed through with the export writer but
# since this is not the case we get the mime type from the global stack instead
file_format = global_stack.definition.getMetaDataEntry("file_formats")
meta["bot_type"] = global_stack.definition.getMetaDataEntry("reference_machine_id") meta["bot_type"] = global_stack.definition.getMetaDataEntry("reference_machine_id")
bounds: Optional[AxisAlignedBox] = None bounds: Optional[AxisAlignedBox] = None
@ -155,7 +174,8 @@ class MakerbotWriter(MeshWriter):
bounds = node_bounds bounds = node_bounds
else: else:
bounds = bounds + node_bounds bounds = bounds + node_bounds
if file_format == "application/x-makerbot-sketch":
bounds = None
if bounds is not None: if bounds is not None:
meta["bounding_box"] = { meta["bounding_box"] = {
"x_min": bounds.left, "x_min": bounds.left,
@ -196,7 +216,7 @@ class MakerbotWriter(MeshWriter):
meta["extruder_temperature"] = materials_temps[0] meta["extruder_temperature"] = materials_temps[0]
meta["extruder_temperatures"] = materials_temps meta["extruder_temperatures"] = materials_temps
meta["model_counts"] = [{"count": 1, "name": node.getName()} for node in nodes] meta["model_counts"] = [{"count": len(nodes), "name": "instance0"}]
tool_types = [extruder.variant.getMetaDataEntry("reference_extruder_id") for extruder in extruders] tool_types = [extruder.variant.getMetaDataEntry("reference_extruder_id") for extruder in extruders]
meta["tool_type"] = tool_types[0] meta["tool_type"] = tool_types[0]
@ -205,12 +225,11 @@ class MakerbotWriter(MeshWriter):
meta["version"] = MakerbotWriter._META_VERSION meta["version"] = MakerbotWriter._META_VERSION
meta["preferences"] = dict() meta["preferences"] = dict()
for node in nodes: bounds = application.getBuildVolume().getBoundingBox()
bounds = node.getBoundingBox() meta["preferences"]["instance0"] = {
meta["preferences"][str(node.getName())] = { "machineBounds": [bounds.right, bounds.back, bounds.left, bounds.front] if bounds is not None else None,
"machineBounds": [bounds.right, bounds.back, bounds.left, bounds.front] if bounds is not None else None, "printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory,
"printMode": CuraApplication.getInstance().getIntentManager().currentIntentCategory, }
}
meta["miracle_config"] = {"gaggles": {str(node.getName()): {} for node in nodes}} meta["miracle_config"] = {"gaggles": {str(node.getName()): {} for node in nodes}}
@ -245,7 +264,7 @@ class MakerbotWriter(MeshWriter):
# platform_temperature # platform_temperature
# total_commands # total_commands
return meta return meta, file_format
def meterToMillimeter(value: float) -> float: def meterToMillimeter(value: float) -> float:

View File

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

@ -356,7 +356,10 @@ geometry41core =
EndPrimitive(); 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 w = size_x;
float h = size_y; 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 return False
[printer, *_] = self._printers [printer, *_] = self._printers
return printer.type in ("MakerBot Method X", "MakerBot Method XL") return printer.type in ("MakerBot Method X", "MakerBot Method XL", "MakerBot Sketch")
@pyqtProperty(bool, notify=_cloudClusterPrintersChanged) @pyqtProperty(bool, notify=_cloudClusterPrintersChanged)
def supportsPrintJobActions(self) -> bool: def supportsPrintJobActions(self) -> bool:

View File

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

View File

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

View File

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

View File

@ -146,12 +146,13 @@ class Formulas(Linter):
available_sections = ["values"] available_sections = ["values"]
for section in available_sections: for section in available_sections:
options = config.options(section) if config.has_section(section):
for option in options: options = config.options(section)
values ={} for option in options:
values["value"] = config.get(section, option) values ={}
overrides[option] = values values["value"] = config.get(section, option)
file_data["overrides"]= overrides# Process the value here overrides[option] = values
file_data["overrides"]= overrides# Process the value here
return file_data return file_data

View File

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

View File

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

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

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

@ -1342,6 +1342,15 @@
"limit_to_extruder": "wall_0_extruder_nr", "limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"z_seam_on_vertex":
{
"label": "Z Seam On Vertex",
"description": "Place the z-seam on a polygon vertex. Switching this off can place the seam between vertices as well. (Keep in mind that this won't override the restrictions on placing the seam on an unsupported overhang.)",
"type": "bool",
"default_value": true,
"settable_per_mesh": true,
"enabled": "z_seam_type == 'back' or z_seam_type == 'shortest'"
},
"z_seam_position": "z_seam_position":
{ {
"label": "Z Seam Position", "label": "Z Seam Position",
@ -4775,6 +4784,34 @@
"settable_per_mesh": true, "settable_per_mesh": true,
"settable_per_extruder": 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": "support_type":
{ {
"label": "Support Placement", "label": "Support Placement",
@ -6180,6 +6217,7 @@
"type": "bool", "type": "bool",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
"children": "children":
@ -6192,6 +6230,7 @@
"value": "raft_remove_inside_corners", "value": "raft_remove_inside_corners",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_base_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
}, },
@ -6203,6 +6242,7 @@
"value": "raft_remove_inside_corners", "value": "raft_remove_inside_corners",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_interface_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
}, },
@ -6214,6 +6254,7 @@
"value": "raft_remove_inside_corners", "value": "raft_remove_inside_corners",
"default_value": false, "default_value": false,
"enabled": "resolveOrValue('adhesion_type') == 'raft'", "enabled": "resolveOrValue('adhesion_type') == 'raft'",
"resolve": "any(extruderValues('raft_surface_remove_inside_corners'))",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
} }
@ -6817,7 +6858,7 @@
"label": "Prime Tower Type", "label": "Prime Tower Type",
"description": "<html>How to generate the prime tower:<ul><li><b>Normal:</b> create a bucket in which secondary materials are primed</li><li><b>Interleaved:</b> create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other</li></ul></html>", "description": "<html>How to generate the prime tower:<ul><li><b>Normal:</b> create a bucket in which secondary materials are primed</li><li><b>Interleaved:</b> create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other</li></ul></html>",
"type": "enum", "type": "enum",
"value": "'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'", "resolve": "'interleaved' if all(mode == 'interleaved' for mode in extruderValues('prime_tower_mode')) else 'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'",
"options": "options":
{ {
"normal": "Normal", "normal": "Normal",
@ -7993,6 +8034,19 @@
"default_value": 90, "default_value": 90,
"settable_per_mesh": true "settable_per_mesh": true
}, },
"seam_overhang_angle":
{
"label": "Seam Overhanging Wall Angle",
"description": "Try to prevent seams on walls that overhang more than this angle. When the value is 90, no walls will be treated as overhanging.",
"unit": "\u00b0",
"type": "float",
"minimum_value": "0",
"minimum_value_warning": "2",
"maximum_value": "90",
"default_value": 90,
"value": "wall_overhang_angle",
"settable_per_mesh": true
},
"wall_overhang_speed_factor": "wall_overhang_speed_factor":
{ {
"label": "Overhanging Wall Speed", "label": "Overhanging Wall Speed",

View File

@ -80,6 +80,7 @@
"maximum_value_warning": "120", "maximum_value_warning": "120",
"minimum_value": "0" "minimum_value": "0"
}, },
"material_print_temp_wait": { "value": false },
"material_print_temperature": { "minimum_value": "0" }, "material_print_temperature": { "minimum_value": "0" },
"material_standby_temperature": "material_standby_temperature":
{ {

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

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

@ -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,15 @@
[general]
definition = ultimaker_factor4
name = Normal
version = 4
[metadata]
global_quality = True
quality_type = fast
setting_version = 23
type = quality
weight = -1
[values]
layer_height = =round(0.15 * material_shrinkage_percentage_z / 100, 5)

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

@ -41,6 +41,7 @@ xy_offset_layer_0
hole_xy_offset hole_xy_offset
hole_xy_offset_max_diameter hole_xy_offset_max_diameter
z_seam_type z_seam_type
z_seam_on_vertex
z_seam_position z_seam_position
z_seam_x z_seam_x
z_seam_y z_seam_y
@ -265,6 +266,8 @@ support_type
support_angle support_angle
support_pattern support_pattern
support_wall_count support_wall_count
support_z_seam_away_from_model
support_z_seam_min_distance
zig_zaggify_support zig_zaggify_support
support_connect_zigzags support_connect_zigzags
support_infill_rate support_infill_rate

View File

@ -1,3 +1,13 @@
[5.7.2]
* Bugfixes
- Fixed a bug where modifier meshes and support meshes were not loaded in the correct position, should resolve https://github.com/Ultimaker/Cura/issues/18761 (and https://github.com/5axes/SpoonAntiWarping/issues/8)
- Primeblobs were not printed for a second extruder
- Interleaved prime tower can now be printed with a raft
- Improved behaviors for start temperature for multiple extruders
- Improved preheating logic when using a raft with multiple extruders
- Enabled Raft Remove Inside Corners and Prime Tower Mode to be shipped with a material profile
[5.7.1] [5.7.1]
* Introducing the UltiMaker Factor 4 * Introducing the UltiMaker Factor 4

View File

@ -56,7 +56,7 @@
"secondary_button": "background_1", "secondary_button": "background_1",
"secondary_button_hover": "background_3", "secondary_button_hover": "background_3",
"secondary_button_text": [255, 255, 255, 255], "secondary_button_text": "text_secondary_button",
"icon": "text_default", "icon": "text_default",
"toolbar_background": "background_1", "toolbar_background": "background_1",
@ -69,9 +69,7 @@
"main_window_header_button_text_active": "background_4", "main_window_header_button_text_active": "background_4",
"main_window_header_background": "background_4", "main_window_header_background": "background_4",
"main_window_header_background_gradient": "background_4", "main_window_header_background_gradient": "background_4",
"main_window_header_button_background_hovered": [46, 46, 46, 255], "main_window_header_button_background_hovered": [46, 46, 46, 255],
"secondary_button_text": "text_secondary_button",
"account_sync_state_icon": [255, 255, 255, 204], "account_sync_state_icon": [255, 255, 255, 204],

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