Merge branch '5.11' into 5.11

This commit is contained in:
Erwan MATHIEU 2025-10-07 10:33:07 +02:00 committed by GitHub
commit 4c5d7e1bd1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
104 changed files with 13240 additions and 17414 deletions

View file

@ -1,16 +1,16 @@
version: "5.11.0-beta.0"
version: "5.11.0-beta.1"
commit: "unknown"
requirements:
- "cura_resources/5.11.0-beta.0"
- "uranium/5.11.0-beta.0"
- "curaengine/5.11.0-beta.0"
- "cura_binary_data/5.11.0-beta.0"
- "fdm_materials/5.11.0-beta.0"
- "cura_resources/5.11.0-beta.1"
- "uranium/5.11.0-beta.1"
- "curaengine/5.11.0-beta.1"
- "cura_binary_data/5.11.0-beta.1"
- "fdm_materials/5.11.0-beta.1"
- "dulcificum/5.10.0"
- "pysavitar/5.11.0-alpha.0"
- "pynest2d/5.10.0"
requirements_internal:
- "fdm_materials/5.11.0-beta.0"
- "fdm_materials/5.11.0-beta.1"
- "cura_private_data/5.11.0-alpha.0@internal/testing"
requirements_enterprise:
- "native_cad_plugin/2.0.0"

View file

@ -14,7 +14,7 @@ DEFAULT_CURA_LATEST_URL = "https://software.ultimaker.com/latest.json"
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
# CuraVersion.py.in template.
CuraSDKVersion = "8.10.0"
CuraSDKVersion = "8.11.0"
try:
from cura.CuraVersion import CuraLatestURL

View file

@ -36,7 +36,7 @@ class Backup:
IGNORED_FOLDERS = [] # type: List[str]
"""These folders should be ignored when making a backup."""
SECRETS_SETTINGS = ["general/ultimaker_auth_data"]
SECRETS_SETTINGS = ["general/ultimaker_auth_data", "cluster_api/auth_ids", "cluster_api/auth_keys", "cluster_api/nonce_counts", "cluster_api/nonces"]
"""Secret preferences that need to obfuscated when making a backup of Cura"""
catalog = i18nCatalog("cura")

View file

@ -2,7 +2,7 @@
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt6.QtCore import Qt, pyqtSignal, pyqtProperty, QTimer
from typing import Iterable, TYPE_CHECKING
from typing import Iterable, TYPE_CHECKING, Optional, Dict, Any
from UM.i18n import i18nCatalog
from UM.Qt.ListModel import ListModel
@ -104,6 +104,9 @@ class ExtrudersModel(ListModel):
self.addOptionalExtruderChanged.emit()
self._updateExtruders()
def getExtruderItem(self, extruder_index: int) -> Optional[Dict[str, Any]]:
return next((item for item in self.items if item["index"] == extruder_index), None)
@pyqtProperty(bool, fset = setAddOptionalExtruder, notify = addOptionalExtruderChanged)
def addOptionalExtruder(self):
return self._add_optional_extruder

View file

@ -6,10 +6,10 @@ from typing import Optional, Dict
from PyQt6.QtCore import QBuffer
from PyQt6.QtGui import QImage, QImageWriter
import UM.View.GL.Texture
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
from UM.View.GL.OpenGL import OpenGL
from UM.View.GL.Texture import Texture
from UM.Signal import Signal
class SliceableObjectDecorator(SceneNodeDecorator):
@ -18,14 +18,20 @@ class SliceableObjectDecorator(SceneNodeDecorator):
self._paint_texture = None
self._texture_data_mapping: Dict[str, tuple[int, int]] = {}
self.paintTextureChanged = Signal()
def isSliceable(self) -> bool:
return True
def getPaintTexture(self) -> Optional[Texture]:
return self._paint_texture
def getPaintTextureChangedSignal(self) -> Signal:
return self.paintTextureChanged
def setPaintTexture(self, texture: Texture) -> None:
self._paint_texture = texture
self.paintTextureChanged.emit()
def getTextureDataMapping(self) -> Dict[str, tuple[int, int]]:
return self._texture_data_mapping
@ -39,6 +45,7 @@ class SliceableObjectDecorator(SceneNodeDecorator):
image = QImage(width, height, QImage.Format.Format_RGB32)
image.fill(0)
self._paint_texture.setImage(image)
self.paintTextureChanged.emit()
def packTexture(self) -> Optional[bytearray]:
if self._paint_texture is None:

View file

@ -1,176 +0,0 @@
# 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"))

View file

@ -51,7 +51,6 @@ 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")
@ -78,8 +77,7 @@ class ThreeMFWriter(MeshWriter):
# Register available variants
self._variants = {
Cura3mfVariant(self).mime_type: Cura3mfVariant,
BambuLabVariant(self).mime_type: BambuLabVariant
Cura3mfVariant(self).mime_type: Cura3mfVariant
}
@staticmethod

View file

@ -32,12 +32,6 @@ def getMetaData():
"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
}
]
}

View file

@ -415,11 +415,12 @@ class StartSliceJob(Job):
for node in group:
# Only check if the printing extruder is enabled for printing meshes
is_non_printing_mesh = node.callDecoration("evaluateIsNonPrintingMesh")
extruder_position = int(node.callDecoration("getActiveExtruderPosition"))
if not is_non_printing_mesh and not extruders_enabled[extruder_position]:
skip_group = True
has_model_with_disabled_extruders = True
associated_disabled_extruders.add(extruder_position)
if not is_non_printing_mesh:
for used_extruder in StartSliceJob._getUsedExtruders(node):
if not extruders_enabled[used_extruder]:
skip_group = True
has_model_with_disabled_extruders = True
associated_disabled_extruders.add(used_extruder)
if not skip_group:
filtered_object_groups.append(group)
@ -760,3 +761,27 @@ class StartSliceJob(Job):
relations_set.add(relation.target.key)
self._addRelations(relations_set, relation.target.relations)
@staticmethod
def _getUsedExtruders(node: SceneNode) -> List[int]:
used_extruders = []
# Look at extruders used in painted texture
node_texture = node.callDecoration("getPaintTexture")
texture_data_mapping = node.callDecoration("getTextureDataMapping")
if node_texture is not None and texture_data_mapping is not None and "extruder" in texture_data_mapping:
texture_image = node_texture.getImage().copy()
image_ptr = texture_image.bits()
image_ptr.setsize(texture_image.sizeInBytes())
image_size = texture_image.height(), texture_image.width()
image_array = numpy.frombuffer(image_ptr, dtype=numpy.uint32).reshape(image_size)
bit_range_start, bit_range_end = texture_data_mapping["extruder"]
image_array = (image_array << (32 - 1 - (bit_range_end - bit_range_start))) >> (32 - 1 - bit_range_end)
used_extruders = numpy.unique(image_array).tolist()
# There is no relevant painting data, just take the extruder associated to the model
if not used_extruders:
used_extruders = [int(node.callDecoration("getActiveExtruderPosition"))]
return used_extruders

View file

@ -527,6 +527,6 @@ class FlavorParser:
# The "save/print" button's state is bound to the backend state.
backend = CuraApplication.getInstance().getBackend()
backend.backendStateChange.emit(Backend.BackendState.Disabled)
backend.setState(Backend.BackendState.Disabled)
return scene_node

View file

@ -0,0 +1,112 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import numpy
from weakref import WeakKeyDictionary
import functools
from typing import Optional
from UM.Scene.SceneNode import SceneNode
from cura.CuraApplication import CuraApplication
from cura.Machines.Models.ExtrudersModel import ExtrudersModel
from UM.Signal import Signal
from .PaintCommand import PaintCommand
class MultiMaterialExtruderConverter:
"""
This class is a single object living in the background, which only job is to watch when extruders of objects
are changed and to convert their multi-material painting textures accordingly.
"""
MAX_EXTRUDER_COUNT = 16
def __init__(self, extruders_model: ExtrudersModel) -> None:
application = CuraApplication.getInstance()
scene = application.getController().getScene()
scene.getRoot().childrenChanged.connect(self._onChildrenChanged)
self._extruders_model: extruders_model
self._watched_nodes: WeakKeyDictionary[SceneNode, tuple[Optional[int], Optional[functools.partial]]] = WeakKeyDictionary()
self.mainExtruderChanged = Signal()
def _onChildrenChanged(self, node: SceneNode):
if node not in self._watched_nodes and node.callDecoration("isSliceable"):
self._watched_nodes[node] = (None, None)
node.decoratorsChanged.connect(self._onDecoratorsChanged)
self._onDecoratorsChanged(node)
for child in node.getChildren():
self._onChildrenChanged(child)
def _onDecoratorsChanged(self, node: SceneNode) -> None:
if node not in self._watched_nodes:
return
current_extruder, extruder_changed_callback = self._watched_nodes[node]
if extruder_changed_callback is None:
extruder_changed_signal = node.callDecoration("getActiveExtruderChangedSignal")
if extruder_changed_signal is not None:
extruder_changed_callback = functools.partial(self._onExtruderChanged, node)
extruder_changed_signal.connect(extruder_changed_callback)
self._watched_nodes[node] = current_extruder, extruder_changed_callback
self._onExtruderChanged(node)
def _onExtruderChanged(self, node: SceneNode) -> None:
self._changeMainObjectExtruder(node)
@staticmethod
def getPaintedObjectExtruderNr(node: SceneNode) -> Optional[int]:
extruder_stack = node.getPrintingExtruder()
if extruder_stack is None:
return None
return extruder_stack.getValue("extruder_nr")
def _changeMainObjectExtruder(self, node: SceneNode) -> None:
if node not in self._watched_nodes:
return
old_extruder_nr, extruder_changed_callback = self._watched_nodes[node]
new_extruder_nr = MultiMaterialExtruderConverter.getPaintedObjectExtruderNr(node)
if new_extruder_nr == old_extruder_nr:
return
self._watched_nodes[node] = (new_extruder_nr, extruder_changed_callback)
if old_extruder_nr is None or new_extruder_nr is None:
return
texture = node.callDecoration("getPaintTexture")
if texture is None:
return
paint_data_mapping = node.callDecoration("getTextureDataMapping")
if paint_data_mapping is None or "extruder" not in paint_data_mapping:
return
bits_range = paint_data_mapping["extruder"]
image = texture.getImage()
image_ptr = image.bits()
image_ptr.setsize(image.sizeInBytes())
image_array = numpy.frombuffer(image_ptr, dtype=numpy.uint32)
bit_range_start, bit_range_end = bits_range
bit_mask = numpy.uint32(PaintCommand.getBitRangeMask(bits_range))
target_bits = (image_array & bit_mask) >> bit_range_start
target_bits[target_bits == old_extruder_nr] = MultiMaterialExtruderConverter.MAX_EXTRUDER_COUNT
target_bits[target_bits == new_extruder_nr] = old_extruder_nr
target_bits[target_bits == MultiMaterialExtruderConverter.MAX_EXTRUDER_COUNT] = new_extruder_nr
image_array &= ~bit_mask
image_array |= ((target_bits << bit_range_start) & bit_mask)
texture.updateImagePart(image.rect())
self.mainExtruderChanged.emit(node)

View file

@ -0,0 +1,43 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional
from PyQt6.QtGui import QUndoCommand, QImage, QPainter, QBrush
from UM.View.GL.Texture import Texture
from .PaintCommand import PaintCommand
class PaintClearCommand(PaintCommand):
"""Provides the command that clears all the painting for the current mode"""
def __init__(self, texture: Texture, bit_range: tuple[int, int], set_value: int) -> None:
super().__init__(texture, bit_range)
self._set_value = set_value
def id(self) -> int:
return 1
def redo(self) -> None:
painter = self._makeClearedTexture()
if self._set_value > 0:
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_SourceOrDestination)
painter.fillRect(self._texture.getImage().rect(), QBrush(self._set_value))
painter.end()
self._texture.updateImagePart(self._bounding_rect)
def mergeWith(self, command: QUndoCommand) -> bool:
if not isinstance(command, PaintClearCommand):
return False
# There is actually nothing more to do here, both clear commands already have the same original texture
return True
def _clearTextureBits(self, painter: QPainter):
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_NotSourceAndDestination)
painter.fillRect(self._texture.getImage().rect(), QBrush(self._getBitRangeMask()))

View file

@ -0,0 +1,62 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Tuple, Optional
from PyQt6.QtCore import QRect
from PyQt6.QtGui import QUndoCommand, QImage, QPainter, QBrush
from UM.View.GL.Texture import Texture
class PaintCommand(QUndoCommand):
"""Provides a command that somehow modifies the actual painting on objects with undo/redo mechanisms"""
FULL_INT32 = 0xffffffff
def __init__(self, texture: Texture, bit_range: tuple[int, int], make_original_image = True) -> None:
super().__init__()
self._texture: Texture = texture
self._bit_range: tuple[int, int] = bit_range
self._original_texture_image = None
self._bounding_rect = texture.getImage().rect()
if make_original_image:
self._original_texture_image = self._texture.getImage().copy()
painter = QPainter(self._original_texture_image)
# Keep only the bits contained in the bit range, so that we won't modify anything else in the image
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_SourceAndDestination)
painter.fillRect(self._original_texture_image.rect(), QBrush(self._getBitRangeMask()))
painter.end()
def undo(self) -> None:
if self._original_texture_image is None:
return
painter = self._makeClearedTexture()
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_SourceOrDestination)
painter.drawImage(0, 0, self._original_texture_image)
painter.end()
self._texture.updateImagePart(self._bounding_rect)
def _makeClearedTexture(self) -> QPainter:
painter = QPainter(self._texture.getImage())
painter.setRenderHint(QPainter.RenderHint.Antialiasing, False)
self._clearTextureBits(painter)
return painter
def _clearTextureBits(self, painter: QPainter):
raise NotImplementedError()
@staticmethod
def getBitRangeMask(bit_range: tuple[int, int]) -> int:
bit_range_start, bit_range_end = bit_range
return (((PaintCommand.FULL_INT32 << (32 - 1 - (bit_range_end - bit_range_start))) & PaintCommand.FULL_INT32) >>
(32 - 1 - bit_range_end))
def _getBitRangeMask(self) -> int:
return PaintCommand.getBitRangeMask(self._bit_range)

View file

@ -0,0 +1,84 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import cast, Optional, List
import math
from PyQt6.QtCore import QRect, QRectF, QPoint
from PyQt6.QtGui import QUndoCommand, QImage, QPainter, QPainterPath, QPen, QBrush
from UM.View.GL.Texture import Texture
from UM.Math.Polygon import Polygon
from .PaintCommand import PaintCommand
class PaintStrokeCommand(PaintCommand):
"""Provides the command that does the actual painting on objects with undo/redo mechanisms"""
PEN_OVERLAP_WIDTH = 2.5
def __init__(self,
texture: Texture,
stroke_polygons: List[Polygon],
set_value: int,
bit_range: tuple[int, int],
mergeable: bool) -> None:
super().__init__(texture, bit_range, make_original_image = not mergeable)
self._stroke_polygons: List[Polygon] = stroke_polygons
self._calculateBoundingRect()
self._set_value: int = set_value
self._mergeable: bool = mergeable
def id(self) -> int:
return 0
def redo(self) -> None:
painter = self._makeClearedTexture()
painter.setBrush(QBrush(self._set_value))
painter.setPen(QPen(painter.brush(), self.PEN_OVERLAP_WIDTH))
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_SourceOrDestination)
painter.drawPath(self._makePainterPath())
painter.end()
self._texture.updateImagePart(self._bounding_rect)
def mergeWith(self, command: QUndoCommand) -> bool:
if not isinstance(command, PaintStrokeCommand):
return False
paint_undo_command = cast(PaintStrokeCommand, command)
if not paint_undo_command._mergeable:
return False
self._stroke_polygons = Polygon.union(self._stroke_polygons + paint_undo_command._stroke_polygons)
self._calculateBoundingRect()
return True
def _clearTextureBits(self, painter: QPainter):
painter.setBrush(QBrush(self._getBitRangeMask()))
painter.setPen(QPen(painter.brush(), self.PEN_OVERLAP_WIDTH))
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_NotSourceAndDestination)
painter.drawPath(self._makePainterPath())
def _makePainterPath(self) -> QPainterPath:
path = QPainterPath()
for polygon in self._stroke_polygons:
path.moveTo(polygon[0][0], polygon[0][1])
for point in polygon:
path.lineTo(point[0], point[1])
path.closeSubpath()
return path
def _calculateBoundingRect(self):
bounding_box = Polygon.getGlobalBoundingBox(self._stroke_polygons)
if bounding_box is None:
self._bounding_rect = QRect()
else:
self._bounding_rect = QRect(
QPoint(math.floor(bounding_box.left - PaintStrokeCommand.PEN_OVERLAP_WIDTH),
math.floor(bounding_box.bottom - PaintStrokeCommand.PEN_OVERLAP_WIDTH)),
QPoint(math.ceil(bounding_box.right + PaintStrokeCommand.PEN_OVERLAP_WIDTH),
math.ceil(bounding_box.top + PaintStrokeCommand.PEN_OVERLAP_WIDTH)))
self._bounding_rect &= self._texture.getImage().rect()

View file

@ -5,8 +5,9 @@ import math
from enum import IntEnum
import numpy
from PyQt6.QtCore import Qt, QObject, pyqtEnum, QPointF
from PyQt6.QtGui import QImage, QPainter, QPen, QBrush, QPolygonF
from PyQt6.QtGui import QImage, QPainter, QPen, QBrush, QPolygonF, QPainterPath
from typing import cast, Optional, Tuple, List
import pyUvula as uvula
from UM.Application import Application
from UM.Event import Event, MouseEvent
@ -15,6 +16,7 @@ from UM.Logger import Logger
from UM.Math.AxisAlignedBox2D import AxisAlignedBox2D
from UM.Math.Polygon import Polygon
from UM.Math.Vector import Vector
from UM.Mesh.MeshData import MeshData
from UM.Scene.Camera import Camera
from UM.Scene.SceneNode import SceneNode
from UM.Scene.Selection import Selection
@ -56,7 +58,7 @@ class PaintTool(Tool):
self._shortcut_key: Qt.Key = Qt.Key.Key_P
self._node_cache: Optional[SceneNode] = None
self._mesh_transformed_cache = None
self._mesh_transformed_cache: Optional[MeshData] = None
self._cache_dirty: bool = True
self._brush_size: int = 10
@ -111,8 +113,16 @@ class PaintTool(Tool):
Logger.error(f"Unknown brush shape '{self._brush_shape}', painting may not work.")
return pen
def _createStrokeImage(self, polys: List[Polygon]) -> Tuple[QImage, Tuple[int, int]]:
return PaintTool._rasterizePolygons(polys, self._brush_pen, QBrush(self._brush_pen.color()))
def _createStrokePath(self, polygons: List[Polygon]) -> QPainterPath:
path = QPainterPath()
for polygon in polygons:
path.moveTo(polygon[0][0], polygon[0][1])
for point in polygon:
path.lineTo(point[0], point[1])
path.closeSubpath()
return path
def getPaintType(self) -> str:
return self._view.getPaintType()
@ -184,11 +194,7 @@ class PaintTool(Tool):
self._updateScene()
def clear(self) -> None:
width, height = self._view.getUvTexDimensions()
clear_image = QImage(width, height, QImage.Format.Format_RGB32)
clear_image.fill(Qt.GlobalColor.white)
self._view.addStroke(clear_image, 0, 0, "none" if self.getPaintType() != "extruder" else "0", False)
self._view.clearPaint()
self._updateScene()
@staticmethod
@ -265,90 +271,42 @@ class PaintTool(Tool):
return Polygon()
return shape.translate(stroke_a[0], stroke_a[1]).unionConvexHulls(shape.translate(stroke_b[0], stroke_b[1]))
@staticmethod
def _rasterizePolygons(polygons: List[Polygon], pen: QPen, brush: QBrush) -> Tuple[QImage, Tuple[int, int]]:
if not polygons:
return QImage(), (0, 0)
bounding_box = polygons[0].getBoundingBox()
for polygon in polygons[1:]:
bounding_box += polygon.getBoundingBox()
bounding_box = AxisAlignedBox2D(numpy.array([math.floor(bounding_box.left), math.floor(bounding_box.top)]),
numpy.array([math.ceil(bounding_box.right), math.ceil(bounding_box.bottom)]))
# Use RGB32 which is more optimized for drawing to
image = QImage(int(bounding_box.width), int(bounding_box.height), QImage.Format.Format_RGB32)
image.fill(0)
painter = QPainter(image)
painter.translate(-bounding_box.left, -bounding_box.bottom)
painter.setRenderHint(QPainter.RenderHint.Antialiasing, False)
painter.setPen(pen)
painter.setBrush(brush)
for polygon in polygons:
painter.drawPolygon(QPolygonF([QPointF(point[0], point[1]) for point in polygon]))
painter.end()
return image, (int(bounding_box.left), int(bounding_box.bottom))
# NOTE: Currently, it's unclear how well this would work for non-convex brush-shapes.
def _getUvAreasForStroke(self, world_coords_a: numpy.ndarray, world_coords_b: numpy.ndarray) -> List[Polygon]:
def _getUvAreasForStroke(self, world_coords_a: numpy.ndarray, world_coords_b: numpy.ndarray, face_id: int) -> List[Polygon]:
""" Fetches all texture-coordinate areas within the provided stroke on the mesh.
Calculates intersections of the stroke with the surface of the geometry and maps them to UV-space polygons.
:param face_id_a: ID of the face where the stroke starts.
:param face_id_b: ID of the face where the stroke ends.
:param world_coords_a: 3D ('world') coordinates corresponding to the starting stroke point.
:param world_coords_b: 3D ('world') coordinates corresponding to the ending stroke point.
:param face_id: the ID of the face at the center of the stroke
:return: A list of UV-mapped polygons representing areas intersected by the stroke on the node's mesh surface.
"""
def get_projected_on_plane(pt: numpy.ndarray) -> numpy.ndarray:
return numpy.array([*self._camera.projectToViewport(Vector(*pt))], dtype=numpy.float32)
def get_projected_on_viewport_image(pt: numpy) -> numpy.ndarray:
return numpy.array([pt[0] + self._camera.getViewportWidth() / 2.0,
self._camera.getViewportHeight() - (pt[1] + self._camera.getViewportHeight() / 2.0)],
dtype=numpy.float32)
stroke_poly = self._getStrokePolygon(get_projected_on_plane(world_coords_a), get_projected_on_plane(world_coords_b))
stroke_poly_viewport = Polygon([get_projected_on_viewport_image(point) for point in stroke_poly])
stroke_poly.toType(numpy.float32)
faces_image, (faces_x, faces_y) = PaintTool._rasterizePolygons([stroke_poly_viewport],
QPen(Qt.PenStyle.NoPen),
QBrush(Qt.GlobalColor.white))
faces = self._faces_selection_pass.getFacesIdsUnderMask(faces_image, faces_x, faces_y)
mesh_indices = self._mesh_transformed_cache.getIndices()
if mesh_indices is None:
mesh_indices = numpy.array([], dtype=numpy.int32)
texture_dimensions = numpy.array(list(self._view.getUvTexDimensions()))
res = []
for face in faces:
_, fnorm = self._mesh_transformed_cache.getFacePlane(face)
if numpy.dot(fnorm, self._cam_norm) < 0: # <- facing away from the viewer
continue
va, vb, vc = self._mesh_transformed_cache.getFaceNodes(face)
stroke_tri = Polygon([
get_projected_on_plane(va),
get_projected_on_plane(vb),
get_projected_on_plane(vc)])
face_uv_coordinates = self._node_cache.getMeshData().getFaceUvCoords(face)
if face_uv_coordinates is None:
continue
ta, tb, tc = face_uv_coordinates
original_uv_poly = numpy.array([ta, tb, tc])
uv_area = stroke_poly.intersection(stroke_tri)
if uv_area.isValid():
uv_area_barycentric = PaintTool._getBarycentricCoordinates(uv_area.getPoints(), stroke_tri.getPoints())
if uv_area_barycentric is not None:
res.append(Polygon((uv_area_barycentric @ original_uv_poly) * texture_dimensions))
return res
res = uvula.project(stroke_poly.getPoints(),
self._mesh_transformed_cache.getVertices(),
mesh_indices,
self._node_cache.getMeshData().getUVCoordinates(),
self._node_cache.getMeshData().getFacesConnections(),
self._view.getUvTexDimensions()[0],
self._view.getUvTexDimensions()[1],
self._camera.getProjectToViewMatrix().getData(),
self._camera.isPerspective(),
self._camera.getViewportWidth(),
self._camera.getViewportHeight(),
self._cam_norm,
face_id)
return [Polygon(points) for points in res]
def event(self, event: Event) -> bool:
"""Handle mouse and keyboard events.
@ -430,44 +388,50 @@ class PaintTool(Tool):
if self._last_world_coords is None:
self._last_world_coords = world_coords
event_caught = False # Propagate mouse event if only moving the cursor, not to block e.g. rotation
try:
brush_color = self._brush_color if self.getPaintType() != "extruder" else str(self._brush_extruder)
uv_areas_cursor = self._getUvAreasForStroke(world_coords, world_coords)
uv_areas_cursor = self._getUvAreasForStroke(world_coords, world_coords, face_id)
if len(uv_areas_cursor) > 0:
cursor_stroke_img, (start_x, start_y) = self._createStrokeImage(uv_areas_cursor)
self._view.setCursorStroke(cursor_stroke_img, start_x, start_y, brush_color)
cursor_path = self._createStrokePath(uv_areas_cursor)
self._view.setCursorStroke(cursor_path, brush_color)
else:
self._view.clearCursorStroke()
if self._mouse_held:
uv_areas = self._getUvAreasForStroke(self._last_world_coords, world_coords)
uv_areas = self._getUvAreasForStroke(self._last_world_coords, world_coords, face_id)
if len(uv_areas) == 0:
return False
stroke_img, (start_x, start_y) = self._createStrokeImage(uv_areas)
self._view.addStroke(stroke_img, start_x, start_y, brush_color, is_moved)
event_caught = True
self._view.addStroke(uv_areas, brush_color, is_moved)
except:
Logger.logException("e", "Error when adding paint stroke")
self._last_world_coords = world_coords
self._updateScene(node)
return True
return event_caught
return False
def getRequiredExtraRenderingPasses(self) -> list[str]:
return ["selection_faces", "picking_selected"]
@staticmethod
def _updateScene(node: SceneNode = None):
def _updateScene(self, node: SceneNode = None):
if node is None:
node = Selection.getSelectedObject(0)
if node is not None:
Application.getInstance().getController().getScene().sceneChanged.emit(node)
if self._mouse_held:
Application.getInstance().getController().getScene().sceneChanged.emit(node)
else:
scene = self.getController().getScene()
scene.sceneChanged.emit(scene.getRoot())
def _onSelectionChanged(self):
super()._onSelectionChanged()
self.setActiveView("PaintTool" if len(Selection.getAllSelectedObjects()) == 1 else None)
single_selection = len(Selection.getAllSelectedObjects()) == 1
self.setActiveView("PaintTool" if single_selection else None)
self._view.setCurrentPaintedObject(Selection.getSelectedObject(0) if single_selection else None)
self._updateState()
def _updateState(self):

View file

@ -1,104 +0,0 @@
# Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import cast, Optional
from PyQt6.QtCore import QRect, QPoint
from PyQt6.QtGui import QUndoCommand, QImage, QPainter
from UM.View.GL.Texture import Texture
class PaintUndoCommand(QUndoCommand):
"""Provides the command that does the actual painting on objects with undo/redo mechanisms"""
def __init__(self,
texture: Texture,
stroke_mask: QImage,
x: int,
y: int,
set_value: int,
bit_range: tuple[int, int],
mergeable: bool) -> None:
super().__init__()
self._original_texture_image: Optional[QImage] = texture.getImage().copy() if not mergeable else None
self._texture: Texture = texture
self._stroke_mask: QImage = stroke_mask
self._x: int = x
self._y: int = y
self._set_value: int = set_value
self._bit_range: tuple[int, int] = bit_range
self._mergeable: bool = mergeable
def id(self) -> int:
# Since the undo stack will contain only commands of this type, we can use a fixed ID
return 0
def redo(self) -> None:
actual_image = self._texture.getImage()
bit_range_start, bit_range_end = self._bit_range
full_int32 = 0xffffffff
clear_texture_bit_mask = full_int32 ^ (((full_int32 << (32 - 1 - (bit_range_end - bit_range_start))) & full_int32) >> (
32 - 1 - bit_range_end))
image_rect = QRect(0, 0, self._stroke_mask.width(), self._stroke_mask.height())
clear_bits_image = self._stroke_mask.copy()
clear_bits_image.invertPixels()
painter = QPainter(clear_bits_image)
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Lighten)
painter.fillRect(image_rect, clear_texture_bit_mask)
painter.end()
set_value_image = self._stroke_mask.copy()
painter = QPainter(set_value_image)
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Multiply)
painter.fillRect(image_rect, self._set_value)
painter.end()
stroked_image = actual_image.copy(self._x, self._y, self._stroke_mask.width(), self._stroke_mask.height())
painter = QPainter(stroked_image)
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_SourceAndDestination)
painter.drawImage(0, 0, clear_bits_image)
painter.setCompositionMode(QPainter.CompositionMode.RasterOp_SourceOrDestination)
painter.drawImage(0, 0, set_value_image)
painter.end()
self._texture.setSubImage(stroked_image, self._x, self._y)
def undo(self) -> None:
if self._original_texture_image is not None:
self._texture.setSubImage(self._original_texture_image.copy(self._x,
self._y,
self._stroke_mask.width(),
self._stroke_mask.height()),
self._x,
self._y)
def mergeWith(self, command: QUndoCommand) -> bool:
if not isinstance(command, PaintUndoCommand):
return False
paint_undo_command = cast(PaintUndoCommand, command)
if not paint_undo_command._mergeable:
return False
self_rect = QRect(QPoint(self._x, self._y), self._stroke_mask.size())
command_rect = QRect(QPoint(paint_undo_command._x, paint_undo_command._y), paint_undo_command._stroke_mask.size())
bounding_rect = self_rect.united(command_rect)
merged_mask = QImage(bounding_rect.width(), bounding_rect.height(), self._stroke_mask.format())
merged_mask.fill(0)
painter = QPainter(merged_mask)
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Lighten)
painter.drawImage(self._x - bounding_rect.x(), self._y - bounding_rect.y(), self._stroke_mask)
painter.drawImage(paint_undo_command._x - bounding_rect.x(), paint_undo_command._y - bounding_rect.y(), paint_undo_command._stroke_mask)
painter.end()
self._x = bounding_rect.x()
self._y = bounding_rect.y()
self._stroke_mask = merged_mask
return True

View file

@ -2,11 +2,15 @@
# Cura is released under the terms of the LGPLv3 or higher.
import os
import math
from weakref import WeakKeyDictionary
from PyQt6.QtCore import QRect, pyqtSignal
from PyQt6.QtGui import QImage, QUndoStack, QPainter, QColor
from typing import Optional, List, Tuple, Dict
from PyQt6.QtCore import QRect, pyqtSignal, Qt, QPoint
from PyQt6.QtGui import QImage, QUndoStack, QPainter, QColor, QPainterPath, QBrush, QPen
from typing import Optional, Tuple, Dict, List
from UM.Logger import Logger
from UM.Scene.SceneNode import SceneNode
from cura.CuraApplication import CuraApplication
from cura.BuildVolume import BuildVolume
from cura.CuraView import CuraView
@ -15,12 +19,14 @@ from UM.PluginRegistry import PluginRegistry
from UM.View.GL.ShaderProgram import ShaderProgram
from UM.View.GL.Texture import Texture
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Scene.Selection import Selection
from UM.View.GL.OpenGL import OpenGL
from UM.i18n import i18nCatalog
from UM.Math.Color import Color
from UM.Math.Polygon import Polygon
from .PaintUndoCommand import PaintUndoCommand
from .PaintStrokeCommand import PaintStrokeCommand
from .PaintClearCommand import PaintClearCommand
from .MultiMaterialExtruderConverter import MultiMaterialExtruderConverter
catalog = i18nCatalog("cura")
@ -36,32 +42,70 @@ class PaintView(CuraView):
def __init__(self) -> None:
super().__init__(use_empty_menu_placeholder = True)
self._paint_shader: Optional[ShaderProgram] = None
self._current_paint_texture: Optional[Texture] = None
self._previous_paint_texture_stroke: Optional[QRect] = None
self._paint_texture: Optional[Texture] = None
self._painted_object: Optional[SceneNode] = None
self._previous_paint_texture_rect: Optional[QRect] = None
self._cursor_texture: Optional[Texture] = None
self._current_bits_ranges: tuple[int, int] = (0, 0)
self._current_paint_type = ""
self._paint_modes: Dict[str, Dict[str, "PaintView.PaintType"]] = {}
self._paint_undo_stack: QUndoStack = QUndoStack()
self._paint_undo_stack.setUndoLimit(32) # Set a quite low amount since every command copies the full texture
self._paint_undo_stack.canUndoChanged.connect(self.canUndoChanged)
self._paint_undo_stack.canRedoChanged.connect(self.canRedoChanged)
self._paint_undo_stacks: WeakKeyDictionary[SceneNode, Dict[str, QUndoStack]] = WeakKeyDictionary()
application = CuraApplication.getInstance()
application.engineCreatedSignal.connect(self._makePaintModes)
self._scene = application.getController().getScene()
self._extruders_model: Optional[ExtrudersModel] = None
self._extruders_converter: Optional[MultiMaterialExtruderConverter] = None
canUndoChanged = pyqtSignal(bool)
canRedoChanged = pyqtSignal(bool)
def setCurrentPaintedObject(self, current_painted_object: Optional[SceneNode]):
if self._painted_object is not None:
texture_changed_signal = self._painted_object.callDecoration("getPaintTextureChangedSignal")
texture_changed_signal.disconnect(self._onCurrentPaintedObjectTextureChanged)
self._paint_texture = None
self._cursor_texture = None
self._painted_object = current_painted_object
if self._painted_object is not None:
texture_changed_signal = self._painted_object.callDecoration("getPaintTextureChangedSignal")
texture_changed_signal.connect(self._onCurrentPaintedObjectTextureChanged)
self._onCurrentPaintedObjectTextureChanged()
self._updateCurrentBitsRanges()
def _onCurrentPaintedObjectTextureChanged(self) -> None:
paint_texture = self._painted_object.callDecoration("getPaintTexture")
self._paint_texture = paint_texture
if paint_texture is not None:
self._cursor_texture = OpenGL.getInstance().createTexture(paint_texture.getWidth(),
paint_texture.getHeight())
image = QImage(paint_texture.getWidth(), paint_texture.getHeight(), QImage.Format.Format_ARGB32)
image.fill(0)
self._cursor_texture.setImage(image)
else:
self._cursor_texture = None
def canUndo(self):
return self._paint_undo_stack.canUndo()
stack = self._getUndoStack()
return stack.canUndo() if stack is not None else False
def canRedo(self):
return self._paint_undo_stack.canRedo()
stack = self._getUndoStack()
return stack.canRedo() if stack is not None else False
def _getUndoStack(self):
if self._painted_object is None:
return None
try:
return self._paint_undo_stacks[self._painted_object][self._current_paint_type]
except KeyError:
return None
def _makePaintModes(self):
application = CuraApplication.getInstance()
@ -69,6 +113,9 @@ class PaintView(CuraView):
self._extruders_model = application.getExtrudersModel()
self._extruders_model.modelChanged.connect(self._onExtrudersChanged)
self._extruders_converter = MultiMaterialExtruderConverter(self._extruders_model)
self._extruders_converter.mainExtruderChanged.connect(self._onMainExtruderChanged)
theme = application.getTheme()
usual_types = {"none": self.PaintType(Color(*theme.getColor("paint_normal_area").getRgb()), 0),
"preferred": self.PaintType(Color(*theme.getColor("paint_preferred_area").getRgb()), 1),
@ -81,17 +128,28 @@ class PaintView(CuraView):
self._current_paint_type = "seam"
def _onMainExtruderChanged(self, node: SceneNode):
# Since the affected extruder has changed, the previous material painting commands become irrelevant,
# so clear the undo stack of the object, if any
try:
self._paint_undo_stacks[node]["extruder"].clear()
except KeyError:
pass
def _makeExtrudersColors(self) -> Dict[str, "PaintView.PaintType"]:
extruders_colors: Dict[str, "PaintView.PaintType"] = {}
for extruder_item in self._extruders_model.items:
if "color" in extruder_item:
for extruder_index in range(MultiMaterialExtruderConverter.MAX_EXTRUDER_COUNT):
extruder_item = self._extruders_model.getExtruderItem(extruder_index)
if extruder_item is None:
extruder_item = self._extruders_model.getExtruderItem(0)
if extruder_item is not None and "color" in extruder_item:
material_color = extruder_item["color"]
else:
material_color = self._extruders_model.defaultColors[0]
index = extruder_item["index"]
extruders_colors[str(index)] = self.PaintType(Color(*QColor(material_color).getRgb()), index)
extruders_colors[str(extruder_index)] = self.PaintType(Color(*QColor(material_color).getRgb()), extruder_index)
return extruders_colors
@ -105,96 +163,115 @@ class PaintView(CuraView):
if controller.getActiveView() != self:
return
selected_objects = Selection.getAllSelectedObjects()
if len(selected_objects) != 1:
if self._painted_object is None:
return
controller.getScene().sceneChanged.emit(selected_objects[0])
controller.getScene().sceneChanged.emit(self._painted_object)
def _checkSetup(self):
if not self._paint_shader:
shader_filename = os.path.join(PluginRegistry.getInstance().getPluginPath("PaintTool"), "paint.shader")
self._paint_shader = OpenGL.getInstance().createShaderProgram(shader_filename)
def setCursorStroke(self, stroke_mask: QImage, start_x: int, start_y: int, brush_color: str):
def setCursorStroke(self, cursor_path: QPainterPath, brush_color: str):
if self._cursor_texture is None or self._cursor_texture.getImage() is None:
return
self.clearCursorStroke()
stroke_image = stroke_mask.copy()
alpha_mask = stroke_image.convertedTo(QImage.Format.Format_Mono)
stroke_image.setAlphaChannel(alpha_mask)
bounding_rect = cursor_path.boundingRect()
bounding_rect_rounded = QRect(
QPoint(math.floor(bounding_rect.left()), math.floor(bounding_rect.top())),
QPoint(math.ceil(bounding_rect.right()), math.ceil(bounding_rect.bottom())))
painter = QPainter(stroke_image)
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_SourceAtop)
painter = QPainter(self._cursor_texture.getImage())
painter.setRenderHint(QPainter.RenderHint.Antialiasing, False)
display_color = self._paint_modes[self._current_paint_type][brush_color].display_color
paint_color = QColor(*[int(color_part * 255) for color_part in [display_color.r, display_color.g, display_color.b]])
paint_color.setAlpha(255)
painter.fillRect(0, 0, stroke_mask.width(), stroke_mask.height(), paint_color)
painter.setBrush(QBrush(paint_color))
painter.setPen(QPen(Qt.PenStyle.NoPen))
painter.drawPath(cursor_path)
painter.end()
self._cursor_texture.setSubImage(stroke_image, start_x, start_y)
self._previous_paint_texture_stroke = QRect(start_x, start_y, stroke_mask.width(), stroke_mask.height())
self._cursor_texture.updateImagePart(bounding_rect_rounded)
self._previous_paint_texture_rect = bounding_rect_rounded
def clearCursorStroke(self) -> bool:
if (self._previous_paint_texture_stroke is None or
if (self._previous_paint_texture_rect is None or
self._cursor_texture is None or self._cursor_texture.getImage() is None):
return False
clear_image = QImage(self._previous_paint_texture_stroke.width(),
self._previous_paint_texture_stroke.height(),
QImage.Format.Format_ARGB32)
clear_image.fill(0)
self._cursor_texture.setSubImage(clear_image,
self._previous_paint_texture_stroke.x(),
self._previous_paint_texture_stroke.y())
self._previous_paint_texture_stroke = None
painter = QPainter(self._cursor_texture.getImage())
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source)
painter.fillRect(self._previous_paint_texture_rect, QBrush(QColor(0, 0, 0, 0)))
painter.end()
self._cursor_texture.updateImagePart(self._previous_paint_texture_rect)
self._previous_paint_texture_rect = None
return True
def addStroke(self, stroke_mask: QImage, start_x: int, start_y: int, brush_color: str, merge_with_previous: bool) -> None:
if self._current_paint_texture is None or self._current_paint_texture.getImage() is None:
def _shiftTextureValue(self, value: int) -> int:
if self._current_bits_ranges is None:
return 0
bit_range_start, _ = self._current_bits_ranges
return value << bit_range_start
def addStroke(self, stroke_path: List[Polygon], brush_color: str, merge_with_previous: bool) -> None:
if self._paint_texture is None or self._paint_texture.getImage() is None:
return
self._prepareDataMapping()
stack = self._prepareUndoRedoStack()
current_image = self._current_paint_texture.getImage()
texture_rect = QRect(0, 0, current_image.width(), current_image.height())
stroke_rect = QRect(start_x, start_y, stroke_mask.width(), stroke_mask.height())
intersect_rect = texture_rect.intersected(stroke_rect)
if intersect_rect != stroke_rect:
# Stroke doesn't fully fit into the image, we have to crop it
stroke_mask = stroke_mask.copy(intersect_rect.x() - start_x,
intersect_rect.y() - start_y,
intersect_rect.width(),
intersect_rect.height())
start_x = intersect_rect.x()
start_y = intersect_rect.y()
if stack is None:
return
bit_range_start, bit_range_end = self._current_bits_ranges
set_value = self._paint_modes[self._current_paint_type][brush_color].value << bit_range_start
set_value = self._shiftTextureValue(self._paint_modes[self._current_paint_type][brush_color].value)
stack.push(PaintStrokeCommand(self._paint_texture,
stroke_path,
set_value,
self._current_bits_ranges,
merge_with_previous))
self._paint_undo_stack.push(PaintUndoCommand(self._current_paint_texture,
stroke_mask,
start_x,
start_y,
set_value,
(bit_range_start, bit_range_end),
merge_with_previous))
def _makeClearCommand(self) -> Optional[PaintClearCommand]:
if self._painted_object is None or self._paint_texture is None or self._current_bits_ranges is None:
return None
set_value = 0
if self._current_paint_type == "extruder":
extruder_stack = self._painted_object.getPrintingExtruder()
if extruder_stack is not None:
set_value = extruder_stack.getValue("extruder_nr")
return PaintClearCommand(self._paint_texture, self._current_bits_ranges, set_value)
def clearPaint(self):
self._prepareDataMapping()
stack = self._prepareUndoRedoStack()
if stack is None:
return
clear_command = self._makeClearCommand()
if clear_command is not None:
stack.push(clear_command)
def undoStroke(self) -> None:
self._paint_undo_stack.undo()
stack = self._getUndoStack()
if stack is not None:
stack.undo()
def redoStroke(self) -> None:
self._paint_undo_stack.redo()
stack = self._getUndoStack()
if stack is not None:
stack.redo()
def getUvTexDimensions(self) -> Tuple[int, int]:
if self._current_paint_texture is not None:
return self._current_paint_texture.getWidth(), self._current_paint_texture.getHeight()
if self._paint_texture is not None:
return self._paint_texture.getWidth(), self._paint_texture.getHeight()
return 0, 0
def getPaintType(self) -> str:
@ -204,19 +281,56 @@ class PaintView(CuraView):
self._current_paint_type = paint_type
self._prepareDataMapping()
def _prepareDataMapping(self):
node = Selection.getAllSelectedObjects()[0]
if node is None:
def _prepareUndoRedoStack(self) -> Optional[QUndoStack]:
if self._painted_object is None:
return None
try:
return self._paint_undo_stacks[self._painted_object][self._current_paint_type]
except KeyError:
stack: QUndoStack = QUndoStack()
stack.setUndoLimit(16) # Set a quite low amount since some commands copy the full texture
stack.canUndoChanged.connect(self.canUndoChanged)
stack.canRedoChanged.connect(self.canRedoChanged)
if self._painted_object not in self._paint_undo_stacks:
self._paint_undo_stacks[self._painted_object] = {}
self._paint_undo_stacks[self._painted_object][self._current_paint_type] = stack
return stack
def _updateCurrentBitsRanges(self):
self._current_bits_ranges = (0, 0)
if self._painted_object is None:
return
paint_data_mapping = node.callDecoration("getTextureDataMapping")
paint_data_mapping = self._painted_object.callDecoration("getTextureDataMapping")
if paint_data_mapping is None or self._current_paint_type not in paint_data_mapping:
return
self._current_bits_ranges = paint_data_mapping[self._current_paint_type]
def _prepareDataMapping(self):
if self._painted_object is None:
return
paint_data_mapping = self._painted_object.callDecoration("getTextureDataMapping")
feature_created = False
if self._current_paint_type not in paint_data_mapping:
new_mapping = self._add_mapping(paint_data_mapping, len(self._paint_modes[self._current_paint_type]))
paint_data_mapping[self._current_paint_type] = new_mapping
node.callDecoration("setTextureDataMapping", paint_data_mapping)
self._painted_object.callDecoration("setTextureDataMapping", paint_data_mapping)
feature_created = True
self._current_bits_ranges = paint_data_mapping[self._current_paint_type]
self._updateCurrentBitsRanges()
if feature_created and self._current_paint_type == "extruder":
# Fill texture extruder with actual mesh extruder
clear_command = self._makeClearCommand()
if clear_command is not None:
clear_command.redo()
@staticmethod
def _add_mapping(actual_mapping: Dict[str, tuple[int, int]], nb_storable_values: int) -> tuple[int, int]:
@ -229,7 +343,7 @@ class PaintView(CuraView):
return start_index, end_index
def beginRendering(self) -> None:
if self._current_paint_type not in self._paint_modes:
if self._painted_object is None or self._current_paint_type not in self._paint_modes:
return
self._checkSetup()
@ -242,23 +356,25 @@ class PaintView(CuraView):
paint_batch = renderer.createRenderBatch(shader=self._paint_shader)
renderer.addRenderBatch(paint_batch)
for node in Selection.getAllSelectedObjects():
paint_batch.addItem(node.getWorldTransformation(copy=False), node.getMeshData(), normal_transformation=node.getCachedNormalMatrix())
paint_texture = node.callDecoration("getPaintTexture")
if paint_texture != self._current_paint_texture:
self._current_paint_texture = paint_texture
self._paint_shader.setTexture(0, self._current_paint_texture)
paint_batch.addItem(self._painted_object.getWorldTransformation(copy=False),
self._painted_object.getMeshData(),
normal_transformation=self._painted_object.getCachedNormalMatrix())
self._cursor_texture = OpenGL.getInstance().createTexture(paint_texture.getWidth(), paint_texture.getHeight())
image = QImage(paint_texture.getWidth(), paint_texture.getHeight(), QImage.Format.Format_ARGB32)
image.fill(0)
self._cursor_texture.setImage(image)
self._paint_shader.setTexture(1, self._cursor_texture)
self._previous_paint_texture_stroke = None
if self._paint_texture is not None:
self._paint_shader.setTexture(0, self._paint_texture)
if self._cursor_texture is not None:
self._paint_shader.setTexture(1, self._cursor_texture)
self._paint_shader.setUniformValue("u_bitsRangesStart", self._current_bits_ranges[0])
self._paint_shader.setUniformValue("u_bitsRangesEnd", self._current_bits_ranges[1])
colors = [paint_type_obj.display_color for paint_type_obj in self._paint_modes[self._current_paint_type].values()]
if self._current_bits_ranges[0] != self._current_bits_ranges[1]:
colors = [paint_type_obj.display_color for paint_type_obj in self._paint_modes[self._current_paint_type].values()]
elif self._current_paint_type == "extruder":
object_extruder = MultiMaterialExtruderConverter.getPaintedObjectExtruderNr(self._painted_object)
colors = [self._paint_modes[self._current_paint_type][str(object_extruder)].display_color]
else:
colors = [self._paint_modes[self._current_paint_type]["none"].display_color]
colors_values = [[int(color_part * 255) for color_part in [color.r, color.g, color.b]] for color in colors]
self._paint_shader.setUniformValueArray("u_renderColors", colors_values)

View file

@ -31,3 +31,5 @@ class PrepareTextureJob(Job):
# Force clear OpenGL buffer so that new UV coordinates will be sent
delattr(mesh, OpenGL.VertexBufferProperty)
# Also cache the faces connection, can be quite long to compute
self._node.getMeshData().getFacesConnections()

View file

@ -14,7 +14,7 @@ def getMetaData():
"tool": {
"name": i18n_catalog.i18nc("@action:button", "Paint"),
"description": i18n_catalog.i18nc("@info:tooltip", "Paint Model"),
"icon": "Visual",
"icon": "Brush",
"tool_panel": "PaintTool.qml",
"weight": 0
},

View file

@ -316,7 +316,7 @@ class ZHopOnTravel(Script):
if hop_start > 0:
# For any lines that are XYZ moves right before layer change
if " Z" in line:
lines[index] = lines[index].replace("Z" + str(self._cur_z), "Z" + str(self._cur_z + hop_height))
lines[index] = lines[index].replace(f"Z{self._cur_z}", f"Z{round(self._cur_z + hop_height, 3)}")
# If there is no 'F' in the next line then add one at the Travel Speed so the z-hop speed doesn't carry over
if not " F" in lines[index] and lines[index].startswith("G0"):
lines[index] = lines[index].replace("G0", f"G0 F{speed_travel}")
@ -421,9 +421,9 @@ class ZHopOnTravel(Script):
machine_height = Application.getInstance().getGlobalContainerStack().getProperty("machine_height", "value")
if self._cur_z + hop_height < machine_height:
up_lines = f"G1 F{speed_zhop} Z{round(self._cur_z + hop_height,2)} ; Hop Up"
up_lines = f"G1 F{speed_zhop} Z{round(self._cur_z + hop_height, 3)} ; Hop Up"
else:
up_lines = f"G1 F{speed_zhop} Z{round(machine_height, 2)} ; Hop Up"
up_lines = f"G1 F{speed_zhop} Z{round(machine_height, 3)} ; Hop Up"
if reset_type in [1, 9] and hop_retraction: # add retract only when necessary
up_lines = f"G1 F{retract_speed} E{round(self._cur_e - retraction_amount, 5)} ; Retract\n" + up_lines
self._cur_e = round(self._cur_e - retraction_amount, 5)

View file

@ -66,12 +66,31 @@ class ClusterApiClient:
self._manager = QNetworkAccessManager()
self._address = address
self._on_error = on_error
self._auth_id = None
self._auth_key = None
self._auth_tries = 0
self._nonce_count = 1
self._nonce = None
prefs = CuraApplication.getInstance().getPreferences()
prefs.addPreference("cluster_api/auth_ids", "{}")
prefs.addPreference("cluster_api/auth_keys", "{}")
prefs.addPreference("cluster_api/nonce_counts", "{}")
prefs.addPreference("cluster_api/nonces", "{}")
try:
self._auth_id = json.loads(prefs.getValue("cluster_api/auth_ids")).get(self._address, None)
self._auth_key = json.loads(prefs.getValue("cluster_api/auth_keys")).get(self._address, None)
self._nonce_count = int(json.loads(prefs.getValue("cluster_api/nonce_counts")).get(self._address, 1))
self._nonce = json.loads(prefs.getValue("cluster_api/nonces")).get(self._address, None)
except (JSONDecodeError, TypeError, KeyError) as ex:
Logger.info(f"Get new cluster-API auth info ('{str(ex)}').")
self._auth_id = None
self._auth_key = None
self._nonce_count = 1
self._nonce = None
def _setLocalValueToPrefDict(self, name: str, value: Any) -> None:
prefs = CuraApplication.getInstance().getPreferences()
values_per_address = json.loads(prefs.getValue(name))
values_per_address[self._address] = value
prefs.setValue(name, json.dumps(values_per_address))
def getSystem(self, on_finished: Callable) -> None:
"""Get printer system information.
@ -158,6 +177,8 @@ class ClusterApiClient:
digest_str = self._makeAuthDigestHeaderPart(path, method=method)
request.setRawHeader(b"Authorization", f"Digest {digest_str}".encode("utf-8"))
self._nonce_count += 1
self._setLocalValueToPrefDict("cluster_api/nonce_counts", self._nonce_count)
CuraApplication.getInstance().savePreferences()
elif not skip_auth:
self._setupAuth()
return request
@ -242,6 +263,9 @@ class ClusterApiClient:
auth_info = json.loads(resp.data().decode())
self._auth_id = auth_info["id"]
self._auth_key = auth_info["key"]
self._setLocalValueToPrefDict("cluster_api/auth_ids", self._auth_id)
self._setLocalValueToPrefDict("cluster_api/auth_keys", self._auth_key)
CuraApplication.getInstance().savePreferences()
except Exception as ex:
Logger.warning(f"Couldn't get temporary digest token: {str(ex)}")
return
@ -282,6 +306,9 @@ class ClusterApiClient:
if nonce_match:
self._nonce = nonce_match.group(1)
self._nonce_count = 1
self._setLocalValueToPrefDict("cluster_api/nonce_counts", self._nonce_count)
self._setLocalValueToPrefDict("cluster_api/nonces", self._nonce)
CuraApplication.getInstance().savePreferences()
self._on_error(reply.errorString())
return

