mirror of
https://github.com/Ultimaker/Cura.git
synced 2026-02-16 09:29:34 -07:00
Merge branch '5.11' into 5.11
This commit is contained in:
commit
4c5d7e1bd1
104 changed files with 13240 additions and 17414 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
112
plugins/PaintTool/MultiMaterialExtruderConverter.py
Normal file
112
plugins/PaintTool/MultiMaterialExtruderConverter.py
Normal 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)
|
||||
43
plugins/PaintTool/PaintClearCommand.py
Normal file
43
plugins/PaintTool/PaintClearCommand.py
Normal 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()))
|
||||
62
plugins/PaintTool/PaintCommand.py
Normal file
62
plugins/PaintTool/PaintCommand.py
Normal 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)
|
||||
84
plugins/PaintTool/PaintStrokeCommand.py
Normal file
84
plugins/PaintTool/PaintStrokeCommand.py
Normal 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()
|
||||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
|
@ -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": [
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
|
|
|
|||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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 l’extrudeuse"
|
||||
|
||||
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 l’extrudeuse"
|
||||
|
||||
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 l’extrudeuse"
|
||||
|
||||
msgctxt "machine_extruder_prestart_code label"
|
||||
msgid "Extruder Prestart G-Code"
|
||||
msgstr "Prestart G-code de l’extrudeuse"
|
||||
|
||||
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 l’utilisation d’une configuration multioutils, cette valeur correspond au temps de changement d’outil 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
|
|
@ -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 nell’estrusione 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 dell’ugello. 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 all’accensione dell’estrusore."
|
||||
|
||||
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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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 Code’u 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
|
|
@ -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
|
|
@ -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]
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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]
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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]
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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:
|
||||
|
|
|
|||
7
resources/themes/cura-light/icons/default/Brush.svg
Normal file
7
resources/themes/cura-light/icons/default/Brush.svg
Normal 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 |
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue