mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-25 07:33:57 -06:00
Merge branch 'main' into CURA-10829_dont_expose_small_skin_to_air
This commit is contained in:
commit
8f1f34e803
140 changed files with 1271 additions and 112 deletions
2
.github/workflows/cura-installer.yml
vendored
2
.github/workflows/cura-installer.yml
vendored
|
@ -155,7 +155,7 @@ jobs:
|
||||||
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
|
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10
|
||||||
|
|
||||||
- name: Create the default Conan profile
|
- name: Create the default Conan profile
|
||||||
run: conan profile new default --detect
|
run: conan profile new default --detect --force
|
||||||
|
|
||||||
- name: Configure GPG Key Linux (Bash)
|
- name: Configure GPG Key Linux (Bash)
|
||||||
if: ${{ runner.os == 'Linux' }}
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
|
77
.github/workflows/installers.yml
vendored
Normal file
77
.github/workflows/installers.yml
vendored
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
name: All installers
|
||||||
|
run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }}
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
cura_conan_version:
|
||||||
|
description: 'Cura Conan Version'
|
||||||
|
default: 'cura/latest@ultimaker/testing'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
conan_args:
|
||||||
|
description: 'Conan args: eq.: --require-override'
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
enterprise:
|
||||||
|
description: 'Build Cura as an Enterprise edition'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
staging:
|
||||||
|
description: 'Use staging API'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
windows-installer:
|
||||||
|
uses: ./.github/workflows/windows.yml
|
||||||
|
with:
|
||||||
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
|
conan_args: ${{ inputs.conan_args }}
|
||||||
|
enterprise: ${{ inputs.enterprise }}
|
||||||
|
staging: ${{ inputs.staging }}
|
||||||
|
architecture: X64
|
||||||
|
operating_system: windows-2022
|
||||||
|
|
||||||
|
linux-modern-installer:
|
||||||
|
uses: ./.github/workflows/linux.yml
|
||||||
|
with:
|
||||||
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
|
conan_args: ${{ inputs.conan_args }}
|
||||||
|
enterprise: ${{ inputs.enterprise }}
|
||||||
|
staging: ${{ inputs.staging }}
|
||||||
|
architecture: X64
|
||||||
|
operating_system: ubuntu-22.04
|
||||||
|
|
||||||
|
linux-legacy-installer:
|
||||||
|
uses: ./.github/workflows/linux.yml
|
||||||
|
with:
|
||||||
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
|
conan_args: ${{ inputs.conan_args }}
|
||||||
|
enterprise: ${{ inputs.enterprise }}
|
||||||
|
staging: ${{ inputs.staging }}
|
||||||
|
architecture: X64
|
||||||
|
operating_system: ubuntu-20.04
|
||||||
|
|
||||||
|
macos-installer:
|
||||||
|
uses: ./.github/workflows/macos.yml
|
||||||
|
with:
|
||||||
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
|
conan_args: ${{ inputs.conan_args }}
|
||||||
|
enterprise: ${{ inputs.enterprise }}
|
||||||
|
staging: ${{ inputs.staging }}
|
||||||
|
architecture: X64
|
||||||
|
operating_system: macos-11.0
|
||||||
|
|
||||||
|
macos-arm-installer:
|
||||||
|
uses: ./.github/workflows/macos.yml
|
||||||
|
with:
|
||||||
|
cura_conan_version: ${{ inputs.cura_conan_version }}
|
||||||
|
conan_args: ${{ inputs.conan_args }}
|
||||||
|
enterprise: ${{ inputs.enterprise }}
|
||||||
|
staging: ${{ inputs.staging }}
|
||||||
|
architecture: ARM64
|
||||||
|
operating_system: self-hosted
|
89
.github/workflows/linux.yml
vendored
Normal file
89
.github/workflows/linux.yml
vendored
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
name: Linux Installer
|
||||||
|
run-name: ${{ inputs.cura_conan_version }} for Linux-${{ inputs.architecture }} by @${{ github.actor }}
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
cura_conan_version:
|
||||||
|
description: 'Cura Conan Version'
|
||||||
|
default: 'cura/latest@ultimaker/testing'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
conan_args:
|
||||||
|
description: 'Conan args: eq.: --require-override'
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
enterprise:
|
||||||
|
description: 'Build Cura as an Enterprise edition'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
staging:
|
||||||
|
description: 'Use staging API'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
architecture:
|
||||||
|
description: 'Architecture'
|
||||||
|
required: true
|
||||||
|
default: 'X64'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- X64
|
||||||
|
operating_system:
|
||||||
|
description: 'OS'
|
||||||
|
required: true
|
||||||
|
default: 'ubuntu-22.04'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- ubuntu-22.04
|
||||||
|
- ubuntu-20.04
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
cura_conan_version:
|
||||||
|
description: 'Cura Conan Version'
|
||||||
|
default: 'cura/latest@ultimaker/testing'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
conan_args:
|
||||||
|
description: 'Conan args: eq.: --require-override'
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
enterprise:
|
||||||
|
description: 'Build Cura as an Enterprise edition'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
staging:
|
||||||
|
description: 'Use staging API'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
architecture:
|
||||||
|
description: 'Architecture'
|
||||||
|
required: true
|
||||||
|
default: 'X64'
|
||||||
|
type: string
|
||||||
|
operating_system:
|
||||||
|
description: 'OS'
|
||||||
|
required: true
|
||||||
|
default: 'ubuntu-22.04'
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
||||||
|
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
||||||
|
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
|
CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }}
|
||||||
|
ENTERPRISE: ${{ inputs.enterprise }}
|
||||||
|
STAGING: ${{ inputs.staging }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cura-installer-create:
|
||||||
|
runs-on: ${{ inputs.operating_system }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
258
.github/workflows/macos.yml
vendored
Normal file
258
.github/workflows/macos.yml
vendored
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
name: Macos Installer
|
||||||
|
run-name: ${{ inputs.cura_conan_version }} for Macos-${{ inputs.architecture }} by @${{ github.actor }}
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
cura_conan_version:
|
||||||
|
description: 'Cura Conan Version'
|
||||||
|
default: 'cura/latest@ultimaker/testing'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
conan_args:
|
||||||
|
description: 'Conan args: eq.: --require-override'
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
enterprise:
|
||||||
|
description: 'Build Cura as an Enterprise edition'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
staging:
|
||||||
|
description: 'Use staging API'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
architecture:
|
||||||
|
description: 'Architecture'
|
||||||
|
required: true
|
||||||
|
default: 'X64'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- X64
|
||||||
|
- ARM64
|
||||||
|
operating_system:
|
||||||
|
description: 'OS'
|
||||||
|
required: true
|
||||||
|
default: 'macos-11'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- self-hosted
|
||||||
|
- macos-11
|
||||||
|
- macos-12
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
cura_conan_version:
|
||||||
|
description: 'Cura Conan Version'
|
||||||
|
default: 'cura/latest@ultimaker/testing'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
conan_args:
|
||||||
|
description: 'Conan args: eq.: --require-override'
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
enterprise:
|
||||||
|
description: 'Build Cura as an Enterprise edition'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
staging:
|
||||||
|
description: 'Use staging API'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
architecture:
|
||||||
|
description: 'Architecture'
|
||||||
|
required: true
|
||||||
|
default: 'X64'
|
||||||
|
type: string
|
||||||
|
operating_system:
|
||||||
|
description: 'OS'
|
||||||
|
required: true
|
||||||
|
default: 'macos-11'
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
||||||
|
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
||||||
|
CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }}
|
||||||
|
MAC_NOTARIZE_USER: ${{ secrets.MAC_NOTARIZE_USER }}
|
||||||
|
MAC_NOTARIZE_PASS: ${{ secrets.MAC_NOTARIZE_PASS }}
|
||||||
|
MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }}
|
||||||
|
MACOS_CERT_INSTALLER_P12: ${{ secrets.MACOS_CERT_INSTALLER_P12 }}
|
||||||
|
MACOS_CERT_USER: ${{ secrets.MACOS_CERT_USER }}
|
||||||
|
MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }}
|
||||||
|
CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }}
|
||||||
|
ENTERPRISE: ${{ inputs.enterprise }}
|
||||||
|
STAGING: ${{ inputs.staging }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cura-installer-create:
|
||||||
|
runs-on: ${{ inputs.operating_system }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Setup Python and pip
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.10.x'
|
||||||
|
cache: 'pip'
|
||||||
|
cache-dependency-path: .github/workflows/requirements-conan-package.txt
|
||||||
|
|
||||||
|
- name: Install Python requirements for runner
|
||||||
|
run: pip install -r .github/workflows/requirements-conan-package.txt
|
||||||
|
|
||||||
|
- name: Install MacOS system requirements
|
||||||
|
run: brew install cmake autoconf automake ninja create-dmg
|
||||||
|
|
||||||
|
- name: Create the default Conan profile
|
||||||
|
run: conan profile new default --detect --force
|
||||||
|
|
||||||
|
- name: Remove Macos keychain (Bash)
|
||||||
|
run: security delete-keychain signing_temp.keychain || true
|
||||||
|
|
||||||
|
- name: Configure Macos keychain Developer Cert(Bash)
|
||||||
|
id: macos-keychain-developer-cert
|
||||||
|
uses: apple-actions/import-codesign-certs@v1
|
||||||
|
with:
|
||||||
|
keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
|
||||||
|
p12-file-base64: ${{ secrets.MACOS_CERT_P12 }}
|
||||||
|
p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }}
|
||||||
|
|
||||||
|
- name: Configure Macos keychain Installer Cert (Bash)
|
||||||
|
id: macos-keychain-installer-cert
|
||||||
|
uses: apple-actions/import-codesign-certs@v1
|
||||||
|
with:
|
||||||
|
keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
|
||||||
|
create-keychain: false # keychain is created in previous use of action.
|
||||||
|
p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }}
|
||||||
|
p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }}
|
||||||
|
|
||||||
|
- name: Get Conan configuration
|
||||||
|
run: conan config install https://github.com/Ultimaker/conan-config.git
|
||||||
|
|
||||||
|
- name: Set architecture conan profile
|
||||||
|
if: ${{ inputs.architecture == 'X64' }}
|
||||||
|
run: conan profile update settings.arch=x86_64 default
|
||||||
|
|
||||||
|
- name: Set Environment variables for Cura (bash)
|
||||||
|
run: |
|
||||||
|
. ./cura_inst/bin/activate_github_actions_env.sh
|
||||||
|
. ./cura_inst/bin/activate_github_actions_version_env.sh
|
||||||
|
|
||||||
|
- name: Unlock Macos keychain (Bash)
|
||||||
|
run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain
|
||||||
|
env:
|
||||||
|
TEMP_KEYCHAIN_PASSWORD: ${{ steps.macos-keychain-developer-cert.outputs.keychain-password }}
|
||||||
|
|
||||||
|
# FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile
|
||||||
|
# OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library.
|
||||||
|
# Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly
|
||||||
|
# and do a manual copy to the VirtualEnv, such that Pyinstaller can find it.
|
||||||
|
- name: Install OpenSSL shared
|
||||||
|
run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy
|
||||||
|
|
||||||
|
- name: Copy OpenSSL shared (Bash)
|
||||||
|
run: |
|
||||||
|
cp ./openssl/lib/*.so* ./cura_inst/bin/ || true
|
||||||
|
cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true
|
||||||
|
|
||||||
|
- name: Create the Cura dist
|
||||||
|
run: pyinstaller ./cura_inst/UltiMaker-Cura.spec
|
||||||
|
|
||||||
|
- name: Output the name file name and extension
|
||||||
|
id: filename
|
||||||
|
shell: python
|
||||||
|
run: |
|
||||||
|
import os
|
||||||
|
enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else ""
|
||||||
|
installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ inputs.arch }}"
|
||||||
|
output_env = os.environ["GITHUB_OUTPUT"]
|
||||||
|
content = ""
|
||||||
|
if os.path.exists(output_env):
|
||||||
|
with open(output_env, "r") as f:
|
||||||
|
content = f.read()
|
||||||
|
with open(output_env, "w") as f:
|
||||||
|
f.write(content)
|
||||||
|
f.writelines(f"INSTALLER_FILENAME={installer_filename}\n")
|
||||||
|
|
||||||
|
- name: Summarize the used Conan dependencies
|
||||||
|
shell: python
|
||||||
|
run: |
|
||||||
|
import os
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
conan_install_info_path = Path("cura_inst/conan_install_info.json")
|
||||||
|
conan_info = {"installed": []}
|
||||||
|
if os.path.exists(conan_install_info_path):
|
||||||
|
with open(conan_install_info_path, "r") as f:
|
||||||
|
conan_info = json.load(f)
|
||||||
|
sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]])
|
||||||
|
|
||||||
|
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||||
|
content = ""
|
||||||
|
if os.path.exists(summary_env):
|
||||||
|
with open(summary_env, "r") as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
with open(summary_env, "w") as f:
|
||||||
|
f.write(content)
|
||||||
|
f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n")
|
||||||
|
f.writelines("## Conan packages:\n")
|
||||||
|
for dep in sorted_deps:
|
||||||
|
f.writelines(f"`{dep}`\n")
|
||||||
|
|
||||||
|
- name: Summarize the used Python modules
|
||||||
|
shell: python
|
||||||
|
run: |
|
||||||
|
import os
|
||||||
|
import pkg_resources
|
||||||
|
summary_env = os.environ["GITHUB_STEP_SUMMARY"]
|
||||||
|
content = ""
|
||||||
|
if os.path.exists(summary_env):
|
||||||
|
with open(summary_env, "r") as f:
|
||||||
|
content = f.read()
|
||||||
|
|
||||||
|
with open(summary_env, "w") as f:
|
||||||
|
f.write(content)
|
||||||
|
f.writelines("## Python modules:\n")
|
||||||
|
for package in pkg_resources.working_set:
|
||||||
|
f.writelines(f"`{package.key}/{package.version}`\n")
|
||||||
|
|
||||||
|
- name: Create the Macos dmg and pkg (Bash)
|
||||||
|
run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_pkg --build_dmg --app_name "$CURA_APP_NAME"
|
||||||
|
working-directory: dist
|
||||||
|
|
||||||
|
- name: Upload the pkg
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-pkg
|
||||||
|
path: |
|
||||||
|
dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.pkg
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
- name: Upload the dmg
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-dmg
|
||||||
|
path: |
|
||||||
|
dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.dmg
|
||||||
|
retention-days: 5
|
||||||
|
|
||||||
|
notify-export:
|
||||||
|
if: ${{ always() }}
|
||||||
|
needs: [ cura-installer-create ]
|
||||||
|
|
||||||
|
uses: ultimaker/cura/.github/workflows/notify.yml@main
|
||||||
|
with:
|
||||||
|
success: ${{ contains(join(needs.*.result, ','), 'success') }}
|
||||||
|
success_title: "Create the Cura distributions"
|
||||||
|
success_body: "Installers for ${{ inputs.cura_conan_version }}"
|
||||||
|
failure_title: "Failed to create the Cura distributions"
|
||||||
|
failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}"
|
||||||
|
secrets: inherit
|
89
.github/workflows/windows.yml
vendored
Normal file
89
.github/workflows/windows.yml
vendored
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
name: Windows Installer
|
||||||
|
run-name: ${{ inputs.cura_conan_version }} for Windows-${{ inputs.architecture }} by @${{ github.actor }}
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
cura_conan_version:
|
||||||
|
description: 'Cura Conan Version'
|
||||||
|
default: 'cura/latest@ultimaker/testing'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
conan_args:
|
||||||
|
description: 'Conan args: eq.: --require-override'
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
enterprise:
|
||||||
|
description: 'Build Cura as an Enterprise edition'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
staging:
|
||||||
|
description: 'Use staging API'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
architecture:
|
||||||
|
description: 'Architecture'
|
||||||
|
required: true
|
||||||
|
default: 'X64'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- X64
|
||||||
|
operating_system:
|
||||||
|
description: 'OS'
|
||||||
|
required: true
|
||||||
|
default: 'windows-2022'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- windows-2022
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
cura_conan_version:
|
||||||
|
description: 'Cura Conan Version'
|
||||||
|
default: 'cura/latest@ultimaker/testing'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
conan_args:
|
||||||
|
description: 'Conan args: eq.: --require-override'
|
||||||
|
default: ''
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
enterprise:
|
||||||
|
description: 'Build Cura as an Enterprise edition'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
staging:
|
||||||
|
description: 'Use staging API'
|
||||||
|
default: false
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
architecture:
|
||||||
|
description: 'Architecture'
|
||||||
|
required: true
|
||||||
|
default: 'X64'
|
||||||
|
type: string
|
||||||
|
operating_system:
|
||||||
|
description: 'OS'
|
||||||
|
required: true
|
||||||
|
default: 'windows-2022'
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
|
||||||
|
CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }}
|
||||||
|
WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }}
|
||||||
|
WIN_CERT_INSTALLER_CER_PASS: ${{ secrets.WIN_CERT_INSTALLER_CER_PASS }}
|
||||||
|
CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }}
|
||||||
|
ENTERPRISE: ${{ inputs.enterprise }}
|
||||||
|
STAGING: ${{ inputs.staging }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
cura-installer-create:
|
||||||
|
runs-on: ${{ inputs.operating_system }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
|
@ -18,8 +18,8 @@ url: "https://ultimaker.com/software/ultimaker-cura"
|
||||||
repository-code: "https://github.com/Ultimaker/Cura"
|
repository-code: "https://github.com/Ultimaker/Cura"
|
||||||
license: LGPL-3.0
|
license: LGPL-3.0
|
||||||
license-url: "https://github.com/Ultimaker/Cura/blob/main/LICENSE"
|
license-url: "https://github.com/Ultimaker/Cura/blob/main/LICENSE"
|
||||||
version: 5.2.1
|
version: 5.4.0
|
||||||
date-released: "2022-10-19"
|
date-released: "2023-07-04"
|
||||||
keywords:
|
keywords:
|
||||||
- Ultimaker
|
- Ultimaker
|
||||||
- Cura
|
- Cura
|
||||||
|
|
1
FUNDING.yml
Normal file
1
FUNDING.yml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
github: [ultimaker]
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
[![Badge Test]][Test]
|
[![Badge Test]][Test]
|
||||||
[![Badge Conan]][Conan]
|
[![Badge Conan]][Conan]
|
||||||
|
![Badge Downloads]
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@
|
||||||
[Badge Conan]: https://img.shields.io/github/workflow/status/Ultimaker/Cura/conan-package?style=for-the-badge&logoColor=white&labelColor=6185aa&color=4c6987&logo=Conan&label=Conan%20Package
|
[Badge Conan]: https://img.shields.io/github/workflow/status/Ultimaker/Cura/conan-package?style=for-the-badge&logoColor=white&labelColor=6185aa&color=4c6987&logo=Conan&label=Conan%20Package
|
||||||
[Badge Test]: https://img.shields.io/github/workflow/status/Ultimaker/Cura/unit-test?style=for-the-badge&logoColor=white&labelColor=4a999d&color=346c6e&logo=Codacy&label=Unit%20Test
|
[Badge Test]: https://img.shields.io/github/workflow/status/Ultimaker/Cura/unit-test?style=for-the-badge&logoColor=white&labelColor=4a999d&color=346c6e&logo=Codacy&label=Unit%20Test
|
||||||
[Badge Size]: https://img.shields.io/github/repo-size/ultimaker/cura?style=for-the-badge&logoColor=white&labelColor=715a97&color=584674&logo=GoogleAnalytics
|
[Badge Size]: https://img.shields.io/github/repo-size/ultimaker/cura?style=for-the-badge&logoColor=white&labelColor=715a97&color=584674&logo=GoogleAnalytics
|
||||||
|
[Badge Downloads]: https://img.shields.io/github/downloads-pre/Ultimaker/Cura/latest/total?style=for-the-badge
|
||||||
|
|
||||||
|
|
||||||
<!---------------------------------[ Buttons ]--------------------------------->
|
<!---------------------------------[ Buttons ]--------------------------------->
|
||||||
|
|
|
@ -466,6 +466,7 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
|
||||||
save(self, os.path.join(self._script_dir, f"activate_github_actions_version_env{ext}"), activate_github_actions_version_env)
|
save(self, os.path.join(self._script_dir, f"activate_github_actions_version_env{ext}"), activate_github_actions_version_env)
|
||||||
|
|
||||||
self._generate_cura_version(os.path.join(self._site_packages, "cura"))
|
self._generate_cura_version(os.path.join(self._site_packages, "cura"))
|
||||||
|
self._generate_about_versions(str(self._share_dir.joinpath("cura", "resources", "qml", "Dialogs")))
|
||||||
|
|
||||||
entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements"))
|
entitlements_file = "'{}'".format(Path(self.cpp_info.res_paths[2], "MacOS", "cura.entitlements"))
|
||||||
self._generate_pyinstaller_spec(location = self._base_dir,
|
self._generate_pyinstaller_spec(location = self._base_dir,
|
||||||
|
@ -473,7 +474,6 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
|
||||||
icon_path = "'{}'".format(os.path.join(self.package_folder, self.cpp_info.resdirs[2], self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
|
icon_path = "'{}'".format(os.path.join(self.package_folder, self.cpp_info.resdirs[2], self.conan_data["pyinstaller"]["icon"][str(self.settings.os)])).replace("\\", "\\\\"),
|
||||||
entitlements_file = entitlements_file if self.settings.os == "Macos" else "None")
|
entitlements_file = entitlements_file if self.settings.os == "Macos" else "None")
|
||||||
|
|
||||||
self._generate_about_versions(os.path.join(self.source_folder, "resources", "qml", "Dialogs"))
|
|
||||||
|
|
||||||
def package(self):
|
def package(self):
|
||||||
copy(self, "cura_app.py", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.bindirs[0]))
|
copy(self, "cura_app.py", src = self.source_folder, dst = os.path.join(self.package_folder, self.cpp.package.bindirs[0]))
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
# Copyright (c) 2018 Ultimaker B.V.
|
# 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 PyQt6.QtCore import QObject, QUrl
|
|
||||||
from PyQt6.QtGui import QDesktopServices
|
|
||||||
from typing import List, cast
|
from typing import List, cast
|
||||||
|
|
||||||
|
from PyQt6.QtCore import QObject, QUrl, QMimeData
|
||||||
|
from PyQt6.QtGui import QDesktopServices
|
||||||
|
from PyQt6.QtWidgets import QApplication
|
||||||
|
|
||||||
from UM.Event import CallFunctionEvent
|
from UM.Event import CallFunctionEvent
|
||||||
from UM.FlameProfiler import pyqtSlot
|
from UM.FlameProfiler import pyqtSlot
|
||||||
from UM.Math.Vector import Vector
|
from UM.Math.Vector import Vector
|
||||||
from UM.Scene.Selection import Selection
|
from UM.Scene.Selection import Selection
|
||||||
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
||||||
|
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
|
||||||
from UM.Operations.GroupedOperation import GroupedOperation
|
from UM.Operations.GroupedOperation import GroupedOperation
|
||||||
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
||||||
from UM.Operations.TranslateOperation import TranslateOperation
|
from UM.Operations.TranslateOperation import TranslateOperation
|
||||||
|
@ -19,6 +22,7 @@ from cura.Operations.SetParentOperation import SetParentOperation
|
||||||
from cura.MultiplyObjectsJob import MultiplyObjectsJob
|
from cura.MultiplyObjectsJob import MultiplyObjectsJob
|
||||||
from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation
|
from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation
|
||||||
from cura.Settings.ExtruderManager import ExtruderManager
|
from cura.Settings.ExtruderManager import ExtruderManager
|
||||||
|
from cura.Arranging.Nest2DArrange import createGroupOperationForArrange
|
||||||
|
|
||||||
from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOperation
|
from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOperation
|
||||||
|
|
||||||
|
@ -181,5 +185,60 @@ class CuraActions(QObject):
|
||||||
|
|
||||||
Selection.clear()
|
Selection.clear()
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def cut(self) -> None:
|
||||||
|
self.copy()
|
||||||
|
self.deleteSelection()
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def copy(self) -> None:
|
||||||
|
mesh_writer = cura.CuraApplication.CuraApplication.getInstance().getMeshFileHandler().getWriter("3MFWriter")
|
||||||
|
if not mesh_writer:
|
||||||
|
Logger.log("e", "No 3MF writer found, unable to copy.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Get the selected nodes
|
||||||
|
selected_objects = Selection.getAllSelectedObjects()
|
||||||
|
# Serialize the nodes to a string
|
||||||
|
scene_string = mesh_writer.sceneNodesToString(selected_objects)
|
||||||
|
# Put the string on the clipboard
|
||||||
|
QApplication.clipboard().setText(scene_string)
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def paste(self) -> None:
|
||||||
|
application = cura.CuraApplication.CuraApplication.getInstance()
|
||||||
|
mesh_reader = application.getMeshFileHandler().getReaderForFile(".3mf")
|
||||||
|
if not mesh_reader:
|
||||||
|
Logger.log("e", "No 3MF reader found, unable to paste.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Parse the scene from the clipboard
|
||||||
|
scene_string = QApplication.clipboard().text()
|
||||||
|
|
||||||
|
nodes = mesh_reader.stringToSceneNodes(scene_string)
|
||||||
|
|
||||||
|
if not nodes:
|
||||||
|
# Nothing to paste
|
||||||
|
return
|
||||||
|
|
||||||
|
# Find all fixed nodes, these are the nodes that should be avoided when arranging
|
||||||
|
fixed_nodes = []
|
||||||
|
root = application.getController().getScene().getRoot()
|
||||||
|
for node in DepthFirstIterator(root):
|
||||||
|
# Only count sliceable objects
|
||||||
|
if node.callDecoration("isSliceable"):
|
||||||
|
fixed_nodes.append(node)
|
||||||
|
# Add the new nodes to the scene, and arrange them
|
||||||
|
group_operation, not_fit_count = createGroupOperationForArrange(nodes, application.getBuildVolume(),
|
||||||
|
fixed_nodes, factor=10000,
|
||||||
|
add_new_nodes_in_scene=True)
|
||||||
|
group_operation.push()
|
||||||
|
|
||||||
|
# deselect currently selected nodes, and select the new nodes
|
||||||
|
for node in Selection.getAllSelectedObjects():
|
||||||
|
Selection.remove(node)
|
||||||
|
for node in nodes:
|
||||||
|
Selection.add(node)
|
||||||
|
|
||||||
def _openUrl(self, url: QUrl) -> None:
|
def _openUrl(self, url: QUrl) -> None:
|
||||||
QDesktopServices.openUrl(url)
|
QDesktopServices.openUrl(url)
|
||||||
|
|
|
@ -495,6 +495,36 @@ class CuraApplication(QtApplication):
|
||||||
def startSplashWindowPhase(self) -> None:
|
def startSplashWindowPhase(self) -> None:
|
||||||
"""Runs preparations that needs to be done before the starting process."""
|
"""Runs preparations that needs to be done before the starting process."""
|
||||||
|
|
||||||
|
self.setRequiredPlugins([
|
||||||
|
# Misc.:
|
||||||
|
"ConsoleLogger", # You want to be able to read the log if something goes wrong.
|
||||||
|
"CuraEngineBackend", # Cura is useless without this one since you can't slice.
|
||||||
|
"FileLogger", # You want to be able to read the log if something goes wrong.
|
||||||
|
"XmlMaterialProfile", # Cura crashes without this one.
|
||||||
|
"Marketplace",
|
||||||
|
# This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back.
|
||||||
|
"PrepareStage", # Cura is useless without this one since you can't load models.
|
||||||
|
"PreviewStage", # This shows the list of the plugin views that are installed in Cura.
|
||||||
|
"MonitorStage", # Major part of Cura's functionality.
|
||||||
|
"LocalFileOutputDevice", # Major part of Cura's functionality.
|
||||||
|
"LocalContainerProvider", # Cura is useless without any profiles or setting definitions.
|
||||||
|
|
||||||
|
# Views:
|
||||||
|
"SimpleView", # Dependency of SolidView.
|
||||||
|
"SolidView", # Displays models. Cura is useless without it.
|
||||||
|
|
||||||
|
# Readers & Writers:
|
||||||
|
"GCodeWriter", # Cura is useless if it can't write its output.
|
||||||
|
"STLReader", # Most common model format, so disabling this makes Cura 90% useless.
|
||||||
|
"3MFWriter", # Required for writing project files.
|
||||||
|
|
||||||
|
# Tools:
|
||||||
|
"CameraTool", # Needed to see the scene. Cura is useless without it.
|
||||||
|
"SelectionTool", # Dependency of the rest of the tools.
|
||||||
|
"TranslateTool", # You'll need this for almost every print.
|
||||||
|
])
|
||||||
|
# Plugins need to be set here, since in the super the check is done if they are actually loaded.
|
||||||
|
|
||||||
super().startSplashWindowPhase()
|
super().startSplashWindowPhase()
|
||||||
|
|
||||||
if not self.getIsHeadLess():
|
if not self.getIsHeadLess():
|
||||||
|
@ -503,33 +533,7 @@ class CuraApplication(QtApplication):
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
Logger.log("w", "Unable to find the window icon.")
|
Logger.log("w", "Unable to find the window icon.")
|
||||||
|
|
||||||
self.setRequiredPlugins([
|
|
||||||
# Misc.:
|
|
||||||
"ConsoleLogger", #You want to be able to read the log if something goes wrong.
|
|
||||||
"CuraEngineBackend", #Cura is useless without this one since you can't slice.
|
|
||||||
"FileLogger", #You want to be able to read the log if something goes wrong.
|
|
||||||
"XmlMaterialProfile", #Cura crashes without this one.
|
|
||||||
"Marketplace", #This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back.
|
|
||||||
"PrepareStage", #Cura is useless without this one since you can't load models.
|
|
||||||
"PreviewStage", #This shows the list of the plugin views that are installed in Cura.
|
|
||||||
"MonitorStage", #Major part of Cura's functionality.
|
|
||||||
"LocalFileOutputDevice", #Major part of Cura's functionality.
|
|
||||||
"LocalContainerProvider", #Cura is useless without any profiles or setting definitions.
|
|
||||||
|
|
||||||
# Views:
|
|
||||||
"SimpleView", #Dependency of SolidView.
|
|
||||||
"SolidView", #Displays models. Cura is useless without it.
|
|
||||||
|
|
||||||
# Readers & Writers:
|
|
||||||
"GCodeWriter", #Cura is useless if it can't write its output.
|
|
||||||
"STLReader", #Most common model format, so disabling this makes Cura 90% useless.
|
|
||||||
"3MFWriter", #Required for writing project files.
|
|
||||||
|
|
||||||
# Tools:
|
|
||||||
"CameraTool", #Needed to see the scene. Cura is useless without it.
|
|
||||||
"SelectionTool", #Dependency of the rest of the tools.
|
|
||||||
"TranslateTool", #You'll need this for almost every print.
|
|
||||||
])
|
|
||||||
self._i18n_catalog = i18nCatalog("cura")
|
self._i18n_catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
self._update_platform_activity_timer = QTimer()
|
self._update_platform_activity_timer = QTimer()
|
||||||
|
|
|
@ -56,7 +56,8 @@ class ThreeMFReader(MeshReader):
|
||||||
def emptyFileHintSet(self) -> bool:
|
def emptyFileHintSet(self) -> bool:
|
||||||
return self._empty_project
|
return self._empty_project
|
||||||
|
|
||||||
def _createMatrixFromTransformationString(self, transformation: str) -> Matrix:
|
@staticmethod
|
||||||
|
def _createMatrixFromTransformationString(transformation: str) -> Matrix:
|
||||||
if transformation == "":
|
if transformation == "":
|
||||||
return Matrix()
|
return Matrix()
|
||||||
|
|
||||||
|
@ -90,7 +91,8 @@ class ThreeMFReader(MeshReader):
|
||||||
|
|
||||||
return temp_mat
|
return temp_mat
|
||||||
|
|
||||||
def _convertSavitarNodeToUMNode(self, savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]:
|
@staticmethod
|
||||||
|
def _convertSavitarNodeToUMNode(savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]:
|
||||||
"""Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node.
|
"""Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node.
|
||||||
|
|
||||||
:returns: Scene node.
|
:returns: Scene node.
|
||||||
|
@ -119,7 +121,7 @@ class ThreeMFReader(MeshReader):
|
||||||
pass
|
pass
|
||||||
um_node.setName(node_name)
|
um_node.setName(node_name)
|
||||||
um_node.setId(node_id)
|
um_node.setId(node_id)
|
||||||
transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation())
|
transformation = ThreeMFReader._createMatrixFromTransformationString(savitar_node.getTransformation())
|
||||||
um_node.setTransformation(transformation)
|
um_node.setTransformation(transformation)
|
||||||
mesh_builder = MeshBuilder()
|
mesh_builder = MeshBuilder()
|
||||||
|
|
||||||
|
@ -138,7 +140,7 @@ class ThreeMFReader(MeshReader):
|
||||||
um_node.setMeshData(mesh_data)
|
um_node.setMeshData(mesh_data)
|
||||||
|
|
||||||
for child in savitar_node.getChildren():
|
for child in savitar_node.getChildren():
|
||||||
child_node = self._convertSavitarNodeToUMNode(child)
|
child_node = ThreeMFReader._convertSavitarNodeToUMNode(child)
|
||||||
if child_node:
|
if child_node:
|
||||||
um_node.addChild(child_node)
|
um_node.addChild(child_node)
|
||||||
|
|
||||||
|
@ -214,7 +216,7 @@ class ThreeMFReader(MeshReader):
|
||||||
CuraApplication.getInstance().getController().getScene().setMetaDataEntry(key, value)
|
CuraApplication.getInstance().getController().getScene().setMetaDataEntry(key, value)
|
||||||
|
|
||||||
for node in scene_3mf.getSceneNodes():
|
for node in scene_3mf.getSceneNodes():
|
||||||
um_node = self._convertSavitarNodeToUMNode(node, file_name)
|
um_node = ThreeMFReader._convertSavitarNodeToUMNode(node, file_name)
|
||||||
if um_node is None:
|
if um_node is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -300,8 +302,23 @@ class ThreeMFReader(MeshReader):
|
||||||
if unit is None:
|
if unit is None:
|
||||||
unit = "millimeter"
|
unit = "millimeter"
|
||||||
elif unit not in conversion_to_mm:
|
elif unit not in conversion_to_mm:
|
||||||
Logger.log("w", "Unrecognised unit {unit} used. Assuming mm instead.".format(unit = unit))
|
Logger.log("w", "Unrecognised unit {unit} used. Assuming mm instead.".format(unit=unit))
|
||||||
unit = "millimeter"
|
unit = "millimeter"
|
||||||
|
|
||||||
scale = conversion_to_mm[unit]
|
scale = conversion_to_mm[unit]
|
||||||
return Vector(scale, scale, scale)
|
return Vector(scale, scale, scale)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def stringToSceneNodes(scene_string: str) -> List[SceneNode]:
|
||||||
|
parser = Savitar.ThreeMFParser()
|
||||||
|
scene = parser.parse(scene_string)
|
||||||
|
|
||||||
|
# Convert the scene to scene nodes
|
||||||
|
nodes = []
|
||||||
|
for savitar_node in scene.getSceneNodes():
|
||||||
|
scene_node = ThreeMFReader._convertSavitarNodeToUMNode(savitar_node, "file_name")
|
||||||
|
if scene_node is None:
|
||||||
|
continue
|
||||||
|
nodes.append(scene_node)
|
||||||
|
|
||||||
|
return nodes
|
||||||
|
|
|
@ -55,11 +55,12 @@ class ThreeMFWriter(MeshWriter):
|
||||||
"cura": "http://software.ultimaker.com/xml/cura/3mf/2015/10"
|
"cura": "http://software.ultimaker.com/xml/cura/3mf/2015/10"
|
||||||
}
|
}
|
||||||
|
|
||||||
self._unit_matrix_string = self._convertMatrixToString(Matrix())
|
self._unit_matrix_string = ThreeMFWriter._convertMatrixToString(Matrix())
|
||||||
self._archive: Optional[zipfile.ZipFile] = None
|
self._archive: Optional[zipfile.ZipFile] = None
|
||||||
self._store_archive = False
|
self._store_archive = False
|
||||||
|
|
||||||
def _convertMatrixToString(self, matrix):
|
@staticmethod
|
||||||
|
def _convertMatrixToString(matrix):
|
||||||
result = ""
|
result = ""
|
||||||
result += str(matrix._data[0, 0]) + " "
|
result += str(matrix._data[0, 0]) + " "
|
||||||
result += str(matrix._data[1, 0]) + " "
|
result += str(matrix._data[1, 0]) + " "
|
||||||
|
@ -83,7 +84,8 @@ class ThreeMFWriter(MeshWriter):
|
||||||
"""
|
"""
|
||||||
self._store_archive = store_archive
|
self._store_archive = store_archive
|
||||||
|
|
||||||
def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()):
|
@staticmethod
|
||||||
|
def _convertUMNodeToSavitarNode(um_node, transformation=Matrix()):
|
||||||
"""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.
|
||||||
|
@ -100,7 +102,7 @@ class ThreeMFWriter(MeshWriter):
|
||||||
|
|
||||||
node_matrix = um_node.getLocalTransformation()
|
node_matrix = um_node.getLocalTransformation()
|
||||||
|
|
||||||
matrix_string = self._convertMatrixToString(node_matrix.preMultiply(transformation))
|
matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix.preMultiply(transformation))
|
||||||
|
|
||||||
savitar_node.setTransformation(matrix_string)
|
savitar_node.setTransformation(matrix_string)
|
||||||
mesh_data = um_node.getMeshData()
|
mesh_data = um_node.getMeshData()
|
||||||
|
@ -133,7 +135,7 @@ class ThreeMFWriter(MeshWriter):
|
||||||
# only save the nodes on the active build plate
|
# only save the nodes on the active build plate
|
||||||
if child_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr:
|
if child_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr:
|
||||||
continue
|
continue
|
||||||
savitar_child_node = self._convertUMNodeToSavitarNode(child_node)
|
savitar_child_node = ThreeMFWriter._convertUMNodeToSavitarNode(child_node)
|
||||||
if savitar_child_node is not None:
|
if savitar_child_node is not None:
|
||||||
savitar_node.addChild(savitar_child_node)
|
savitar_node.addChild(savitar_child_node)
|
||||||
|
|
||||||
|
@ -221,7 +223,7 @@ class ThreeMFWriter(MeshWriter):
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
if node == root_node:
|
if node == root_node:
|
||||||
for root_child in node.getChildren():
|
for root_child in node.getChildren():
|
||||||
savitar_node = self._convertUMNodeToSavitarNode(root_child, transformation_matrix)
|
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child, transformation_matrix)
|
||||||
if savitar_node:
|
if savitar_node:
|
||||||
savitar_scene.addSceneNode(savitar_node)
|
savitar_scene.addSceneNode(savitar_node)
|
||||||
else:
|
else:
|
||||||
|
@ -303,9 +305,19 @@ class ThreeMFWriter(MeshWriter):
|
||||||
Logger.log("w", "Can't create snapshot when renderer not initialized.")
|
Logger.log("w", "Can't create snapshot when renderer not initialized.")
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
snapshot = Snapshot.snapshot(width = 300, height = 300)
|
snapshot = Snapshot.snapshot(width=300, height=300)
|
||||||
except:
|
except:
|
||||||
Logger.logException("w", "Failed to create snapshot image")
|
Logger.logException("w", "Failed to create snapshot image")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return snapshot
|
return snapshot
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def sceneNodesToString(scene_nodes: [SceneNode]) -> str:
|
||||||
|
savitar_scene = Savitar.Scene()
|
||||||
|
for scene_node in scene_nodes:
|
||||||
|
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(scene_node)
|
||||||
|
savitar_scene.addSceneNode(savitar_node)
|
||||||
|
parser = Savitar.ThreeMFParser()
|
||||||
|
scene_string = parser.sceneToString(savitar_scene)
|
||||||
|
return scene_string
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Copyright (c) 2018 Jaime van Kessel, Ultimaker B.V.
|
# Copyright (c) 2018 Jaime van Kessel, Ultimaker B.V.
|
||||||
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
|
# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import configparser # The script lists are stored in metadata as serialised config files.
|
import configparser # The script lists are stored in metadata as serialised config files.
|
||||||
import importlib.util
|
import importlib.util
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Copyright (c) 2022 Jaime van Kessel, Ultimaker B.V.
|
// Copyright (c) 2022 Jaime van Kessel, Ultimaker B.V.
|
||||||
// The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
|
// The PostProcessingPlugin is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.2
|
import QtQuick 2.2
|
||||||
import QtQuick.Controls 2.15
|
import QtQuick.Controls 2.15
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Copyright (c) 2015 Jaime van Kessel
|
# Copyright (c) 2015 Jaime van Kessel
|
||||||
# Copyright (c) 2018 Ultimaker B.V.
|
# Copyright (c) 2018 Ultimaker B.V.
|
||||||
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
|
# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher.
|
||||||
from typing import Optional, Any, Dict, TYPE_CHECKING, List
|
from typing import Optional, Any, Dict, TYPE_CHECKING, List
|
||||||
|
|
||||||
from UM.Signal import Signal, signalemitter
|
from UM.Signal import Signal, signalemitter
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# ChangeAtZ script - Change printing parameters at a given height
|
# ChangeAtZ script - Change printing parameters at a given height
|
||||||
# This script is the successor of the TweakAtZ plugin for legacy Cura.
|
# This script is the successor of the TweakAtZ plugin for legacy Cura.
|
||||||
# It contains code from the TweakAtZ plugin V1.0-V4.x and from the ExampleScript by Jaime van Kessel, Ultimaker B.V.
|
# It contains code from the TweakAtZ plugin V1.0-V4.x and from the ExampleScript by Jaime van Kessel, Ultimaker B.V.
|
||||||
# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher.
|
# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher.
|
||||||
# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms
|
# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms
|
||||||
|
|
||||||
# Authors of the ChangeAtZ plugin / script:
|
# Authors of the ChangeAtZ plugin / script:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# ColorMix script - 2-1 extruder color mix and blending
|
# ColorMix script - 2-1 extruder color mix and blending
|
||||||
# This script is specific for the Geeetech A10M dual extruder but should work with other Marlin printers.
|
# This script is specific for the Geeetech A10M dual extruder but should work with other Marlin printers.
|
||||||
# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher.
|
# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher.
|
||||||
# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms
|
# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms
|
||||||
|
|
||||||
#Authors of the 2-1 ColorMix plug-in / script:
|
#Authors of the 2-1 ColorMix plug-in / script:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Copyright (c) 2023 Ultimaker B.V.
|
# Copyright (c) 2023 Ultimaker B.V.
|
||||||
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
|
# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
# Modification 06.09.2020
|
# Modification 06.09.2020
|
||||||
# add checkbox, now you can choose and use configuration from the firmware itself.
|
# add checkbox, now you can choose and use configuration from the firmware itself.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Copyright (c) 2023 UltiMaker B.V.
|
# Copyright (c) 2023 UltiMaker B.V.
|
||||||
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
|
# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
from ..Script import Script
|
from ..Script import Script
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Copyright (c) 2017 Ghostkeeper
|
# Copyright (c) 2017 Ghostkeeper
|
||||||
# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
|
# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import re #To perform the search and replace.
|
import re #To perform the search and replace.
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# This PostProcessingPlugin script is released under the terms of the AGPLv3 or higher.
|
# This PostProcessingPlugin script is released under the terms of the LGPLv3 or higher.
|
||||||
"""
|
"""
|
||||||
Copyright (c) 2017 Christophe Baribaud 2017
|
Copyright (c) 2017 Christophe Baribaud 2017
|
||||||
Python implementation of https://github.com/electrocbd/post_stretch
|
Python implementation of https://github.com/electrocbd/post_stretch
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
"machine_width": { "default_value": 280 },
|
"machine_width": { "default_value": 280 },
|
||||||
"material_diameter": { "default_value": 1.75 },
|
"material_diameter": { "default_value": 1.75 },
|
||||||
"material_initial_print_temperature": { "value": "material_print_temperature" },
|
"material_initial_print_temperature": { "value": "material_print_temperature" },
|
||||||
"prime_tower_min_volume": { "value": "((reveOrValue('layer_height'))/2" },
|
"prime_tower_min_volume": { "value": "((resolveOrValue('layer_height'))/2" },
|
||||||
"prime_tower_position_x": { "value": "240" },
|
"prime_tower_position_x": { "value": "240" },
|
||||||
"prime_tower_position_y": { "value": "190" },
|
"prime_tower_position_y": { "value": "190" },
|
||||||
"prime_tower_size": { "value": "30" },
|
"prime_tower_size": { "value": "30" },
|
||||||
|
|
29
resources/definitions/anycubic_kobra_plus.def.json
Normal file
29
resources/definitions/anycubic_kobra_plus.def.json
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Anycubic Kobra Plus",
|
||||||
|
"inherits": "fdmprinter",
|
||||||
|
"metadata":
|
||||||
|
{
|
||||||
|
"visible": true,
|
||||||
|
"author": "Jordon Brooks",
|
||||||
|
"manufacturer": "Anycubic",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"has_machine_quality": true,
|
||||||
|
"has_materials": true,
|
||||||
|
"machine_extruder_trains": { "0": "anycubic_kobra_plus_extruder_0" },
|
||||||
|
"preferred_material": "generic_pla",
|
||||||
|
"preferred_quality_type": "normal",
|
||||||
|
"quality_definition": "anycubic_kobra_plus"
|
||||||
|
},
|
||||||
|
"overrides":
|
||||||
|
{
|
||||||
|
"machine_depth": { "default_value": 302 },
|
||||||
|
"machine_end_gcode": { "default_value": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84\nM355 S0; led off" },
|
||||||
|
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
|
||||||
|
"machine_heated_bed": { "default_value": true },
|
||||||
|
"machine_height": { "default_value": 352 },
|
||||||
|
"machine_name": { "default_value": "Anycubic Kobra Plus" },
|
||||||
|
"machine_start_gcode": { "default_value": "G28 ;Home\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nM355 S1; Turn LED on\n; Add Custom purge lines\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X1.0 Y30 Z0.3 F5000.0 ; Move to start position\nG1 X1.0 Y100.0 Z0.3 F1500.0 E15 ; Draw the first line\nG1 X1.3 Y100.0 Z0.3 F5000.0 ; Move to side a little\nG1 X1.3 Y30 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 E-2 F500 ; Retract a little \nG1 X50 F500 ; wipe away from the filament line\nG1 X100 F9000 ; Quickly wipe away from the filament line\nG1 Z5.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\n; End custom purge lines" },
|
||||||
|
"machine_width": { "default_value": 302 }
|
||||||
|
}
|
||||||
|
}
|
|
@ -69,7 +69,7 @@
|
||||||
"material_print_temperature_layer_0": { "value": "210 if material_print_temperature < 210 else material_print_temperature" },
|
"material_print_temperature_layer_0": { "value": "210 if material_print_temperature < 210 else material_print_temperature" },
|
||||||
"min_infill_area": { "value": "5" },
|
"min_infill_area": { "value": "5" },
|
||||||
"minimum_interface_area": { "default_value": 10 },
|
"minimum_interface_area": { "default_value": 10 },
|
||||||
"minimum_support_area": { "default_value": 3 },
|
"minimum_support_area": { "value": "3 if support_structure == 'normal' else 0" },
|
||||||
"optimize_wall_printing_order": { "default_value": true },
|
"optimize_wall_printing_order": { "default_value": true },
|
||||||
"prime_tower_brim_enable": { "default_value": true },
|
"prime_tower_brim_enable": { "default_value": true },
|
||||||
"prime_tower_min_volume": { "value": "(layer_height) * (prime_tower_size / 2)**2 * 3 * 0.5 " },
|
"prime_tower_min_volume": { "value": "(layer_height) * (prime_tower_size / 2)**2 * 3 * 0.5 " },
|
||||||
|
|
|
@ -1664,6 +1664,7 @@
|
||||||
"small_skin_width":
|
"small_skin_width":
|
||||||
{
|
{
|
||||||
"label": "Small Top/Bottom Width",
|
"label": "Small Top/Bottom Width",
|
||||||
|
|
||||||
"description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions. Off for the topmost (air-exposed) layer by default (see 'Small Top/Bottom On Surface').",
|
"description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions. Off for the topmost (air-exposed) layer by default (see 'Small Top/Bottom On Surface').",
|
||||||
"value": "skin_line_width * 2",
|
"value": "skin_line_width * 2",
|
||||||
"default_value": 1,
|
"default_value": 1,
|
||||||
|
@ -5931,7 +5932,7 @@
|
||||||
"maximum_value_warning": "skirt_brim_line_width",
|
"maximum_value_warning": "skirt_brim_line_width",
|
||||||
"enabled": "resolveOrValue('adhesion_type') == 'brim'",
|
"enabled": "resolveOrValue('adhesion_type') == 'brim'",
|
||||||
"limit_to_extruder": "skirt_brim_extruder_nr",
|
"limit_to_extruder": "skirt_brim_extruder_nr",
|
||||||
"settable_per_mesh": true,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": true
|
"settable_per_extruder": true
|
||||||
},
|
},
|
||||||
"brim_replaces_support":
|
"brim_replaces_support":
|
||||||
|
@ -6815,6 +6816,48 @@
|
||||||
"minimum_value_warning": "500",
|
"minimum_value_warning": "500",
|
||||||
"maximum_value_warning": "100000",
|
"maximum_value_warning": "100000",
|
||||||
"settable_per_mesh": true
|
"settable_per_mesh": true
|
||||||
|
},
|
||||||
|
"meshfix_fluid_motion_enabled":
|
||||||
|
{
|
||||||
|
"label": "Enable Fluid Motion",
|
||||||
|
"description": "When enabled tool paths are corrected for printers with smooth motion planners. Small movements that deviate from the general tool path direction are smoothed to improve fluid motions.",
|
||||||
|
"type": "bool",
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"meshfix_fluid_motion_shift_distance":
|
||||||
|
{
|
||||||
|
"label": "Fluid Motion Shift Distance",
|
||||||
|
"description": "Distance points are shifted to smooth the path",
|
||||||
|
"enabled": "meshfix_fluid_motion_enabled",
|
||||||
|
"type": "float",
|
||||||
|
"unit": "mm",
|
||||||
|
"default_value": 0.1,
|
||||||
|
"minimum_value": "0.01",
|
||||||
|
"maximum_value": "1"
|
||||||
|
},
|
||||||
|
"meshfix_fluid_motion_small_distance":
|
||||||
|
{
|
||||||
|
"label": "Fluid Motion Small Distance",
|
||||||
|
"description": "Distance points are shifted to smooth the path",
|
||||||
|
"enabled": "meshfix_fluid_motion_enabled",
|
||||||
|
"unit": "mm",
|
||||||
|
"type": "float",
|
||||||
|
"default_value": 0.01,
|
||||||
|
"minimum_value": "0.01",
|
||||||
|
"maximum_value": "0.1"
|
||||||
|
},
|
||||||
|
"meshfix_fluid_motion_angle":
|
||||||
|
{
|
||||||
|
"label": "Fluid Motion Angle",
|
||||||
|
"description": "If a toolpath-segment deviates more than this angle from the general motion it is smoothed.",
|
||||||
|
"enabled": "meshfix_fluid_motion_enabled",
|
||||||
|
"type": "float",
|
||||||
|
"unit": "\u00b0",
|
||||||
|
"default_value": 15,
|
||||||
|
"maximum_value": "90",
|
||||||
|
"minimum_value": "0",
|
||||||
|
"minimum_value_warning": "1",
|
||||||
|
"maximum_value_warning": "35"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
16
resources/extruders/anycubic_kobra_plus_extruder_0.def.json
Normal file
16
resources/extruders/anycubic_kobra_plus_extruder_0.def.json
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Extruder 1",
|
||||||
|
"inherits": "fdmextruder",
|
||||||
|
"metadata":
|
||||||
|
{
|
||||||
|
"machine": "anycubic_kobra_plus",
|
||||||
|
"position": "0"
|
||||||
|
},
|
||||||
|
"overrides":
|
||||||
|
{
|
||||||
|
"extruder_nr": { "default_value": 0 },
|
||||||
|
"machine_nozzle_size": { "default_value": 0.4 },
|
||||||
|
"material_diameter": { "default_value": 1.75 }
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) 2022 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.
|
||||||
|
|
||||||
pragma Singleton
|
pragma Singleton
|
||||||
|
@ -6,7 +6,7 @@ pragma Singleton
|
||||||
import QtQuick 2.10
|
import QtQuick 2.10
|
||||||
import QtQuick.Controls 2.4
|
import QtQuick.Controls 2.4
|
||||||
import UM 1.1 as UM
|
import UM 1.1 as UM
|
||||||
import Cura 1.0 as Cura
|
import Cura 1.5 as Cura
|
||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
|
@ -60,6 +60,7 @@ Item
|
||||||
property alias showProfileFolder: showProfileFolderAction
|
property alias showProfileFolder: showProfileFolderAction
|
||||||
property alias documentation: documentationAction
|
property alias documentation: documentationAction
|
||||||
property alias showTroubleshooting: showTroubleShootingAction
|
property alias showTroubleshooting: showTroubleShootingAction
|
||||||
|
property alias openSponsershipPage: openSponsershipPageAction
|
||||||
property alias reportBug: reportBugAction
|
property alias reportBug: reportBugAction
|
||||||
property alias whatsNew: whatsNewAction
|
property alias whatsNew: whatsNewAction
|
||||||
property alias about: aboutAction
|
property alias about: aboutAction
|
||||||
|
@ -71,6 +72,15 @@ Item
|
||||||
|
|
||||||
property alias browsePackages: browsePackagesAction
|
property alias browsePackages: browsePackagesAction
|
||||||
|
|
||||||
|
property alias paste: pasteAction
|
||||||
|
property alias copy: copyAction
|
||||||
|
property alias cut: cutAction
|
||||||
|
|
||||||
|
readonly property bool copy_paste_enabled: {
|
||||||
|
const all_enabled_packages = CuraApplication.getPackageManager().allEnabledPackages;
|
||||||
|
return all_enabled_packages.includes("3MFReader") && all_enabled_packages.includes("3MFWriter");
|
||||||
|
}
|
||||||
|
|
||||||
UM.I18nCatalog{id: catalog; name: "cura"}
|
UM.I18nCatalog{id: catalog; name: "cura"}
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,6 +91,13 @@ Item
|
||||||
text: catalog.i18nc("@action:inmenu", "Show Online Troubleshooting")
|
text: catalog.i18nc("@action:inmenu", "Show Online Troubleshooting")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Action
|
||||||
|
{
|
||||||
|
id: openSponsershipPageAction
|
||||||
|
onTriggered: Qt.openUrlExternally("https://ultimaker.com/software/ultimaker-cura/sponsor/")
|
||||||
|
text: catalog.i18nc("@action:inmenu", "Sponsor Cura")
|
||||||
|
}
|
||||||
|
|
||||||
Action
|
Action
|
||||||
{
|
{
|
||||||
id: toggleFullScreenAction
|
id: toggleFullScreenAction
|
||||||
|
@ -309,6 +326,33 @@ Item
|
||||||
onTriggered: CuraActions.centerSelection()
|
onTriggered: CuraActions.centerSelection()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Action
|
||||||
|
{
|
||||||
|
id: copyAction
|
||||||
|
text: catalog.i18nc("@action:inmenu menubar:edit", "Copy to clipboard")
|
||||||
|
onTriggered: CuraActions.copy()
|
||||||
|
enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection && copy_paste_enabled
|
||||||
|
shortcut: StandardKey.Copy
|
||||||
|
}
|
||||||
|
|
||||||
|
Action
|
||||||
|
{
|
||||||
|
id: pasteAction
|
||||||
|
text: catalog.i18nc("@action:inmenu menubar:edit", "Paste from clipboard")
|
||||||
|
onTriggered: CuraActions.paste()
|
||||||
|
enabled: UM.Controller.toolsEnabled && copy_paste_enabled
|
||||||
|
shortcut: StandardKey.Paste
|
||||||
|
}
|
||||||
|
|
||||||
|
Action
|
||||||
|
{
|
||||||
|
id: cutAction
|
||||||
|
text: catalog.i18nc("@action:inmenu menubar:edit", "Cut")
|
||||||
|
onTriggered: CuraActions.cut()
|
||||||
|
enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection && copy_paste_enabled
|
||||||
|
shortcut: StandardKey.Cut
|
||||||
|
}
|
||||||
|
|
||||||
Action
|
Action
|
||||||
{
|
{
|
||||||
id: multiplySelectionAction
|
id: multiplySelectionAction
|
||||||
|
|
|
@ -57,10 +57,10 @@ Popup
|
||||||
permissionsRequired: []
|
permissionsRequired: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
displayName: "UltiMaker Academy", //Not translated, since it's a brand name.
|
displayName: catalog.i18nc("@label:button", "Sponsor Cura"),
|
||||||
thumbnail: UM.Theme.getIcon("Knowledge"),
|
thumbnail: UM.Theme.getIcon("Heart"),
|
||||||
description: catalog.i18nc("@tooltip:button", "Become a 3D printing expert with UltiMaker e-learning."),
|
description: catalog.i18nc("@tooltip:button", "Show your support for Cura with a donation."),
|
||||||
link: "https://academy.ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-academy",
|
link: "https://ultimaker.com/software/ultimaker-cura/sponsor/",
|
||||||
permissionsRequired: []
|
permissionsRequired: []
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -19,6 +19,8 @@ Cura.Menu
|
||||||
// Selection-related actions.
|
// Selection-related actions.
|
||||||
Cura.MenuItem { action: Cura.Actions.centerSelection; }
|
Cura.MenuItem { action: Cura.Actions.centerSelection; }
|
||||||
Cura.MenuItem { action: Cura.Actions.deleteSelection; }
|
Cura.MenuItem { action: Cura.Actions.deleteSelection; }
|
||||||
|
Cura.MenuItem { action: Cura.Actions.copy; }
|
||||||
|
Cura.MenuItem { action: Cura.Actions.paste; }
|
||||||
Cura.MenuItem { action: Cura.Actions.multiplySelection; }
|
Cura.MenuItem { action: Cura.Actions.multiplySelection; }
|
||||||
|
|
||||||
// Extruder selection - only visible if there is more than 1 extruder
|
// Extruder selection - only visible if there is more than 1 extruder
|
||||||
|
|
|
@ -17,6 +17,7 @@ Cura.Menu
|
||||||
Cura.MenuItem { action: Cura.Actions.showTroubleshooting}
|
Cura.MenuItem { action: Cura.Actions.showTroubleshooting}
|
||||||
Cura.MenuItem { action: Cura.Actions.documentation }
|
Cura.MenuItem { action: Cura.Actions.documentation }
|
||||||
Cura.MenuItem { action: Cura.Actions.reportBug }
|
Cura.MenuItem { action: Cura.Actions.reportBug }
|
||||||
|
Cura.MenuItem { action: Cura.Actions.openSponsershipPage }
|
||||||
Cura.MenuSeparator { }
|
Cura.MenuSeparator { }
|
||||||
Cura.MenuItem { action: Cura.Actions.whatsNew }
|
Cura.MenuItem { action: Cura.Actions.whatsNew }
|
||||||
Cura.MenuItem { action: Cura.Actions.about }
|
Cura.MenuItem { action: Cura.Actions.about }
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
[general]
|
||||||
|
definition = anycubic_kobra_plus
|
||||||
|
name = Normal
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[metadata]
|
||||||
|
global_quality = True
|
||||||
|
quality_type = normal
|
||||||
|
setting_version = 22
|
||||||
|
type = quality
|
||||||
|
weight = 0
|
||||||
|
|
||||||
|
[values]
|
||||||
|
infill_pattern = cubic
|
||||||
|
layer_height = 0.2
|
||||||
|
layer_height_0 = 0.2
|
||||||
|
material_final_print_temperature = 195
|
||||||
|
material_print_temperature = 195
|
||||||
|
retraction_combing = off
|
||||||
|
retraction_hop = 0.1
|
||||||
|
retraction_hop_enabled = True
|
||||||
|
retraction_hop_only_when_collides = True
|
||||||
|
speed_infill = 40
|
||||||
|
speed_layer_0 = 20
|
||||||
|
speed_print = 80
|
||||||
|
speed_wall_x = 60
|
||||||
|
wall_thickness = 1.2
|
||||||
|
|
|
@ -13,4 +13,8 @@ weight = 0
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -14,5 +14,9 @@ weight = 0
|
||||||
[values]
|
[values]
|
||||||
speed_infill = =math.ceil(speed_print * 40 / 55)
|
speed_infill = =math.ceil(speed_print * 40 / 55)
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,10 @@ retraction_min_travel = 5
|
||||||
speed_print = 70
|
speed_print = 70
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 70)
|
speed_topbottom = =math.ceil(speed_print * 30 / 70)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 70)
|
speed_wall = =math.ceil(speed_print * 30 / 70)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 30
|
switch_extruder_prime_speed = 30
|
||||||
switch_extruder_retraction_amount = 30
|
switch_extruder_retraction_amount = 30
|
||||||
switch_extruder_retraction_speeds = 40
|
switch_extruder_retraction_speeds = 40
|
||||||
|
|
|
@ -29,7 +29,11 @@ speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
support_interface_density = 87.5
|
support_interface_density = 87.5
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -15,5 +15,9 @@ weight = 0
|
||||||
material_print_temperature = =default_material_print_temperature - 5
|
material_print_temperature = =default_material_print_temperature - 5
|
||||||
speed_infill = =math.ceil(speed_print * 40 / 55)
|
speed_infill = =math.ceil(speed_print * 40 / 55)
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,10 @@ retraction_hop = 0.2
|
||||||
speed_print = 30
|
speed_print = 30
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 30)
|
speed_wall = =math.ceil(speed_print * 25 / 30)
|
||||||
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.72
|
top_bottom_thickness = 0.72
|
||||||
travel_avoid_distance = 0.4
|
travel_avoid_distance = 0.4
|
||||||
wall_0_inset = 0.015
|
wall_0_inset = 0.015
|
||||||
|
|
|
@ -34,6 +34,10 @@ speed_print = 25
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -21,6 +21,10 @@ speed_print = 30
|
||||||
speed_topbottom = =math.ceil(speed_print * 20 / 30)
|
speed_topbottom = =math.ceil(speed_print * 20 / 30)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 30)
|
speed_wall = =math.ceil(speed_print * 25 / 30)
|
||||||
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.72
|
top_bottom_thickness = 0.72
|
||||||
wall_0_inset = 0.015
|
wall_0_inset = 0.015
|
||||||
wall_0_wipe_dist = 0.25
|
wall_0_wipe_dist = 0.25
|
||||||
|
|
|
@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 50)
|
speed_wall = =math.ceil(speed_print * 30 / 50)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -23,4 +23,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 60)
|
speed_wall = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 55)
|
||||||
speed_print = 55
|
speed_print = 55
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 55)
|
speed_wall = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -23,4 +23,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 45 / 60)
|
speed_wall = =math.ceil(speed_print * 45 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ speed_print = 40
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
||||||
speed_wall = =math.ceil(speed_print * 35 / 40)
|
speed_wall = =math.ceil(speed_print * 35 / 40)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
||||||
support_z_distance = =layer_height
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.4/layer_height)*layer_height
|
||||||
wall_0_inset = 0
|
wall_0_inset = 0
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,9 @@ speed_print = 45
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||||
speed_wall = =math.ceil(speed_print * 45 / 45)
|
speed_wall = =math.ceil(speed_print * 45 / 45)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
support_z_distance = =layer_height
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.4/layer_height)*layer_height
|
||||||
wall_0_inset = 0
|
wall_0_inset = 0
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ speed_print = 40
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
||||||
speed_wall = =math.ceil(speed_print * 35 / 40)
|
speed_wall = =math.ceil(speed_print * 35 / 40)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
||||||
support_z_distance = =layer_height
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.4/layer_height)*layer_height
|
||||||
wall_0_inset = 0
|
wall_0_inset = 0
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,9 @@ speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 40 / 50)
|
speed_topbottom = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 50 / 50)
|
speed_wall = =math.ceil(speed_print * 50 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 40 / 50)
|
speed_wall_0 = =math.ceil(speed_wall * 40 / 50)
|
||||||
support_z_distance = =layer_height
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.4/layer_height)*layer_height
|
||||||
wall_0_inset = 0
|
wall_0_inset = 0
|
||||||
|
|
||||||
|
|
|
@ -21,4 +21,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 50)
|
speed_wall = =math.ceil(speed_print * 30 / 50)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -20,4 +20,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 60)
|
speed_wall = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 45 / 55)
|
||||||
speed_print = 55
|
speed_print = 55
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 55)
|
speed_wall = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -20,4 +20,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 45 / 60)
|
speed_wall = =math.ceil(speed_print * 45 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,10 @@ weight = 1
|
||||||
[values]
|
[values]
|
||||||
ooze_shield_angle = 40
|
ooze_shield_angle = 40
|
||||||
raft_airgap = 0.4
|
raft_airgap = 0.4
|
||||||
retraction_prime_speed = =retraction_speed
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 30
|
switch_extruder_prime_speed = 30
|
||||||
switch_extruder_retraction_amount = 30
|
switch_extruder_retraction_amount = 30
|
||||||
switch_extruder_retraction_speeds = 40
|
switch_extruder_retraction_speeds = 40
|
||||||
|
|
|
@ -15,7 +15,10 @@ weight = -1
|
||||||
material_print_temperature = =default_material_print_temperature + 5
|
material_print_temperature = =default_material_print_temperature + 5
|
||||||
ooze_shield_angle = 40
|
ooze_shield_angle = 40
|
||||||
raft_airgap = 0.4
|
raft_airgap = 0.4
|
||||||
retraction_prime_speed = =retraction_speed
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 30
|
switch_extruder_prime_speed = 30
|
||||||
switch_extruder_retraction_amount = 30
|
switch_extruder_retraction_amount = 30
|
||||||
switch_extruder_retraction_speeds = 40
|
switch_extruder_retraction_speeds = 40
|
||||||
|
|
|
@ -14,7 +14,10 @@ weight = 0
|
||||||
[values]
|
[values]
|
||||||
ooze_shield_angle = 40
|
ooze_shield_angle = 40
|
||||||
raft_airgap = 0.4
|
raft_airgap = 0.4
|
||||||
retraction_prime_speed = =retraction_speed
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 30
|
switch_extruder_prime_speed = 30
|
||||||
switch_extruder_retraction_amount = 30
|
switch_extruder_retraction_amount = 30
|
||||||
switch_extruder_retraction_speeds = 40
|
switch_extruder_retraction_speeds = 40
|
||||||
|
|
|
@ -15,7 +15,10 @@ weight = -2
|
||||||
material_print_temperature = =default_material_print_temperature + 10
|
material_print_temperature = =default_material_print_temperature + 10
|
||||||
ooze_shield_angle = 40
|
ooze_shield_angle = 40
|
||||||
raft_airgap = 0.4
|
raft_airgap = 0.4
|
||||||
retraction_prime_speed = =retraction_speed
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 30
|
switch_extruder_prime_speed = 30
|
||||||
switch_extruder_retraction_amount = 30
|
switch_extruder_retraction_amount = 30
|
||||||
switch_extruder_retraction_speeds = 40
|
switch_extruder_retraction_speeds = 40
|
||||||
|
|
|
@ -31,7 +31,11 @@ speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
support_interface_density = 87.5
|
support_interface_density = 87.5
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -31,7 +31,11 @@ speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
support_interface_density = 87.5
|
support_interface_density = 87.5
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -30,7 +30,11 @@ speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
support_interface_density = 87.5
|
support_interface_density = 87.5
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -31,7 +31,11 @@ speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
support_interface_density = 87.5
|
support_interface_density = 87.5
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 50)
|
speed_wall = =math.ceil(speed_print * 30 / 50)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -19,4 +19,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 60)
|
speed_wall = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -20,4 +20,8 @@ speed_infill = =math.ceil(speed_print * 45 / 55)
|
||||||
speed_print = 55
|
speed_print = 55
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 55)
|
speed_wall = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -19,4 +19,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 45 / 60)
|
speed_wall = =math.ceil(speed_print * 45 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -21,5 +21,9 @@ retraction_prime_speed = =retraction_speed
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 50)
|
speed_topbottom = =math.ceil(speed_print * 35 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 35 / 50)
|
speed_wall = =math.ceil(speed_print * 35 / 50)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1
|
top_bottom_thickness = 1
|
||||||
|
|
||||||
|
|
|
@ -21,5 +21,9 @@ speed_print = 70
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 70)
|
speed_topbottom = =math.ceil(speed_print * 35 / 70)
|
||||||
speed_wall = =math.ceil(speed_print * 45 / 70)
|
speed_wall = =math.ceil(speed_print * 45 / 70)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 70)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 70)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1
|
top_bottom_thickness = 1
|
||||||
|
|
||||||
|
|
|
@ -17,5 +17,9 @@ machine_nozzle_heat_up_speed = 1.6
|
||||||
prime_tower_enable = False
|
prime_tower_enable = False
|
||||||
raft_airgap = 0.25
|
raft_airgap = 0.25
|
||||||
retraction_prime_speed = =retraction_speed
|
retraction_prime_speed = =retraction_speed
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1
|
top_bottom_thickness = 1
|
||||||
|
|
||||||
|
|
|
@ -24,5 +24,9 @@ retraction_prime_speed = =retraction_speed
|
||||||
speed_topbottom = =math.ceil(speed_print * 40 / 70)
|
speed_topbottom = =math.ceil(speed_print * 40 / 70)
|
||||||
speed_wall = =math.ceil(speed_print * 55 / 70)
|
speed_wall = =math.ceil(speed_print * 55 / 70)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 45 / 50)
|
speed_wall_0 = =math.ceil(speed_wall * 45 / 50)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,10 @@ raft_airgap = 0.25
|
||||||
retraction_prime_speed = =retraction_speed
|
retraction_prime_speed = =retraction_speed
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_wall = 50
|
speed_wall = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.9
|
top_bottom_thickness = 0.9
|
||||||
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -21,5 +21,9 @@ speed_print = 45
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 45)
|
speed_wall = =math.ceil(speed_print * 40 / 45)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
|
|
||||||
|
|
|
@ -21,5 +21,9 @@ speed_print = 45
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 45)
|
speed_wall = =math.ceil(speed_print * 40 / 45)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
|
|
||||||
|
|
|
@ -21,5 +21,9 @@ speed_print = 45
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 45)
|
speed_wall = =math.ceil(speed_print * 40 / 45)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
|
|
||||||
|
|
|
@ -22,5 +22,9 @@ speed_roofing = =math.ceil(speed_wall * 20 / 24)
|
||||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 36 / 50)
|
speed_wall = =math.ceil(speed_print * 36 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_print * 26 / 50)
|
speed_wall_0 = =math.ceil(speed_print * 26 / 50)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,10 @@ raft_airgap = 0.25
|
||||||
retraction_prime_speed = =retraction_speed
|
retraction_prime_speed = =retraction_speed
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_wall = 50
|
speed_wall = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -35,6 +35,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -36,6 +36,10 @@ speed_topbottom = =math.ceil(speed_print * 0.8)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -22,8 +22,9 @@ speed_topbottom = =speed_print
|
||||||
speed_wall = =speed_print
|
speed_wall = =speed_print
|
||||||
speed_wall_0 = =speed_wall
|
speed_wall_0 = =speed_wall
|
||||||
speed_wall_x = =speed_wall
|
speed_wall_x = =speed_wall
|
||||||
support_bottom_distance = =support_z_distance / 2
|
support_bottom_distance = =support_z_distance
|
||||||
support_top_distance = =support_z_distance / 2
|
support_interface_enable = True
|
||||||
support_z_distance = =layer_height * 2
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,9 @@ speed_topbottom = =speed_print
|
||||||
speed_wall = =speed_print
|
speed_wall = =speed_print
|
||||||
speed_wall_0 = =speed_wall
|
speed_wall_0 = =speed_wall
|
||||||
speed_wall_x = =speed_wall
|
speed_wall_x = =speed_wall
|
||||||
support_bottom_distance = =support_z_distance / 2
|
support_bottom_distance = =support_z_distance
|
||||||
support_top_distance = =support_z_distance / 2
|
support_interface_enable = True
|
||||||
support_z_distance = =layer_height * 2
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,9 @@ speed_topbottom = =speed_print
|
||||||
speed_wall = =speed_print
|
speed_wall = =speed_print
|
||||||
speed_wall_0 = =speed_wall
|
speed_wall_0 = =speed_wall
|
||||||
speed_wall_x = =speed_wall
|
speed_wall_x = =speed_wall
|
||||||
support_bottom_distance = =support_z_distance / 2
|
support_bottom_distance = =support_z_distance
|
||||||
support_top_distance = =support_z_distance / 2
|
support_interface_enable = True
|
||||||
support_z_distance = =layer_height * 2
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,9 @@ speed_topbottom = =speed_print
|
||||||
speed_wall = =speed_print
|
speed_wall = =speed_print
|
||||||
speed_wall_0 = =speed_wall
|
speed_wall_0 = =speed_wall
|
||||||
speed_wall_x = =speed_wall
|
speed_wall_x = =speed_wall
|
||||||
support_bottom_distance = =support_z_distance / 2
|
support_bottom_distance = =support_z_distance
|
||||||
support_top_distance = =support_z_distance / 2
|
support_interface_enable = True
|
||||||
support_z_distance = =layer_height * 2
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,9 @@ speed_topbottom = =speed_print
|
||||||
speed_wall = =speed_print
|
speed_wall = =speed_print
|
||||||
speed_wall_0 = =speed_wall
|
speed_wall_0 = =speed_wall
|
||||||
speed_wall_x = =speed_wall
|
speed_wall_x = =speed_wall
|
||||||
support_bottom_distance = =support_z_distance / 2
|
support_bottom_distance = =support_z_distance
|
||||||
support_top_distance = =support_z_distance / 2
|
support_interface_enable = True
|
||||||
support_z_distance = =layer_height * 2
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 1.2
|
top_bottom_thickness = 1.2
|
||||||
|
|
||||||
|
|
|
@ -13,4 +13,8 @@ weight = 0
|
||||||
|
|
||||||
[values]
|
[values]
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -14,5 +14,9 @@ weight = 0
|
||||||
[values]
|
[values]
|
||||||
speed_infill = =math.ceil(speed_print * 40 / 55)
|
speed_infill = =math.ceil(speed_print * 40 / 55)
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,15 @@ weight = 0
|
||||||
machine_nozzle_cool_down_speed = 0.9
|
machine_nozzle_cool_down_speed = 0.9
|
||||||
machine_nozzle_heat_up_speed = 1.4
|
machine_nozzle_heat_up_speed = 1.4
|
||||||
ooze_shield_angle = 40
|
ooze_shield_angle = 40
|
||||||
raft_airgap = 0.15
|
raft_airgap = 0.4
|
||||||
retraction_min_travel = 5
|
retraction_min_travel = 5
|
||||||
speed_print = 70
|
speed_print = 70
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 70)
|
speed_topbottom = =math.ceil(speed_print * 30 / 70)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 70)
|
speed_wall = =math.ceil(speed_print * 30 / 70)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 30
|
switch_extruder_prime_speed = 30
|
||||||
switch_extruder_retraction_amount = 30
|
switch_extruder_retraction_amount = 30
|
||||||
switch_extruder_retraction_speeds = 40
|
switch_extruder_retraction_speeds = 40
|
||||||
|
|
|
@ -29,7 +29,11 @@ speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
speed_topbottom = =math.ceil(speed_print * 25 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 50)
|
speed_wall = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
support_interface_density = 87.5
|
support_interface_density = 87.5
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -15,5 +15,9 @@ weight = 0
|
||||||
material_print_temperature = =default_material_print_temperature - 5
|
material_print_temperature = =default_material_print_temperature - 5
|
||||||
speed_infill = =math.ceil(speed_print * 40 / 55)
|
speed_infill = =math.ceil(speed_print * 40 / 55)
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.8
|
top_bottom_thickness = 0.8
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,10 @@ retraction_hop = 0.2
|
||||||
speed_print = 30
|
speed_print = 30
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 30)
|
speed_wall = =math.ceil(speed_print * 25 / 30)
|
||||||
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.72
|
top_bottom_thickness = 0.72
|
||||||
travel_avoid_distance = 0.4
|
travel_avoid_distance = 0.4
|
||||||
wall_0_inset = 0.015
|
wall_0_inset = 0.015
|
||||||
|
|
|
@ -34,6 +34,10 @@ speed_print = 25
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 25)
|
speed_wall = =math.ceil(speed_print * 25 / 25)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
speed_wall_0 = =math.ceil(speed_wall * 25 / 25)
|
||||||
support_angle = 50
|
support_angle = 50
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
switch_extruder_prime_speed = 15
|
switch_extruder_prime_speed = 15
|
||||||
switch_extruder_retraction_amount = 20
|
switch_extruder_retraction_amount = 20
|
||||||
switch_extruder_retraction_speeds = 35
|
switch_extruder_retraction_speeds = 35
|
||||||
|
|
|
@ -21,6 +21,10 @@ speed_print = 30
|
||||||
speed_topbottom = =math.ceil(speed_print * 20 / 30)
|
speed_topbottom = =math.ceil(speed_print * 20 / 30)
|
||||||
speed_wall = =math.ceil(speed_print * 25 / 30)
|
speed_wall = =math.ceil(speed_print * 25 / 30)
|
||||||
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
speed_wall_0 = =math.ceil(speed_print * 20 / 30)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
top_bottom_thickness = 0.72
|
top_bottom_thickness = 0.72
|
||||||
wall_0_inset = 0.015
|
wall_0_inset = 0.015
|
||||||
wall_0_wipe_dist = 0.25
|
wall_0_wipe_dist = 0.25
|
||||||
|
|
|
@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 50)
|
||||||
speed_print = 50
|
speed_print = 50
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
speed_topbottom = =math.ceil(speed_print * 30 / 50)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 50)
|
speed_wall = =math.ceil(speed_print * 30 / 50)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -23,4 +23,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
speed_topbottom = =math.ceil(speed_print * 30 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 40 / 60)
|
speed_wall = =math.ceil(speed_print * 40 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -22,4 +22,8 @@ speed_infill = =math.ceil(speed_print * 40 / 55)
|
||||||
speed_print = 55
|
speed_print = 55
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
speed_topbottom = =math.ceil(speed_print * 30 / 55)
|
||||||
speed_wall = =math.ceil(speed_print * 30 / 55)
|
speed_wall = =math.ceil(speed_print * 30 / 55)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -23,4 +23,8 @@ speed_print = 60
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
speed_topbottom = =math.ceil(speed_print * 35 / 60)
|
||||||
speed_wall = =math.ceil(speed_print * 45 / 60)
|
speed_wall = =math.ceil(speed_print * 45 / 60)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.3/layer_height)*layer_height
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ speed_print = 40
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
||||||
speed_wall = =math.ceil(speed_print * 35 / 40)
|
speed_wall = =math.ceil(speed_print * 35 / 40)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
||||||
support_z_distance = =layer_height
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.4/layer_height)*layer_height
|
||||||
wall_0_inset = 0
|
wall_0_inset = 0
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,9 @@ speed_print = 45
|
||||||
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
speed_topbottom = =math.ceil(speed_print * 35 / 45)
|
||||||
speed_wall = =math.ceil(speed_print * 45 / 45)
|
speed_wall = =math.ceil(speed_print * 45 / 45)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
speed_wall_0 = =math.ceil(speed_wall * 35 / 45)
|
||||||
support_z_distance = =layer_height
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.4/layer_height)*layer_height
|
||||||
wall_0_inset = 0
|
wall_0_inset = 0
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@ speed_print = 40
|
||||||
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
speed_topbottom = =math.ceil(speed_print * 30 / 35)
|
||||||
speed_wall = =math.ceil(speed_print * 35 / 40)
|
speed_wall = =math.ceil(speed_print * 35 / 40)
|
||||||
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
speed_wall_0 = =math.ceil(speed_wall * 30 / 35)
|
||||||
support_z_distance = =layer_height
|
support_bottom_distance = =support_z_distance
|
||||||
|
support_interface_enable = True
|
||||||
|
support_top_distance = =support_z_distance
|
||||||
|
support_z_distance = =math.ceil(0.4/layer_height)*layer_height
|
||||||
wall_0_inset = 0
|
wall_0_inset = 0
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue