mirror of
https://github.com/Ultimaker/Cura.git
synced 2026-02-17 18:02:16 -07:00
Merge branch 'main' into ZhopOnTravel
This commit is contained in:
commit
2e09ca96de
92 changed files with 6045 additions and 235 deletions
63
.github/ISSUE_TEMPLATE/SlicingCrash.yaml
vendored
63
.github/ISSUE_TEMPLATE/SlicingCrash.yaml
vendored
|
|
@ -5,38 +5,25 @@ body:
|
|||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
### ✨Try our improved Cura 5.7✨
|
||||
Before filling out the report below, we want you to try the latest Cura 5.7.
|
||||
This version of Cura has become significantly more reliable and has an updated slicing engine that will automatically send a report to the Cura Team for analysis.
|
||||
#### [You can find the downloads here](https://github.com/Ultimaker/Cura/releases/latest) ####
|
||||
If you still encounter a crash you are still welcome to report the issue so we can use your model as a test case, you can find instructions on how to do that below.
|
||||
### ✨Are you stuck? Have you tried these two things? ✨
|
||||
1- Are you on a Cura version lower than Cura 5.7? We really recommend updating because it resolves a lot of slicing crashes!
|
||||
2- Have you tried fixing the model with software that repairs 3d files and makes them watertight?
|
||||
Are you seeing spots and dots on your model? That is Cura indicating that your model is not watertight.
|
||||
You can try doing a quick [Mesh Fix with the Meshtools Plugin](https://marketplace.ultimaker.com/app/cura/plugins/fieldofview/MeshTools) or other mesh editing software.
|
||||
|
||||
### Project File
|
||||
**⚠️ Before you continue, we need your project file to troubleshoot a slicing crash.**
|
||||
It contains the printer and settings we need for troubleshooting.
|
||||
If you still encounter a crash you are welcome to report the issue so we can use your model as a test case.
|
||||
You can find instructions on how to share your model in a Package for Technical Support below.
|
||||
|
||||

|
||||
|
||||
To save a project file go to File -> Save project.
|
||||
Please make sure to .zip your project file.
|
||||
For big files, you may need to use [WeTransfer](https://wetransfer.com/) or similar file-sharing sites.
|
||||
|
||||
🤔 Before you share, please think to yourself. Is this a model that can be shared?
|
||||
Unfortunately we cannot help if this file is missing.
|
||||
Do you have the project file? Than let's continue ⬇️
|
||||
|
||||
### Questions
|
||||
🤔 Before you share, please think to yourself. Is this a model that can be shared on the internet?
|
||||
**Unfortunately, we cannot help if this file is missing.**
|
||||
|
||||
### Questions
|
||||
- type: input
|
||||
attributes:
|
||||
label: Cura Version
|
||||
placeholder: 5.6.0
|
||||
description: We work hard on improving our slicing crashes. If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
We work hard on improving our slicing crashes. Our most recent release is 5.7.1.
|
||||
If you are not on the latest version of Cura, [you can download it here](https://github.com/Ultimaker/Cura/releases/latest)
|
||||
- type: input
|
||||
attributes:
|
||||
label: Operating System
|
||||
|
|
@ -50,27 +37,13 @@ body:
|
|||
description: Which printer was selected in Cura?
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Name abnormal settings
|
||||
description: Are there any settings that you might have changed that caused the crash? Does your model slice when you select the default profiles?
|
||||
placeholder:
|
||||
validations:
|
||||
- type: input
|
||||
attributes:
|
||||
label: Describe model location
|
||||
description: Does your model slice if you rotate the model 90 degrees or if you move it away from the center of the buildplate?
|
||||
placeholder:
|
||||
validations:
|
||||
- type: input
|
||||
attributes:
|
||||
label: Describe your model
|
||||
description: Have you sliced your model succesfully before? Is it watertight? Have you tried doing a quick [Mesh Fix with the Meshtools Plugin](https://marketplace.ultimaker.com/app/cura/plugins/fieldofview/MeshTools)?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Add your .zip here ⬇️
|
||||
description: You can add the zip file and additional information that is relevant to the issue in the comments below.
|
||||
label: Describe your problem and add the package for technical support as a .zip here ⬇️
|
||||
description: |
|
||||
If you still have Cura open with your crash > Click on Help on top bar > Click on Export Package For Technical Support > Compress the file into a zip > Add the file here to your GitHub issue 🔗
|
||||
|
||||
If you closed Cura, please open Cura to recreate the crash> Select your printer > Load your model > Select your print settings > Click on Help on top bar > Click on Export Package For Technical Support > Compress the file into a zip > Add the file here to your GitHub issue 🔗
|
||||
validations:
|
||||
required: true
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ requirements:
|
|||
- "cura_binary_data/5.11.0-alpha.0@ultimaker/testing"
|
||||
- "fdm_materials/5.11.0-alpha.0@ultimaker/testing"
|
||||
- "dulcificum/5.10.0"
|
||||
- "pysavitar/5.10.0"
|
||||
- "pysavitar/5.11.0-alpha.0"
|
||||
- "pynest2d/5.10.0"
|
||||
requirements_internal:
|
||||
- "fdm_materials/5.11.0-alpha.0@ultimaker/testing"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
from typing import Tuple, Optional, TYPE_CHECKING, Dict, Any
|
||||
|
||||
|
|
@ -9,14 +9,10 @@ if TYPE_CHECKING:
|
|||
|
||||
|
||||
class Backups:
|
||||
"""The back-ups API provides a version-proof bridge between Cura's
|
||||
|
||||
BackupManager and plug-ins that hook into it.
|
||||
"""The back-ups API provides a version-proof bridge between Cura's BackupManager and plug-ins that hook into it.
|
||||
|
||||
Usage:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from cura.API import CuraAPI
|
||||
api = CuraAPI()
|
||||
api.backups.createBackup()
|
||||
|
|
@ -26,19 +22,22 @@ class Backups:
|
|||
def __init__(self, application: "CuraApplication") -> None:
|
||||
self.manager = BackupsManager(application)
|
||||
|
||||
def createBackup(self) -> Tuple[Optional[bytes], Optional[Dict[str, Any]]]:
|
||||
def createBackup(self, available_remote_plugins: frozenset[str] = frozenset()) -> Tuple[Optional[bytes], Optional[Dict[str, Any]]]:
|
||||
"""Create a new back-up using the BackupsManager.
|
||||
|
||||
:return: Tuple containing a ZIP file with the back-up data and a dict with metadata about the back-up.
|
||||
"""
|
||||
|
||||
return self.manager.createBackup()
|
||||
return self.manager.createBackup(available_remote_plugins)
|
||||
|
||||
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, Any]) -> None:
|
||||
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, Any], auto_close: bool = True) -> None:
|
||||
"""Restore a back-up using the BackupsManager.
|
||||
|
||||
:param zip_file: A ZIP file containing the actual back-up data.
|
||||
:param meta_data: Some metadata needed for restoring a back-up, like the Cura version number.
|
||||
"""
|
||||
|
||||
return self.manager.restoreBackup(zip_file, meta_data)
|
||||
return self.manager.restoreBackup(zip_file, meta_data, auto_close=auto_close)
|
||||
|
||||
def shouldReinstallDownloadablePlugins(self) -> bool:
|
||||
return self.manager.shouldReinstallDownloadablePlugins()
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
from dataclasses import asdict
|
||||
|
||||
from typing import cast, Dict, TYPE_CHECKING
|
||||
from typing import cast, Dict, TYPE_CHECKING, Any
|
||||
|
||||
from UM.Settings.InstanceContainer import InstanceContainer
|
||||
from UM.Settings.SettingFunction import SettingFunction
|
||||
|
|
@ -54,6 +54,15 @@ class Settings:
|
|||
|
||||
return self.application.getSidebarCustomMenuItems()
|
||||
|
||||
def getAllGlobalSettings(self) -> Dict[str, Any]:
|
||||
global_stack = cast(GlobalStack, self.application.getGlobalContainerStack())
|
||||
|
||||
all_settings = {}
|
||||
for setting in global_stack.getAllKeys():
|
||||
all_settings[setting] = self._retrieveValue(global_stack, setting)
|
||||
|
||||
return all_settings
|
||||
|
||||
def getSliceMetadata(self) -> Dict[str, Dict[str, Dict[str, str]]]:
|
||||
"""Get all changed settings and all settings. For each extruder and the global stack"""
|
||||
print_information = self.application.getPrintInformation()
|
||||
|
|
@ -71,24 +80,16 @@ class Settings:
|
|||
"quality": asdict(machine_manager.activeQualityDisplayNameMap()),
|
||||
}
|
||||
|
||||
def _retrieveValue(container: InstanceContainer, setting_: str):
|
||||
value_ = container.getProperty(setting_, "value")
|
||||
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
|
||||
if not isinstance(value_, SettingFunction):
|
||||
return value_ # Success!
|
||||
value_ = value_(container)
|
||||
return 0 # Fallback value after breaking possibly endless loop.
|
||||
|
||||
global_stack = cast(GlobalStack, self.application.getGlobalContainerStack())
|
||||
|
||||
# Add global user or quality changes
|
||||
global_flattened_changes = InstanceContainer.createMergedInstanceContainer(global_stack.userChanges, global_stack.qualityChanges)
|
||||
for setting in global_flattened_changes.getAllKeys():
|
||||
settings["global"]["changes"][setting] = _retrieveValue(global_flattened_changes, setting)
|
||||
settings["global"]["changes"][setting] = self._retrieveValue(global_flattened_changes, setting)
|
||||
|
||||
# Get global all settings values without user or quality changes
|
||||
for setting in global_stack.getAllKeys():
|
||||
settings["global"]["all_settings"][setting] = _retrieveValue(global_stack, setting)
|
||||
settings["global"]["all_settings"][setting] = self._retrieveValue(global_stack, setting)
|
||||
|
||||
for i, extruder in enumerate(global_stack.extruderList):
|
||||
# Add extruder fields to settings dictionary
|
||||
|
|
@ -100,10 +101,19 @@ class Settings:
|
|||
# Add extruder user or quality changes
|
||||
extruder_flattened_changes = InstanceContainer.createMergedInstanceContainer(extruder.userChanges, extruder.qualityChanges)
|
||||
for setting in extruder_flattened_changes.getAllKeys():
|
||||
settings[f"extruder_{i}"]["changes"][setting] = _retrieveValue(extruder_flattened_changes, setting)
|
||||
settings[f"extruder_{i}"]["changes"][setting] = self._retrieveValue(extruder_flattened_changes, setting)
|
||||
|
||||
# Get extruder all settings values without user or quality changes
|
||||
for setting in extruder.getAllKeys():
|
||||
settings[f"extruder_{i}"]["all_settings"][setting] = _retrieveValue(extruder, setting)
|
||||
settings[f"extruder_{i}"]["all_settings"][setting] = self._retrieveValue(extruder, setting)
|
||||
|
||||
return settings
|
||||
|
||||
@staticmethod
|
||||
def _retrieveValue(container: InstanceContainer, setting_: str):
|
||||
value_ = container.getProperty(setting_, "value")
|
||||
for _ in range(0, 1024): # Prevent possibly endless loop by not using a limit.
|
||||
if not isinstance(value_, SettingFunction):
|
||||
return value_ # Success!
|
||||
value_ = value_(container)
|
||||
return 0 # Fallback value after breaking possibly endless loop.
|
||||
|
|
@ -1,5 +1,8 @@
|
|||
# Copyright (c) 2021 Ultimaker B.V.
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
import tempfile
|
||||
|
||||
import json
|
||||
|
||||
import io
|
||||
import os
|
||||
|
|
@ -7,12 +10,13 @@ import re
|
|||
import shutil
|
||||
from copy import deepcopy
|
||||
from zipfile import ZipFile, ZIP_DEFLATED, BadZipfile
|
||||
from typing import Dict, Optional, TYPE_CHECKING, List
|
||||
from typing import Callable, Dict, Optional, TYPE_CHECKING, List
|
||||
|
||||
from UM import i18nCatalog
|
||||
from UM.Logger import Logger
|
||||
from UM.Message import Message
|
||||
from UM.Platform import Platform
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Resources import Resources
|
||||
from UM.Version import Version
|
||||
|
||||
|
|
@ -30,6 +34,7 @@ class Backup:
|
|||
"""These files should be ignored when making a backup."""
|
||||
|
||||
IGNORED_FOLDERS = [] # type: List[str]
|
||||
"""These folders should be ignored when making a backup."""
|
||||
|
||||
SECRETS_SETTINGS = ["general/ultimaker_auth_data"]
|
||||
"""Secret preferences that need to obfuscated when making a backup of Cura"""
|
||||
|
|
@ -42,7 +47,7 @@ class Backup:
|
|||
self.zip_file = zip_file # type: Optional[bytes]
|
||||
self.meta_data = meta_data # type: Optional[Dict[str, str]]
|
||||
|
||||
def makeFromCurrent(self) -> None:
|
||||
def makeFromCurrent(self, available_remote_plugins: frozenset[str] = frozenset()) -> None:
|
||||
"""Create a back-up from the current user config folder."""
|
||||
|
||||
cura_release = self._application.getVersion()
|
||||
|
|
@ -68,7 +73,7 @@ class Backup:
|
|||
|
||||
# Create an empty buffer and write the archive to it.
|
||||
buffer = io.BytesIO()
|
||||
archive = self._makeArchive(buffer, version_data_dir)
|
||||
archive = self._makeArchive(buffer, version_data_dir, available_remote_plugins)
|
||||
if archive is None:
|
||||
return
|
||||
files = archive.namelist()
|
||||
|
|
@ -77,9 +82,7 @@ class Backup:
|
|||
machine_count = max(len([s for s in files if "machine_instances/" in s]) - 1, 0) # If people delete their profiles but not their preferences, it can still make a backup, and report -1 profiles. Server crashes on this.
|
||||
material_count = max(len([s for s in files if "materials/" in s]) - 1, 0)
|
||||
profile_count = max(len([s for s in files if "quality_changes/" in s]) - 1, 0)
|
||||
# We don't store plugins anymore, since if you can make backups, you have an account (and the plugins are
|
||||
# on the marketplace anyway)
|
||||
plugin_count = 0
|
||||
plugin_count = len([s for s in files if "plugin.json" in s])
|
||||
# Store the archive and metadata so the BackupManager can fetch them when needed.
|
||||
self.zip_file = buffer.getvalue()
|
||||
self.meta_data = {
|
||||
|
|
@ -92,22 +95,72 @@ class Backup:
|
|||
# Restore the obfuscated settings
|
||||
self._illuminate(**secrets)
|
||||
|
||||
def _makeArchive(self, buffer: "io.BytesIO", root_path: str) -> Optional[ZipFile]:
|
||||
def _fillToInstallsJson(self, file_path: str, reinstall_on_restore: frozenset[str], add_to_archive: Callable[[str, str], None]) -> Optional[str]:
|
||||
""" Moves all plugin-data (in a config-file) for plugins that could be (re)installed from the Marketplace from
|
||||
'installed' to 'to_installs' before adding that file to the archive.
|
||||
|
||||
Note that the 'filename'-entry in the package-data (of the plugins) might not be valid anymore on restore.
|
||||
We'll replace it on restore instead, as that's the time when the new package is downloaded.
|
||||
|
||||
:param file_path: Absolute path to the packages-file.
|
||||
:param reinstall_on_restore: A set of plugins that _can_ be reinstalled from the Marketplace.
|
||||
:param add_to_archive: A function/lambda that takes a filename and adds it to the archive (as the 2nd name).
|
||||
"""
|
||||
with open(file_path, "r") as file:
|
||||
data = json.load(file)
|
||||
reinstall, keep_in = {}, {}
|
||||
for install_id, install_info in data["installed"].items():
|
||||
(reinstall if install_id in reinstall_on_restore else keep_in)[install_id] = install_info
|
||||
data["installed"] = keep_in
|
||||
data["to_install"].update(reinstall)
|
||||
if data is not None:
|
||||
tmpfile = tempfile.NamedTemporaryFile(delete_on_close=False)
|
||||
with open(tmpfile.name, "w") as outfile:
|
||||
json.dump(data, outfile)
|
||||
add_to_archive(tmpfile.name, file_path)
|
||||
return tmpfile.name
|
||||
return None
|
||||
|
||||
def _findRedownloadablePlugins(self, available_remote_plugins: frozenset) -> (frozenset[str], frozenset[str]):
|
||||
""" Find all plugins that should be able to be reinstalled from the Marketplace.
|
||||
|
||||
:param plugins_path: Path to all plugins in the user-space.
|
||||
:return: Tuple of a set of plugin-ids and a set of plugin-paths.
|
||||
"""
|
||||
plugin_reg = PluginRegistry.getInstance()
|
||||
id = "id"
|
||||
plugins = [v for v in plugin_reg.getAllMetaData()
|
||||
if v[id] in available_remote_plugins and not plugin_reg.isBundledPlugin(v[id])]
|
||||
return frozenset([v[id] for v in plugins]), frozenset([v["location"] for v in plugins])
|
||||
|
||||
def _makeArchive(self, buffer: "io.BytesIO", root_path: str, available_remote_plugins: frozenset) -> Optional[ZipFile]:
|
||||
"""Make a full archive from the given root path with the given name.
|
||||
|
||||
:param root_path: The root directory to archive recursively.
|
||||
:return: The archive as bytes.
|
||||
"""
|
||||
ignore_string = re.compile("|".join(self.IGNORED_FILES + self.IGNORED_FOLDERS))
|
||||
reinstall_instead_ids, reinstall_instead_paths = self._findRedownloadablePlugins(available_remote_plugins)
|
||||
tmpfiles = []
|
||||
try:
|
||||
archive = ZipFile(buffer, "w", ZIP_DEFLATED)
|
||||
for root, folders, files in os.walk(root_path):
|
||||
add_path_to_archive = lambda path, alt_path: archive.write(path, alt_path[len(root_path) + len(os.sep):])
|
||||
for root, folders, files in os.walk(root_path, topdown=True):
|
||||
for item_name in folders + files:
|
||||
absolute_path = os.path.join(root, item_name)
|
||||
if ignore_string.search(absolute_path):
|
||||
if ignore_string.search(absolute_path) or any([absolute_path.startswith(x) for x in reinstall_instead_paths]):
|
||||
continue
|
||||
archive.write(absolute_path, absolute_path[len(root_path) + len(os.sep):])
|
||||
if item_name == "packages.json":
|
||||
tmpfiles.append(
|
||||
self._fillToInstallsJson(absolute_path, reinstall_instead_ids, add_path_to_archive))
|
||||
else:
|
||||
add_path_to_archive(absolute_path, absolute_path)
|
||||
archive.close()
|
||||
for tmpfile_path in tmpfiles:
|
||||
try:
|
||||
os.remove(tmpfile_path)
|
||||
except IOError as ex:
|
||||
Logger.warning(f"Couldn't remove temporary file '{tmpfile_path}' because '{ex}'.")
|
||||
return archive
|
||||
except (IOError, OSError, BadZipfile) as error:
|
||||
Logger.log("e", "Could not create archive from user data directory: %s", error)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2018 Ultimaker B.V.
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from typing import Dict, Optional, Tuple, TYPE_CHECKING
|
||||
|
|
@ -22,7 +22,10 @@ class BackupsManager:
|
|||
def __init__(self, application: "CuraApplication") -> None:
|
||||
self._application = application
|
||||
|
||||
def createBackup(self) -> Tuple[Optional[bytes], Optional[Dict[str, str]]]:
|
||||
def shouldReinstallDownloadablePlugins(self) -> bool:
|
||||
return True
|
||||
|
||||
def createBackup(self, available_remote_plugins: frozenset[str] = frozenset()) -> Tuple[Optional[bytes], Optional[Dict[str, str]]]:
|
||||
"""
|
||||
Get a back-up of the current configuration.
|
||||
|
||||
|
|
@ -31,17 +34,18 @@ class BackupsManager:
|
|||
|
||||
self._disableAutoSave()
|
||||
backup = Backup(self._application)
|
||||
backup.makeFromCurrent()
|
||||
backup.makeFromCurrent(available_remote_plugins if self.shouldReinstallDownloadablePlugins() else frozenset())
|
||||
self._enableAutoSave()
|
||||
# We don't return a Backup here because we want plugins only to interact with our API and not full objects.
|
||||
return backup.zip_file, backup.meta_data
|
||||
|
||||
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, str]) -> None:
|
||||
def restoreBackup(self, zip_file: bytes, meta_data: Dict[str, str], auto_close: bool = True) -> None:
|
||||
"""
|
||||
Restore a back-up from a given ZipFile.
|
||||
|
||||
:param zip_file: A bytes object containing the actual back-up.
|
||||
:param meta_data: A dict containing some metadata that is needed to restore the back-up correctly.
|
||||
:param auto_close: Normally, Cura will need to close immediately after restoring the back-up.
|
||||
"""
|
||||
|
||||
if not meta_data.get("cura_release", None):
|
||||
|
|
@ -54,7 +58,7 @@ class BackupsManager:
|
|||
backup = Backup(self._application, zip_file = zip_file, meta_data = meta_data)
|
||||
restored = backup.restore()
|
||||
|
||||
if restored:
|
||||
if restored and auto_close:
|
||||
# At this point, Cura will need to restart for the changes to take effect.
|
||||
# We don't want to store the data at this point as that would override the just-restored backup.
|
||||
self._application.windowClosed(save_data = False)
|
||||
|
|
|
|||
|
|
@ -188,6 +188,7 @@ class CuraApplication(QtApplication):
|
|||
|
||||
self._single_instance = None
|
||||
self._open_project_mode: Optional[str] = None
|
||||
self._read_operation_is_project_file: Optional[bool] = None
|
||||
|
||||
self._cura_formula_functions = None # type: Optional[CuraFormulaFunctions]
|
||||
|
||||
|
|
@ -2015,18 +2016,18 @@ class CuraApplication(QtApplication):
|
|||
self.deleteAll()
|
||||
break
|
||||
|
||||
is_project_file = self.checkIsValidProjectFile(file)
|
||||
self._read_operation_is_project_file = self.checkIsValidProjectFile(file)
|
||||
|
||||
if self._open_project_mode is None:
|
||||
self._open_project_mode = self.getPreferences().getValue("cura/choice_on_open_project")
|
||||
|
||||
if is_project_file and self._open_project_mode == "open_as_project":
|
||||
if self._read_operation_is_project_file and self._open_project_mode == "open_as_project":
|
||||
# open as project immediately without presenting a dialog
|
||||
workspace_handler = self.getWorkspaceFileHandler()
|
||||
workspace_handler.readLocalFile(file, add_to_recent_files_hint = add_to_recent_files)
|
||||
return
|
||||
|
||||
if is_project_file and self._open_project_mode == "always_ask":
|
||||
if self._read_operation_is_project_file and self._open_project_mode == "always_ask":
|
||||
# present a dialog asking to open as project or import models
|
||||
self.callLater(self.openProjectFile.emit, file, add_to_recent_files)
|
||||
return
|
||||
|
|
@ -2164,7 +2165,7 @@ class CuraApplication(QtApplication):
|
|||
nodes_to_arrange.append(node)
|
||||
# If the file is a project,and models are to be loaded from a that project,
|
||||
# models inside file should be arranged in buildplate.
|
||||
elif self._open_project_mode == "open_as_model":
|
||||
elif self._read_operation_is_project_file and self._open_project_mode == "open_as_model":
|
||||
nodes_to_arrange.append(node)
|
||||
|
||||
# This node is deep copied from some other node which already has a BuildPlateDecorator, but the deepcopy
|
||||
|
|
|
|||
|
|
@ -402,6 +402,9 @@ class CuraContainerStack(ContainerStack):
|
|||
|
||||
return super().getProperty(key, property_name, context)
|
||||
|
||||
def getValue(self, key: str, context = None) -> Any:
|
||||
return self.getProperty(key, "value", context)
|
||||
|
||||
|
||||
class _ContainerIndexes:
|
||||
"""Private helper class to keep track of container positions and their types."""
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ from UM.Scene.Selection import Selection
|
|||
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
||||
from UM.Settings.ContainerRegistry import ContainerRegistry # Finding containers by ID.
|
||||
from cura.Machines.ContainerTree import ContainerTree
|
||||
from cura.Settings.ExtruderStack import ExtruderStack
|
||||
|
||||
from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING, Union
|
||||
|
||||
|
|
@ -304,6 +305,11 @@ class ExtruderManager(QObject):
|
|||
Logger.log("e", "Unable to find one or more of the extruders in %s", used_extruder_stack_ids)
|
||||
return []
|
||||
|
||||
def getFirstUsedExtruderStack(self)-> ExtruderStack:
|
||||
used_extruders = self.getUsedExtruderStacks()
|
||||
sorted_extruders = sorted(used_extruders, key=lambda extruder: extruder.getValue("extruder_nr"))
|
||||
return sorted_extruders[0]
|
||||
|
||||
def getInitialExtruderNr(self) -> int:
|
||||
"""Get the extruder that the print will start with.
|
||||
|
||||
|
|
@ -320,8 +326,7 @@ class ExtruderManager(QObject):
|
|||
skirt_brim_extruder_nr = global_stack.getProperty("skirt_brim_extruder_nr", "value")
|
||||
# if the skirt_brim_extruder_nr is -1, then we use the first used extruder
|
||||
if skirt_brim_extruder_nr == -1:
|
||||
used_extruders = self.getUsedExtruderStacks()
|
||||
return used_extruders[0].position
|
||||
return self.getFirstUsedExtruderStack().getValue("extruder_nr")
|
||||
else:
|
||||
return skirt_brim_extruder_nr
|
||||
if adhesion_type == "raft":
|
||||
|
|
@ -332,7 +337,7 @@ class ExtruderManager(QObject):
|
|||
return global_stack.getProperty("support_infill_extruder_nr", "value")
|
||||
|
||||
# REALLY no adhesion? Use the first used extruder.
|
||||
return self.getUsedExtruderStacks()[0].getProperty("extruder_nr", "value")
|
||||
return self.getFirstUsedExtruderStack().getValue("extruder_nr")
|
||||
|
||||
def removeMachineExtruders(self, machine_id: str) -> None:
|
||||
"""Removes the container stack and user profile for the extruders for a specific machine.
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
# Copyright (c) 2022 UltiMaker B.V.
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura's build system is released under the terms of the AGPLv3 or higher.
|
||||
|
||||
!define APP_NAME "{{ app_name }}"
|
||||
!define COMP_NAME "{{ company }}"
|
||||
!define WEB_SITE "{{ web_site }}"
|
||||
!define VERSION "{{ version }}"
|
||||
!define VIVERSION "{{ version_major }}.{{ version_minor }}.{{ version_patch }}.0"
|
||||
!define COPYRIGHT "Copyright (c) {{ year }} {{ company }}"
|
||||
|
|
@ -16,13 +15,11 @@
|
|||
!define REG_APP_PATH "Software\Microsoft\Windows\CurrentVersion\App Paths\${APP_NAME}-${VERSION}"
|
||||
!define UNINSTALL_PATH "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}-${VERSION}"
|
||||
|
||||
!define REG_START_MENU "Start Menu Folder"
|
||||
!define REG_START_MENU "Start Menu Shortcut"
|
||||
|
||||
;Require administrator access
|
||||
RequestExecutionLevel admin
|
||||
|
||||
var SM_Folder
|
||||
|
||||
######################################################################
|
||||
|
||||
VIProductVersion "${VIVERSION}"
|
||||
|
|
@ -64,11 +61,9 @@ InstallDir "$PROGRAMFILES64\${APP_NAME}"
|
|||
|
||||
!ifdef REG_START_MENU
|
||||
!define MUI_STARTMENUPAGE_NODISABLE
|
||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "UltiMaker Cura"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${REG_ROOT}"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${UNINSTALL_PATH}"
|
||||
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${REG_START_MENU}"
|
||||
!insertmacro MUI_PAGE_STARTMENU Application $SM_Folder
|
||||
!endif
|
||||
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
|
|
@ -107,27 +102,11 @@ SetOutPath "$INSTDIR"
|
|||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
||||
|
||||
!ifdef REG_START_MENU
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||
CreateDirectory "$SMPROGRAMS\$SM_Folder"
|
||||
CreateShortCut "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
|
||||
CreateShortCut "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe"
|
||||
|
||||
!ifdef WEB_SITE
|
||||
WriteIniStr "$INSTDIR\UltiMaker Cura website.url" "InternetShortcut" "URL" "${WEB_SITE}"
|
||||
CreateShortCut "$SMPROGRAMS\$SM_Folder\UltiMaker Cura website.lnk" "$INSTDIR\UltiMaker Cura website.url"
|
||||
!endif
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
CreateShortCut "$SMPROGRAMS\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
|
||||
!endif
|
||||
|
||||
!ifndef REG_START_MENU
|
||||
CreateDirectory "$SMPROGRAMS\{{ app_name }}"
|
||||
CreateShortCut "$SMPROGRAMS\{{ app_name }}\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
|
||||
CreateShortCut "$SMPROGRAMS\{{ app_name }}\Uninstall ${APP_NAME}.lnk" "$INSTDIR\uninstall.exe"
|
||||
|
||||
!ifdef WEB_SITE
|
||||
WriteIniStr "$INSTDIR\UltiMaker Cura website.url" "InternetShortcut" "URL" "${WEB_SITE}"
|
||||
CreateShortCut "$SMPROGRAMS\{{ app_name }}\UltiMaker Cura website.lnk" "$INSTDIR\UltiMaker Cura website.url"
|
||||
!endif
|
||||
CreateShortCut "$SMPROGRAMS\${APP_NAME}.lnk" "$INSTDIR\${MAIN_APP_EXE}"
|
||||
!endif
|
||||
|
||||
WriteRegStr ${REG_ROOT} "${REG_APP_PATH}" "" "$INSTDIR\${MAIN_APP_EXE}"
|
||||
|
|
@ -138,9 +117,6 @@ WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayIcon" "$INSTDIR\${MAIN_APP_
|
|||
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "DisplayVersion" "${VERSION}"
|
||||
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "Publisher" "${COMP_NAME}"
|
||||
|
||||
!ifdef WEB_SITE
|
||||
WriteRegStr ${REG_ROOT} "${UNINSTALL_PATH}" "URLInfoAbout" "${WEB_SITE}"
|
||||
!endif
|
||||
SectionEnd
|
||||
|
||||
######################################################################
|
||||
|
|
@ -177,29 +153,17 @@ RmDir "$INSTDIR\share\uranium"
|
|||
RmDir "$INSTDIR\share"
|
||||
|
||||
Delete "$INSTDIR\uninstall.exe"
|
||||
!ifdef WEB_SITE
|
||||
Delete "$INSTDIR\${APP_NAME} website.url"
|
||||
!endif
|
||||
|
||||
RmDir /r /REBOOTOK "$INSTDIR"
|
||||
|
||||
!ifdef REG_START_MENU
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER "Application" $SM_Folder
|
||||
Delete "$SMPROGRAMS\$SM_Folder\${APP_NAME}.lnk"
|
||||
Delete "$SMPROGRAMS\$SM_Folder\Uninstall ${APP_NAME}.lnk"
|
||||
!ifdef WEB_SITE
|
||||
Delete "$SMPROGRAMS\$SM_Folder\UltiMaker Cura website.lnk"
|
||||
!endif
|
||||
RmDir "$SMPROGRAMS\$SM_Folder"
|
||||
Delete "$SMPROGRAMS\${APP_NAME}.lnk"
|
||||
Delete "$SMPROGRAMS\Uninstall ${APP_NAME}.lnk"
|
||||
!endif
|
||||
|
||||
!ifndef REG_START_MENU
|
||||
Delete "$SMPROGRAMS\{{ app_name }}\${APP_NAME}.lnk"
|
||||
Delete "$SMPROGRAMS\{{ app_name }}\Uninstall ${APP_NAME}.lnk"
|
||||
!ifdef WEB_SITE
|
||||
Delete "$SMPROGRAMS\{{ app_name }}\UltiMaker Cura website.lnk"
|
||||
!endif
|
||||
RmDir "$SMPROGRAMS\{{ app_name }}"
|
||||
Delete "$SMPROGRAMS\${APP_NAME}.lnk"
|
||||
Delete "$SMPROGRAMS\Uninstall ${APP_NAME}.lnk"
|
||||
!endif
|
||||
|
||||
!insertmacro APP_UNASSOCIATE "stl" "Cura.model"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2022 UltiMaker
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
|
||||
|
|
@ -51,7 +51,6 @@ def generate_nsi(source_path: str, dist_path: str, filename: str, version: str):
|
|||
version_minor = str(parsed_version.minor),
|
||||
version_patch = str(parsed_version.patch),
|
||||
company = "UltiMaker",
|
||||
web_site = "https://ultimaker.com",
|
||||
year = datetime.now().year,
|
||||
cura_license_file = str(source_loc.joinpath("packaging", "cura_license.txt")),
|
||||
compression_method = "LZMA", # ZLIB, BZIP2 or LZMA
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2022 UltiMaker
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
|
||||
|
|
@ -40,7 +40,6 @@ def generate_wxs(source_path: Path, dist_path: Path, filename: Path, app_name: s
|
|||
version_minor=str(parsed_version.minor),
|
||||
version_patch=str(parsed_version.patch),
|
||||
company="UltiMaker",
|
||||
web_site="https://ultimaker.com",
|
||||
year=datetime.now().year,
|
||||
upgrade_code=str(uuid.uuid5(uuid.NAMESPACE_DNS, app_name)),
|
||||
cura_license_file=str(source_loc.joinpath("packaging", "msi", "cura_license.rtf")),
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ class ThreeMFReader(MeshReader):
|
|||
return temp_mat
|
||||
|
||||
@staticmethod
|
||||
def _convertSavitarNodeToUMNode(savitar_node: Savitar.SceneNode, file_name: str = "") -> Optional[SceneNode]:
|
||||
def _convertSavitarNodeToUMNode(savitar_node: Savitar.SceneNode, file_name: str = "", archive: zipfile.ZipFile = None) -> Optional[SceneNode]:
|
||||
"""Convenience function that converts a SceneNode object (as obtained from libSavitar) to a scene node.
|
||||
|
||||
:returns: Scene node.
|
||||
|
|
@ -115,6 +115,10 @@ class ThreeMFReader(MeshReader):
|
|||
|
||||
active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
|
||||
|
||||
component_path = savitar_node.getComponentPath()
|
||||
if component_path != "" and archive is not None:
|
||||
savitar_node.parseComponentData(archive.open(component_path.lstrip("/")).read())
|
||||
|
||||
um_node = CuraSceneNode() # This adds a SettingOverrideDecorator
|
||||
um_node.addDecorator(BuildPlateDecorator(active_build_plate))
|
||||
try:
|
||||
|
|
@ -143,7 +147,7 @@ class ThreeMFReader(MeshReader):
|
|||
um_node.setMeshData(mesh_data)
|
||||
|
||||
for child in savitar_node.getChildren():
|
||||
child_node = ThreeMFReader._convertSavitarNodeToUMNode(child)
|
||||
child_node = ThreeMFReader._convertSavitarNodeToUMNode(child, archive=archive)
|
||||
if child_node:
|
||||
um_node.addChild(child_node)
|
||||
|
||||
|
|
@ -232,7 +236,7 @@ class ThreeMFReader(MeshReader):
|
|||
CuraApplication.getInstance().getController().getScene().setMetaDataEntry(key, value)
|
||||
|
||||
for node in scene_3mf.getSceneNodes():
|
||||
um_node = ThreeMFReader._convertSavitarNodeToUMNode(node, file_name)
|
||||
um_node = ThreeMFReader._convertSavitarNodeToUMNode(node, file_name, archive)
|
||||
if um_node is None:
|
||||
continue
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ def getMetaData() -> Dict:
|
|||
if "3MFReader.ThreeMFReader" in sys.modules:
|
||||
metaData["mesh_reader"] = [
|
||||
{
|
||||
"extension": "3mf",
|
||||
"extension": workspace_extension,
|
||||
"description": catalog.i18nc("@item:inlistbox", "3MF File")
|
||||
}
|
||||
]
|
||||
|
|
|
|||
176
plugins/3MFWriter/BambuLabVariant.py
Normal file
176
plugins/3MFWriter/BambuLabVariant.py
Normal file
|
|
@ -0,0 +1,176 @@
|
|||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
from io import StringIO
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
from PyQt6.QtCore import Qt, QBuffer
|
||||
from PyQt6.QtGui import QImage
|
||||
|
||||
from UM.Application import Application
|
||||
from UM.Logger import Logger
|
||||
from UM.Mesh.MeshWriter import MeshWriter
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from typing import cast
|
||||
|
||||
from cura.CuraApplication import CuraApplication
|
||||
|
||||
from .ThreeMFVariant import ThreeMFVariant
|
||||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
# Path constants
|
||||
METADATA_PATH = "Metadata"
|
||||
THUMBNAIL_PATH_MULTIPLATE = f"{METADATA_PATH}/plate_1.png"
|
||||
THUMBNAIL_PATH_MULTIPLATE_SMALL = f"{METADATA_PATH}/plate_1_small.png"
|
||||
GCODE_PATH = f"{METADATA_PATH}/plate_1.gcode"
|
||||
GCODE_MD5_PATH = f"{GCODE_PATH}.md5"
|
||||
MODEL_SETTINGS_PATH = f"{METADATA_PATH}/model_settings.config"
|
||||
PLATE_DESC_PATH = f"{METADATA_PATH}/plate_1.json"
|
||||
SLICE_INFO_PATH = f"{METADATA_PATH}/slice_info.config"
|
||||
PROJECT_SETTINGS_PATH = f"{METADATA_PATH}/project_settings.config"
|
||||
|
||||
class BambuLabVariant(ThreeMFVariant):
|
||||
"""BambuLab specific implementation of the 3MF format."""
|
||||
|
||||
@property
|
||||
def mime_type(self) -> str:
|
||||
return "application/vnd.bambulab-package.3dmanufacturing-3dmodel+xml"
|
||||
|
||||
def process_thumbnail(self, snapshot: QImage, thumbnail_buffer: QBuffer,
|
||||
archive: zipfile.ZipFile, relations_element: ET.Element) -> None:
|
||||
"""Process the thumbnail for BambuLab variant."""
|
||||
# Write thumbnail
|
||||
archive.writestr(zipfile.ZipInfo(THUMBNAIL_PATH_MULTIPLATE), thumbnail_buffer.data())
|
||||
|
||||
# Add relations elements for thumbnails
|
||||
ET.SubElement(relations_element, "Relationship",
|
||||
Target="/" + THUMBNAIL_PATH_MULTIPLATE, Id="rel-2",
|
||||
pe="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail")
|
||||
|
||||
ET.SubElement(relations_element, "Relationship",
|
||||
Target="/" + THUMBNAIL_PATH_MULTIPLATE, Id="rel-4",
|
||||
Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-middle")
|
||||
|
||||
# Create and save small thumbnail
|
||||
small_snapshot = snapshot.scaled(128, 128, transformMode=Qt.TransformationMode.SmoothTransformation)
|
||||
small_thumbnail_buffer = QBuffer()
|
||||
small_thumbnail_buffer.open(QBuffer.OpenModeFlag.ReadWrite)
|
||||
small_snapshot.save(small_thumbnail_buffer, "PNG")
|
||||
|
||||
# Write small thumbnail
|
||||
archive.writestr(zipfile.ZipInfo(THUMBNAIL_PATH_MULTIPLATE_SMALL), small_thumbnail_buffer.data())
|
||||
|
||||
# Add relation for small thumbnail
|
||||
ET.SubElement(relations_element, "Relationship",
|
||||
Target="/" + THUMBNAIL_PATH_MULTIPLATE_SMALL, Id="rel-5",
|
||||
Type="http://schemas.bambulab.com/package/2021/cover-thumbnail-small")
|
||||
|
||||
def add_extra_files(self, archive: zipfile.ZipFile, metadata_relations_element: ET.Element) -> None:
|
||||
"""Add BambuLab specific files to the archive."""
|
||||
self._storeGCode(archive, metadata_relations_element)
|
||||
self._storeModelSettings(archive)
|
||||
self._storePlateDesc(archive)
|
||||
self._storeSliceInfo(archive)
|
||||
self._storeProjectSettings(archive)
|
||||
|
||||
def _storeGCode(self, archive: zipfile.ZipFile, metadata_relations_element: ET.Element):
|
||||
"""Store GCode data in the archive."""
|
||||
gcode_textio = StringIO()
|
||||
gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter"))
|
||||
success = gcode_writer.write(gcode_textio, None)
|
||||
|
||||
if not success:
|
||||
error_msg = catalog.i18nc("@info:error", "Can't write GCode to 3MF file")
|
||||
self._writer.setInformation(error_msg)
|
||||
Logger.error(error_msg)
|
||||
raise Exception(error_msg)
|
||||
|
||||
gcode_data = gcode_textio.getvalue().encode("UTF-8")
|
||||
archive.writestr(zipfile.ZipInfo(GCODE_PATH), gcode_data)
|
||||
|
||||
gcode_relation_element = ET.SubElement(metadata_relations_element, "Relationship",
|
||||
Target=f"/{GCODE_PATH}", Id="rel-1",
|
||||
Type="http://schemas.bambulab.com/package/2021/gcode")
|
||||
|
||||
# Calculate and store the MD5 sum of the gcode data
|
||||
md5_hash = hashlib.md5(gcode_data).hexdigest()
|
||||
archive.writestr(zipfile.ZipInfo(GCODE_MD5_PATH), md5_hash.encode("UTF-8"))
|
||||
|
||||
def _storeModelSettings(self, archive: zipfile.ZipFile):
|
||||
"""Store model settings in the archive."""
|
||||
config = ET.Element("config")
|
||||
plate = ET.SubElement(config, "plate")
|
||||
ET.SubElement(plate, "metadata", key="plater_id", value="1")
|
||||
ET.SubElement(plate, "metadata", key="plater_name", value="")
|
||||
ET.SubElement(plate, "metadata", key="locked", value="false")
|
||||
ET.SubElement(plate, "metadata", key="filament_map_mode", value="Auto For Flush")
|
||||
extruders_count = len(CuraApplication.getInstance().getExtruderManager().extruderIds)
|
||||
ET.SubElement(plate, "metadata", key="filament_maps", value=" ".join("1" for _ in range(extruders_count)))
|
||||
ET.SubElement(plate, "metadata", key="gcode_file", value=GCODE_PATH)
|
||||
ET.SubElement(plate, "metadata", key="thumbnail_file", value=THUMBNAIL_PATH_MULTIPLATE)
|
||||
ET.SubElement(plate, "metadata", key="pattern_bbox_file", value=PLATE_DESC_PATH)
|
||||
|
||||
self._writer._storeElementTree(archive, MODEL_SETTINGS_PATH, config)
|
||||
|
||||
def _storePlateDesc(self, archive: zipfile.ZipFile):
|
||||
"""Store plate description in the archive."""
|
||||
plate_desc = {}
|
||||
|
||||
filament_ids = []
|
||||
filament_colors = []
|
||||
|
||||
for extruder in CuraApplication.getInstance().getExtruderManager().getUsedExtruderStacks():
|
||||
filament_ids.append(extruder.getValue("extruder_nr"))
|
||||
filament_colors.append(self._writer._getMaterialColor(extruder))
|
||||
|
||||
plate_desc["filament_ids"] = filament_ids
|
||||
plate_desc["filament_colors"] = filament_colors
|
||||
plate_desc["first_extruder"] = CuraApplication.getInstance().getExtruderManager().getInitialExtruderNr()
|
||||
plate_desc["is_seq_print"] = Application.getInstance().getGlobalContainerStack().getValue("print_sequence") == "one_at_a_time"
|
||||
plate_desc["nozzle_diameter"] = CuraApplication.getInstance().getExtruderManager().getActiveExtruderStack().getValue("machine_nozzle_size")
|
||||
plate_desc["version"] = 2
|
||||
|
||||
file = zipfile.ZipInfo(PLATE_DESC_PATH)
|
||||
file.compress_type = zipfile.ZIP_DEFLATED
|
||||
archive.writestr(file, json.dumps(plate_desc).encode("UTF-8"))
|
||||
|
||||
def _storeSliceInfo(self, archive: zipfile.ZipFile):
|
||||
"""Store slice information in the archive."""
|
||||
config = ET.Element("config")
|
||||
|
||||
header = ET.SubElement(config, "header")
|
||||
ET.SubElement(header, "header_item", key="X-BBL-Client-Type", value="slicer")
|
||||
ET.SubElement(header, "header_item", key="X-BBL-Client-Version", value="02.00.01.50")
|
||||
|
||||
plate = ET.SubElement(config, "plate")
|
||||
ET.SubElement(plate, "metadata", key="index", value="1")
|
||||
ET.SubElement(plate,
|
||||
"metadata",
|
||||
key="nozzle_diameters",
|
||||
value=str(CuraApplication.getInstance().getExtruderManager().getActiveExtruderStack().getValue("machine_nozzle_size")))
|
||||
|
||||
print_information = CuraApplication.getInstance().getPrintInformation()
|
||||
for index, extruder in enumerate(Application.getInstance().getGlobalContainerStack().extruderList):
|
||||
used_m = print_information.materialLengths[index]
|
||||
used_g = print_information.materialWeights[index]
|
||||
if used_m > 0.0 and used_g > 0.0:
|
||||
ET.SubElement(plate,
|
||||
"filament",
|
||||
id=str(extruder.getValue("extruder_nr") + 1),
|
||||
tray_info_idx="GFA00",
|
||||
type=extruder.material.getMetaDataEntry("material", ""),
|
||||
color=self._writer._getMaterialColor(extruder),
|
||||
used_m=str(used_m),
|
||||
used_g=str(used_g))
|
||||
|
||||
self._writer._storeElementTree(archive, SLICE_INFO_PATH, config)
|
||||
|
||||
def _storeProjectSettings(self, archive: zipfile.ZipFile):
|
||||
api = CuraApplication.getInstance().getCuraAPI()
|
||||
file = zipfile.ZipInfo(PROJECT_SETTINGS_PATH)
|
||||
json_string = json.dumps(api.interface.settings.getAllGlobalSettings(), separators=(", ", ": "), indent=4)
|
||||
archive.writestr(file, json_string.encode("UTF-8"))
|
||||
33
plugins/3MFWriter/Cura3mfVariant.py
Normal file
33
plugins/3MFWriter/Cura3mfVariant.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
from PyQt6.QtCore import QBuffer
|
||||
from PyQt6.QtGui import QImage
|
||||
|
||||
from .ThreeMFVariant import ThreeMFVariant
|
||||
|
||||
# Standard 3MF paths
|
||||
METADATA_PATH = "Metadata"
|
||||
THUMBNAIL_PATH = f"{METADATA_PATH}/thumbnail.png"
|
||||
|
||||
class Cura3mfVariant(ThreeMFVariant):
|
||||
"""Default implementation of the 3MF format."""
|
||||
|
||||
@property
|
||||
def mime_type(self) -> str:
|
||||
return "application/vnd.ms-package.3dmanufacturing-3dmodel+xml"
|
||||
|
||||
def process_thumbnail(self, snapshot: QImage, thumbnail_buffer: QBuffer,
|
||||
archive: zipfile.ZipFile, relations_element: ET.Element) -> None:
|
||||
"""Process the thumbnail for default 3MF variant."""
|
||||
thumbnail_file = zipfile.ZipInfo(THUMBNAIL_PATH)
|
||||
# Don't try to compress snapshot file, because the PNG is pretty much as compact as it will get
|
||||
archive.writestr(thumbnail_file, thumbnail_buffer.data())
|
||||
|
||||
# Add thumbnail relation to _rels/.rels file
|
||||
ET.SubElement(relations_element, "Relationship",
|
||||
Target="/" + THUMBNAIL_PATH, Id="rel1",
|
||||
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail")
|
||||
74
plugins/3MFWriter/ThreeMFVariant.py
Normal file
74
plugins/3MFWriter/ThreeMFVariant.py
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import TYPE_CHECKING
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
from PyQt6.QtGui import QImage
|
||||
from PyQt6.QtCore import QBuffer
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .ThreeMFWriter import ThreeMFWriter
|
||||
|
||||
class ThreeMFVariant(ABC):
|
||||
"""Base class for 3MF format variants.
|
||||
|
||||
Different vendors may have their own extensions to the 3MF format,
|
||||
such as BambuLab's 3MF variant. This class provides an interface
|
||||
for implementing these variants.
|
||||
"""
|
||||
|
||||
def __init__(self, writer: 'ThreeMFWriter'):
|
||||
"""
|
||||
:param writer: The ThreeMFWriter instance that will use this variant
|
||||
"""
|
||||
self._writer = writer
|
||||
|
||||
@property
|
||||
@abstractmethod
|
||||
def mime_type(self) -> str:
|
||||
"""The MIME type for this 3MF variant."""
|
||||
pass
|
||||
|
||||
def handles_mime_type(self, mime_type: str) -> bool:
|
||||
"""Check if this variant handles the given MIME type.
|
||||
|
||||
:param mime_type: The MIME type to check
|
||||
:return: True if this variant handles the MIME type, False otherwise
|
||||
"""
|
||||
return mime_type == self.mime_type
|
||||
|
||||
def prepare_content_types(self, content_types: ET.Element) -> None:
|
||||
"""Prepare the content types XML element for this variant.
|
||||
|
||||
:param content_types: The content types XML element
|
||||
"""
|
||||
pass
|
||||
|
||||
def prepare_relations(self, relations_element: ET.Element) -> None:
|
||||
"""Prepare the relations XML element for this variant.
|
||||
|
||||
:param relations_element: The relations XML element
|
||||
"""
|
||||
pass
|
||||
|
||||
def process_thumbnail(self, snapshot: QImage, thumbnail_buffer: QBuffer,
|
||||
archive: zipfile.ZipFile, relations_element: ET.Element) -> None:
|
||||
"""Process the thumbnail for this variant.
|
||||
|
||||
:param snapshot: The snapshot image
|
||||
:param thumbnail_buffer: Buffer containing the thumbnail data
|
||||
:param archive: The zip archive to write to
|
||||
:param relations_element: The relations XML element
|
||||
"""
|
||||
pass
|
||||
|
||||
def add_extra_files(self, archive: zipfile.ZipFile, metadata_relations_element: ET.Element) -> None:
|
||||
"""Add any extra files required by this variant to the archive.
|
||||
|
||||
:param archive: The zip archive to write to
|
||||
:param metadata_relations_element: The metadata relations XML element
|
||||
"""
|
||||
pass
|
||||
|
|
@ -1,11 +1,13 @@
|
|||
# Copyright (c) 2015-2022 Ultimaker B.V.
|
||||
# Copyright (c) 2015-2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import json
|
||||
import re
|
||||
import threading
|
||||
|
||||
from typing import Optional, cast, List, Dict, Pattern, Set
|
||||
from typing import Optional, cast, List, Dict, Set
|
||||
|
||||
from UM.PluginRegistry import PluginRegistry
|
||||
from UM.Mesh.MeshWriter import MeshWriter
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Logger import Logger
|
||||
|
|
@ -19,7 +21,9 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
|
|||
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.CuraPackageManager import CuraPackageManager
|
||||
from cura.Machines.Models.ExtrudersModel import ExtrudersModel
|
||||
from cura.Settings import CuraContainerStack
|
||||
from cura.Settings.ExtruderStack import ExtruderStack
|
||||
from cura.Utils.Threading import call_on_qt_thread
|
||||
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||
from cura.Snapshot import Snapshot
|
||||
|
|
@ -45,11 +49,13 @@ import UM.Application
|
|||
|
||||
from .SettingsExportModel import SettingsExportModel
|
||||
from .SettingsExportGroup import SettingsExportGroup
|
||||
from .ThreeMFVariant import ThreeMFVariant
|
||||
from .Cura3mfVariant import Cura3mfVariant
|
||||
from .BambuLabVariant import BambuLabVariant
|
||||
|
||||
from UM.i18n import i18nCatalog
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
THUMBNAIL_PATH = "Metadata/thumbnail.png"
|
||||
MODEL_PATH = "3D/3dmodel.model"
|
||||
PACKAGE_METADATA_PATH = "Cura/packages.json"
|
||||
|
||||
|
|
@ -68,6 +74,12 @@ class ThreeMFWriter(MeshWriter):
|
|||
self._store_archive = False
|
||||
self._lock = threading.Lock()
|
||||
|
||||
# Register available variants
|
||||
self._variants = {
|
||||
Cura3mfVariant(self).mime_type: Cura3mfVariant,
|
||||
BambuLabVariant(self).mime_type: BambuLabVariant
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def _convertMatrixToString(matrix):
|
||||
result = ""
|
||||
|
|
@ -201,26 +213,48 @@ class ThreeMFWriter(MeshWriter):
|
|||
|
||||
painter.end()
|
||||
|
||||
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode, export_settings_model = None) -> bool:
|
||||
def _getVariant(self, mime_type: str) -> ThreeMFVariant:
|
||||
"""Get the appropriate variant for the given MIME type.
|
||||
|
||||
:param mime_type: The MIME type to get the variant for
|
||||
:return: An instance of the variant for the given MIME type
|
||||
"""
|
||||
variant_class = self._variants.get(mime_type, Cura3mfVariant)
|
||||
return variant_class(self)
|
||||
|
||||
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode, export_settings_model = None, **kwargs) -> bool:
|
||||
self._archive = None # Reset archive
|
||||
archive = zipfile.ZipFile(stream, "w", compression = zipfile.ZIP_DEFLATED)
|
||||
|
||||
# Determine which variant to use based on mime type in kwargs
|
||||
mime_type = kwargs.get("mime_type", Cura3mfVariant(self).mime_type)
|
||||
variant = self._getVariant(mime_type)
|
||||
|
||||
try:
|
||||
model_file = zipfile.ZipInfo(MODEL_PATH)
|
||||
# Because zipfile is stupid and ignores archive-level compression settings when writing with ZipInfo.
|
||||
model_file.compress_type = zipfile.ZIP_DEFLATED
|
||||
|
||||
# Create content types file
|
||||
content_types_file = zipfile.ZipInfo("[Content_Types].xml")
|
||||
content_types_file.compress_type = zipfile.ZIP_DEFLATED
|
||||
content_types = ET.Element("Types", xmlns = self._namespaces["content-types"])
|
||||
rels_type = ET.SubElement(content_types, "Default", Extension = "rels", ContentType = "application/vnd.openxmlformats-package.relationships+xml")
|
||||
model_type = ET.SubElement(content_types, "Default", Extension = "model", ContentType = "application/vnd.ms-package.3dmanufacturing-3dmodel+xml")
|
||||
|
||||
# Create _rels/.rels file
|
||||
relations_file = zipfile.ZipInfo("_rels/.rels")
|
||||
relations_file.compress_type = zipfile.ZIP_DEFLATED
|
||||
relations_element = ET.Element("Relationships", xmlns = self._namespaces["relationships"])
|
||||
model_relation_element = ET.SubElement(relations_element, "Relationship", Target = "/" + MODEL_PATH, Id = "rel0", Type = "http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel")
|
||||
relations_element = self._makeRelationsTree()
|
||||
model_relation_element = ET.SubElement(relations_element, "Relationship", Target="/" + MODEL_PATH,
|
||||
Id="rel0",
|
||||
Type="http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel")
|
||||
|
||||
# Create Metadata/_rels/model_settings.config.rels
|
||||
metadata_relations_element = self._makeRelationsTree()
|
||||
|
||||
# Let the variant add its specific files
|
||||
variant.add_extra_files(archive, metadata_relations_element)
|
||||
|
||||
# Let the variant prepare content types and relations
|
||||
variant.prepare_content_types(content_types)
|
||||
variant.prepare_relations(relations_element)
|
||||
|
||||
# Attempt to add a thumbnail
|
||||
snapshot = self._createSnapshot()
|
||||
|
|
@ -233,16 +267,11 @@ class ThreeMFWriter(MeshWriter):
|
|||
thumbnail_buffer.open(QBuffer.OpenModeFlag.ReadWrite)
|
||||
snapshot.save(thumbnail_buffer, "PNG")
|
||||
|
||||
thumbnail_file = zipfile.ZipInfo(THUMBNAIL_PATH)
|
||||
# Don't try to compress snapshot file, because the PNG is pretty much as compact as it will get
|
||||
archive.writestr(thumbnail_file, thumbnail_buffer.data())
|
||||
|
||||
# Add PNG to content types file
|
||||
thumbnail_type = ET.SubElement(content_types, "Default", Extension="png", ContentType="image/png")
|
||||
# Add thumbnail relation to _rels/.rels file
|
||||
thumbnail_relation_element = ET.SubElement(relations_element, "Relationship",
|
||||
Target="/" + THUMBNAIL_PATH, Id="rel1",
|
||||
Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail")
|
||||
|
||||
# Let the variant process the thumbnail
|
||||
variant.process_thumbnail(snapshot, thumbnail_buffer, archive, relations_element)
|
||||
|
||||
# Write material metadata
|
||||
packages_metadata = self._getMaterialPackageMetadata() + self._getPluginPackageMetadata()
|
||||
|
|
@ -305,8 +334,10 @@ class ThreeMFWriter(MeshWriter):
|
|||
scene_string = parser.sceneToString(savitar_scene)
|
||||
|
||||
archive.writestr(model_file, scene_string)
|
||||
archive.writestr(content_types_file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(content_types))
|
||||
archive.writestr(relations_file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(relations_element))
|
||||
self._storeElementTree(archive, "[Content_Types].xml", content_types)
|
||||
self._storeElementTree(archive, "_rels/.rels", relations_element)
|
||||
if len(metadata_relations_element) > 0:
|
||||
self._storeElementTree(archive, "Metadata/_rels/model_settings.config.rels", metadata_relations_element)
|
||||
except Exception as error:
|
||||
Logger.logException("e", "Error writing zip file")
|
||||
self.setInformation(str(error))
|
||||
|
|
@ -319,6 +350,25 @@ class ThreeMFWriter(MeshWriter):
|
|||
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def _storeElementTree(archive: zipfile.ZipFile, file_path: str, root_element: ET.Element):
|
||||
file = zipfile.ZipInfo(file_path)
|
||||
file.compress_type = zipfile.ZIP_DEFLATED
|
||||
archive.writestr(file, b'<?xml version="1.0" encoding="UTF-8"?> \n' + ET.tostring(root_element))
|
||||
|
||||
def _makeRelationsTree(self):
|
||||
return ET.Element("Relationships", xmlns=self._namespaces["relationships"])
|
||||
|
||||
@staticmethod
|
||||
def _getMaterialColor(extruder: "ExtruderStack") -> str:
|
||||
position = int(extruder.getMetaDataEntry("position", default="0"))
|
||||
try:
|
||||
default_color = ExtrudersModel.defaultColors[position]
|
||||
except IndexError:
|
||||
default_color = "#e0e000"
|
||||
color_code = extruder.material.getMetaDataEntry("color_code", default=default_color)
|
||||
return color_code.upper()
|
||||
|
||||
@staticmethod
|
||||
def _storeMetadataJson(metadata: Dict[str, List[Dict[str, str]]], archive: zipfile.ZipFile, path: str) -> None:
|
||||
"""Stores metadata inside archive path as json file"""
|
||||
|
|
|
|||
|
|
@ -28,11 +28,17 @@ def getMetaData():
|
|||
metaData["mesh_writer"] = {
|
||||
"output": [
|
||||
{
|
||||
"extension": "3mf",
|
||||
"extension": workspace_extension,
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "3MF file"),
|
||||
"mime_type": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml",
|
||||
"mode": ThreeMFWriter.ThreeMFWriter.OutputMode.BinaryMode
|
||||
},
|
||||
{
|
||||
"extension": f"gcode.{workspace_extension}",
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "BambuLab 3MF file"),
|
||||
"mime_type": "application/vnd.bambulab-package.3dmanufacturing-3dmodel+xml",
|
||||
"mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode
|
||||
}
|
||||
]
|
||||
}
|
||||
metaData["workspace_writer"] = {
|
||||
|
|
@ -44,7 +50,7 @@ def getMetaData():
|
|||
"mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode
|
||||
},
|
||||
{
|
||||
"extension": "3mf",
|
||||
"extension": workspace_extension,
|
||||
"description": i18n_catalog.i18nc("@item:inlistbox", "Universal Cura Project"),
|
||||
"mime_type": "application/x-ucp",
|
||||
"mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Copyright (c) 2020 Ultimaker B.V.
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
import json
|
||||
import threading
|
||||
|
|
@ -13,11 +13,14 @@ from UM.Message import Message
|
|||
from UM.TaskManagement.HttpRequestManager import HttpRequestManager
|
||||
from UM.TaskManagement.HttpRequestScope import JsonDecoratorScope
|
||||
from UM.i18n import i18nCatalog
|
||||
from cura.ApplicationMetadata import CuraSDKVersion
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
|
||||
import cura.UltimakerCloud.UltimakerCloudConstants as UltimakerCloudConstants
|
||||
|
||||
catalog = i18nCatalog("cura")
|
||||
|
||||
PACKAGES_URL = f"{UltimakerCloudConstants.CuraCloudAPIRoot}/cura-packages/v{UltimakerCloudConstants.CuraCloudAPIVersion}/cura/v{CuraSDKVersion}/packages"
|
||||
|
||||
class CreateBackupJob(Job):
|
||||
"""Creates backup zip, requests upload url and uploads the backup file to cloud storage."""
|
||||
|
|
@ -40,23 +43,54 @@ class CreateBackupJob(Job):
|
|||
self._job_done = threading.Event()
|
||||
"""Set when the job completes. Does not indicate success."""
|
||||
self.backup_upload_error_message = ""
|
||||
"""After the job completes, an empty string indicates success. Othrerwise, the value is a translated message."""
|
||||
"""After the job completes, an empty string indicates success. Otherwise, the value is a translated message."""
|
||||
|
||||
def _setPluginFetchErrorMessage(self, error_msg: str) -> None:
|
||||
Logger.error(f"Fetching plugins for backup resulted in error: {error_msg}")
|
||||
self.backup_upload_error_message = "Couldn't update currently available plugins, backup stopped."
|
||||
self._upload_message.hide()
|
||||
self._job_done.set()
|
||||
|
||||
def run(self) -> None:
|
||||
upload_message = Message(catalog.i18nc("@info:backup_status", "Creating your backup..."),
|
||||
self._upload_message = Message(catalog.i18nc("@info:backup_status", "Fetch re-downloadable package-ids..."),
|
||||
title = self.MESSAGE_TITLE,
|
||||
progress = -1)
|
||||
upload_message.show()
|
||||
self._upload_message.show()
|
||||
CuraApplication.getInstance().processEvents()
|
||||
|
||||
if CuraApplication.getInstance().getCuraAPI().backups.shouldReinstallDownloadablePlugins():
|
||||
request_url = f"{PACKAGES_URL}?package_type=plugin"
|
||||
scope = JsonDecoratorScope(UltimakerCloudScope(CuraApplication.getInstance()))
|
||||
HttpRequestManager.getInstance().get(
|
||||
request_url,
|
||||
scope=scope,
|
||||
callback=self._continueRun,
|
||||
error_callback=lambda reply, error: self._setPluginFetchErrorMessage(str(error)),
|
||||
)
|
||||
else:
|
||||
self._continueRun()
|
||||
|
||||
def _continueRun(self, reply: "QNetworkReply" = None) -> None:
|
||||
if reply is not None:
|
||||
response_data = HttpRequestManager.readJSON(reply)
|
||||
if "data" not in response_data:
|
||||
self._setPluginFetchErrorMessage(f"Missing 'data' from response. Keys in response: {response_data.keys()}")
|
||||
return
|
||||
available_remote_plugins = frozenset({v["package_id"] for v in response_data["data"]})
|
||||
else:
|
||||
available_remote_plugins = frozenset()
|
||||
|
||||
self._upload_message.setText(catalog.i18nc("@info:backup_status", "Creating your backup..."))
|
||||
CuraApplication.getInstance().processEvents()
|
||||
cura_api = CuraApplication.getInstance().getCuraAPI()
|
||||
self._backup_zip, backup_meta_data = cura_api.backups.createBackup()
|
||||
self._backup_zip, backup_meta_data = cura_api.backups.createBackup(available_remote_plugins)
|
||||
|
||||
if not self._backup_zip or not backup_meta_data:
|
||||
self.backup_upload_error_message = catalog.i18nc("@info:backup_status", "There was an error while creating your backup.")
|
||||
upload_message.hide()
|
||||
self._upload_message.hide()
|
||||
return
|
||||
|
||||
upload_message.setText(catalog.i18nc("@info:backup_status", "Uploading your backup..."))
|
||||
self._upload_message.setText(catalog.i18nc("@info:backup_status", "Uploading your backup..."))
|
||||
CuraApplication.getInstance().processEvents()
|
||||
|
||||
# Create an upload entry for the backup.
|
||||
|
|
@ -64,13 +98,18 @@ class CreateBackupJob(Job):
|
|||
backup_meta_data["description"] = "{}.backup.{}.cura.zip".format(timestamp, backup_meta_data["cura_release"])
|
||||
self._requestUploadSlot(backup_meta_data, len(self._backup_zip))
|
||||
|
||||
self._job_done.wait()
|
||||
# Note: One 'process events' call wasn't enough with the changed situation somehow.
|
||||
for _ in range(5000):
|
||||
CuraApplication.getInstance().processEvents()
|
||||
if self._job_done.wait(0.02):
|
||||
break
|
||||
|
||||
if self.backup_upload_error_message == "":
|
||||
upload_message.setText(catalog.i18nc("@info:backup_status", "Your backup has finished uploading."))
|
||||
upload_message.setProgress(None) # Hide progress bar
|
||||
self._upload_message.setText(catalog.i18nc("@info:backup_status", "Your backup has finished uploading."))
|
||||
self._upload_message.setProgress(None) # Hide progress bar
|
||||
else:
|
||||
# some error occurred. This error is presented to the user by DrivePluginExtension
|
||||
upload_message.hide()
|
||||
self._upload_message.hide()
|
||||
|
||||
def _requestUploadSlot(self, backup_metadata: Dict[str, Any], backup_size: int) -> None:
|
||||
"""Request a backup upload slot from the API.
|
||||
|
|
@ -83,7 +122,6 @@ class CreateBackupJob(Job):
|
|||
"metadata": backup_metadata
|
||||
}
|
||||
}).encode()
|
||||
|
||||
HttpRequestManager.getInstance().put(
|
||||
self._api_backup_url,
|
||||
data = payload,
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
# Copyright (c) 2021 Ultimaker B.V.
|
||||
# Copyright (c) 2025 UltiMaker
|
||||
# Cura is released under the terms of the LGPLv3 or higher.
|
||||
|
||||
import base64
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import threading
|
||||
from tempfile import NamedTemporaryFile
|
||||
from typing import Optional, Any, Dict
|
||||
|
|
@ -12,9 +13,16 @@ from PyQt6.QtNetwork import QNetworkReply, QNetworkRequest
|
|||
from UM.Job import Job
|
||||
from UM.Logger import Logger
|
||||
from UM.PackageManager import catalog
|
||||
from UM.Resources import Resources
|
||||
from UM.TaskManagement.HttpRequestManager import HttpRequestManager
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from UM.Version import Version
|
||||
|
||||
from cura.ApplicationMetadata import CuraSDKVersion
|
||||
from cura.CuraApplication import CuraApplication
|
||||
from cura.UltimakerCloud.UltimakerCloudScope import UltimakerCloudScope
|
||||
import cura.UltimakerCloud.UltimakerCloudConstants as UltimakerCloudConstants
|
||||
|
||||
PACKAGES_URL_TEMPLATE = f"{UltimakerCloudConstants.CuraCloudAPIRoot}/cura-packages/v{UltimakerCloudConstants.CuraCloudAPIVersion}/cura/v{{0}}/packages/{{1}}/download"
|
||||
|
||||
class RestoreBackupJob(Job):
|
||||
"""Downloads a backup and overwrites local configuration with the backup.
|
||||
|
|
@ -38,7 +46,6 @@ class RestoreBackupJob(Job):
|
|||
self.restore_backup_error_message = ""
|
||||
|
||||
def run(self) -> None:
|
||||
|
||||
url = self._backup.get("download_url")
|
||||
assert url is not None
|
||||
|
||||
|
|
@ -48,7 +55,11 @@ class RestoreBackupJob(Job):
|
|||
error_callback = self._onRestoreRequestCompleted
|
||||
)
|
||||
|
||||
self._job_done.wait() # A job is considered finished when the run function completes
|
||||
# Note: Just to be sure, use the same structure here as in CreateBackupJob.
|
||||
for _ in range(5000):
|
||||
CuraApplication.getInstance().processEvents()
|
||||
if self._job_done.wait(0.02):
|
||||
break
|
||||
|
||||
def _onRestoreRequestCompleted(self, reply: QNetworkReply, error: Optional["QNetworkReply.NetworkError"] = None) -> None:
|
||||
if not HttpRequestManager.replyIndicatesSuccess(reply, error):
|
||||
|
|
@ -60,8 +71,8 @@ class RestoreBackupJob(Job):
|
|||
|
||||
# We store the file in a temporary path fist to ensure integrity.
|
||||
try:
|
||||
temporary_backup_file = NamedTemporaryFile(delete = False)
|
||||
with open(temporary_backup_file.name, "wb") as write_backup:
|
||||
self._temporary_backup_file = NamedTemporaryFile(delete_on_close = False)
|
||||
with open(self._temporary_backup_file.name, "wb") as write_backup:
|
||||
app = CuraApplication.getInstance()
|
||||
bytes_read = reply.read(self.DISK_WRITE_BUFFER_SIZE)
|
||||
while bytes_read:
|
||||
|
|
@ -69,23 +80,98 @@ class RestoreBackupJob(Job):
|
|||
bytes_read = reply.read(self.DISK_WRITE_BUFFER_SIZE)
|
||||
app.processEvents()
|
||||
except EnvironmentError as e:
|
||||
Logger.log("e", f"Unable to save backed up files due to computer limitations: {str(e)}")
|
||||
Logger.error(f"Unable to save backed up files due to computer limitations: {str(e)}")
|
||||
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
|
||||
self._job_done.set()
|
||||
return
|
||||
|
||||
if not self._verifyMd5Hash(temporary_backup_file.name, self._backup.get("md5_hash", "")):
|
||||
if not self._verifyMd5Hash(self._temporary_backup_file.name, self._backup.get("md5_hash", "")):
|
||||
# Don't restore the backup if the MD5 hashes do not match.
|
||||
# This can happen if the download was interrupted.
|
||||
Logger.log("w", "Remote and local MD5 hashes do not match, not restoring backup.")
|
||||
Logger.error("Remote and local MD5 hashes do not match, not restoring backup.")
|
||||
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
|
||||
self._job_done.set()
|
||||
return
|
||||
|
||||
# Tell Cura to place the backup back in the user data folder.
|
||||
with open(temporary_backup_file.name, "rb") as read_backup:
|
||||
metadata = self._backup.get("metadata", {})
|
||||
with open(self._temporary_backup_file.name, "rb") as read_backup:
|
||||
cura_api = CuraApplication.getInstance().getCuraAPI()
|
||||
cura_api.backups.restoreBackup(read_backup.read(), self._backup.get("metadata", {}))
|
||||
cura_api.backups.restoreBackup(read_backup.read(), metadata, auto_close=False)
|
||||
|
||||
self._job_done.set()
|
||||
# Read packages data-file, to get the 'to_install' plugin-ids.
|
||||
version_to_restore = Version(metadata.get("cura_release", "dev"))
|
||||
version_str = f"{version_to_restore.getMajor()}.{version_to_restore.getMinor()}"
|
||||
packages_path = os.path.abspath(os.path.join(os.path.abspath(
|
||||
Resources.getConfigStoragePath()), "..", version_str, "packages.json"))
|
||||
if not os.path.exists(packages_path):
|
||||
Logger.error(f"Can't find path '{packages_path}' to tell what packages should be redownloaded.")
|
||||
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
|
||||
self._job_done.set()
|
||||
return
|
||||
|
||||
to_install = {}
|
||||
try:
|
||||
with open(packages_path, "r") as packages_file:
|
||||
packages_json = json.load(packages_file)
|
||||
if "to_install" in packages_json:
|
||||
for package_data in packages_json["to_install"].values():
|
||||
if "package_info" not in package_data:
|
||||
continue
|
||||
package_info = package_data["package_info"]
|
||||
if "package_id" in package_info and "sdk_version_semver" in package_info:
|
||||
to_install[package_info["package_id"]] = package_info["sdk_version_semver"]
|
||||
except IOError as ex:
|
||||
Logger.error(f"Couldn't open '{packages_path}' because '{str(ex)}' to get packages to re-install.")
|
||||
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
|
||||
self._job_done.set()
|
||||
return
|
||||
|
||||
if len(to_install) < 1:
|
||||
Logger.info("No packages to reinstall, early out.")
|
||||
self._job_done.set()
|
||||
return
|
||||
|
||||
# Download all re-installable plugins packages, so they can be put back on start-up.
|
||||
redownload_errors = []
|
||||
def packageDownloadCallback(package_id: str, msg: "QNetworkReply", err: "QNetworkReply.NetworkError" = None) -> None:
|
||||
if err is not None or HttpRequestManager.safeHttpStatus(msg) != 200:
|
||||
redownload_errors.append(err)
|
||||
del to_install[package_id]
|
||||
|
||||
try:
|
||||
with NamedTemporaryFile(mode="wb", suffix=".curapackage", delete=False) as temp_file:
|
||||
bytes_read = msg.read(self.DISK_WRITE_BUFFER_SIZE)
|
||||
while bytes_read:
|
||||
temp_file.write(bytes_read)
|
||||
bytes_read = msg.read(self.DISK_WRITE_BUFFER_SIZE)
|
||||
CuraApplication.getInstance().processEvents()
|
||||
temp_file.close()
|
||||
if not CuraApplication.getInstance().getPackageManager().installPackage(temp_file.name):
|
||||
redownload_errors.append(f"Couldn't install package '{package_id}'.")
|
||||
except IOError as ex:
|
||||
redownload_errors.append(f"Couldn't process package '{package_id}' because '{ex}'.")
|
||||
|
||||
if len(to_install) < 1:
|
||||
if len(redownload_errors) == 0:
|
||||
Logger.info("All packages redownloaded!")
|
||||
self._job_done.set()
|
||||
else:
|
||||
msgs = "\n - ".join(redownload_errors)
|
||||
Logger.error(f"Couldn't re-install at least one package(s) because: {msgs}")
|
||||
self.restore_backup_error_message = self.DEFAULT_ERROR_MESSAGE
|
||||
self._job_done.set()
|
||||
|
||||
self._package_download_scope = UltimakerCloudScope(CuraApplication.getInstance())
|
||||
for package_id, package_api_version in to_install.items():
|
||||
def handlePackageId(package_id: str = package_id):
|
||||
HttpRequestManager.getInstance().get(
|
||||
PACKAGES_URL_TEMPLATE.format(package_api_version, package_id),
|
||||
scope=self._package_download_scope,
|
||||
callback=lambda msg: packageDownloadCallback(package_id, msg),
|
||||
error_callback=lambda msg, err: packageDownloadCallback(package_id, msg, err)
|
||||
)
|
||||
handlePackageId(package_id)
|
||||
|
||||
@staticmethod
|
||||
def _verifyMd5Hash(file_path: str, known_hash: str) -> bool:
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class GCodeGzWriter(MeshWriter):
|
|||
def __init__(self) -> None:
|
||||
super().__init__(add_to_recent_files = False)
|
||||
|
||||
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode = MeshWriter.OutputMode.BinaryMode) -> bool:
|
||||
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode = MeshWriter.OutputMode.BinaryMode, **kwargs) -> bool:
|
||||
"""Writes the gzipped g-code to a stream.
|
||||
|
||||
Note that even though the function accepts a collection of nodes, the
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ class GCodeWriter(MeshWriter):
|
|||
|
||||
self._application = Application.getInstance()
|
||||
|
||||
def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode):
|
||||
def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode, **kwargs):
|
||||
"""Writes the g-code for the entire scene to a stream.
|
||||
|
||||
Note that even though the function accepts a collection of nodes, the
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ class MakerbotWriter(MeshWriter):
|
|||
|
||||
return None
|
||||
|
||||
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode) -> bool:
|
||||
def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode=MeshWriter.OutputMode.BinaryMode, **kwargs) -> bool:
|
||||
metadata, file_format = self._getMeta(nodes)
|
||||
if mode != MeshWriter.OutputMode.BinaryMode:
|
||||
Logger.log("e", "MakerbotWriter does not support text mode.")
|
||||
|
|
|
|||
|
|
@ -496,7 +496,7 @@ class PurgeLinesAndUnload(Script):
|
|||
"""Generates G-code lines for prime blob adjustment."""
|
||||
gcode_lines = [
|
||||
f"G1 F{retract_speed} E{retract_distance} ; Unretract",
|
||||
"G92 E0 ; Reset extruder"
|
||||
"G92 E0 ; Reset extruder\n"
|
||||
]
|
||||
return "\n".join(gcode_lines)
|
||||
|
||||
|
|
|
|||
|
|
@ -101,7 +101,8 @@ class RemovableDriveOutputDevice(OutputDevice):
|
|||
self._stream = open(file_name, "wt", buffering = 1, encoding = "utf-8")
|
||||
else: #Binary mode.
|
||||
self._stream = open(file_name, "wb", buffering = 1)
|
||||
job = WriteFileJob(writer, self._stream, nodes, preferred_format["mode"])
|
||||
writer_args = {"mime_type": preferred_format["mime_type"]}
|
||||
job = WriteFileJob(writer, self._stream, nodes, preferred_format["mode"], writer_args)
|
||||
job.setFileName(file_name)
|
||||
job.progress.connect(self._onProgress)
|
||||
job.finished.connect(self._onFinished)
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ class UFPWriter(MeshWriter):
|
|||
# Qt thread. The File read/write operations right now are executed on separated threads because they are scheduled
|
||||
# by the Job class.
|
||||
@call_on_qt_thread
|
||||
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode):
|
||||
def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode, **kwargs):
|
||||
archive = VirtualFile()
|
||||
archive.openStream(stream, "application/x-ufp", OpenMode.WriteOnly)
|
||||
|
||||
|
|
|
|||
42
resources/definitions/bambulab_a1.def.json
Normal file
42
resources/definitions/bambulab_a1.def.json
Normal file
File diff suppressed because one or more lines are too long
42
resources/definitions/bambulab_a1mini.def.json
Normal file
42
resources/definitions/bambulab_a1mini.def.json
Normal file
File diff suppressed because one or more lines are too long
267
resources/definitions/bambulab_base.def.json
Normal file
267
resources/definitions/bambulab_base.def.json
Normal file
|
|
@ -0,0 +1,267 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "BambuLab base definition",
|
||||
"inherits": "fdmprinter",
|
||||
"metadata":
|
||||
{
|
||||
"visible": false,
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "BambuLab",
|
||||
"file_formats": "application/vnd.bambulab-package.3dmanufacturing-3dmodel+xml"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"acceleration_infill": { "value": "acceleration_print" },
|
||||
"acceleration_layer_0": { "value": 2000 },
|
||||
"acceleration_prime_tower": { "value": "acceleration_print" },
|
||||
"acceleration_print": { "value": 20000 },
|
||||
"acceleration_print_layer_0": { "value": "acceleration_layer_0" },
|
||||
"acceleration_roofing": { "value": "acceleration_wall_0" },
|
||||
"acceleration_skirt_brim": { "value": "acceleration_layer_0" },
|
||||
"acceleration_support": { "value": "acceleration_print" },
|
||||
"acceleration_support_bottom": { "value": "acceleration_support_interface" },
|
||||
"acceleration_support_infill": { "value": "acceleration_support" },
|
||||
"acceleration_support_interface": { "value": "acceleration_support" },
|
||||
"acceleration_support_roof": { "value": "acceleration_support_interface" },
|
||||
"acceleration_topbottom": { "value": "acceleration_print" },
|
||||
"acceleration_travel": { "value": 20000 },
|
||||
"acceleration_travel_enabled": { "value": true },
|
||||
"acceleration_travel_layer_0": { "value": "acceleration_layer_0" },
|
||||
"acceleration_wall": { "value": "acceleration_print/8" },
|
||||
"acceleration_wall_0": { "value": "acceleration_wall" },
|
||||
"acceleration_wall_0_roofing": { "value": "acceleration_wall_0" },
|
||||
"acceleration_wall_x": { "value": "acceleration_print" },
|
||||
"acceleration_wall_x_roofing": { "value": "acceleration_wall" },
|
||||
"adhesion_type": { "value": "'skirt'" },
|
||||
"bottom_thickness": { "value": 0.6 },
|
||||
"bridge_skin_speed":
|
||||
{
|
||||
"unit": "mm/s",
|
||||
"value": "bridge_wall_speed"
|
||||
},
|
||||
"bridge_sparse_infill_max_density": { "value": 50 },
|
||||
"bridge_wall_min_length": { "value": 10 },
|
||||
"bridge_wall_speed":
|
||||
{
|
||||
"unit": "mm/s",
|
||||
"value": 50
|
||||
},
|
||||
"cool_min_layer_time": { "value": 6 },
|
||||
"cool_min_speed": { "value": 6 },
|
||||
"cool_min_temperature": { "value": "material_print_temperature-15" },
|
||||
"default_material_print_temperature": { "maximum_value_warning": 320 },
|
||||
"extra_infill_lines_to_support_skins": { "value": "'walls_and_lines'" },
|
||||
"gradual_flow_enabled": { "value": false },
|
||||
"hole_xy_offset": { "value": 0.075 },
|
||||
"infill_overlap": { "value": 10 },
|
||||
"infill_pattern": { "value": "'zigzag' if infill_sparse_density > 80 else 'gyroid'" },
|
||||
"infill_sparse_density": { "value": 15 },
|
||||
"infill_wall_line_count": { "value": "1 if infill_sparse_density > 80 else 0" },
|
||||
"jerk_infill": { "value": "jerk_print" },
|
||||
"jerk_layer_0": { "value": "jerk_print/2" },
|
||||
"jerk_prime_tower": { "value": "jerk_print" },
|
||||
"jerk_print": { "value": "50" },
|
||||
"jerk_print_layer_0": { "value": "jerk_layer_0" },
|
||||
"jerk_roofing": { "value": "jerk_wall_0" },
|
||||
"jerk_skirt_brim": { "value": "jerk_layer_0" },
|
||||
"jerk_support": { "value": "jerk_print" },
|
||||
"jerk_support_bottom": { "value": "jerk_support_interface" },
|
||||
"jerk_support_infill": { "value": "jerk_support" },
|
||||
"jerk_support_interface": { "value": "jerk_support" },
|
||||
"jerk_support_roof": { "value": "jerk_support_interface" },
|
||||
"jerk_topbottom": { "value": "jerk_print" },
|
||||
"jerk_travel": { "value": 50 },
|
||||
"jerk_travel_enabled": { "value": true },
|
||||
"jerk_travel_layer_0": { "value": "jerk_travel" },
|
||||
"jerk_wall": { "value": "jerk_print/5" },
|
||||
"jerk_wall_0": { "value": "jerk_wall" },
|
||||
"jerk_wall_0_roofing": { "value": "jerk_wall_0" },
|
||||
"jerk_wall_x": { "value": "jerk_print" },
|
||||
"jerk_wall_x_roofing": { "value": "jerk_wall_0" },
|
||||
"line_width": { "value": 0.42 },
|
||||
"machine_acceleration": { "value": 10000 },
|
||||
"machine_buildplate_type":
|
||||
{
|
||||
"default_value": "textured_pei_plate",
|
||||
"options":
|
||||
{
|
||||
"cool_plate": "Cool Plate",
|
||||
"engineering_plate": "Engineering Plate",
|
||||
"high_temp_plate": "High Temp Plate",
|
||||
"textured_pei_plate": "Textured PEI Plate"
|
||||
}
|
||||
},
|
||||
"machine_center_is_zero": { "default_value": false },
|
||||
"machine_gcode_flavor": { "default_value": "BambuLab" },
|
||||
"machine_heated_bed": { "default_value": true },
|
||||
"machine_max_feedrate_e": { "value": 150 },
|
||||
"machine_max_feedrate_x": { "value": 500 },
|
||||
"machine_max_feedrate_y": { "value": 500 },
|
||||
"machine_max_feedrate_z": { "value": 15 },
|
||||
"machine_max_jerk_e": { "default_value": 100 },
|
||||
"machine_max_jerk_xy": { "default_value": 5000 },
|
||||
"machine_max_jerk_z": { "default_value": 100 },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 1.3 },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 1.9 },
|
||||
"machine_nozzle_size": { "default_value": 0.4 },
|
||||
"machine_show_variants": { "value": true },
|
||||
"machine_use_extruder_offset_to_offset_coords": { "value": false },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"material_flush_purge_length":
|
||||
{
|
||||
"default_value": 80,
|
||||
"enabled": "not prime_tower_enable"
|
||||
},
|
||||
"material_flush_purge_speed":
|
||||
{
|
||||
"default_value": 500,
|
||||
"enabled": "not prime_tower_enable"
|
||||
},
|
||||
"material_max_flowrate": { "enabled": true },
|
||||
"max_skin_angle_for_expansion": { "value": 45 },
|
||||
"meshfix_maximum_resolution": { "value": 0.4 },
|
||||
"min_infill_area": { "default_value": 10 },
|
||||
"optimize_wall_printing_order": { "value": false },
|
||||
"prime_tower_enable": { "default_value": true },
|
||||
"prime_tower_line_width": { "value": "1.5 * line_width" },
|
||||
"prime_tower_min_volume": { "default_value": 250 },
|
||||
"prime_tower_size": { "default_value": 40 },
|
||||
"relative_extrusion": { "value": true },
|
||||
"retraction_amount": { "value": 0.5 },
|
||||
"retraction_combing_max_distance": { "value": 100 },
|
||||
"retraction_extra_prime_amount": { "value": 0.12 },
|
||||
"retraction_hop": { "value": 0.2 },
|
||||
"retraction_hop_after_extruder_switch_height": { "value": 2 },
|
||||
"retraction_hop_enabled": { "value": true },
|
||||
"retraction_min_travel": { "value": "5 if support_enable and support_structure=='tree' else line_width * 2" },
|
||||
"retraction_prime_speed": { "value": 15 },
|
||||
"retraction_speed": { "value": 30 },
|
||||
"skin_edge_support_thickness": { "value": 0 },
|
||||
"skin_material_flow": { "value": 95 },
|
||||
"skin_overlap": { "value": 0 },
|
||||
"skin_preshrink": { "value": 0 },
|
||||
"skirt_brim_speed": { "maximum_value_warning": 500 },
|
||||
"skirt_line_count": { "value": 5 },
|
||||
"small_skin_on_surface": { "value": false },
|
||||
"small_skin_width": { "value": 4 },
|
||||
"speed_infill":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_print"
|
||||
},
|
||||
"speed_ironing":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": 20
|
||||
},
|
||||
"speed_layer_0":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_print/6"
|
||||
},
|
||||
"speed_prime_tower":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_wall"
|
||||
},
|
||||
"speed_print":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": 300
|
||||
},
|
||||
"speed_print_layer_0":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_layer_0"
|
||||
},
|
||||
"speed_roofing":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_wall"
|
||||
},
|
||||
"speed_support":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_wall_0"
|
||||
},
|
||||
"speed_support_bottom":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_support_interface"
|
||||
},
|
||||
"speed_support_infill":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_support"
|
||||
},
|
||||
"speed_support_interface":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": 50
|
||||
},
|
||||
"speed_support_roof":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_support_interface"
|
||||
},
|
||||
"speed_topbottom":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_print"
|
||||
},
|
||||
"speed_travel":
|
||||
{
|
||||
"maximum_value": 500,
|
||||
"value": 500
|
||||
},
|
||||
"speed_travel_layer_0":
|
||||
{
|
||||
"maximum_value": 500,
|
||||
"value": 150
|
||||
},
|
||||
"speed_wall":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_print*2/3"
|
||||
},
|
||||
"speed_wall_0":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_wall"
|
||||
},
|
||||
"speed_wall_0_roofing":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_wall"
|
||||
},
|
||||
"speed_wall_x":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_print"
|
||||
},
|
||||
"speed_wall_x_roofing":
|
||||
{
|
||||
"maximum_value_warning": 500,
|
||||
"value": "speed_wall"
|
||||
},
|
||||
"support_brim_line_count": { "value": 5 },
|
||||
"support_infill_rate": { "value": "80 if gradual_support_infill_steps != 0 else 15" },
|
||||
"support_pattern": { "value": "'gyroid'" },
|
||||
"support_structure": { "value": "'tree'" },
|
||||
"switch_extruder_retraction_amount": { "value": 5 },
|
||||
"travel_avoid_other_parts": { "value": false },
|
||||
"wall_0_acceleration": { "value": 1000 },
|
||||
"wall_0_deceleration": { "value": 1000 },
|
||||
"wall_0_end_speed_ratio": { "value": 100 },
|
||||
"wall_0_speed_split_distance": { "value": 0.2 },
|
||||
"wall_0_start_speed_ratio": { "value": 100 },
|
||||
"wall_0_wipe_dist": { "value": 0 },
|
||||
"wall_material_flow": { "value": 95 },
|
||||
"wall_overhang_angle": { "value": 10 },
|
||||
"wall_overhang_speed_factors": { "default_value": "[25,15,5,5]" },
|
||||
"wall_x_material_flow": { "value": 100 },
|
||||
"z_seam_corner": { "value": "'z_seam_corner_weighted'" },
|
||||
"z_seam_position": { "value": "'backright'" },
|
||||
"z_seam_type": { "value": "'sharpest_corner'" }
|
||||
}
|
||||
}
|
||||
58
resources/definitions/bambulab_x1.def.json
Normal file
58
resources/definitions/bambulab_x1.def.json
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -214,8 +214,8 @@
|
|||
},
|
||||
"machine_buildplate_type":
|
||||
{
|
||||
"label": "Build Plate Material",
|
||||
"description": "The material of the build plate installed on the printer.",
|
||||
"label": "Build Plate Type",
|
||||
"description": "The type of build plate installed on the printer.",
|
||||
"default_value": "glass",
|
||||
"type": "enum",
|
||||
"options":
|
||||
|
|
@ -388,7 +388,8 @@
|
|||
"Makerbot": "Makerbot",
|
||||
"BFB": "Bits from Bytes",
|
||||
"MACH3": "Mach3",
|
||||
"Repetier": "Repetier"
|
||||
"Repetier": "Repetier",
|
||||
"BambuLab": "BambuLab"
|
||||
},
|
||||
"default_value": "RepRap (Marlin/Sprinter)",
|
||||
"settable_per_mesh": false,
|
||||
|
|
@ -3376,6 +3377,20 @@
|
|||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": true,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"material_max_flowrate":
|
||||
{
|
||||
"default_value": 16,
|
||||
"description": "Maximum flow rate that the printer can extrude for the material",
|
||||
"enabled": false,
|
||||
"label": "Material Maximum Flow Rate",
|
||||
"maximum_value": "machine_max_feedrate_e * (material_diameter/2)**2 * math.pi",
|
||||
"minimum_value": "0",
|
||||
"settable_per_extruder": true,
|
||||
"settable_per_mesh": false,
|
||||
"type": "float",
|
||||
"unit": "mm\u00b3/s",
|
||||
"value": "16"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -4855,7 +4870,7 @@
|
|||
},
|
||||
"build_fan_full_at_height":
|
||||
{
|
||||
"label": "Build Fan Speed at Height",
|
||||
"label": "Build Volume Fan Speed at Height",
|
||||
"description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from Initial Fan Speed to Regular Fan Speed.",
|
||||
"unit": "mm",
|
||||
"type": "float",
|
||||
|
|
@ -4870,8 +4885,8 @@
|
|||
{
|
||||
"build_fan_full_layer":
|
||||
{
|
||||
"label": "Build Fan Speed at Layer",
|
||||
"description": "The layer at which the build fans spin on full fan speed. This value is calculated and rounded to a whole number.",
|
||||
"label": "Build Volume Fan Speed at Layer",
|
||||
"description": "The layer at which the build-volume fans spin on full fan speed. This value is calculated and rounded to a whole number.",
|
||||
"type": "int",
|
||||
"default_value": 0,
|
||||
"minimum_value": "0",
|
||||
|
|
@ -4884,6 +4899,34 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"build_volume_fan_speed_0":
|
||||
{
|
||||
"label": "Initial Layers Build Volume Fan Speed",
|
||||
"description": "The fan speed (as a percentage) for the auxiliary or build-volume fan, that is set until the layer specified at 'Build Volume Fan Speed at Layer' is reached. After that, the speed is set by 'Build Volume Fan Speed' instead (so not this 'Initial Layers' one).",
|
||||
"unit": "%",
|
||||
"type": "float",
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "100",
|
||||
"default_value": 0,
|
||||
"enabled": "build_volume_fan_nr != 0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"build_volume_fan_speed":
|
||||
{
|
||||
"label": "Build Volume Fan Speed",
|
||||
"description": "The fan speed (as a percentage) for the auxiliary or build-volume fan, that is set from the moment that the layer specified at 'Build Volume Fan Speed at Layer' is reached and onwards. Before that, the speed is set by 'Initial Layers Build Volume Fan Speed' instead.",
|
||||
"unit": "%",
|
||||
"type": "float",
|
||||
"minimum_value": "0",
|
||||
"maximum_value": "100",
|
||||
"default_value": 100,
|
||||
"enabled": "build_volume_fan_nr != 0",
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_meshgroup": false
|
||||
},
|
||||
"cool_fan_speed":
|
||||
{
|
||||
"label": "Fan Speed",
|
||||
|
|
@ -7465,6 +7508,17 @@
|
|||
"limit_to_extruder": "raft_surface_extruder_nr"
|
||||
}
|
||||
}
|
||||
},
|
||||
"machine_scan_first_layer":
|
||||
{
|
||||
"default_value": false,
|
||||
"description": "Whether to scan the first layer for layer adhesion problems.",
|
||||
"enabled": false,
|
||||
"label": "Scan the first layer",
|
||||
"settable_per_extruder": false,
|
||||
"settable_per_mesh": false,
|
||||
"settable_per_meshgroup": false,
|
||||
"type": "bool"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
|||
53
resources/definitions/ultimaker_s6.def.json
Normal file
53
resources/definitions/ultimaker_s6.def.json
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "UltiMaker S6",
|
||||
"inherits": "ultimaker_s8",
|
||||
"metadata":
|
||||
{
|
||||
"visible": true,
|
||||
"author": "UltiMaker",
|
||||
"manufacturer": "Ultimaker B.V.",
|
||||
"file_formats": "application/x-ufp;text/x-gcode",
|
||||
"platform": "ultimaker_s5_platform.obj",
|
||||
"bom_numbers": [
|
||||
10700
|
||||
],
|
||||
"firmware_update_info":
|
||||
{
|
||||
"check_urls": [ "https://software.ultimaker.com/releases/firmware/5078167/stable/um-update.swu.version" ],
|
||||
"id": 5078167,
|
||||
"update_url": "https://ultimaker.com/firmware?utm_source=cura&utm_medium=software&utm_campaign=fw-update"
|
||||
},
|
||||
"first_start_actions": [ "DiscoverUM3Action" ],
|
||||
"has_machine_quality": true,
|
||||
"has_materials": true,
|
||||
"has_variants": true,
|
||||
"machine_extruder_trains":
|
||||
{
|
||||
"0": "ultimaker_s6_extruder_left",
|
||||
"1": "ultimaker_s6_extruder_right"
|
||||
},
|
||||
"nozzle_offsetting_for_disallowed_areas": false,
|
||||
"platform_offset": [
|
||||
0,
|
||||
-30,
|
||||
-10
|
||||
],
|
||||
"platform_texture": "UltimakerS6backplate.png",
|
||||
"preferred_material": "ultimaker_pla_blue",
|
||||
"preferred_variant_name": "AA+ 0.4",
|
||||
"quality_definition": "ultimaker_s8",
|
||||
"supported_actions": [ "DiscoverUM3Action" ],
|
||||
"supports_material_export": true,
|
||||
"supports_network_connection": true,
|
||||
"supports_usb_connection": false,
|
||||
"variants_name": "Print Core",
|
||||
"variants_name_has_translation": true,
|
||||
"weight": -2
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"adhesion_type": { "value": "'brim'" },
|
||||
"machine_name": { "default_value": "UltiMaker S6" }
|
||||
}
|
||||
}
|
||||
|
|
@ -47,7 +47,7 @@
|
|||
"overrides":
|
||||
{
|
||||
"default_material_print_temperature": { "maximum_value_warning": "320" },
|
||||
"machine_name": { "default_value": "Ultimaker S7" },
|
||||
"machine_name": { "default_value": "UltiMaker S7" },
|
||||
"material_print_temperature_layer_0": { "maximum_value_warning": "320" }
|
||||
}
|
||||
}
|
||||
|
|
@ -385,7 +385,7 @@
|
|||
"unit": "m/s\u00b3",
|
||||
"value": "20000 if machine_gcode_flavor == 'Cheetah' else 100"
|
||||
},
|
||||
"machine_name": { "default_value": "Ultimaker S8" },
|
||||
"machine_name": { "default_value": "UltiMaker S8" },
|
||||
"machine_nozzle_cool_down_speed": { "default_value": 1.3 },
|
||||
"machine_nozzle_heat_up_speed": { "default_value": 0.6 },
|
||||
"machine_start_gcode": { "default_value": "M213 U0.1 ;undercut 0.1mm" },
|
||||
|
|
@ -412,7 +412,7 @@
|
|||
"retraction_hop": { "value": 1 },
|
||||
"retraction_hop_after_extruder_switch_height": { "value": 2 },
|
||||
"retraction_hop_enabled": { "value": true },
|
||||
"retraction_min_travel": { "value": "5 if support_enable and support_structure=='tree' else line_width * 2" },
|
||||
"retraction_min_travel": { "value": "5 if support_enable and support_structure=='tree' else line_width * 2.5" },
|
||||
"retraction_prime_speed": { "value": 15 },
|
||||
"skin_edge_support_thickness": { "value": 0 },
|
||||
"skin_material_flow": { "value": 95 },
|
||||
|
|
|
|||
19
resources/extruders/bambulab_a1_extruder_0.def.json
Normal file
19
resources/extruders/bambulab_a1_extruder_0.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
19
resources/extruders/bambulab_a1_extruder_1.def.json
Normal file
19
resources/extruders/bambulab_a1_extruder_1.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 1 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
19
resources/extruders/bambulab_a1_extruder_2.def.json
Normal file
19
resources/extruders/bambulab_a1_extruder_2.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1",
|
||||
"position": "2"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 2 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
19
resources/extruders/bambulab_a1_extruder_3.def.json
Normal file
19
resources/extruders/bambulab_a1_extruder_3.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1",
|
||||
"position": "3"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 3 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1 extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X267 F18000\nG1 Y128 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1 extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1 extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S4\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1 extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
19
resources/extruders/bambulab_a1mini_extruder_0.def.json
Normal file
19
resources/extruders/bambulab_a1mini_extruder_0.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1mini",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
19
resources/extruders/bambulab_a1mini_extruder_1.def.json
Normal file
19
resources/extruders/bambulab_a1mini_extruder_1.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1mini",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 1 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
19
resources/extruders/bambulab_a1mini_extruder_2.def.json
Normal file
19
resources/extruders/bambulab_a1mini_extruder_2.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1mini",
|
||||
"position": "2"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 2 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
19
resources/extruders/bambulab_a1mini_extruder_3.def.json
Normal file
19
resources/extruders/bambulab_a1mini_extruder_3.def.json
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_a1mini",
|
||||
"position": "3"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 3 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": ";===== A1mini extruder end {extruder_nr} begin =====\nG392 S0\nM1007 S0 ; turn off mass estimation\nM204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X180 F18000\nG1 Y90 F9000\n\nM400\nM106 P1 S0\nM106 P2 S0\n{if material_print_temperature > 142, extruder_nr}\nM104 S{material_print_temperature, extruder_nr}\n{endif}\n\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A0 F{material_flush_purge_speed}\n\nM628 S1\nG92 E0\nG1 E-18 F{material_flush_purge_speed}\nM400\nM629 S1\n\n;===== A1mini extruder end {extruder_nr} finish =====\n" },
|
||||
"machine_extruder_start_code": { "default_value": ";===== A1mini extruder start {extruder_nr} begin =====\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\nM620.10 A1 F{material_flush_purge_speed} L{material_flush_purge_length} H{machine_nozzle_size} T{material_print_temperature, extruder_nr}\n\nM400\nG92 E0\n\n{if not prime_tower_enable}\n\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n\nM400\nM106 P1 S60\nG1 E5 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n; G1 E-{retraction_amount} F1800\nM400\nM106 P1 S178\nM400 S3\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nG1 X-3.5 F18000\nG1 X-13.5 F3000\nM400\nM106 P1 S0\n\nM622.1 S0\n\nM621 S{extruder_nr}A\nG392 S0\n\nM1007 S1\n;===== A1mini extruder start {extruder_nr} finish =====\n" },
|
||||
"material_diameter": { "default_value": 1.75 },
|
||||
"switch_extruder_retraction_amount": { "default_value": 18 }
|
||||
}
|
||||
}
|
||||
18
resources/extruders/bambulab_x1_extruder_0.def.json
Normal file
18
resources/extruders/bambulab_x1_extruder_0.def.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_x1",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 0 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
|
||||
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
||||
18
resources/extruders/bambulab_x1_extruder_1.def.json
Normal file
18
resources/extruders/bambulab_x1_extruder_1.def.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_x1",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 1 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
|
||||
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
||||
18
resources/extruders/bambulab_x1_extruder_2.def.json
Normal file
18
resources/extruders/bambulab_x1_extruder_2.def.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_x1",
|
||||
"position": "2"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 2 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
|
||||
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
||||
18
resources/extruders/bambulab_x1_extruder_3.def.json
Normal file
18
resources/extruders/bambulab_x1_extruder_3.def.json
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "bambulab_x1",
|
||||
"position": "3"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr": { "default_value": 3 },
|
||||
"machine_extruder_change_duration": { "default_value": 29 },
|
||||
"machine_extruder_end_code": { "default_value": "M204 S9000\n\nG91 ; set relative positioning\nG1 Z3.0 F1200\nG90 ; back to abolute positioning\n\nG1 X70 F21000\nG1 Y245\nG1 Y265 F3000\nM400\nM106 P1 S0\nM106 P2 S0\n\n{if material_print_temperature > 142}\nM104 S{material_print_temperature}\n{endif}\n\nM620.11 S1 I{extruder_nr} E-18 F1200\nM400\n\nG1 X90 F3000\nG1 Y255 F4000\nG1 X100 F5000\nG1 X120 F15000\nG1 X20 Y50 F21000\nG1 Y-3\n\n;{if toolchange_count == 2}\n; get travel path for change filament\n;M620.1 X[travel_point_1_x] Y[travel_point_1_y] F21000 P0\n;M620.1 X[travel_point_2_x] Y[travel_point_2_y] F21000 P1\n;M620.1 X[travel_point_3_x] Y[travel_point_3_y] F21000 P2\n;{endif}\n\nM620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n" },
|
||||
"machine_extruder_start_code": { "default_value": "M620.1 E F{material_flush_purge_speed} T{material_print_temperature, extruder_nr}\n\nG92 E0\n\n; always use highest temperature to flush\n{if material_type == 'PETG'}\nM109 S260\n{elsif material_type == 'PVA'}\nM109 S210\n{else}\nM109 S{material_print_temperature}\n{endif}\n\n{if not prime_tower_enable}\n\nM83\n; FLUSH_START\n; always use highest temperature to flush\nM400\nM1002 set_filament_type:UNKNOWN\nM109 S{material_print_temperature, extruder_nr}\nM106 P1 S60\nG1 E{material_flush_purge_length / 4.0} F{min(extruderValues('material_flush_purge_speed'))} ; do not need pulsatile flushing for start part\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{min(extruderValues('material_flush_purge_speed'))}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.23} F{material_flush_purge_speed, extruder_nr}\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\nM400\nM1002 set_filament_type:{material_type, extruder_nr}\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; WIPE\nM400\nM106 P1 S178\nM400 S3\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nG1 X-38.2 F18000\nG1 X-48.2 F3000\nM400\nM106 P1 S0\n\nM106 P1 S60\n; FLUSH_START\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\nG1 E{(material_flush_purge_length / 4.0) * 0.18} F{material_flush_purge_speed, extruder_nr}\nG1 E{(material_flush_purge_length / 4.0) * 0.02} F50\n; FLUSH_END\nG1 E-{retraction_amount * 2} F1800\nG1 E{retraction_amount * 2} F300\n\n; FLUSH_START\nM400\nM109 S{material_print_temperature}\nG1 E6 F{material_flush_purge_speed, extruder_nr} ;Compensate for filament spillage during waiting temperature\n; FLUSH_END\n\n{endif} ; prime_tower_enable\n\nM400\nG92 E0\n;G1 E-[new_retract_length_toolchange] F1800\nM106 P1 S255\nM400 S3\n\nG1 X70 F5000\nG1 X90 F3000\nG1 Y255 F4000\nG1 X105 F5000\nG1 Y265 F5000\nG1 X70 F10000\nG1 X100 F5000\nG1 X70 F10000\nG1 X100 F5000\n\nG1 X70 F10000\nG1 X80 F15000\nG1 X60\nG1 X80\nG1 X60\nG1 X80 ; shake to put down garbage\nG1 X100 F5000\nG1 X165 F15000; wipe and shake\nG1 Y256 ; move Y to aside, prevent collision\nM400\n\nM621 S{extruder_nr}A\n" },
|
||||
"material_diameter": { "default_value": 1.75 }
|
||||
}
|
||||
}
|
||||
31
resources/extruders/ultimaker_s6_extruder_left.def.json
Normal file
31
resources/extruders/ultimaker_s6_extruder_left.def.json
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 1",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_s6",
|
||||
"position": "0"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 0,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"extruder_prime_pos_x": { "default_value": -3 },
|
||||
"extruder_prime_pos_y": { "default_value": 6 },
|
||||
"extruder_prime_pos_z": { "default_value": 2 },
|
||||
"machine_extruder_end_pos_abs": { "default_value": true },
|
||||
"machine_extruder_end_pos_x": { "default_value": 330 },
|
||||
"machine_extruder_end_pos_y": { "default_value": 237 },
|
||||
"machine_extruder_start_code": { "value": "\"M214 D0 K{material_pressure_advance_factor} R0.04\"" },
|
||||
"machine_extruder_start_pos_abs": { "default_value": true },
|
||||
"machine_extruder_start_pos_x": { "default_value": 330 },
|
||||
"machine_extruder_start_pos_y": { "default_value": 237 },
|
||||
"machine_nozzle_head_distance": { "default_value": 2.7 },
|
||||
"machine_nozzle_offset_x": { "default_value": 0 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 }
|
||||
}
|
||||
}
|
||||
31
resources/extruders/ultimaker_s6_extruder_right.def.json
Normal file
31
resources/extruders/ultimaker_s6_extruder_right.def.json
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
"version": 2,
|
||||
"name": "Extruder 2",
|
||||
"inherits": "fdmextruder",
|
||||
"metadata":
|
||||
{
|
||||
"machine": "ultimaker_s6",
|
||||
"position": "1"
|
||||
},
|
||||
"overrides":
|
||||
{
|
||||
"extruder_nr":
|
||||
{
|
||||
"default_value": 1,
|
||||
"maximum_value": "1"
|
||||
},
|
||||
"extruder_prime_pos_x": { "default_value": 333 },
|
||||
"extruder_prime_pos_y": { "default_value": 6 },
|
||||
"extruder_prime_pos_z": { "default_value": 2 },
|
||||
"machine_extruder_end_pos_abs": { "default_value": true },
|
||||
"machine_extruder_end_pos_x": { "default_value": 330 },
|
||||
"machine_extruder_end_pos_y": { "default_value": 219 },
|
||||
"machine_extruder_start_code": { "value": "\"M214 D0 K{material_pressure_advance_factor} R0.04\"" },
|
||||
"machine_extruder_start_pos_abs": { "default_value": true },
|
||||
"machine_extruder_start_pos_x": { "default_value": 330 },
|
||||
"machine_extruder_start_pos_y": { "default_value": 219 },
|
||||
"machine_nozzle_head_distance": { "default_value": 4.2 },
|
||||
"machine_nozzle_offset_x": { "default_value": 22 },
|
||||
"machine_nozzle_offset_y": { "default_value": 0 }
|
||||
}
|
||||
}
|
||||
BIN
resources/images/UltimakerS6backplate.png
Normal file
BIN
resources/images/UltimakerS6backplate.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
resources/images/bambulab-buildplate.png
Normal file
BIN
resources/images/bambulab-buildplate.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
|
|
@ -0,0 +1,18 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Accurate
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
intent_category = engineering
|
||||
material = generic_nylon-cf-slide
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = intent
|
||||
variant = CC+ 0.6
|
||||
|
||||
[values]
|
||||
infill_sparse_density = 20
|
||||
top_bottom_thickness = =wall_thickness
|
||||
wall_thickness = =line_width * 3
|
||||
|
||||
|
|
@ -5,11 +5,11 @@ version = 4
|
|||
|
||||
[metadata]
|
||||
intent_category = engineering
|
||||
material = generic_nylon
|
||||
material = generic_petcf
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = intent
|
||||
variant = AA+ 0.4
|
||||
variant = CC+ 0.6
|
||||
|
||||
[values]
|
||||
infill_sparse_density = 20
|
||||
1978
resources/meshes/bambulab_a1mini.obj
Normal file
1978
resources/meshes/bambulab_a1mini.obj
Normal file
File diff suppressed because it is too large
Load diff
1999
resources/meshes/bambulab_x1.obj
Normal file
1999
resources/meshes/bambulab_x1.obj
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -360,17 +360,6 @@ UM.PreferencesPage
|
|||
}
|
||||
}
|
||||
|
||||
UM.Label
|
||||
{
|
||||
id: languageCaption
|
||||
|
||||
//: Language change warning
|
||||
text: catalog.i18nc("@label", "*You will need to restart the application for these changes to have effect.")
|
||||
wrapMode: Text.WordWrap
|
||||
font.italic: true
|
||||
|
||||
}
|
||||
|
||||
Item
|
||||
{
|
||||
//: Spacer
|
||||
|
|
@ -705,7 +694,7 @@ UM.PreferencesPage
|
|||
UM.CheckBox
|
||||
{
|
||||
id: singleInstanceCheckbox
|
||||
text: catalog.i18nc("@option:check","Use a single instance of Cura")
|
||||
text: catalog.i18nc("@option:check","Use a single instance of Cura *")
|
||||
|
||||
checked: boolCheck(UM.Preferences.getValue("cura/single_instance"))
|
||||
onCheckedChanged: UM.Preferences.setValue("cura/single_instance", checked)
|
||||
|
|
@ -1101,8 +1090,6 @@ UM.PreferencesPage
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Multi-buildplate functionality is disabled because it's broken. See CURA-4975 for the ticket to remove it.
|
||||
Item
|
||||
{
|
||||
//: Spacer
|
||||
|
|
@ -1110,6 +1097,18 @@ UM.PreferencesPage
|
|||
width: UM.Theme.getSize("default_margin").height
|
||||
}
|
||||
|
||||
UM.Label
|
||||
{
|
||||
id: languageCaption
|
||||
|
||||
//: Language change warning
|
||||
text: catalog.i18nc("@label", "*You will need to restart the application for these changes to have effect.")
|
||||
wrapMode: Text.WordWrap
|
||||
font.italic: true
|
||||
}
|
||||
|
||||
/* Multi-buildplate functionality is disabled because it's broken. See CURA-4975 for the ticket to remove it.
|
||||
|
||||
Label
|
||||
{
|
||||
font.bold: true
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
[general]
|
||||
definition = bambulab_a1
|
||||
name = Standard
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_pla
|
||||
quality_type = normal
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = 0.4mm
|
||||
|
||||
[values]
|
||||
|
||||
15
resources/quality/bambu/bambulab_a1_normal.inst.cfg
Normal file
15
resources/quality/bambu/bambulab_a1_normal.inst.cfg
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
[general]
|
||||
definition = bambulab_a1
|
||||
name = Normal
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
global_quality = True
|
||||
quality_type = normal
|
||||
setting_version = 25
|
||||
type = quality
|
||||
weight = 0
|
||||
|
||||
[values]
|
||||
layer_height = 0.2
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
[general]
|
||||
definition = bambulab_a1mini
|
||||
name = Standard
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_pla
|
||||
quality_type = normal
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = 0.4mm
|
||||
|
||||
[values]
|
||||
|
||||
15
resources/quality/bambu/bambulab_a1mini_normal.inst.cfg
Normal file
15
resources/quality/bambu/bambulab_a1mini_normal.inst.cfg
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
[general]
|
||||
definition = bambulab_a1mini
|
||||
name = Normal
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
global_quality = True
|
||||
quality_type = normal
|
||||
setting_version = 25
|
||||
type = quality
|
||||
weight = 0
|
||||
|
||||
[values]
|
||||
layer_height = 0.2
|
||||
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
[general]
|
||||
definition = bambulab_x1
|
||||
name = Standard
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_pla
|
||||
quality_type = normal
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = X1 0.4mm
|
||||
|
||||
[values]
|
||||
|
||||
15
resources/quality/bambu/bambulab_x1_normal.inst.cfg
Normal file
15
resources/quality/bambu/bambulab_x1_normal.inst.cfg
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
[general]
|
||||
definition = bambulab_x1
|
||||
name = Normal
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
global_quality = True
|
||||
quality_type = normal
|
||||
setting_version = 25
|
||||
type = quality
|
||||
weight = 0
|
||||
|
||||
[values]
|
||||
layer_height = 0.2
|
||||
|
||||
|
|
@ -15,7 +15,6 @@ weight = -2
|
|||
cool_min_layer_time = 4
|
||||
cool_min_layer_time_fan_speed_max = 9
|
||||
cool_min_temperature = =material_print_temperature - 10
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
retraction_prime_speed = 15
|
||||
support_structure = tree
|
||||
|
||||
|
|
|
|||
|
|
@ -13,8 +13,10 @@ weight = -2
|
|||
|
||||
[values]
|
||||
infill_overlap = 20
|
||||
infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'gyroid'
|
||||
speed_print = 100
|
||||
speed_wall_0 = =speed_print
|
||||
infill_pattern = lines
|
||||
speed_print = 40
|
||||
speed_wall = =speed_print
|
||||
speed_wall_0 = =speed_wall
|
||||
support_interface_enable = True
|
||||
wall_thickness = =wall_line_width_0 + 2*wall_line_width_x
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_abs
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -2
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
cool_min_layer_time = 4
|
||||
cool_min_layer_time_fan_speed_max = 9
|
||||
cool_min_temperature = =material_print_temperature - 10
|
||||
retraction_prime_speed = 15
|
||||
support_interface_enable = False
|
||||
support_structure = tree
|
||||
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Extra Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_abs
|
||||
quality_type = verydraft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -3
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
cool_min_layer_time = 4
|
||||
cool_min_layer_time_fan_speed_max = 9
|
||||
cool_min_temperature = =material_print_temperature - 10
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
retraction_prime_speed = 15
|
||||
support_interface_enable = False
|
||||
support_structure = tree
|
||||
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
||||
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_petg
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -2
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
cool_min_layer_time = 4
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
support_interface_enable = False
|
||||
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Extra Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_petg
|
||||
quality_type = verydraft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -3
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
cool_min_layer_time = 4
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
support_interface_enable = False
|
||||
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
||||
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_pla
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -2
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
retraction_prime_speed = =retraction_speed
|
||||
support_interface_enable = False
|
||||
support_structure = tree
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Extra Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_pla
|
||||
quality_type = verydraft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -3
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
material_print_temperature = =default_material_print_temperature + 20
|
||||
retraction_prime_speed = =retraction_speed
|
||||
support_interface_enable = False
|
||||
support_structure = tree
|
||||
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
||||
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_tough_pla
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -2
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
retraction_prime_speed = =retraction_speed
|
||||
support_interface_enable = False
|
||||
support_structure = tree
|
||||
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Extra Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_tough_pla
|
||||
quality_type = verydraft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = AA+ 0.6
|
||||
weight = -3
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
material_print_temperature = =default_material_print_temperature + 20
|
||||
retraction_prime_speed = =retraction_speed
|
||||
support_interface_enable = False
|
||||
support_structure = tree
|
||||
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
||||
|
||||
|
|
@ -13,17 +13,23 @@ weight = -1
|
|||
|
||||
[values]
|
||||
acceleration_prime_tower = 1500
|
||||
acceleration_support = 1500
|
||||
brim_replaces_support = False
|
||||
build_volume_temperature = =70 if extruders_enabled_count > 1 else 35
|
||||
cool_fan_enabled = =not (support_enable and (extruder_nr == support_infill_extruder_nr))
|
||||
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
|
||||
initial_layer_line_width_factor = 150
|
||||
jerk_prime_tower = 4000
|
||||
jerk_support = 4000
|
||||
minimum_support_area = 4
|
||||
retraction_amount = 6.5
|
||||
retraction_count_max = 5
|
||||
skirt_brim_minimal_length = =min(2000, 175 / (layer_height * line_width))
|
||||
speed_prime_tower = 25
|
||||
speed_prime_tower = 50
|
||||
speed_support = 50
|
||||
support_angle = 45
|
||||
speed_support_bottom = =2*speed_support_interface/5
|
||||
speed_support_interface = 50
|
||||
support_bottom_density = 70
|
||||
support_infill_sparse_thickness = =2 * layer_height
|
||||
support_interface_enable = True
|
||||
support_z_distance = 0
|
||||
|
|
|
|||
|
|
@ -13,18 +13,24 @@ weight = 0
|
|||
|
||||
[values]
|
||||
acceleration_prime_tower = 1500
|
||||
acceleration_support = 1500
|
||||
brim_replaces_support = False
|
||||
build_volume_temperature = =70 if extruders_enabled_count > 1 else 35
|
||||
cool_fan_enabled = =not (support_enable and (extruder_nr == support_infill_extruder_nr))
|
||||
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
|
||||
initial_layer_line_width_factor = 150
|
||||
jerk_prime_tower = 4000
|
||||
jerk_support = 4000
|
||||
material_print_temperature = =default_material_print_temperature - 5
|
||||
minimum_support_area = 4
|
||||
retraction_amount = 6.5
|
||||
retraction_count_max = 5
|
||||
skirt_brim_minimal_length = =min(2000, 175 / (layer_height * line_width))
|
||||
speed_prime_tower = 25
|
||||
speed_prime_tower = 50
|
||||
speed_support = 50
|
||||
support_angle = 45
|
||||
speed_support_bottom = =2*speed_support_interface/5
|
||||
speed_support_interface = 50
|
||||
support_bottom_density = 70
|
||||
support_infill_sparse_thickness = =2 * layer_height
|
||||
support_interface_enable = True
|
||||
support_z_distance = 0
|
||||
|
|
|
|||
|
|
@ -13,18 +13,24 @@ weight = -2
|
|||
|
||||
[values]
|
||||
acceleration_prime_tower = 1500
|
||||
acceleration_support = 1500
|
||||
brim_replaces_support = False
|
||||
build_volume_temperature = =70 if extruders_enabled_count > 1 else 35
|
||||
cool_fan_enabled = =not (support_enable and (extruder_nr == support_infill_extruder_nr))
|
||||
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
|
||||
initial_layer_line_width_factor = 150
|
||||
jerk_prime_tower = 4000
|
||||
jerk_support = 4000
|
||||
material_print_temperature = =default_material_print_temperature + 5
|
||||
minimum_support_area = 4
|
||||
retraction_amount = 6.5
|
||||
retraction_count_max = 5
|
||||
skirt_brim_minimal_length = =min(2000, 175 / (layer_height * line_width))
|
||||
speed_prime_tower = 25
|
||||
speed_prime_tower = 50
|
||||
speed_support = 50
|
||||
support_angle = 45
|
||||
speed_support_bottom = =2*speed_support_interface/5
|
||||
speed_support_interface = 50
|
||||
support_bottom_density = 70
|
||||
support_interface_enable = True
|
||||
support_z_distance = 0
|
||||
|
||||
|
|
|
|||
|
|
@ -13,18 +13,24 @@ weight = -3
|
|||
|
||||
[values]
|
||||
acceleration_prime_tower = 1500
|
||||
acceleration_support = 1500
|
||||
brim_replaces_support = False
|
||||
build_volume_temperature = =70 if extruders_enabled_count > 1 else 35
|
||||
cool_fan_enabled = =not (support_enable and (extruder_nr == support_infill_extruder_nr))
|
||||
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
|
||||
initial_layer_line_width_factor = 150
|
||||
jerk_prime_tower = 4000
|
||||
jerk_support = 4000
|
||||
material_print_temperature = =default_material_print_temperature - 5
|
||||
minimum_support_area = 4
|
||||
retraction_amount = 6.5
|
||||
retraction_count_max = 5
|
||||
skirt_brim_minimal_length = =min(2000, 175 / (layer_height * line_width))
|
||||
speed_prime_tower = 25
|
||||
speed_prime_tower = 50
|
||||
speed_support = 50
|
||||
support_angle = 45
|
||||
speed_support_bottom = =2*speed_support_interface/5
|
||||
speed_support_interface = 50
|
||||
support_bottom_density = 70
|
||||
support_infill_sparse_thickness = 0.3
|
||||
support_interface_enable = True
|
||||
support_z_distance = 0
|
||||
|
|
|
|||
|
|
@ -14,6 +14,8 @@ weight = -2
|
|||
[values]
|
||||
cool_min_layer_time = 6
|
||||
cool_min_layer_time_fan_speed_max = 12
|
||||
retraction_amount = 8
|
||||
inset_direction = inside_out
|
||||
material_flow = 95
|
||||
retraction_prime_speed = 15
|
||||
speed_wall_x = =speed_wall_0
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_nylon-cf-slide
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = CC+ 0.6
|
||||
weight = -2
|
||||
|
||||
[values]
|
||||
cool_min_layer_time_fan_speed_max = 11
|
||||
retraction_prime_speed = 15
|
||||
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Extra Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_nylon-cf-slide
|
||||
quality_type = verydraft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = CC+ 0.6
|
||||
weight = -3
|
||||
|
||||
[values]
|
||||
cool_min_layer_time_fan_speed_max = 11
|
||||
retraction_prime_speed = 15
|
||||
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_petcf
|
||||
quality_type = draft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = CC+ 0.6
|
||||
weight = -2
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
support_interface_enable = False
|
||||
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = Extra Fast
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
material = generic_petcf
|
||||
quality_type = verydraft
|
||||
setting_version = 25
|
||||
type = quality
|
||||
variant = CC+ 0.6
|
||||
weight = -3
|
||||
|
||||
[values]
|
||||
bridge_skin_material_flow = 200
|
||||
bridge_wall_material_flow = 200
|
||||
material_print_temperature = =default_material_print_temperature + 10
|
||||
support_interface_enable = False
|
||||
wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25)
|
||||
|
||||
13
resources/variants/bambu/bambulab_a1_0.4.inst.cfg
Normal file
13
resources/variants/bambu/bambulab_a1_0.4.inst.cfg
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
[general]
|
||||
definition = bambulab_a1
|
||||
name = 0.4mm
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_size = 0.4
|
||||
|
||||
13
resources/variants/bambu/bambulab_a1mini_0.4.inst.cfg
Normal file
13
resources/variants/bambu/bambulab_a1mini_0.4.inst.cfg
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
[general]
|
||||
definition = bambulab_a1mini
|
||||
name = 0.4mm
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_size = 0.4
|
||||
|
||||
13
resources/variants/bambu/bambulab_x1_0.4.inst.cfg
Normal file
13
resources/variants/bambu/bambulab_x1_0.4.inst.cfg
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
[general]
|
||||
definition = bambulab_x1
|
||||
name = X1 0.4mm
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_size = 0.4
|
||||
|
||||
17
resources/variants/ultimaker_s6_aa_plus04.inst.cfg
Normal file
17
resources/variants/ultimaker_s6_aa_plus04.inst.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s6
|
||||
name = AA+ 0.4
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_id = AA+ 0.4
|
||||
machine_nozzle_size = 0.4
|
||||
machine_nozzle_tip_outer_diameter = 1.2
|
||||
retraction_prime_speed = =retraction_speed
|
||||
|
||||
17
resources/variants/ultimaker_s6_aa_plus06.inst.cfg
Normal file
17
resources/variants/ultimaker_s6_aa_plus06.inst.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s6
|
||||
name = AA+ 0.6
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_id = AA+ 0.6
|
||||
machine_nozzle_size = 0.6
|
||||
machine_nozzle_tip_outer_diameter = 1.2
|
||||
retraction_prime_speed = =retraction_speed
|
||||
|
||||
19
resources/variants/ultimaker_s6_bb04.inst.cfg
Normal file
19
resources/variants/ultimaker_s6_bb04.inst.cfg
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
[general]
|
||||
definition = ultimaker_s6
|
||||
name = BB 0.4
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_heat_up_speed = 1.5
|
||||
machine_nozzle_id = BB 0.4
|
||||
machine_nozzle_tip_outer_diameter = 1.0
|
||||
retraction_amount = 4.5
|
||||
support_bottom_height = =layer_height * 2
|
||||
support_interface_enable = True
|
||||
switch_extruder_retraction_amount = 12
|
||||
|
||||
17
resources/variants/ultimaker_s6_cc_plus04.inst.cfg
Normal file
17
resources/variants/ultimaker_s6_cc_plus04.inst.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s6
|
||||
name = CC+ 0.4
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_id = CC+ 0.4
|
||||
machine_nozzle_size = 0.4
|
||||
machine_nozzle_tip_outer_diameter = 1.2
|
||||
retraction_prime_speed = =retraction_speed
|
||||
|
||||
17
resources/variants/ultimaker_s6_cc_plus06.inst.cfg
Normal file
17
resources/variants/ultimaker_s6_cc_plus06.inst.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s6
|
||||
name = CC+ 0.6
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_id = CC+ 0.6
|
||||
machine_nozzle_size = 0.6
|
||||
machine_nozzle_tip_outer_diameter = 1.2
|
||||
retraction_prime_speed = =retraction_speed
|
||||
|
||||
17
resources/variants/ultimaker_s6_dd04.inst.cfg
Normal file
17
resources/variants/ultimaker_s6_dd04.inst.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s6
|
||||
name = DD 0.4
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_id = DD 0.4
|
||||
machine_nozzle_size = 0.4
|
||||
machine_nozzle_tip_outer_diameter = 1.2
|
||||
retraction_prime_speed = =retraction_speed
|
||||
|
||||
17
resources/variants/ultimaker_s8_aa_plus06.inst.cfg
Normal file
17
resources/variants/ultimaker_s8_aa_plus06.inst.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = AA+ 0.6
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_id = AA+ 0.6
|
||||
machine_nozzle_size = 0.6
|
||||
machine_nozzle_tip_outer_diameter = 1.2
|
||||
retraction_prime_speed = =retraction_speed
|
||||
|
||||
17
resources/variants/ultimaker_s8_cc_plus06.inst.cfg
Normal file
17
resources/variants/ultimaker_s8_cc_plus06.inst.cfg
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
[general]
|
||||
definition = ultimaker_s8
|
||||
name = CC+ 0.6
|
||||
version = 4
|
||||
|
||||
[metadata]
|
||||
hardware_type = nozzle
|
||||
setting_version = 25
|
||||
type = variant
|
||||
|
||||
[values]
|
||||
machine_nozzle_cool_down_speed = 0.9
|
||||
machine_nozzle_id = CC+ 0.6
|
||||
machine_nozzle_size = 0.6
|
||||
machine_nozzle_tip_outer_diameter = 1.2
|
||||
retraction_prime_speed = =retraction_speed
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue