diff --git a/.github/ISSUE_TEMPLATE/SlicingCrash.yaml b/.github/ISSUE_TEMPLATE/SlicingCrash.yaml
index c684b2cf63..2fe0a2f63b 100644
--- a/.github/ISSUE_TEMPLATE/SlicingCrash.yaml
+++ b/.github/ISSUE_TEMPLATE/SlicingCrash.yaml
@@ -23,14 +23,14 @@ body:
- type: input
attributes:
label: Cura Version
- placeholder: 5.3.1
+ placeholder: 5.6.0
validations:
required: true
- type: markdown
attributes:
value: |
- We work hard on improving our slicing crashes. Our most recent release is 5.3.1.
- If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/tag/5.3.1)
+ We work hard on improving our slicing crashes. Our most recent release is 5.6.0.
+ If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
- type: input
attributes:
label: Operating System
diff --git a/.github/workflows/conan-package-create.yml b/.github/workflows/conan-package-create.yml
index 220c8feef3..56c96f483f 100644
--- a/.github/workflows/conan-package-create.yml
+++ b/.github/workflows/conan-package-create.yml
@@ -139,26 +139,18 @@ jobs:
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
- name: Add Cura private Artifactory remote
- run: |
- conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True
- conan remote add cura-private-conan-dev https://cura.jfrog.io/artifactory/api/conan/cura-private-conan-dev True
+ run: conan remote add cura-private-conan-dev https://cura.jfrog.io/artifactory/api/conan/cura-private-conan-dev True
- name: Set GH service account for remote cura-conan-dev
- run: |
- conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
- conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-private-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
+ run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-private-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
- name: Create the Packages
run: conan install ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True
- name: Upload the Package(s)
if: ${{ always() && inputs.conan_upload_community }}
- run: |
- conan upload ${{ inputs.recipe_id_full }} -r cura --all -c
- conan upload ${{ inputs.recipe_id_full }} -r cura-conan-dev --all -c
+ run: conan upload ${{ inputs.recipe_id_full }} -r cura --all -c
- name: Upload the Package(s) to the private Artifactory
if: ${{ always() && ! inputs.conan_upload_community }}
- run: |
- conan upload ${{ inputs.recipe_id_full }} -r cura-private --all -c
- conan upload ${{ inputs.recipe_id_full }} -r cura-private-conan-dev --all -c
+ run: conan upload ${{ inputs.recipe_id_full }} -r cura-private-conan-dev --all -c
diff --git a/.github/workflows/conan-package.yml b/.github/workflows/conan-package.yml
index c561e85a94..47000752dd 100644
--- a/.github/workflows/conan-package.yml
+++ b/.github/workflows/conan-package.yml
@@ -41,12 +41,12 @@ on:
branches:
- main
- 'CURA-*'
- - '[1-9].[0-9]'
- - '[1-9].[0-9][0-9]'
+ - '[0-9].[0-9]'
+ - '[0-9].[0-9][0-9]'
tags:
- - '[1-9].[0-9].[0-9]*'
- - '[1-9].[0-9].[0-9]'
- - '[1-9].[0-9][0-9].[0-9]*'
+ - '[0-9].[0-9].[0-9]*'
+ - '[0-9].[0-9].[0-9]'
+ - '[0-9].[0-9][0-9].[0-9]*'
env:
CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }}
@@ -102,7 +102,7 @@ jobs:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
sudo apt update
sudo apt upgrade
- sudo apt install efibootmgr build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison g++-12 gcc-12 -y
+ sudo apt install efibootmgr build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison libxcb-cursor-dev g++-12 gcc-12 -y
- name: Install GCC-13
run: |
@@ -118,9 +118,6 @@ jobs:
conan config install https://github.com/Ultimaker/conan-config.git
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
- - name: Set GH service account for remote cura-conan-dev
- run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
-
- name: Create the Packages
run: conan create . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o ${{ needs.conan-recipe-version.outputs.project_name }}:devtools=True -o ${{ needs.conan-recipe-version.outputs.project_name }}:enable_i18n=True -c tools.build:skip_test=True
@@ -132,9 +129,7 @@ jobs:
if: always()
run: |
conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_full }} -r cura --all -c
- conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_full }} -r cura-conan-dev --all -c
conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_latest }} -r cura -c
- conan upload ${{ needs.conan-recipe-version.outputs.recipe_id_latest }} -r cura-conan-dev -c
notify-create:
if: ${{ always() && (github.event_name == 'push' && (github.ref_name == 'main' || github.ref_name == 'master' || needs.conan-recipe-version.outputs.is_release_branch == 'true')) }}
diff --git a/.github/workflows/conan-recipe-export.yml b/.github/workflows/conan-recipe-export.yml
index 9036fe9a21..69c4e4d34a 100644
--- a/.github/workflows/conan-recipe-export.yml
+++ b/.github/workflows/conan-recipe-export.yml
@@ -80,14 +80,10 @@ jobs:
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
- name: Add Cura private Artifactory remote
- run: |
- conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True
- conan remote add cura-private-conan-dev https://cura.jfrog.io/artifactory/api/conan/cura-private-conan-dev True
+ run: conan remote add cura-private-conan-dev https://cura.jfrog.io/artifactory/api/conan/cura-private-conan-dev True
- name: Set GH service account for remote cura-conan-dev
- run: |
- conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
- conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-private-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
+ run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-private-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
- name: Export the Package (binaries)
if: ${{ inputs.conan_export_binaries }}
@@ -105,14 +101,10 @@ jobs:
if: ${{ always() && inputs.conan_upload_community }}
run: |
conan upload ${{ inputs.recipe_id_full }} -r cura --all -c
- conan upload ${{ inputs.recipe_id_full }} -r cura-conan-dev --all -c
conan upload ${{ inputs.recipe_id_latest }} -r cura -c
- conan upload ${{ inputs.recipe_id_latest }} -r cura-conan-dev -c
- name: Upload the Package(s) to the private Artifactory
if: ${{ always() && ! inputs.conan_upload_community }}
run: |
- conan upload ${{ inputs.recipe_id_full }} -r cura-private --all -c
conan upload ${{ inputs.recipe_id_full }} -r cura-private-conan-dev --all -c
- conan upload ${{ inputs.recipe_id_latest }} -r cura-private -c
conan upload ${{ inputs.recipe_id_latest }} -r cura-private-conan-dev -c
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 52dc5e73d3..d8cd580190 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -111,7 +111,7 @@ jobs:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
sudo apt update
sudo apt upgrade
- sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config binutils coreutils desktop-file-utils fakeroot fuse libgdk-pixbuf2.0-dev patchelf squashfs-tools strace util-linux zsync -y
+ sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config binutils coreutils desktop-file-utils fakeroot fuse libgdk-pixbuf2.0-dev patchelf squashfs-tools strace util-linux zsync libxcb-cursor-dev -y
# Get the AppImage tool
wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool
@@ -143,9 +143,6 @@ jobs:
conan config install https://github.com/Ultimaker/conan-config.git
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
- - name: Set GH service account for remote cura-conan-dev
- run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
-
- name: Use Conan download cache (Bash)
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index 9e6dbf8541..2c7186a764 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -145,16 +145,13 @@ jobs:
p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }}
- name: Remove private Artifactory
- run: conan remote remove cura-conan-private || true
+ run: conan remote remove cura-private-conan-dev || true
- name: Get Conan configuration
run: |
conan config install https://github.com/Ultimaker/conan-config.git
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
- - name: Set GH service account for remote cura-conan-dev
- run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
-
- name: Use Conan download cache (Bash)
run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache"
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index eb0e47b2bf..6944969313 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -118,9 +118,6 @@ jobs:
conan config install https://github.com/Ultimaker/conan-config.git
conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}"
- - name: Set GH service account for remote cura-conan-dev
- run: conan user -p ${{ secrets.CONAN_GH_RUNNER_PASS }} -r cura-conan-dev "${{ secrets.CONAN_GH_RUNNER_USER }}"
-
- name: Use Conan download cache (Powershell)
run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache"
@@ -143,13 +140,13 @@ jobs:
.\cura_inst\Scripts\activate_github_actions_env.ps1
.\cura_inst\Scripts\activate_github_actions_version_env.ps1
- - name: Install OpenSSL shared
- run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy
-
- - name: Copy OpenSSL shared (Powershell)
- run: |
- cp openssl/bin/*.dll ./cura_inst/Scripts/
- cp openssl/lib/*.lib ./cura_inst/Lib/
+# - name: Install OpenSSL shared
+# run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy
+#
+# - name: Copy OpenSSL shared (Powershell)
+# run: |
+# cp openssl/bin/*.dll ./cura_inst/Scripts/
+# cp openssl/lib/*.lib ./cura_inst/Lib/
- name: Create the Cura dist
run: pyinstaller ./cura_inst/UltiMaker-Cura.spec
diff --git a/README.md b/README.md
index 26b9ef06f9..7d1b575e69 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
[![Badge Test]][Test]
[![Badge Conan]][Conan]
-![Badge Downloads]
+[![Badge Downloads]][Downloads]
@@ -67,6 +67,7 @@
[Issues]: https://github.com/Ultimaker/Cura/issues
[Conan]: https://github.com/Ultimaker/Cura/actions/workflows/conan-package.yml
[Test]: https://github.com/Ultimaker/Cura/actions/workflows/unit-test.yml
+[Downloads]: https://github.com/Ultimaker/Cura/releases/latest
[License]: LICENSE
[Report]: docs/Report.md
@@ -81,8 +82,8 @@
[Badge License]: https://img.shields.io/badge/License-LGPL3-336887.svg?style=for-the-badge&labelColor=458cb5&logoColor=white&logo=GNU
[Badge Closed]: https://img.shields.io/github/issues-closed/ultimaker/cura?style=for-the-badge&logoColor=white&labelColor=629944&color=446a30&logo=AddThis
[Badge Issues]: https://img.shields.io/github/issues/ultimaker/cura?style=for-the-badge&logoColor=white&labelColor=c34360&color=933349&logo=AdBlock
-[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 Conan]: https://img.shields.io/github/actions/workflow/status/Ultimaker/Cura/conan-package.yml?branch=main&style=for-the-badge&logoColor=white&labelColor=6185aa&color=4c6987&logo=Conan&label=Conan%20Package
+[Badge Test]: https://img.shields.io/github/actions/workflow/status/Ultimaker/Cura/unit-test.yml?branch=main&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 Downloads]: https://img.shields.io/github/downloads-pre/Ultimaker/Cura/latest/total?style=for-the-badge
diff --git a/conanfile.py b/conanfile.py
index a9ac2c18cb..48cba847be 100644
--- a/conanfile.py
+++ b/conanfile.py
@@ -322,7 +322,7 @@ class CuraConan(ConanFile):
self.requires("curaengine_grpc_definitions/0.1.0")
self.requires("zlib/1.2.13")
self.requires("pyarcus/5.3.0")
- self.requires("dulcificum/(latest)@ultimaker/stable")
+ self.requires("dulcificum/0.1.0-beta.1")
self.requires("curaengine/(latest)@ultimaker/testing")
self.requires("pysavitar/5.3.0")
self.requires("pynest2d/5.3.0")
@@ -338,7 +338,7 @@ class CuraConan(ConanFile):
def build_requirements(self):
if self.options.get_safe("enable_i18n", False):
- self.tool_requires("gettext/0.21@ultimaker/testing", force_host_context = True)
+ self.tool_requires("gettext/0.21", force_host_context = True)
def layout(self):
self.folders.source = "."
diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py
index e501b33896..742d1872cb 100755
--- a/cura/BuildVolume.py
+++ b/cura/BuildVolume.py
@@ -120,6 +120,8 @@ class BuildVolume(SceneNode):
# Objects loaded at the moment. We are connected to the property changed events of these objects.
self._scene_objects = set() # type: Set[SceneNode]
+ # Number of toplevel printable meshes. If there is more than one, the build volume needs to take account of the gantry height in One at a Time printing.
+ self._root_printable_object_count = 0
self._scene_change_timer = QTimer()
self._scene_change_timer.setInterval(200)
@@ -151,6 +153,7 @@ class BuildVolume(SceneNode):
def _onSceneChangeTimerFinished(self):
root = self._application.getController().getScene().getRoot()
new_scene_objects = set(node for node in BreadthFirstIterator(root) if node.callDecoration("isSliceable"))
+
if new_scene_objects != self._scene_objects:
for node in new_scene_objects - self._scene_objects: #Nodes that were added to the scene.
self._updateNodeListeners(node)
@@ -166,6 +169,26 @@ class BuildVolume(SceneNode):
self.rebuild()
self._scene_objects = new_scene_objects
+
+ # This also needs to be called when objects are grouped/ungrouped,
+ # which is not reflected in a change in self._scene_objects
+ self._updateRootPrintableObjectCount()
+
+ def _updateRootPrintableObjectCount(self):
+ # Get the number of models in the scene root, excluding modifier meshes and counting grouped models as 1
+ root = self._application.getController().getScene().getRoot()
+ scene_objects = set(node for node in BreadthFirstIterator(root) if node.callDecoration("isSliceable") or node.callDecoration("isGroup"))
+
+ new_root_printable_object_count = len(list(node for node in scene_objects if node.getParent() == root and not (
+ node_stack := node.callDecoration("getStack") and (
+ node.callDecoration("getStack").getProperty("anti_overhang_mesh", "value") or
+ node.callDecoration("getStack").getProperty("support_mesh", "value") or
+ node.callDecoration("getStack").getProperty("cutting_mesh", "value") or
+ node.callDecoration("getStack").getProperty("infill_mesh", "value")
+ ))
+ ))
+ if new_root_printable_object_count != self._root_printable_object_count:
+ self._root_printable_object_count = new_root_printable_object_count
self._onSettingPropertyChanged("print_sequence", "value") # Create fake event, so right settings are triggered.
def _updateNodeListeners(self, node: SceneNode):
@@ -650,7 +673,7 @@ class BuildVolume(SceneNode):
self._width = self._global_container_stack.getProperty("machine_width", "value")
machine_height = self._global_container_stack.getProperty("machine_height", "value")
- if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1:
+ if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and self._root_printable_object_count > 1:
new_height = min(self._global_container_stack.getProperty("gantry_height", "value") * self._scale_vector.z, machine_height)
if self._height > new_height:
@@ -692,9 +715,12 @@ class BuildVolume(SceneNode):
update_extra_z_clearance = True
for setting_key in self._changed_settings_since_last_rebuild:
+ if setting_key in ["print_sequence", "support_mesh", "infill_mesh", "cutting_mesh", "anti_overhang_mesh"]:
+ self._updateRootPrintableObjectCount()
+
if setting_key == "print_sequence":
machine_height = self._global_container_stack.getProperty("machine_height", "value")
- if self._application.getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1:
+ if self._application.getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and self._root_printable_object_count > 1:
new_height = min(
self._global_container_stack.getProperty("gantry_height", "value") * self._scale_vector.z,
machine_height)
diff --git a/cura/Settings/DatabaseHandlers/VariantDatabaseHandler.py b/cura/Settings/DatabaseHandlers/VariantDatabaseHandler.py
index 4b1deae356..b0293c5904 100644
--- a/cura/Settings/DatabaseHandlers/VariantDatabaseHandler.py
+++ b/cura/Settings/DatabaseHandlers/VariantDatabaseHandler.py
@@ -10,13 +10,16 @@ class VariantDatabaseHandler(DatabaseMetadataContainerController):
"""The Database handler for Variant containers"""
def __init__(self):
- super().__init__(SQLQueryFactory(table = "variant",
- fields = {
- "id": "text",
- "name": "text",
- "hardware_type": "text",
- "definition": "text",
- "version": "text",
- "setting_version": "text"
- }))
+ super().__init__(SQLQueryFactory(
+ table="variant",
+ fields={
+ "id": "text",
+ "name": "text",
+ "hardware_type": "text",
+ "definition": "text",
+ "version": "text",
+ "setting_version": "text",
+ "reference_extruder_id": "text",
+ },
+ ))
self._container_type = InstanceContainer
diff --git a/plugins/MakerbotWriter/MakerbotWriter.py b/plugins/MakerbotWriter/MakerbotWriter.py
index 9021a3345f..1087ef0b16 100644
--- a/plugins/MakerbotWriter/MakerbotWriter.py
+++ b/plugins/MakerbotWriter/MakerbotWriter.py
@@ -50,60 +50,6 @@ class MakerbotWriter(MeshWriter):
{"prefix": "thumbnail", "width": 90, "height": 90},
]
_META_VERSION = "3.0.0"
- _PRINT_NAME_MAP = {
- "UltiMaker Method": "fire_e",
- "UltiMaker Method X": "lava_f",
- "UltiMaker Method XL": "magma_10",
- }
- _EXTRUDER_NAME_MAP = {
- "1XA": "mk14_hot",
- "2XA": "mk14_hot_s",
- "1C": "mk14_c",
- "1A": "mk14",
- "2A": "mk14_s",
- "LABS": "mk14_e",
- }
- _MATERIAL_MAP = {"2780b345-577b-4a24-a2c5-12e6aad3e690": "abs",
- "88c8919c-6a09-471a-b7b6-e801263d862d": "abs-wss1",
- "416eead4-0d8e-4f0b-8bfc-a91a519befa5": "asa",
- "85bbae0e-938d-46fb-989f-c9b3689dc4f0": "nylon-cf",
- "283d439a-3490-4481-920c-c51d8cdecf9c": "nylon",
- "62414577-94d1-490d-b1e4-7ef3ec40db02": "pc",
- "69386c85-5b6c-421a-bec5-aeb1fb33f060": "petg",
- "0ff92885-617b-4144-a03c-9989872454bc": "pla",
- "a4255da2-cb2a-4042-be49-4a83957a2f9a": "pva",
- "a140ef8f-4f26-4e73-abe0-cfc29d6d1024": "wss1",
- "77873465-83a9-4283-bc44-4e542b8eb3eb": "sr30",
- "96fca5d9-0371-4516-9e96-8e8182677f3c": "im-pla",
- "9f52c514-bb53-46a6-8c0c-d507cd6ee742": "abs",
- "0f9a2a91-f9d6-4b6b-bd9b-a120a29391be": "abs",
- "d3e972f2-68c0-4d2f-8cfd-91028dfc3381": "abs",
- "495a0ce5-9daf-4a16-b7b2-06856d82394d": "abs-cf10",
- "cb76bd6e-91fd-480c-a191-12301712ec77": "abs-wss1",
- "a017777e-3f37-4d89-a96c-dc71219aac77": "abs-wss1",
- "4d96000d-66de-4d54-a580-91827dcfd28f": "abs-wss1",
- "0ecb0e1a-6a66-49fb-b9ea-61a8924e0cf5": "asa",
- "efebc2ea-2381-4937-926f-e824524524a5": "asa",
- "b0199512-5714-4951-af85-be19693430f8": "asa",
- "b9f55a0a-a2b6-4b8d-8d48-07802c575bd1": "pla",
- "c439d884-9cdc-4296-a12c-1bacae01003f": "pla",
- "16a723e3-44df-49f4-82ec-2a1173c1e7d9": "pla",
- "74d0f5c2-fdfd-4c56-baf1-ff5fa92d177e": "pla",
- "64dcb783-470d-4400-91b1-7001652f20da": "pla",
- "3a1b479b-899c-46eb-a2ea-67050d1a4937": "pla",
- "4708ac49-5dde-4cc2-8c0a-87425a92c2b3": "pla",
- "4b560eda-1719-407f-b085-1c2c1fc8ffc1": "pla",
- "e10a287d-0067-4a58-9083-b7054f479991": "im-pla",
- "01a6b5b0-fab1-420c-a5d9-31713cbeb404": "im-pla",
- "f65df4ad-a027-4a48-a51d-975cc8b87041": "im-pla",
- "f48739f8-6d96-4a3d-9a2e-8505a47e2e35": "im-pla",
- "5c7d7672-e885-4452-9a78-8ba90ec79937": "petg",
- "91e05a6e-2f5b-4964-b973-d83b5afe6db4": "petg",
- "bdc7dd03-bf38-48ee-aeca-c3e11cee799e": "petg",
- "54f66c89-998d-4070-aa60-1cb0fd887518": "nylon",
- "002c84b3-84ac-4b5a-b57d-fe1f555a6351": "pva",
- "e4da5fcb-f62d-48a2-aaef-0b645aa6973b": "wss1",
- "77f06146-6569-437d-8380-9edb0d635a32": "sr30"}
# must be called from the main thread because of OpenGL
@staticmethod
@@ -198,7 +144,7 @@ class MakerbotWriter(MeshWriter):
meta = dict()
- meta["bot_type"] = MakerbotWriter._PRINT_NAME_MAP.get((name := global_stack.definition.name), name)
+ meta["bot_type"] = global_stack.definition.getMetaDataEntry("reference_machine_id")
bounds: Optional[AxisAlignedBox] = None
for node in nodes:
@@ -240,12 +186,7 @@ class MakerbotWriter(MeshWriter):
meta["uuid"] = print_information.slice_uuid
- materials = []
- for extruder in extruders:
- guid = extruder.material.getMetaData().get("GUID")
- material_name = extruder.material.getMetaData().get("material")
- material = self._MATERIAL_MAP.get(guid, material_name)
- materials.append(material)
+ materials = [extruder.material.getMetaData().get("reference_material_id") for extruder in extruders]
meta["material"] = materials[0]
meta["materials"] = materials
@@ -257,8 +198,7 @@ class MakerbotWriter(MeshWriter):
meta["model_counts"] = [{"count": 1, "name": node.getName()} for node in nodes]
- tool_types = [MakerbotWriter._EXTRUDER_NAME_MAP.get((name := extruder.variant.getName()), name) for extruder in
- extruders]
+ tool_types = [extruder.variant.getMetaDataEntry("reference_extruder_id") for extruder in extruders]
meta["tool_type"] = tool_types[0]
meta["tool_types"] = tool_types
diff --git a/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py
index bfd88534f8..784a18b2e5 100644
--- a/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py
+++ b/plugins/PostProcessingPlugin/scripts/DisplayInfoOnLCD.py
@@ -24,7 +24,8 @@
# - Example line on LCD: 1/479 | ET 2h13m
# - Time to Pauses changes the M117/M118 lines to countdown to the next pause as 1/479 | TP 2h36m
# - 'Add M118 Line' is available with either option. M118 will bounce the message back to a remote print server through the USB connection.
-# - Enable 'Finish-Time' Message - when enabled, takes the Print Time, adds 15 minutes for print start-up, and calculates when the print will end. It takes into account the Time Fudge Factor. The user may enter a print start time. This is also available for Display Filename.
+# - 'Add M73 Line' is used by 'Display Progress' only. There are options to incluse M73 P(percent) and M73 R(time remaining)
+# - Enable 'Finish-Time' Message - when enabled, takes the Print Time and calculates when the print will end. It takes into account the Time Fudge Factor. The user may enter a print start time. This is also available for Display Filename.
from ..Script import Script
from UM.Application import Application
@@ -34,6 +35,7 @@ import configparser
from UM.Preferences import Preferences
import time
import datetime
+import math
from UM.Message import Message
class DisplayInfoOnLCD(Script):
@@ -118,14 +120,38 @@ class DisplayInfoOnLCD(Script):
"add_m118_line":
{
"label": "Add M118 Line",
- "description": "Adds M118 in addition to the M117. It will bounce the message back through the USB port to a computer print server (if a printer server is enabled).",
+ "description": "Adds M118 in addition to the M117. It will bounce the message back through the USB port to a computer print server (if a printer server like Octoprint or Pronterface is in use).",
"type": "bool",
"default_value": false
},
+ "add_m73_line":
+ {
+ "label": "Add M73 Line(s)",
+ "description": "Adds M73 in addition to the M117. For some firmware this will set the printers time and or percentage.",
+ "type": "bool",
+ "default_value": false,
+ "enabled": "display_option == 'display_progress'"
+ },
+ "add_m73_percent":
+ {
+ "label": " Add M73 Percentage",
+ "description": "Adds M73 with the P parameter. For some firmware this will set the printers 'percentage' of layers completed and it will count upward.",
+ "type": "bool",
+ "default_value": false,
+ "enabled": "add_m73_line and display_option == 'display_progress'"
+ },
+ "add_m73_time":
+ {
+ "label": " Add M73 Time",
+ "description": "Adds M73 with the R parameter. For some firmware this will set the printers 'print time' and it will count downward.",
+ "type": "bool",
+ "default_value": false,
+ "enabled": "add_m73_line and display_option == 'display_progress'"
+ },
"speed_factor":
{
"label": "Time Fudge Factor %",
- "description": "When using 'Display Progress' tweak this value to get better estimates. ([Actual Print Time]/[Cura Estimate]) x 100 = Time Fudge Factor. If Cura estimated 9hr and the print actually took 10hr30min then enter 117 here to adjust any estimate closer to reality. This Fudge Factor is also used to calculate the time that the print will end if you were to start it 15 minutes after slicing.",
+ "description": "When using 'Display Progress' tweak this value to get better estimates. ([Actual Print Time]/[Cura Estimate]) x 100 = Time Fudge Factor. If Cura estimated 9hr and the print actually took 10hr30min then enter 117 here to adjust any estimate closer to reality. This Fudge Factor is also used to calculate the print finish time.",
"type": "float",
"unit": "%",
"default_value": 100,
@@ -134,7 +160,7 @@ class DisplayInfoOnLCD(Script):
"countdown_to_pause":
{
"label": "Countdown to Pauses",
- "description": "When enabled - DisplayInfoOnLCD must run AFTER all PauseAtHeight and Filament Change scripts. Instead of layer number and remaining print time the LCD will show 'layers remaining before pause/filament change and the time to pause/filament change' (TP).",
+ "description": "Instead of the remaining print time the LCD will show the estimated time to pause (TP).",
"type": "bool",
"default_value": false,
"enabled": "display_option == 'display_progress'"
@@ -142,7 +168,7 @@ class DisplayInfoOnLCD(Script):
"enable_end_message":
{
"label": "Enable 'Finish-Time' Message",
- "description": "Get a message when you save a fresh slice. It will show the estimated date and time that the print would finish (with a 15 minute lag from the end of slicing to the start of the print).",
+ "description": "Get a message when you save a fresh slice. It will show the estimated date and time that the print would finish.",
"type": "bool",
"default_value": true,
"enabled": true
@@ -150,7 +176,7 @@ class DisplayInfoOnLCD(Script):
"print_start_time":
{
"label": "Print Start Time (Ex 16:45)",
- "description": "Use 'Military' time. 16:45 would be 4:45PM. 09:30 would be 9:30AM. If you leave this blank it will be assumed that the print start will 15 minutes after slicing.",
+ "description": "Use 'Military' time. 16:45 would be 4:45PM. 09:30 would be 9:30AM. If you leave this blank it will be assumed that the print will start Now. If you enter a guesstimate of your printer start time and that time is before 'Now' the guesstimate will consider that the print will start tomorrow at the entered time. ",
"type": "str",
"default_value": "",
"unit": "hrs ",
@@ -163,7 +189,10 @@ class DisplayInfoOnLCD(Script):
def execute(self, data):
display_option = self.getSettingValueByKey("display_option")
add_m118_line = self.getSettingValueByKey("add_m118_line")
-
+ add_m73_line = self.getSettingValueByKey("add_m73_line")
+ add_m73_time = self.getSettingValueByKey("add_m73_time")
+ add_m73_percent = self.getSettingValueByKey("add_m73_percent")
+
# This is Display Filename and Layer on LCD---------------------------------------------------------
if display_option == "filename_layer":
max_layer = 0
@@ -217,6 +246,12 @@ class DisplayInfoOnLCD(Script):
display_total_layers = self.getSettingValueByKey("display_total_layers")
display_remaining_time = self.getSettingValueByKey("display_remaining_time")
speed_factor = self.getSettingValueByKey("speed_factor") / 100
+ m73_time = False
+ m73_percent = False
+ if add_m73_line and add_m73_time:
+ m73_time = True
+ if add_m73_line and add_m73_percent:
+ m73_percent = True
# initialize global variables
first_layer_index = 0
time_total = 0
@@ -235,27 +270,26 @@ class DisplayInfoOnLCD(Script):
mmm = round((hhh % 1) * 60)
orig_hhh = cura_time/3600
orig_hr = round(orig_hhh // 1)
- orig_min = int((cura_time - (orig_hr * 3600))/60) # Not rounded up
- orig_mmm = round((orig_hhh % 1) * 60) # Rounded up
- orig_sec = round(cura_time - orig_hr * 3600 - orig_min * 60)
+ orig_mmm = math.floor((orig_hhh % 1) * 60)
+ orig_sec = round((((orig_hhh % 1) * 60) % 1) * 60)
if add_m118_line: lines.insert(tindex + 3,"M118 Adjusted Print Time " + str(hr) + "hr " + str(mmm) + "min")
lines.insert(tindex + 3,"M117 ET " + str(hr) + "hr " + str(mmm) + "min")
- # If Countdown to pause is enabled then count the pauses and/or filament changes
+ # add M73 line at beginning
+ mins = int(60 * hr + mmm)
+ if m73_time:
+ lines.insert(tindex + 3, "M73 R{}".format(mins))
+ if m73_percent:
+ lines.insert(tindex + 3, "M73 P0")
+ # If Countdonw to pause is enabled then count the pauses
pause_str = ""
if bool(self.getSettingValueByKey("countdown_to_pause")):
pause_count = 0
- filament_change_count = 0
for num in range(2,len(data) - 1, 1):
if "PauseAtHeight.py" in data[num]:
pause_count += 1
- if "M600" in data[num]:
- filament_change_count += 1
- if pause_count > 0:
pause_str = f" with {pause_count} pause(s)"
- if filament_change_count > 0:
- pause_str += f" and {filament_change_count} filament change(s)"
# This line goes in to convert seconds to hours and minutes
- lines.insert(tindex + 3, f";Cura Time Estimate: {cura_time}sec = {orig_hr}hr {orig_min}min {orig_sec}sec {pause_str}")
+ lines.insert(tindex + 3, f";Cura Time Estimate: {cura_time}sec = {orig_hr}hr {orig_mmm}min {orig_sec}sec {pause_str}")
data[0] = "\n".join(lines)
data[len(data)-1] += "M117 Orig Cura Est " + str(orig_hr) + "hr " + str(orig_mmm) + "min\n"
if add_m118_line: data[len(data)-1] += "M118 Est w/FudgeFactor " + str(speed_factor * 100) + "% was " + str(hr) + "hr " + str(mmm) + "min\n"
@@ -322,6 +356,12 @@ class DisplayInfoOnLCD(Script):
for l_index, line in enumerate(lines):
if line.startswith(";LAYER:"):
lines[l_index] += "\nM117 " + display_text
+ # add M73 line
+ mins = int(60 * h + m)
+ if m73_time:
+ lines[l_index] += "\nM73 R{}".format(mins)
+ if m73_percent:
+ lines[l_index] += "\nM73 P" + str(round(int(current_layer) / int(number_of_layers) * 100))
if add_m118_line:
lines[l_index] += "\nM118 " + display_text
break
@@ -344,7 +384,7 @@ class DisplayInfoOnLCD(Script):
if line.startswith(";TIME_ELAPSED:"):
this_time = (float(line.split(":")[1]))*speed_factor
time_list.append(str(this_time))
- if "PauseAtHeight.py" in layer or "M600" in layer:
+ if "PauseAtHeight.py" in layer:
for qnum in range(num - 1, pause_index, -1):
time_list[qnum] = str(float(this_time) - float(time_list[qnum])) + "P"
pause_index = num-1
@@ -380,7 +420,7 @@ class DisplayInfoOnLCD(Script):
return data
def message_to_user(self, speed_factor: float):
- # Message the user of the projected finish time of the print (figuring a 15 minute delay from end-of-slice to start-of-print
+ # Message the user of the projected finish time of the print
print_time = Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601)
print_start_time = self.getSettingValueByKey("print_start_time")
# If the user entered a print start time make sure it is in the correct format or ignore it.
@@ -391,12 +431,10 @@ class DisplayInfoOnLCD(Script):
hr = int(print_start_time.split(":")[0])
min = int(print_start_time.split(":")[1])
sec = 0
- fifteen_minute_delay = 0
else:
hr = int(time.strftime("%H"))
min = int(time.strftime("%M"))
sec = int(time.strftime("%S"))
- fifteen_minute_delay = 900
#Get the current data/time info
yr = int(time.strftime("%Y"))
@@ -409,7 +447,7 @@ class DisplayInfoOnLCD(Script):
pr_min = int(print_time.split(":")[1])
pr_sec = int(print_time.split(":")[2])
#Adjust the print time if none was entered
- print_seconds = pr_hr*3600 + pr_min*60 + pr_sec + fifteen_minute_delay
+ print_seconds = pr_hr*3600 + pr_min*60 + pr_sec
#Adjust the total seconds by the Fudge Factor
adjusted_print_time = print_seconds * speed_factor
#Break down the adjusted seconds back into hh:mm:ss
@@ -435,13 +473,13 @@ class DisplayInfoOnLCD(Script):
show_hr = str(new_time.strftime("%H")) + ":"
show_ampm = " AM"
if print_start_time == "":
- start_str = "and a 15 minute lag between saving the file and starting the print."
+ start_str = "Now"
else:
start_str = "and your entered 'print start time' of " + print_start_time + "hrs."
if print_start_time != "":
print_start_str = "Print Start Time................." + str(print_start_time) + "hrs"
else:
- print_start_str = "Print Start Time.................15 minutes from now."
+ print_start_str = "Print Start Time.................Now."
estimate_str = "Cura Time Estimate.........." + str(print_time)
adjusted_str = "Adjusted Time Estimate..." + str(time_change)
finish_str = week_day + " " + str(mo_str) + " " + str(new_time.strftime("%d")) + ", " + str(new_time.strftime("%Y")) + " at " + str(show_hr) + str(new_time.strftime("%M")) + str(show_ampm)
diff --git a/resources/definitions/Geeetech_Base_Dual_Extruder.def.json b/resources/definitions/Geeetech_Base_Dual_Extruder.def.json
index c8ab3ca623..6050090e1d 100644
--- a/resources/definitions/Geeetech_Base_Dual_Extruder.def.json
+++ b/resources/definitions/Geeetech_Base_Dual_Extruder.def.json
@@ -130,8 +130,7 @@
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_interface_density": { "value": 33.333 },
"support_interface_height": { "value": "layer_height * 3" },
- "support_interface_pattern": { "value": "zigzag" },
- "support_interface_skip_height": { "value": 0.2 },
+ "support_interface_pattern": { "value": "'zigzag'" },
"support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
diff --git a/resources/definitions/Geeetech_Base_Multi_Extruder.def.json b/resources/definitions/Geeetech_Base_Multi_Extruder.def.json
index 36783200dd..db239bf424 100644
--- a/resources/definitions/Geeetech_Base_Multi_Extruder.def.json
+++ b/resources/definitions/Geeetech_Base_Multi_Extruder.def.json
@@ -131,8 +131,7 @@
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_interface_density": { "value": 33.333 },
"support_interface_height": { "value": "layer_height * 3" },
- "support_interface_pattern": { "value": "zigzag" },
- "support_interface_skip_height": { "value": 0.2 },
+ "support_interface_pattern": { "value": "'zigzag'" },
"support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
diff --git a/resources/definitions/Geeetech_Base_Single_Extruder.def.json b/resources/definitions/Geeetech_Base_Single_Extruder.def.json
index b901668859..03f9fa15cf 100644
--- a/resources/definitions/Geeetech_Base_Single_Extruder.def.json
+++ b/resources/definitions/Geeetech_Base_Single_Extruder.def.json
@@ -118,8 +118,7 @@
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_interface_density": { "value": 33.333 },
"support_interface_height": { "value": "layer_height * 3" },
- "support_interface_pattern": { "value": "zigzag" },
- "support_interface_skip_height": { "value": 0.2 },
+ "support_interface_pattern": { "value": "'zigzag'" },
"support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
diff --git a/resources/definitions/SV02.def.json b/resources/definitions/SV02.def.json
index 45b2572242..c700e3916b 100644
--- a/resources/definitions/SV02.def.json
+++ b/resources/definitions/SV02.def.json
@@ -59,7 +59,7 @@
"machine_width": { "default_value": 280 },
"material_diameter": { "default_value": 1.75 },
"material_initial_print_temperature": { "value": "material_print_temperature" },
- "prime_tower_min_volume": { "value": "((resolveOrValue('layer_height'))/2" },
+ "prime_tower_min_volume": { "value": "resolveOrValue('layer_height')/2" },
"prime_tower_size": { "value": "30" },
"prime_tower_wipe_enabled": { "default_value": true },
"retraction_amount": { "default_value": 5 },
diff --git a/resources/definitions/anycubic_kobra2.def.json b/resources/definitions/anycubic_kobra2.def.json
new file mode 100644
index 0000000000..aea6b4d344
--- /dev/null
+++ b/resources/definitions/anycubic_kobra2.def.json
@@ -0,0 +1,90 @@
+{
+ "version": 2,
+ "name": "Anycubic Kobra 2",
+ "inherits": "fdmprinter",
+ "metadata":
+ {
+ "visible": true,
+ "author": "ThatGuyZim",
+ "manufacturer": "Anycubic",
+ "file_formats": "text/x-gcode",
+ "platform": "anycubic_kobra2_platform.stl",
+ "machine_extruder_trains": { "0": "anycubic_kobra2_extruder_0" }
+ },
+ "overrides":
+ {
+ "acceleration_enabled": { "value": true },
+ "acceleration_print": { "value": 2500 },
+ "acceleration_travel": { "value": 3000 },
+ "acceleration_travel_layer_0": { "value": "acceleration_travel" },
+ "gantry_height": { "value": "0" },
+ "infill_before_walls": { "value": false },
+ "jerk_enabled": { "value": true },
+ "jerk_print": { "value": 8 },
+ "jerk_travel": { "value": 10 },
+ "jerk_travel_layer_0": { "value": "jerk_travel" },
+ "layer_height": { "default_value": 0.2 },
+ "machine_center_is_zero": { "default_value": false },
+ "machine_depth": { "default_value": 220 },
+ "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM107 ; fan off\nG91 ;relative positioning\nG1 E-2 F3000 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 F3000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 F3000 ;move X/Y to min endstops, so the head is out of the way\nG1 Y210 F3000\nM84 ;steppers off\nG90\nM300 S1318 P266" },
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "machine_heated_bed": { "default_value": true },
+ "machine_height": { "default_value": 250 },
+ "machine_max_acceleration_e": { "value": 2500 },
+ "machine_max_acceleration_x": { "value": 2500 },
+ "machine_max_acceleration_y": { "value": 2500 },
+ "machine_max_acceleration_z": { "value": 800 },
+ "machine_max_feedrate_e": { "default_value": 100 },
+ "machine_max_feedrate_x": { "default_value": 300 },
+ "machine_max_feedrate_y": { "default_value": 250 },
+ "machine_max_feedrate_z": { "default_value": 40 },
+ "machine_max_jerk_e": { "value": 10 },
+ "machine_max_jerk_xy": { "value": 10 },
+ "machine_max_jerk_z": { "value": 2 },
+ "machine_name": { "default_value": "Anycubic Kobra 2" },
+ "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ; use absolute coordinates\nM82 ; use absolute distances for extrusion\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all axes\nM300 S1318 P266\nG1 Z5 F5000 ; lift nozzle\nG1 X5 Y0 F3000\nG1 Z0.3 ; set nozzle height\nG92 E0\nG1 X50 Y0 E20 F500 ; Extrude 20mm of filament in a 5cm line \nG92 E0 ; zero the extruded length again \nG1 E-4.5 F4800 ; Retract a little \nG92 E0\nG1 X120 F4000 ; Quickly wipe away from the filament line\nM117 ; Printing\u2026\nG5" },
+ "machine_width": { "default_value": 220 },
+ "material_bed_temperature": { "maximum_value_warning": 110 },
+ "material_bed_temperature_layer_0": { "maximum_value_warning": 110 },
+ "material_diameter": { "default_value": 1.75 },
+ "material_final_print_temperature": { "value": "material_print_temperature" },
+ "material_initial_print_temperature":
+ {
+ "maximum_value_warning": 260,
+ "value": "material_print_temperature + 5"
+ },
+ "material_print_temperature": { "maximum_value_warning": 260 },
+ "material_print_temperature_layer_0":
+ {
+ "maximum_value_warning": 260,
+ "value": "material_print_temperature + 5"
+ },
+ "retraction_amount": { "value": 2 },
+ "retraction_combing": { "value": "'off'" },
+ "retraction_combing_max_distance": { "value": 30 },
+ "retraction_min_travel": { "value": 1 },
+ "retraction_prime_speed": { "maximum_value_warning": 100 },
+ "retraction_retract_speed": { "maximum_value_warning": 100 },
+ "retraction_speed":
+ {
+ "maximum_value_warning": 100,
+ "value": 80
+ },
+ "speed_print": { "value": 80 },
+ "speed_support": { "value": "speed_wall_0" },
+ "speed_support_interface": { "value": "speed_topbottom" },
+ "speed_travel":
+ {
+ "maximum_value": 200.0,
+ "maximum_value_warning": 175.0,
+ "value": 125
+ },
+ "speed_travel_layer_0": { "value": "speed_travel" },
+ "speed_wall_x": { "value": "speed_wall" },
+ "top_bottom_pattern": { "default_value": "zigzag" },
+ "travel_avoid_supports": { "value": true },
+ "travel_retract_before_outer_wall": { "value": true },
+ "wall_line_count": { "value": 3 },
+ "wall_thickness": { "value": 1.2 }
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_ender3v3se.def.json b/resources/definitions/creality_ender3v3se.def.json
index 12a861a2a9..5769e3e493 100644
--- a/resources/definitions/creality_ender3v3se.def.json
+++ b/resources/definitions/creality_ender3v3se.def.json
@@ -20,15 +20,18 @@
},
"overrides":
{
- "gantry_height": { "value": 25 },
+ "gantry_height": { "value": 38 },
"machine_depth": { "default_value": 220 },
"machine_head_with_fans_polygon":
{
"default_value": [
- [-20, 10],
- [10, 10],
- [10, -10],
- [-20, -10]
+ [-36, -18],
+ [-20, -42],
+ [6, -42],
+ [30, -18],
+ [30, 52],
+ [-3, 56],
+ [-36, 52]
]
},
"machine_heated_bed": { "default_value": true },
diff --git a/resources/definitions/flyingbear_base.def.json b/resources/definitions/flyingbear_base.def.json
index 70ae7e8f96..268d8a169b 100644
--- a/resources/definitions/flyingbear_base.def.json
+++ b/resources/definitions/flyingbear_base.def.json
@@ -41,10 +41,9 @@
"infill_line_width": { "value": "line_width + 0.1" },
"infill_overlap": { "value": 30 },
"infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" },
- "infill_sparse_density": { "value": 20 },
"infill_wipe_dist": { "value": 0.0 },
"layer_height_0": { "value": 0.2 },
- "machine_buildplate_type": { "value": "glass" },
+ "machine_buildplate_type": { "value": "'glass'" },
"machine_center_is_zero": { "default_value": false },
"machine_end_gcode": { "default_value": "G91 ;use relative coordinates\nG1 E-4 F1500 ;retract the filament\nG1 X5 Y5 Z0.2 F5000 ;wipe\nG1 Z5 F1500 ;raise z\nG90 ;use absolute coordinates\nG1 X10 Y{machine_depth} F5000 ;park print head\n\nM107 ;turn off fan\nM104 S0 ;turn off hotend\nM140 S0 ;turn off heatbed\nM84 ;disable motors" },
"machine_heated_bed": { "default_value": true },
diff --git a/resources/definitions/flyingbear_ghost_6.def.json b/resources/definitions/flyingbear_ghost_6.def.json
new file mode 100644
index 0000000000..26c067285e
--- /dev/null
+++ b/resources/definitions/flyingbear_ghost_6.def.json
@@ -0,0 +1,48 @@
+{
+ "version": 2,
+ "name": "Flying Bear Ghost 6",
+ "inherits": "flyingbear_base",
+ "metadata":
+ {
+ "visible": true,
+ "author": "barrnet",
+ "platform": "flyingbear_platform.obj",
+ "platform_texture": "flyingbear_platform.png",
+ "quality_definition": "flyingbear_base"
+ },
+ "overrides":
+ {
+ "acceleration_enabled": { "value": false },
+ "acceleration_print": { "value": 1500 },
+ "acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
+ "acceleration_travel": { "value": 3000 },
+ "acceleration_travel_layer_0": { "value": "acceleration_travel" },
+ "jerk_enabled": { "value": false },
+ "jerk_print": { "value": 20 },
+ "jerk_travel": { "value": "jerk_print" },
+ "jerk_travel_layer_0": { "value": "jerk_travel" },
+ "machine_acceleration": { "value": 1500 },
+ "machine_depth": { "default_value": 210 },
+ "machine_height": { "default_value": 210 },
+ "machine_max_acceleration_e": { "value": 80000 },
+ "machine_max_acceleration_x": { "value": 1000 },
+ "machine_max_acceleration_y": { "value": 1000 },
+ "machine_max_acceleration_z": { "value": 200 },
+ "machine_max_feedrate_e": { "value": 70 },
+ "machine_max_feedrate_x": { "value": 200 },
+ "machine_max_feedrate_y": { "value": 200 },
+ "machine_max_feedrate_z": { "value": 20 },
+ "machine_max_jerk_e": { "value": 5.0 },
+ "machine_max_jerk_xy": { "value": 15 },
+ "machine_max_jerk_z": { "value": 0.4 },
+ "machine_name": { "default_value": "Flying Bear Ghost 6" },
+ "machine_steps_per_mm_e": { "default_value": 405 },
+ "machine_steps_per_mm_x": { "default_value": 160 },
+ "machine_steps_per_mm_y": { "default_value": 160 },
+ "machine_steps_per_mm_z": { "default_value": 800 },
+ "machine_width": { "default_value": 255 },
+ "retraction_amount": { "value": 0.8 },
+ "retraction_extrusion_window": { "value": 1.5 },
+ "retraction_speed": { "default_value": 35 }
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/lotmaxx_sc10.def.json b/resources/definitions/lotmaxx_sc10.def.json
index f2ef02c664..224328c505 100644
--- a/resources/definitions/lotmaxx_sc10.def.json
+++ b/resources/definitions/lotmaxx_sc10.def.json
@@ -20,10 +20,9 @@
"cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
"cool_min_layer_time": { "value": 10 },
"gantry_height": { "value": 40 },
- "jerk_enabled": { "value": false },
"jerk_print": { "value": 8 },
"jerk_travel": { "value": "jerk_print" },
- "jerk_travel_layer_0": { "value": " jerk_travel" },
+ "jerk_travel_layer_0": { "value": "jerk_travel" },
"machine_depth": { "default_value": 235 },
"machine_end_gcode": { "default_value": "; SC-10 Custom End G-code\nG4 ; Wait\nM220 S100 ; Reset Speed factor override percentage to default (100%)\nM221 S100 ; Reset Extrude factor override percentage to default (100%)\nG91 ; Set coordinates to relative\nG1 F1800 E-3 ; Retract filament 3 mm to prevent oozing\nG1 F3000 Z20 ; Move Z Axis up 20 mm to allow filament ooze freely\nG90 ; Set coordinates to absolute\nG1 X0 Y{machine_depth} F1000 ; Move Heat Bed to the front for easy print removal\nM84 ; Disable stepper motors\n; End of custom end GCode" },
"machine_head_with_fans_polygon":
diff --git a/resources/definitions/mixware_hyper_s.def.json b/resources/definitions/mixware_hyper_s.def.json
index 9268b99808..e3d67de8e0 100644
--- a/resources/definitions/mixware_hyper_s.def.json
+++ b/resources/definitions/mixware_hyper_s.def.json
@@ -78,7 +78,7 @@
"minimum_value_warning": "0.01"
},
"retraction_amount": { "default_value": 2 },
- "retraction_combing": { "value": "off" },
+ "retraction_combing": { "value": "'off'" },
"retraction_combing_max_distance": { "default_value": 0.5 },
"retraction_count_max": { "default_value": 100 },
"retraction_extrusion_window":
diff --git a/resources/definitions/modix_v3_base.def.json b/resources/definitions/modix_v3_base.def.json
index 911d674e68..80921d3254 100644
--- a/resources/definitions/modix_v3_base.def.json
+++ b/resources/definitions/modix_v3_base.def.json
@@ -82,6 +82,6 @@
"travel_avoid_supports": { "value": true },
"travel_retract_before_outer_wall": { "value": true },
"wall_thickness": { "value": "line_width * 2" },
- "z_seam_corner": { "value": "z_seam_corner_weighted" }
+ "z_seam_corner": { "value": "'z_seam_corner_weighted'" }
}
}
\ No newline at end of file
diff --git a/resources/definitions/modix_v4_base.def.json b/resources/definitions/modix_v4_base.def.json
index 71b99c7cae..55d901db1c 100644
--- a/resources/definitions/modix_v4_base.def.json
+++ b/resources/definitions/modix_v4_base.def.json
@@ -82,6 +82,6 @@
"travel_avoid_supports": { "value": true },
"travel_retract_before_outer_wall": { "value": true },
"wall_thickness": { "value": "line_width * 2" },
- "z_seam_corner": { "value": "z_seam_corner_weighted" }
+ "z_seam_corner": { "value": "'z_seam_corner_weighted'" }
}
}
\ No newline at end of file
diff --git a/resources/definitions/multicomp_mcpi200.def.json b/resources/definitions/multicomp_mcpi200.def.json
new file mode 100644
index 0000000000..b9d0e36f29
--- /dev/null
+++ b/resources/definitions/multicomp_mcpi200.def.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "name": "Multicomp Pro MCPI-200",
+ "inherits": "goofoo_near",
+ "metadata":
+ {
+ "visible": true,
+ "author": "Woosh",
+ "manufacturer": "Multicomp Pro"
+ },
+ "overrides":
+ {
+ "machine_depth": { "default_value": 200 },
+ "machine_height": { "default_value": 200 },
+ "machine_name": { "default_value": "Multicomp Pro MCPI-200" },
+ "machine_width": { "default_value": 200 }
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/renkforce_pro10plus.def.json b/resources/definitions/renkforce_pro10plus.def.json
new file mode 100644
index 0000000000..414d59ec0b
--- /dev/null
+++ b/resources/definitions/renkforce_pro10plus.def.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "name": "Renkforce Pro 10+",
+ "inherits": "goofoo_near",
+ "metadata":
+ {
+ "visible": true,
+ "author": "Woosh (based on RF100.ini by Conrad Electronic SE)",
+ "manufacturer": "Renkforce"
+ },
+ "overrides":
+ {
+ "machine_depth": { "default_value": 360 },
+ "machine_height": { "default_value": 400 },
+ "machine_name": { "default_value": "Renkforce Pro 10+" },
+ "machine_width": { "default_value": 360 }
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/sovol_base_planetary.def.json b/resources/definitions/sovol_base_planetary.def.json
index 8deee57012..a132f105a8 100644
--- a/resources/definitions/sovol_base_planetary.def.json
+++ b/resources/definitions/sovol_base_planetary.def.json
@@ -13,8 +13,6 @@
"machine_acceleration": { "value": 1000 },
"machine_max_feedrate_e": { "value": 40 },
"machine_max_jerk_xy": { "value": 5 },
- "material_print_temperature": { "value": 195 },
- "retraction_speed": { "default_value": 30 },
"z_seam_corner": { "value": "'z_seam_corner_weighted'" }
}
}
\ No newline at end of file
diff --git a/resources/definitions/ultimaker_methodx.def.json b/resources/definitions/ultimaker_methodx.def.json
index d74a08baf3..a6708a0421 100644
--- a/resources/definitions/ultimaker_methodx.def.json
+++ b/resources/definitions/ultimaker_methodx.def.json
@@ -75,6 +75,7 @@
"preferred_material": "ultimaker_absr_175",
"preferred_quality_type": "draft",
"preferred_variant_name": "1XA",
+ "reference_machine_id": "lava_f",
"supports_network_connection": true,
"supports_usb_connection": false,
"variant_definition": "ultimaker_methodx",
diff --git a/resources/definitions/ultimaker_methodxl.def.json b/resources/definitions/ultimaker_methodxl.def.json
index 270379d6cd..6c12218b51 100644
--- a/resources/definitions/ultimaker_methodxl.def.json
+++ b/resources/definitions/ultimaker_methodxl.def.json
@@ -25,6 +25,7 @@
],
"platform_texture": "MakerbotMethod.png",
"preferred_quality_type": "draft",
+ "reference_machine_id": "magma_10",
"supports_network_connection": true,
"supports_usb_connection": false,
"variants_name": "Extruder",
diff --git a/resources/definitions/uni_base.def.json b/resources/definitions/uni_base.def.json
index c6405d213c..967a9423dc 100644
--- a/resources/definitions/uni_base.def.json
+++ b/resources/definitions/uni_base.def.json
@@ -47,10 +47,8 @@
"infill_enable_travel_optimization": { "value": "True" },
"infill_line_width": { "value": "round(line_width * 1.1, 2)" },
"infill_pattern": { "value": "'gyroid'" },
- "initial_layer_line_width_factor": { "value": "100" },
"layer_height_0": { "value": "layer_height" },
- "line_width": { "value": "machine_nozzle_size" },
- "machine_buildplate_type": { "value": "glass" },
+ "machine_buildplate_type": { "value": "'glass'" },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 220 },
"machine_end_gcode": { "default_value": "G91\nG1 E-1 F600\nG1 Z+1 E-3 X-20 Y-20 F4800\nM104 S0\nM106 S0\nM140 S0\nM220 S100\nM221 S100\nG28\nG90\nM84\n;\n" },
diff --git a/resources/definitions/weedo_base.def.json b/resources/definitions/weedo_base.def.json
index bbc1fcd09e..04549e6768 100644
--- a/resources/definitions/weedo_base.def.json
+++ b/resources/definitions/weedo_base.def.json
@@ -222,7 +222,7 @@
"raft_surface_speed": { "value": 40.0 },
"raft_surface_thickness": { "value": 0.25 },
"retraction_amount": { "default_value": 3 },
- "retraction_combing": { "value": "off" },
+ "retraction_combing": { "value": "'off'" },
"retraction_extrusion_window": { "value": 1.0 },
"retraction_hop_after_extruder_switch": { "default_value": false },
"retraction_min_travel": { "value": 0.8 },
diff --git a/resources/definitions/zav_base.def.json b/resources/definitions/zav_base.def.json
index 03178f5eb9..921f0b23be 100644
--- a/resources/definitions/zav_base.def.json
+++ b/resources/definitions/zav_base.def.json
@@ -46,10 +46,8 @@
"infill_enable_travel_optimization": { "value": "True" },
"infill_line_width": { "value": "round(line_width * 1.1, 2)" },
"infill_pattern": { "value": "'gyroid'" },
- "initial_layer_line_width_factor": { "value": "100" },
"layer_height_0": { "value": "layer_height" },
- "line_width": { "value": "machine_nozzle_size" },
- "machine_buildplate_type": { "value": "glass" },
+ "machine_buildplate_type": { "value": "'glass'" },
"machine_center_is_zero": { "default_value": false },
"machine_depth": { "default_value": 200 },
"machine_end_gcode": { "default_value": ";---- Ending Script Start ----\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-4 F300 ;retract the filament a bit before lifting the nozzle to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F5000 ;move Z up a bit and retract filament even more\nG28 Z0 ;move bed down\nG28 X0 Y0 ;move X/Y to min endstops so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning\nM107 ;switch off cooling fan\nM355 S0 P0 ;switch off case light\n;---- Ending Script End ----\n" },
diff --git a/resources/extruders/anycubic_kobra2_extruder_0.def.json b/resources/extruders/anycubic_kobra2_extruder_0.def.json
new file mode 100644
index 0000000000..adfdb45986
--- /dev/null
+++ b/resources/extruders/anycubic_kobra2_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata":
+ {
+ "machine": "anycubic_kobra2",
+ "position": "0"
+ },
+ "overrides":
+ {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
\ No newline at end of file
diff --git a/resources/meshes/anycubic_kobra2_platform.stl b/resources/meshes/anycubic_kobra2_platform.stl
new file mode 100644
index 0000000000..339d8c15eb
Binary files /dev/null and b/resources/meshes/anycubic_kobra2_platform.stl differ
diff --git a/resources/variants/flyingbear/flyingbear_ghost_6_0.25.inst.cfg b/resources/variants/flyingbear/flyingbear_ghost_6_0.25.inst.cfg
new file mode 100644
index 0000000000..bb673ccc53
--- /dev/null
+++ b/resources/variants/flyingbear/flyingbear_ghost_6_0.25.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = flyingbear_ghost_6
+name = 0.25mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.25
+
diff --git a/resources/variants/flyingbear/flyingbear_ghost_6_0.30.inst.cfg b/resources/variants/flyingbear/flyingbear_ghost_6_0.30.inst.cfg
new file mode 100644
index 0000000000..ffae1f125d
--- /dev/null
+++ b/resources/variants/flyingbear/flyingbear_ghost_6_0.30.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = flyingbear_ghost_6
+name = 0.3mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.3
+
diff --git a/resources/variants/flyingbear/flyingbear_ghost_6_0.40.inst.cfg b/resources/variants/flyingbear/flyingbear_ghost_6_0.40.inst.cfg
new file mode 100644
index 0000000000..574ec2638a
--- /dev/null
+++ b/resources/variants/flyingbear/flyingbear_ghost_6_0.40.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = flyingbear_ghost_6
+name = 0.4mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.4
+
diff --git a/resources/variants/flyingbear/flyingbear_ghost_6_0.50.inst.cfg b/resources/variants/flyingbear/flyingbear_ghost_6_0.50.inst.cfg
new file mode 100644
index 0000000000..908a07a12e
--- /dev/null
+++ b/resources/variants/flyingbear/flyingbear_ghost_6_0.50.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = flyingbear_ghost_6
+name = 0.5mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.5
+
diff --git a/resources/variants/flyingbear/flyingbear_ghost_6_0.60.inst.cfg b/resources/variants/flyingbear/flyingbear_ghost_6_0.60.inst.cfg
new file mode 100644
index 0000000000..816401bed0
--- /dev/null
+++ b/resources/variants/flyingbear/flyingbear_ghost_6_0.60.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = flyingbear_ghost_6
+name = 0.6mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.6
+
diff --git a/resources/variants/flyingbear/flyingbear_ghost_6_0.80.inst.cfg b/resources/variants/flyingbear/flyingbear_ghost_6_0.80.inst.cfg
new file mode 100644
index 0000000000..c34767b93e
--- /dev/null
+++ b/resources/variants/flyingbear/flyingbear_ghost_6_0.80.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = flyingbear_ghost_6
+name = 0.8mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.8
+
diff --git a/resources/variants/multicomp/multicomp_mcpi200_0.2.inst.cfg b/resources/variants/multicomp/multicomp_mcpi200_0.2.inst.cfg
new file mode 100644
index 0000000000..eb96860dcb
--- /dev/null
+++ b/resources/variants/multicomp/multicomp_mcpi200_0.2.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = multicomp_mcpi200
+name = 0.2mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.2
+
diff --git a/resources/variants/multicomp/multicomp_mcpi200_0.4.inst.cfg b/resources/variants/multicomp/multicomp_mcpi200_0.4.inst.cfg
new file mode 100644
index 0000000000..b84fee233e
--- /dev/null
+++ b/resources/variants/multicomp/multicomp_mcpi200_0.4.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = multicomp_mcpi200
+name = 0.4mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.4
+
diff --git a/resources/variants/multicomp/multicomp_mcpi200_0.6.inst.cfg b/resources/variants/multicomp/multicomp_mcpi200_0.6.inst.cfg
new file mode 100644
index 0000000000..b9f3282064
--- /dev/null
+++ b/resources/variants/multicomp/multicomp_mcpi200_0.6.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = multicomp_mcpi200
+name = 0.6mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.6
+
diff --git a/resources/variants/multicomp/multicomp_mcpi200_0.8.inst.cfg b/resources/variants/multicomp/multicomp_mcpi200_0.8.inst.cfg
new file mode 100644
index 0000000000..ca17db8e86
--- /dev/null
+++ b/resources/variants/multicomp/multicomp_mcpi200_0.8.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = multicomp_mcpi200
+name = 0.8mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.8
+
diff --git a/resources/variants/multicomp/multicomp_mcpi200_1.0.inst.cfg b/resources/variants/multicomp/multicomp_mcpi200_1.0.inst.cfg
new file mode 100644
index 0000000000..7f71cd6c19
--- /dev/null
+++ b/resources/variants/multicomp/multicomp_mcpi200_1.0.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = multicomp_mcpi200
+name = 1.0mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 1.0
+
diff --git a/resources/variants/renkforce/renkforce_pro10plus_0.2.inst.cfg b/resources/variants/renkforce/renkforce_pro10plus_0.2.inst.cfg
new file mode 100644
index 0000000000..e2a36778c6
--- /dev/null
+++ b/resources/variants/renkforce/renkforce_pro10plus_0.2.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = renkforce_pro10plus
+name = 0.2mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.2
+
diff --git a/resources/variants/renkforce/renkforce_pro10plus_0.4.inst.cfg b/resources/variants/renkforce/renkforce_pro10plus_0.4.inst.cfg
new file mode 100644
index 0000000000..aea6acc5e5
--- /dev/null
+++ b/resources/variants/renkforce/renkforce_pro10plus_0.4.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = renkforce_pro10plus
+name = 0.4mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.4
+
diff --git a/resources/variants/renkforce/renkforce_pro10plus_0.6.inst.cfg b/resources/variants/renkforce/renkforce_pro10plus_0.6.inst.cfg
new file mode 100644
index 0000000000..228ea98425
--- /dev/null
+++ b/resources/variants/renkforce/renkforce_pro10plus_0.6.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = renkforce_pro10plus
+name = 0.6mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.6
+
diff --git a/resources/variants/renkforce/renkforce_pro10plus_0.8.inst.cfg b/resources/variants/renkforce/renkforce_pro10plus_0.8.inst.cfg
new file mode 100644
index 0000000000..c7b037a84d
--- /dev/null
+++ b/resources/variants/renkforce/renkforce_pro10plus_0.8.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = renkforce_pro10plus
+name = 0.8mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 0.8
+
diff --git a/resources/variants/renkforce/renkforce_pro10plus_1.0.inst.cfg b/resources/variants/renkforce/renkforce_pro10plus_1.0.inst.cfg
new file mode 100644
index 0000000000..2c1e6194ed
--- /dev/null
+++ b/resources/variants/renkforce/renkforce_pro10plus_1.0.inst.cfg
@@ -0,0 +1,13 @@
+[general]
+definition = renkforce_pro10plus
+name = 1.0mm Nozzle
+version = 4
+
+[metadata]
+hardware_type = nozzle
+setting_version = 22
+type = variant
+
+[values]
+machine_nozzle_size = 1.0
+
diff --git a/resources/variants/ultimaker_methodx_1C.inst.cfg b/resources/variants/ultimaker_methodx_1C.inst.cfg
index 74b8f9d8e1..b2bd39e906 100644
--- a/resources/variants/ultimaker_methodx_1C.inst.cfg
+++ b/resources/variants/ultimaker_methodx_1C.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_c
setting_version = 22
type = variant
diff --git a/resources/variants/ultimaker_methodx_1XA.inst.cfg b/resources/variants/ultimaker_methodx_1XA.inst.cfg
index b68db556e4..f63c2a4df7 100644
--- a/resources/variants/ultimaker_methodx_1XA.inst.cfg
+++ b/resources/variants/ultimaker_methodx_1XA.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_hot
setting_version = 22
type = variant
diff --git a/resources/variants/ultimaker_methodx_2XA.inst.cfg b/resources/variants/ultimaker_methodx_2XA.inst.cfg
index 9b951fe99e..24461cd5ef 100644
--- a/resources/variants/ultimaker_methodx_2XA.inst.cfg
+++ b/resources/variants/ultimaker_methodx_2XA.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_hot_s
setting_version = 22
type = variant
diff --git a/resources/variants/ultimaker_methodx_LABS.inst.cfg b/resources/variants/ultimaker_methodx_LABS.inst.cfg
index a5232706b9..2c667e37f1 100644
--- a/resources/variants/ultimaker_methodx_LABS.inst.cfg
+++ b/resources/variants/ultimaker_methodx_LABS.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_e
setting_version = 22
type = variant
diff --git a/resources/variants/ultimaker_methodxl_1C.inst.cfg b/resources/variants/ultimaker_methodxl_1C.inst.cfg
index 2e1c690552..527415ca35 100644
--- a/resources/variants/ultimaker_methodxl_1C.inst.cfg
+++ b/resources/variants/ultimaker_methodxl_1C.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_c
setting_version = 22
type = variant
diff --git a/resources/variants/ultimaker_methodxl_1XA.inst.cfg b/resources/variants/ultimaker_methodxl_1XA.inst.cfg
index 0db3501e1a..6da0eb3bb2 100644
--- a/resources/variants/ultimaker_methodxl_1XA.inst.cfg
+++ b/resources/variants/ultimaker_methodxl_1XA.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_hot
setting_version = 22
type = variant
diff --git a/resources/variants/ultimaker_methodxl_2XA.inst.cfg b/resources/variants/ultimaker_methodxl_2XA.inst.cfg
index 52a2e0382c..a64b66b89f 100644
--- a/resources/variants/ultimaker_methodxl_2XA.inst.cfg
+++ b/resources/variants/ultimaker_methodxl_2XA.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_hot_s
setting_version = 22
type = variant
diff --git a/resources/variants/ultimaker_methodxl_LABS.inst.cfg b/resources/variants/ultimaker_methodxl_LABS.inst.cfg
index 3c6e538c19..fa726c02ab 100644
--- a/resources/variants/ultimaker_methodxl_LABS.inst.cfg
+++ b/resources/variants/ultimaker_methodxl_LABS.inst.cfg
@@ -5,6 +5,7 @@ version = 4
[metadata]
hardware_type = nozzle
+reference_extruder_id = mk14_e
setting_version = 22
type = variant