View file

@ -32,6 +32,8 @@ class ZeroConfClient:
self._service_changed_request_event = None # type: Optional[Event]
self._service_changed_request_thread = None # type: Optional[Thread]
self._warn_once_no_address_services = set()
def start(self) -> None:
"""The ZeroConf service changed requests are handled in a separate thread so we don't block the UI.
@ -145,9 +147,11 @@ class ZeroConfClient:
address = '.'.join(map(str, info.addresses[0]))
self.addedNetworkCluster.emit(str(name), address, info.properties)
else:
Logger.log("w", "The type of the found device is '%s', not 'printer'." % type_of_device)
Logger.warning(f"The type of the found device is '{type_of_device}', not 'printer'.")
else:
Logger.log("w", "Could not get information about %s" % name)
if name not in self._warn_once_no_address_services:
self._warn_once_no_address_services.add(name)
Logger.warning(f"Could not get information about '{name}'.")
return False
return True

View file

@ -1 +1 @@
version: "5.11.0-beta.0"
version: "5.11.0-beta.1"

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,267 +0,0 @@
{
"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'" }
}
}

File diff suppressed because one or more lines are too long

View file

@ -13,7 +13,7 @@
"gantry_height": { "value": 40 },
"machine_acceleration": { "value": 150 },
"machine_depth": { "default_value": 330 },
"machine_end_gcode": { "default_value": "G91 ; Set Positioning to Relative\nM83 ; Set Extruder to Relative\nG92 E0 ; Reset Extruder\nG1 E-4 F3000 ; Retract 4mm of filament\nG1 Z0.2 ; Raise nozzle .2mm\nG90 ; Set positioning to absolute\nG1 X{machine_width} Y{machine_depth} ; Park print head\nG91 ; Set Positioning to RelativeG1 Z10 ; Raise nozzle 10mm\nM106 S0 ; Turn off part fan\nM104 S0 ; Set nozzle temp to zero\nM140 S0 ; set bed temp to zero\nM84 X Y Z E ; Disable X Y Z and E steppers\n" },
"machine_end_gcode": { "default_value": "G91 ; Set Positioning to Relative\nM83 ; Set Extruder to Relative\nG92 E0 ; Reset Extruder\nG1 E-4 F3000 ; Retract 4mm of filament\nG1 Z0.2 ; Raise nozzle .2mm\nG90 ; Set positioning to absolute\nG1 X{machine_width} Y{machine_depth} ; Park print head\nG91 ; Set Positioning to Relative\nG1 Z10 ; Raise nozzle 10mm\nM106 S0 ; Turn off part fan\nM104 S0 ; Set nozzle temp to zero\nM140 S0 ; set bed temp to zero\nM84 X Y Z E ; Disable X Y Z and E steppers\n" },
"machine_head_with_fans_polygon":
{
"default_value": [

View file

@ -13,7 +13,7 @@
"gantry_height": { "value": 40 },
"machine_acceleration": { "value": 150 },
"machine_depth": { "default_value": 400 },
"machine_end_gcode": { "default_value": "G91 ; Set Positioning to Relative\nM83 ; Set Extruder to Relative\nG92 E0 ; Reset Extruder\nG1 E-4 F3000 ; Retract 4mm of filament\nG1 Z0.2 ; Raise nozzle .2mm\nG90 ; Set positioning to absolute\nG1 X{machine_width} Y{machine_depth} ; Park print head\nG91 ; Set Positioning to RelativeG1 Z10 ; Raise nozzle 10mm\nM106 S0 ; Turn off part fan\nM104 S0 ; Set nozzle temp to zero\nM140 S0 ; set bed temp to zero\nM84 X Y Z E ; Disable X Y Z and E steppers\n" },
"machine_end_gcode": { "default_value": "G91 ; Set Positioning to Relative\nM83 ; Set Extruder to Relative\nG92 E0 ; Reset Extruder\nG1 E-4 F3000 ; Retract 4mm of filament\nG1 Z0.2 ; Raise nozzle .2mm\nG90 ; Set positioning to absolute\nG1 X{machine_width} Y{machine_depth} ; Park print head\nG91 ; Set Positioning to Relative\nG1 Z10 ; Raise nozzle 10mm\nM106 S0 ; Turn off part fan\nM104 S0 ; Set nozzle temp to zero\nM140 S0 ; set bed temp to zero\nM84 X Y Z E ; Disable X Y Z and E steppers\n" },
"machine_head_with_fans_polygon":
{
"default_value": [

View file

@ -13,7 +13,7 @@
"gantry_height": { "value": 40 },
"machine_acceleration": { "value": 150 },
"machine_depth": { "default_value": 500 },
"machine_end_gcode": { "default_value": "G91 ; Set Positioning to Relative\nM83 ; Set Extruder to Relative\nG92 E0 ; Reset Extruder\nG1 E-4 F3000 ; Retract 4mm of filament\nG1 Z0.2 ; Raise nozzle .2mm\nG90 ; Set positioning to absolute\nG1 X{machine_width} Y{machine_depth} ; Park print head\nG91 ; Set Positioning to RelativeG1 Z10 ; Raise nozzle 10mm\nM106 S0 ; Turn off part fan\nM104 S0 ; Set nozzle temp to zero\nM140 S0 ; set bed temp to zero\nM84 X Y Z E ; Disable X Y Z and E steppers\n" },
"machine_end_gcode": { "default_value": "G91 ; Set Positioning to Relative\nM83 ; Set Extruder to Relative\nG92 E0 ; Reset Extruder\nG1 E-4 F3000 ; Retract 4mm of filament\nG1 Z0.2 ; Raise nozzle .2mm\nG90 ; Set positioning to absolute\nG1 X{machine_width} Y{machine_depth} ; Park print head\nG91 ; Set Positioning to Relative\nG1 Z10 ; Raise nozzle 10mm\nM106 S0 ; Turn off part fan\nM104 S0 ; Set nozzle temp to zero\nM140 S0 ; set bed temp to zero\nM84 X Y Z E ; Disable X Y Z and E steppers\n" },
"machine_head_with_fans_polygon":
{
"default_value": [

View file

@ -448,7 +448,7 @@
"retraction_min_travel": { "value": "2.5 if support_enable and support_structure=='tree' else line_width * 2.5" },
"retraction_prime_speed": { "value": 15 },
"roofing_monotonic": { "value": false },
"roofing_pattern": { "value": "'zigzag'" },
"roofing_pattern": { "value": "'lines'" },
"seam_overhang_angle": { "value": 35 },
"skin_edge_support_thickness": { "value": 0.8 },
"skin_material_flow": { "value": 93 },

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,19 +0,0 @@
{
"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 }
}
}

View file

@ -1,18 +0,0 @@
{
"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 }
}
}

View file

@ -1,18 +0,0 @@
{
"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 }
}
}

View file

@ -1,18 +0,0 @@
{
"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 }
}
}

View file

@ -1,18 +0,0 @@
{
"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 }
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Extruder"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Dauer des Extruderwechsels"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "G-Code Extruder-Ende"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Extruder-Endposition Y"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Extruder-G-Code-Vorstart"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "X-Position Extruder-Einzug"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "Düsen-ID"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Düsenlänge"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "X-Versatz Düse"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Y-Versatz Düse"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Vor dem Umschalten auf diesen Extruder auszuführender G-Code-Vorstart."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "Auszuführenden G-Code beim Umschalten auf diesen Extruder starten."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "Die für das Drucken verwendete Extruder-Einheit. Diese wird für die Mehrfach-Extrusion benutzt."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Der Höhenunterschied zwischen der Düsenspitze und dem untersten Teil des Druckkopfs."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "Der Innendurchmesser der Düse. Verwenden Sie diese Einstellung, wenn Sie eine Düse einer Nicht-Standardgröße verwenden."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "Die Y-Koordinate der Startposition beim Einschalten des Extruders."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Düsenlänge"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Der Höhenunterschied zwischen der Düsenspitze und dem untersten Teil des Druckkopfs."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Dauer des Extruderwechsels"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Extruder-G-Code-Vorstart"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Vor dem Umschalten auf diesen Extruder auszuführender G-Code-Vorstart."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "Bei Verwendung einer Mehrfachwerkzeugkonfiguration ist dieser Wert die Werkzeugwechselzeit in Sekunden. Dieser Wert wird zur geschätzten Zeit basierend auf der Anzahl der Änderungen hinzugefügt."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Extrusor"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Duración del cambio del extrusor"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "GCode final del extrusor"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Posición de fin del extrusor sobre el eje Y"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "G-code de prearranque de extrusor"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "Posición de preparación del extrusor sobre el eje X"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "Id. de la tobera"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Longitud de la boquilla"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "Desplazamiento de la tobera sobre el eje X"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Desplazamiento de la tobera sobre el eje Y"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Prearrancar g-code para ejecutar antes de cambiar a este extrusor."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "Iniciar GCode para ejecutarlo al cambiar a este extrusor."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "El tren extrusor que se utiliza para imprimir. Se emplea en la extrusión múltiple."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "La diferencia de altura entre la punta de la boquilla y la parte más baja del cabezal de impresión."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "Diámetro interior de la tobera. Cambie este ajuste cuando utilice un tamaño de tobera no estándar."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "Coordenada Y de la posición de inicio cuando se enciende el extrusor."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Longitud de la boquilla"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "La diferencia de altura entre la punta de la boquilla y la parte más baja del cabezal de impresión."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Duración del cambio del extrusor"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "G-code de prearranque de extrusor"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Prearrancar g-code para ejecutar antes de cambiar a este extrusor."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "Cuando se use una configuración multiherramienta, este valor es el tiempo de cambio de herramienta en segundos. Se añadirá este valor al tiempo estimado en base al número de cambios que ocurran."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Extrudeuse"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Durée du changement de lextrudeuse"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "Extrudeuse G-Code de fin"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Extrudeuse Position de fin Y"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Prestart G-code de lextrudeuse"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "Extrudeuse Position d'amorçage X"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "ID buse"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Longueur de la buse"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "Buse Décalage X"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Buse Décalage Y"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Prestart g-code à exécuter avant de passer à cette extrudeuse."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "Démarrer le G-Code à exécuter lors du passage à cette extrudeuse."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "Le train d'extrudeuse utilisé pour l'impression. Cela est utilisé en multi-extrusion."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Différence de hauteur entre l'extrémité de la buse et la partie la plus basse de la tête d'impression."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "Le diamètre intérieur de la buse. Modifiez ce paramètre si vous utilisez une taille de buse non standard."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "Les coordonnées Y de la position de départ lors de la mise en marche de l'extrudeuse."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Longueur de la buse"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Différence de hauteur entre l'extrémité de la buse et la partie la plus basse de la tête d'impression."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Durée du changement de lextrudeuse"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Prestart G-code de lextrudeuse"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Prestart g-code à exécuter avant de passer à cette extrudeuse."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "Lors de lutilisation dune configuration multioutils, cette valeur correspond au temps de changement doutil en secondes. Cette valeur sera ajoutée au temps estimé en fonction du nombre de changements effectués."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Estrusore"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Durata cambio estrusore"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "Codice G fine estrusore"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Posizione Y fine estrusore"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Codice G della fase preparatoria dell'estrusore"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "Posizione X innesco estrusore"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "ID ugello"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Lunghezza ugello"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "Offset X ugello"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Offset Y ugello"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Codice G della fase preparatoria da eseguire prima di passare a questo estrusore."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "Inizio codice G da eseguire quando si passa a questo estrusore."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "Treno estrusore utilizzato per la stampa. Utilizzato nellestrusione multipla."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "La differenza di altezza tra la punta dell'ugello e la parte più bassa della testina di stampa."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "Il diametro interno dellugello. Modificare questa impostazione quando si utilizza una dimensione ugello non standard."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "La coordinata y della posizione di partenza allaccensione dellestrusore."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Lunghezza ugello"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "La differenza di altezza tra la punta dell'ugello e la parte più bassa della testina di stampa."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Durata cambio estrusore"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Codice G della fase preparatoria dell'estrusore"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Codice G della fase preparatoria da eseguire prima di passare a questo estrusore."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "Quando si utilizza una configurazione multi-utensile, questo valore rappresenta il tempo di cambio utensile in secondi. Questo valore verrà aggiunto al tempo stimato in base al numero di cambi che si verificano."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "익스트루더"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "압출기 변경 시간"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "익스트루더 엔드 G 코드"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "익스트루더 끝 Y 위치"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "압출기 사전 시작 G-코드"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "익스트루더 프라임 X 위치"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "노즐 ID"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "노즐 길이"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "노즐 X 오프셋"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "노즐 Y 오프셋"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "이 압출기로 전환하기 전에 실행할 사전 시작 g-코드입니다."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "이 익스트루더로 전환 시 실행할 G 코드를 시작하십시오."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "프린팅에 사용되는 익스트루더 트레인. 이것은 다중 압출에 사용됩니다."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "노즐 끝과 프린트 헤드의 가장 낮은 부분 사이의 높이 차이입니다."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "노즐의 내경. 비표준 노즐 크기를 사용할 때, 이 설정을 변경하십시오."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "익스트루더를 켤 때 시작 위치의 y 좌표."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "노즐 길이"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "노즐 끝과 프린트 헤드의 가장 낮은 부분 사이의 높이 차이입니다."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "압출기 변경 시간"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "압출기 사전 시작 G-코드"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "이 압출기로 전환하기 전에 실행할 사전 시작 g-코드입니다."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "멀티 도구 설정을 사용할 경우, 해당 값은 도구 변경에 걸리는 시간(초 단위)입니다. 이 값은 발생하는 변경 횟수에 따라 예상 시간에 추가됩니다."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Extruder"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Duur extruderwissel"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "Eind-G-code van Extruder"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Y-eindpositie Extruder"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Extruder Prestart G-Code"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "X-positie voor Primen Extruder"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "Nozzle-ID"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Lengte spuitmond"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "X-Offset Nozzle"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Y-Offset Nozzle"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Prestart g-code die moet worden uitgevoerd voordat wordt overgeschakeld naar deze extruder."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "Start-g-code die wordt uitgevoerd wanneer naar deze extruder wordt gewisseld."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "De extruder train die voor het printen wordt gebruikt. Deze wordt gebruikt in meervoudige doorvoer."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Het hoogteverschil tussen de punt van de spuitmond en het laagste deel van de printkop."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "De binnendiameter van de nozzle. Verander deze instelling wanneer u een nozzle gebruikt die geen standaard formaat heeft."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "De Y-coördinaat van de startpositie wanneer de extruder wordt ingeschakeld."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Lengte spuitmond"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Het hoogteverschil tussen de punt van de spuitmond en het laagste deel van de printkop."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Duur extruderwissel"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Extruder Prestart G-Code"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Prestart g-code die moet worden uitgevoerd voordat wordt overgeschakeld naar deze extruder."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "Bij gebruik van een multitoolsetup is deze waarde de toolwisseltijd in seconden. Deze waarde wordt opgeteld bij de geschatte tijd op basis van het aantal wissels dat plaatsvindt."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Extrusor"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Duração da mudança de extrusora"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "G-Code Final do Extrusor"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Posição Y Final do Extrusor"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Código-G do pré-arranque da extrusora"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "Posição X Preparação do Extrusor"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "ID do Nozzle"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Comprimento do bocal"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "Desvio X do Nozzle"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Desvio Y do Nozzle"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "O código-G de pré-arranque a executar antes de mudar para esta extrusora."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "G-code inicial para executar ao mudar para este extrusor."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "O núcleos de extrusão utilizado para imprimir. Definição usada com múltiplos extrusores."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "A diferença de altura entre a extremidade do bocal e a parte mais baixa da cabeça da impressão."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "O diâmetro interno do nozzle. Altere esta definição quando utilizar um nozzle com um tamanho não convencional."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "A coordenada Y da posição inicial ao ligar o extrusor."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Comprimento do bocal"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "A diferença de altura entre a extremidade do bocal e a parte mais baixa da cabeça da impressão."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Duração da mudança de extrusora"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Código-G do pré-arranque da extrusora"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "O código-G de pré-arranque a executar antes de mudar para esta extrusora."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "Quando é utilizada uma configuração com ferramentas múltiplas, este valor é o tempo da mudança de ferramenta em segundos. Este valor será adicionado ao tempo estimado com base no número de mudanças que ocorrerem."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Экструдер"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Продолжительность смены экструдера"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "Завершающий G-код экструдера"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Конечная Y позиция экструдера"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "G-код для предстартовой рутины экструдера"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "Начальная X позиция экструдера"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "Идентификатор сопла"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Длина сопла"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "X смещение сопла"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Y смещение сопла"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "G-код для выполнения до переключения на этот экструдер."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "Стартовый G-код, запускающийся при переключении на данный экструдер."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "Экструдер, который используется для печати. Имеет значение при использовании нескольких экструдеров."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Разница высот между кончиком сопла и самой нижней частью печатающей головки."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "Внутренний диаметр сопла. Измените этот параметр при использовании сопла нестандартного размера."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "Y координата стартовой позиции при включении экструдера."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Длина сопла"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Разница высот между кончиком сопла и самой нижней частью печатающей головки."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Продолжительность смены экструдера"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "G-код для предстартовой рутины экструдера"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "G-код для выполнения до переключения на этот экструдер."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "При использовании нескольких инструментов это значение представляет собой время смены инструмента в секундах. Оно будет прибавлено к расчетному времени с учетом количества смен инструментов."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "Ekstrüder"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Ekstruder Değişim süresi"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "Ekstruder G-Code'u Sonlandırma"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "Ekstruderin Y Bitiş Konumu"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Ekstruder Ön Başlatma G Kodu"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "Extruder İlk X konumu"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "Nozül Kimliği"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Püskürtme Memesi Uzunluğu"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "Nozül NX Ofseti"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "Nozül Y Ofseti"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Bu ekstrudere geçmeden önce çalıştırılacak g kodunu önden başlatır."
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "Bu ekstrüdere geçiş yaparken çalıştırmak üzere G Codeu başlatın."
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "Yazdırma için kullanılan ekstruder dişli çark. Çoklu ekstrüzyon işlemi için kullanılır."
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Püskürtme memesinin ucu ile yazıcı kafasının en alt kısmı arasındaki yükseklik farkı."
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "Nozül iç çapı. Standart olmayan nozül boyutu kullanırken bu ayarı değiştirin."
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "Ekstruder açılırken başlangıç konumunun Y koordinatı."
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "Püskürtme Memesi Uzunluğu"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "Püskürtme memesinin ucu ile yazıcı kafasının en alt kısmı arasındaki yükseklik farkı."
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "Ekstruder Değişim süresi"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "Ekstruder Ön Başlatma G Kodu"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "Bu ekstrudere geçmeden önce çalıştırılacak g kodunu önden başlatır."
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "Çoklu alet kurulumu kullanıldığında bu değer, saniye cinsinden alet değiştirme süresidir. Bu değer, meydana gelen değişiklik sayısına bağlı olarak tahmini süreye eklenecektir."

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: plugins@ultimaker.com\n"
"POT-Creation-Date: 2025-02-21 15:37+0000\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-03-13 09:02+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -36,10 +36,6 @@ msgctxt "extruder_nr label"
msgid "Extruder"
msgstr "挤出机"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "挤出机更换时间"
msgctxt "machine_extruder_end_code label"
msgid "Extruder End G-Code"
msgstr "挤出机的结束 G-code"
@ -60,10 +56,6 @@ msgctxt "machine_extruder_end_pos_y label"
msgid "Extruder End Position Y"
msgstr "挤出机终点位置 Y 坐标"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "挤出机预启动G代码"
msgctxt "extruder_prime_pos_x label"
msgid "Extruder Prime X Position"
msgstr "挤出机 X 轴坐标"
@ -132,10 +124,6 @@ msgctxt "machine_nozzle_id label"
msgid "Nozzle ID"
msgstr "喷嘴 ID"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "喷嘴长度"
msgctxt "machine_nozzle_offset_x label"
msgid "Nozzle X Offset"
msgstr "喷嘴 X 轴偏移量"
@ -144,10 +132,6 @@ msgctxt "machine_nozzle_offset_y label"
msgid "Nozzle Y Offset"
msgstr "喷嘴 Y 轴偏移量"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "在切换到此挤出机之前执行的预启动G代码。"
msgctxt "machine_extruder_start_code description"
msgid "Start g-code to execute when switching to this extruder."
msgstr "在切换到此挤出机时执行的开始 G-code。"
@ -168,10 +152,6 @@ msgctxt "extruder_nr description"
msgid "The extruder train used for printing. This is used in multi-extrusion."
msgstr "用于打印的挤出机,在多挤出机情况下适用。"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "喷嘴尖端与打印头最低部分之间的高度差。"
msgctxt "machine_nozzle_size description"
msgid "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size."
msgstr "喷嘴内径,在使用非标准喷嘴尺寸时需更改此设置。"
@ -216,6 +196,26 @@ msgctxt "machine_extruder_start_pos_y description"
msgid "The y-coordinate of the starting position when turning the extruder on."
msgstr "打开挤压机时的起始位置 Y 坐标。"
msgctxt "machine_nozzle_head_distance label"
msgid "Nozzle Length"
msgstr "喷嘴长度"
msgctxt "machine_nozzle_head_distance description"
msgid "The height difference between the tip of the nozzle and the lowest part of the print head."
msgstr "喷嘴尖端与打印头最低部分之间的高度差。"
msgctxt "machine_extruder_change_duration label"
msgid "Extruder Change duration"
msgstr "挤出机更换时间"
msgctxt "machine_extruder_prestart_code label"
msgid "Extruder Prestart G-Code"
msgstr "挤出机预启动G代码"
msgctxt "machine_extruder_prestart_code description"
msgid "Prestart g-code to execute before switching to this extruder."
msgstr "在切换到此挤出机之前执行的预启动G代码。"
msgctxt "machine_extruder_change_duration description"
msgid "When using a multi tool setup, this value is the tool change time in seconds. This value will be added to the estimate time based on the number of changes that occur."
msgstr "当使用多工具设置时,此值为工具更换时间(以秒为单位)。此值将根据发生的更换次数添加到估计时间中。"

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,14 +0,0 @@
[general]
definition = bambulab_a1
name = Standard
version = 4
[metadata]
material = generic_pla
quality_type = normal
setting_version = 25
type = quality
variant = 0.4mm
[values]

View file

@ -1,15 +0,0 @@
[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

View file

@ -1,14 +0,0 @@
[general]
definition = bambulab_a1mini
name = Standard
version = 4
[metadata]
material = generic_pla
quality_type = normal
setting_version = 25
type = quality
variant = 0.4mm
[values]

View file

@ -1,15 +0,0 @@
[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

View file

@ -1,14 +0,0 @@
[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]

View file

@ -1,15 +0,0 @@
[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

View file

@ -0,0 +1,47 @@
[general]
definition = ultimaker3
name = Fast
version = 4
[metadata]
material = generic_bam
quality_type = draft
setting_version = 25
type = quality
variant = BB 0.4
weight = -2
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
material_print_temperature = =default_material_print_temperature + 5
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
retraction_min_travel = =line_width * 2
retraction_prime_speed = =retraction_speed
skin_overlap = 20
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 35 / 70)
speed_wall = =math.ceil(speed_print * 50 / 70)
speed_wall_0 = =math.ceil(speed_wall * 35 / 50)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1
xy_offset_layer_0 = =(-0.2 if adhesion_type == "skirt" or adhesion_type == "none" else 0) + xy_offset

View file

@ -0,0 +1,47 @@
[general]
definition = ultimaker3
name = Normal
version = 4
[metadata]
material = generic_bam
quality_type = fast
setting_version = 25
type = quality
variant = BB 0.4
weight = -1
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
retraction_min_travel = =line_width * 2
retraction_prime_speed = =retraction_speed
skin_overlap = 15
speed_prime_tower = =speed_topbottom
speed_print = 80
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 30 / 80)
speed_wall = =math.ceil(speed_print * 40 / 80)
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_infill_sparse_thickness = =2*layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1
xy_offset_layer_0 = =(-0.2 if adhesion_type == "skirt" or adhesion_type == "none" else 0) + xy_offset

View file

@ -0,0 +1,47 @@
[general]
definition = ultimaker3
name = Fine
version = 4
[metadata]
material = generic_bam
quality_type = normal
setting_version = 25
type = quality
variant = BB 0.4
weight = 0
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
retraction_min_travel = =line_width * 2
retraction_prime_speed = =retraction_speed
skin_overlap = 10
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 30 / 70)
speed_wall = =math.ceil(speed_print * 30 / 70)
speed_wall_0 = =math.ceil(speed_wall * 20 / 30)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_infill_sparse_thickness = =2*layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1
xy_offset_layer_0 = =(-0.2 if adhesion_type == "skirt" or adhesion_type == "none" else 0) + xy_offset

View file

@ -0,0 +1,30 @@
[general]
definition = ultimaker_factor4
name = Normal
version = 4
[metadata]
material = generic_bam
quality_type = fast
setting_version = 25
type = quality
variant = BB 0.4
weight = -1
[values]
brim_replaces_support = False
build_volume_temperature = =40 if extruders_enabled_count > 1 else 35
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
gradual_flow_discretisation_step_size = 0.1
gradual_flow_enabled = True
machine_nozzle_heat_up_speed = 1.56
max_flow_acceleration = 1
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
skin_material_flow = =material_flow * 0.965
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_join_distance = 5
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height

View file

@ -0,0 +1,32 @@
[general]
definition = ultimaker_factor4
name = Fine
version = 4
[metadata]
material = generic_bam
quality_type = normal
setting_version = 25
type = quality
variant = BB 0.4
weight = 0
[values]
brim_replaces_support = False
build_volume_temperature = =40 if extruders_enabled_count > 1 else 35
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
gradual_flow_discretisation_step_size = 0.1
gradual_flow_enabled = True
machine_nozzle_heat_up_speed = 1.56
material_print_temperature = =default_material_print_temperature - 5
max_flow_acceleration = 1
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
skin_material_flow = =material_flow * 0.965
speed_print = 60
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_join_distance = 5
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height

View file

@ -0,0 +1,31 @@
[general]
definition = ultimaker_factor4
name = Fast
version = 4
[metadata]
material = generic_bam
quality_type = draft
setting_version = 25
type = quality
variant = BB 0.4
weight = -2
[values]
brim_replaces_support = False
build_volume_temperature = =40 if extruders_enabled_count > 1 else 35
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
gradual_flow_discretisation_step_size = 0.1
gradual_flow_enabled = True
machine_nozzle_heat_up_speed = 1.56
max_flow_acceleration = 1
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
skin_material_flow = =material_flow * 0.965
speed_print = 60
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_join_distance = 5
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height

View file

@ -0,0 +1,31 @@
[general]
definition = ultimaker_factor4
name = Extra Fast
version = 4
[metadata]
material = generic_bam
quality_type = verydraft
setting_version = 25
type = quality
variant = BB 0.4
weight = -3
[values]
brim_replaces_support = False
build_volume_temperature = =40 if extruders_enabled_count > 1 else 35
default_material_bed_temperature = =0 if extruders_enabled_count > 1 else 60
gradual_flow_discretisation_step_size = 0.1
gradual_flow_enabled = True
machine_nozzle_heat_up_speed = 1.56
max_flow_acceleration = 1
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
skin_material_flow = =material_flow * 0.965
speed_print = 50
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_join_distance = 5
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height

View file

@ -0,0 +1,46 @@
[general]
definition = ultimaker_s3
name = Normal
version = 4
[metadata]
material = generic_bam
quality_type = fast
setting_version = 25
type = quality
variant = BB 0.4
weight = -1
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 80
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 30 / 80)
speed_wall = =math.ceil(speed_print * 40 / 80)
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_infill_sparse_thickness = =2 * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -0,0 +1,46 @@
[general]
definition = ultimaker_s3
name = Fine
version = 4
[metadata]
material = generic_bam
quality_type = normal
setting_version = 25
type = quality
variant = BB 0.4
weight = 0
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 30 / 70)
speed_wall = =math.ceil(speed_print * 30 / 70)
speed_wall_0 = =math.ceil(speed_wall * 20 / 30)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_infill_sparse_thickness = =2 * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -0,0 +1,46 @@
[general]
definition = ultimaker_s3
name = Fast
version = 4
[metadata]
material = generic_bam
quality_type = draft
setting_version = 25
type = quality
variant = BB 0.4
weight = -2
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
material_print_temperature = =default_material_print_temperature + 5
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 35 / 70)
speed_wall = =math.ceil(speed_print * 50 / 70)
speed_wall_0 = =math.ceil(speed_wall * 35 / 50)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -0,0 +1,47 @@
[general]
definition = ultimaker_s3
name = Extra Fast - Experimental
version = 4
[metadata]
is_experimental = True
material = generic_bam
quality_type = verydraft
setting_version = 25
type = quality
variant = BB 0.4
weight = -3
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
material_print_temperature = =default_material_print_temperature + 5
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 35 / 70)
speed_wall = =math.ceil(speed_print * 50 / 70)
speed_wall_0 = =math.ceil(speed_wall * 35 / 50)
support_angle = 45
support_bottom_distance = 0.3
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = 0.3
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -0,0 +1,46 @@
[general]
definition = ultimaker_s5
name = Normal
version = 4
[metadata]
material = generic_bam
quality_type = fast
setting_version = 25
type = quality
variant = BB 0.4
weight = -1
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 80
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 30 / 80)
speed_wall = =math.ceil(speed_print * 40 / 80)
speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_infill_sparse_thickness = =2 * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -0,0 +1,46 @@
[general]
definition = ultimaker_s5
name = Fine
version = 4
[metadata]
material = generic_bam
quality_type = normal
setting_version = 25
type = quality
variant = BB 0.4
weight = 0
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 30 / 70)
speed_wall = =math.ceil(speed_print * 30 / 70)
speed_wall_0 = =math.ceil(speed_wall * 20 / 30)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_infill_sparse_thickness = =2 * layer_height
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -0,0 +1,46 @@
[general]
definition = ultimaker_s5
name = Fast
version = 4
[metadata]
material = generic_bam
quality_type = draft
setting_version = 25
type = quality
variant = BB 0.4
weight = -2
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
material_print_temperature = =default_material_print_temperature + 5
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 35 / 70)
speed_wall = =math.ceil(speed_print * 50 / 70)
speed_wall_0 = =math.ceil(speed_wall * 35 / 50)
support_angle = 45
support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -0,0 +1,47 @@
[general]
definition = ultimaker_s5
name = Extra Fast - Experimental
version = 4
[metadata]
is_experimental = True
material = generic_bam
quality_type = verydraft
setting_version = 25
type = quality
variant = BB 0.4
weight = -3
[values]
acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 3500)
acceleration_support_bottom = =extruderValue(support_bottom_extruder_nr, 'acceleration_support_interface')
acceleration_support_interface = =acceleration_topbottom
brim_replaces_support = False
brim_width = 7
build_volume_temperature = =50 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 24
default_material_bed_temperature = =0 if extruders_enabled_count > 1 and (not support_enable or extruder_nr != support_extruder_nr) else 60
machine_nozzle_cool_down_speed = 0.75
machine_nozzle_heat_up_speed = 1.6
material_print_temperature = =default_material_print_temperature + 5
prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100
retraction_amount = 6.5
speed_prime_tower = =speed_topbottom
speed_print = 70
speed_support = =speed_wall_0
speed_support_interface = =speed_topbottom
speed_topbottom = =math.ceil(speed_print * 35 / 70)
speed_wall = =math.ceil(speed_print * 50 / 70)
speed_wall_0 = =math.ceil(speed_wall * 35 / 50)
support_angle = 45
support_bottom_distance = 0.3
support_bottom_height = =extruderValue(support_bottom_extruder_nr, 'support_interface_height')
support_interface_density = =min(extruderValues('material_surface_energy'))
support_interface_enable = True
support_structure = normal
support_top_distance = 0.3
support_z_distance = =layer_height * 2
switch_extruder_prime_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_amount = =machine_heat_zone_length
top_bottom_thickness = 1

View file

@ -1,3 +1,83 @@
[5.11]
* New features and improvements:
- Added a new option in the toolbar menu that allows user to paint on model
- Introduced option to paint on the model to assign the paint to different extruders allowing for multimaterial printing
- Introduced option to paint on the model to indicate preferred and blocked areas for z-seam placement
- Enable saving and storing painted on preferences in project files.
- Expanded available print cores on the UltiMaker S6 and S8, user can now also slice for AA 0.25, AA 0.4, AA 0.8, CC 0.4 and CC 0.6
- Introduces Retraction During Travel Move, Keep Retracting During Travel, Prime During Travel Move settings to allow for more effective traveling. NOTE: If the printer has pressure advance or a filament flow sensor, please keep an eye on the print
- Introduced initial layer build fan speed, and build fan speed settings for more control over the build volume fan
- Introduced a pop-up that appears if user have an extruder that they are not using, allowing them to disable it for better quality
- Updated the Release Notification so the team can share more information about what's in the new release.
- Updated the logic for storing Cura Back-ups to download instead of store Cura plugins when restoring a back-up.
- Updated the Splash Screen and Header to show the correct UltiMaker logo.
- Updated local connection to UltiMaker Printers to allow for user verification.
- If users were not using the USB-Cable Printing in the previous (5.10) version of Cura, it is automatically disabled for them. In addition, an option is added to the Cura Preferences under General where user can easily Enable or Disable the USB-cable printing by checking, unchecking the setting and restarting Cura.
- Significantly updated the ChangeAtZ Script, to support relative extrusion, firmware retraction. Added "layer range" as an option and Travel moves are separated so changes in print speed don't necessarily affect them, contributed by @GregValiant
- Introduced a Post Processing Script that allows user to use their printer for Annealing or Drying, contributed by @GregValiant
- Updated the DisplayInfoOnLCD plug-in so it now correctly displays the Remaining time, contributed by @GregValiant, resolves https://github.com/Ultimaker/Cura/issues/18766
- Update Create Thumbnail Post Processing Plugin with an option Thumbnail Begin/End and Use '*' for size of image, contributed by @geekykayaker-anon
- Updated the Cooling Profile Post Processing Plug-in to include Build Volume Fan, and Idle Speed, contributed by @GregValiant
- Updated the Filament Change Post Processing Log-in to hide the "Z-Move" when in "use firmware configuration" mode, contributed by @GregValiant
- Enable more retraction settings to be set per-model, contributed by @jeremysalwen
- Updated Insert At Layerchange post processing plug-in to allow for lowercase commands, resolves https://github.com/Ultimaker/Cura/issues/20441
- Introduced a Post Processing Script that allows for defining Z-Hop on Travel, contributed by @GregValiant
* Bug fixes:
- Fixed a bug where Cura would not start if you have an extremely strict AntiVirus program installed on the same PC
- Fixed a bug on Mac where Pop Up Windows would hide behind the main window
- Fixed a bug where Overhang Wall Speeds were applied to Walls that were supposed to be bridging
- Fixed a bug where the Brim Gap would also apply to the support structures that don't need the brim gap
- Fixed a bug where you could not add a cloud connected printer if you were not already signed in by removing a campaign link
- Fixed a bug where the nozzle would wipe back on the top layer of a spiralized model
- Updated warning range for the Inside Travel Avoid Distance
- Updated Use Towers for Support from Expert to Basic Category
- Fixed a bug where translations would not show up in Recommended
- Gracefully supports if Printers, Projects, and Users are deactivated in Digital Factory if a subscription is downgraded
- Removed the None Corner Preference from the Sharpest Corner Z Seam Alignment
- Updated the Fine print profile for the FDM printer. It now defaults to a 0.1mm layer height, correcting the previous 0.2mm default setting due to missing value.
- Fixed a bug where Cura would fail randomly, if the printer was loaded before the MachineErrorChecker, contributed by @0xorial
- Cleaned up the Windows Start Menu entry after installing. It no longer is folderized and doesn't contain a link anymore, contributed by @RedBlackAka
- Removed NSIS uninstall shortcut left behind when uninstalling, contributed by @RedBlackAka, resolves #20446 / #20302
- Updated code quality of the PurgeLinesAndUnload Post Processing Plug-in script, contributed by @hellAholic
- Fix race condition in TreeSupportBaseCircle which may sometimes cause a crash, contributed by @ThomasRahm
* Printer definitions, profiles and materials:
- Significantly improved printed part quality for PLA, Tough PLA, ABS, and PETG on the UltiMaker S6 and S8.
- (Tree) Support is now less prone to falling over and easier to remove
- Bridging, Walls, and Top Surfaces now have fewer flow jumps
- Top details, especially around overhangs, look better because of the changes in cooling
- Dimensional accuracy has improved because of the updated wall printing strategy
- Seams are no longer printed on overhangs, improving the quality
- Added new draft intent profiles for PLA, Tough PLA, ABS, and PETG on UltiMaker S6 and S8
- Introduced support for Nylon material on UltiMaker Method and Method X
- Updated codequality of the UltiMaker S8 definition to allow for better support for Marketplace materials
- Updated settings to reduced ringing artifacts on the UltiMaker Factor 4
- Improve calculation for the Build Volume Temperature for the UltiMaker Factor 4
- Updated temperature settings for the UltiMaker Method and MethodXL to improve printing rafts with RapidRinse.
- Updated settings for UltiMaker Sketch Sprint to improve print quality for overhangs and bridges
- Improved the predicted printing time on the Makerbot Replicator+ to be closer to the actual printing time
- Introduced 2.85 mm Generic BVOH material profiles
- Introduced support for BAM materials on BB cores on UltiMaker S line printers
- Introduced Anycubic Kobra S1, contributed by @takanuva15
- Updated code quality for zyyx_pro and zyyx_plus definitions
- Introduced Anycubic Kobra 3 V2, and Anycubic Kobra 3 v2 ACE PRO, contributed by @SamBkamp
- Updated 100% infill settings for all printers, contributed by @Asterchades
- Significant speed improvements for the Voron profiles, contributed by @NerdyGriffin, @WCEngineer, and @magnetoxgarage
- Introduced Sovol SV08, contributed by @sesse
- Introduced Toybox Alpha One/Two, contributed by @lukbrew25
- Updated Hellbot Hidra and Hellbot Hidra Plus with bed image, contributed by @DevelopmentHellbot
- Updated Sovol SV01 definition to be titan style instead of Bowden, contributed by @JoGrob
- Introduced BIQU B2, contributed by @bjuraga
- Introduced Geetech M1 and Geetech M1S Profiles, and updated the Geetech Thunder Profiles, contributed by @whoseyoung
* Known Issues, but we intend to resolve them for stable
- Painting can still be slow with very detailed models
- Prime tower area is not displayed nor considered when using multi-material via painting
- Painting does not work on models contained in a group
- Painting undo/redo/clear does not invalidate the slice result
[5.10.2]
* UltiMaker S6 and S8 improvements:

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
<g>
<path
d="m 21.623816,17.375136 -4.3725,-4.38 V 9.7476157 c 6e-4,-0.09871 -0.0183,-0.19656 -0.0557,-0.28793 -0.0373,-0.09138 -0.0923,-0.17449 -0.1618,-0.24457 L 9.5338267,1.7151117 c -0.06972,-0.0703 -0.15267,-0.126092 -0.24406,-0.164168 -0.0914,-0.03808 -0.18943,-0.05768 -0.28844,-0.05768 -0.099,0 -0.19703,0.0196 -0.28843,0.05768 -0.09139,0.03808 -0.17434,0.09387 -0.24407,0.164168 l -6.749995,6.750004 c -0.0703,0.06972 -0.126092,0.15267 -0.164168,0.24406 -0.03808,0.0914 -0.05768,0.18943 -0.05768,0.28844 0,0.09901 0.0196,0.19703 0.05768,0.28843 0.03808,0.09139 0.09387,0.17434 0.164168,0.24407 l 7.499995,7.5000203 c 0.07008,0.0695 0.1532,0.1245 0.24457,0.1618 0.09138,0.0373 0.18923,0.0562 0.28793,0.0557 h 3.2549893 l 4.3725,4.38 c 0.5629,0.5629 1.3264,0.8791 2.1225,0.8791 0.7961,0 1.5596,-0.3162 2.1225,-0.8791 0.5629,-0.5629 0.8792,-1.3264 0.8792,-2.1225 0,-0.7961 -0.3163,-1.5596 -0.8792,-2.1225 z M 4.5013367,7.8051157 l 1.71749,1.725 1.06501,-1.065 -1.72501,-1.7175 1.1925,-1.1925 3.2175,3.225 1.0649893,-1.065 -3.2249893,-3.2175 1.1925,-1.1925 L 13.943816,8.2476158 8.2513266,13.940136 3.3088367,8.9976157 Z M 20.558816,20.555136 c -0.281,0.2794 -0.6612,0.4362 -1.0575,0.4362 -0.3963,0 -0.7764,-0.1568 -1.0575,-0.4362 l -4.5975,-4.59 c -0.1598,-0.1099 -0.3414,-0.1841 -0.5325,-0.2175 h -3.254989 l -0.7500003,-0.75 5.6924893,-5.6925202 0.75,0.7500002 v 3.25502 c 8e-4,0.1967 0.079,0.3853 0.2175,0.525 l 4.59,4.605 c 0.2794,0.281 0.4362,0.6612 0.4362,1.0575 0,0.3963 -0.1568,0.7764 -0.4362,1.0575 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

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

Some files were not shown because too many files have changed in this diff Show more