Merge remote-tracking branch 'origin/main' into CURA-12261-3dconnectionmouse

This commit is contained in:
Erwan MATHIEU 2025-02-06 12:57:24 +01:00
commit eb5c5a1ad9
58 changed files with 431 additions and 76 deletions

View file

@ -5,7 +5,7 @@ requirements:
- "curaengine/5.10.0-alpha.0@ultimaker/testing" - "curaengine/5.10.0-alpha.0@ultimaker/testing"
- "cura_binary_data/5.10.0-alpha.0@ultimaker/testing" - "cura_binary_data/5.10.0-alpha.0@ultimaker/testing"
- "fdm_materials/5.10.0-alpha.0@ultimaker/testing" - "fdm_materials/5.10.0-alpha.0@ultimaker/testing"
- "dulcificum/0.2.1@ultimaker/stable" - "dulcificum/0.3.0@ultimaker/stable"
- "pysavitar/5.4.0-alpha.0@ultimaker/stable" - "pysavitar/5.4.0-alpha.0@ultimaker/stable"
- "pynest2d/5.4.0-alpha.0@ultimaker/stable" - "pynest2d/5.4.0-alpha.0@ultimaker/stable"
requirements_internal: requirements_internal:

View file

@ -27,7 +27,6 @@ class CuraConan(ConanFile):
generators = "VirtualPythonEnv" generators = "VirtualPythonEnv"
tool_requires = "gettext/0.22.5" tool_requires = "gettext/0.22.5"
# FIXME: Remove specific branch once merged to main
python_requires = "translationextractor/[>=2.2.0]@ultimaker/stable" python_requires = "translationextractor/[>=2.2.0]@ultimaker/stable"
options = { options = {

View file

@ -13,7 +13,9 @@ class FormatMaps:
"fire_e": "ultimaker_method", "fire_e": "ultimaker_method",
"lava_f": "ultimaker_methodx", "lava_f": "ultimaker_methodx",
"magma_10": "ultimaker_methodxl", "magma_10": "ultimaker_methodxl",
"sketch": "ultimaker_sketch" "sketch": "ultimaker_sketch",
"sketch_large": "ultimaker_sketch_large",
"sketch_sprint": "ultimaker_sketch_sprint"
} }
# A map from the extruder-name in their native file-formats to the internal name we use. # A map from the extruder-name in their native file-formats to the internal name we use.

View file

@ -1,9 +1,12 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal from PyQt6.QtCore import pyqtProperty, QObject, pyqtSignal
from typing import List from typing import List
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.Settings.DefinitionContainer import DefinitionContainer
MYPY = False MYPY = False
if MYPY: if MYPY:
from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel
@ -68,6 +71,15 @@ class PrinterConfigurationModel(QObject):
return True return True
return False return False
@pyqtProperty("QStringList", constant=True)
def validCoresForPrinterType(self) -> List[str]:
printers = ContainerRegistry.getInstance().findContainersMetadata(
ignore_case=True, type="machine", name=self._printer_type, container_type=DefinitionContainer)
id = printers[0]["id"] if len(printers) > 0 and "id" in printers[0] else ""
definitions = ContainerRegistry.getInstance().findContainersMetadata(
ignore_case=True, type="variant", definition=id+"*")
return [x["name"] for x in definitions]
def __str__(self): def __str__(self):
message_chunks = [] message_chunks = []
message_chunks.append("Printer type: " + self._printer_type) message_chunks.append("Printer type: " + self._printer_type)

View file

@ -1679,7 +1679,7 @@ class MachineManager(QObject):
intent_category = self.activeIntentCategory, intent_category = self.activeIntentCategory,
intent_name = IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), intent_name = IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()),
custom_profile = self.activeQualityOrQualityChangesName if global_stack.qualityChanges is not empty_quality_changes_container else None, custom_profile = self.activeQualityOrQualityChangesName if global_stack.qualityChanges is not empty_quality_changes_container else None,
layer_height = self.activeQualityLayerHeight if self.isActiveQualitySupported else None, layer_height = float("{:.2f}".format(self.activeQualityLayerHeight)) if self.isActiveQualitySupported else None,
is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported
) )

View file

@ -46,6 +46,13 @@ class MakerbotWriter(MeshWriter):
suffixes=["makerbot"] suffixes=["makerbot"]
) )
) )
MimeTypeDatabase.addMimeType(
MimeType(
name="application/x-makerbot-replicator_plus",
comment="Makerbot Toolpath Package",
suffixes=["makerbot"]
)
)
_PNG_FORMAT = [ _PNG_FORMAT = [
{"prefix": "isometric_thumbnail", "width": 120, "height": 120}, {"prefix": "isometric_thumbnail", "width": 120, "height": 120},
@ -114,6 +121,8 @@ class MakerbotWriter(MeshWriter):
filename, filedata = "print.gcode", gcode_text_io.getvalue() filename, filedata = "print.gcode", gcode_text_io.getvalue()
case "application/x-makerbot": case "application/x-makerbot":
filename, filedata = "print.jsontoolpath", du.gcode_2_miracle_jtp(gcode_text_io.getvalue()) filename, filedata = "print.jsontoolpath", du.gcode_2_miracle_jtp(gcode_text_io.getvalue())
case "application/x-makerbot-replicator_plus":
filename, filedata = "print.jsontoolpath", du.gcode_2_miracle_jtp(gcode_text_io.getvalue(), nb_extruders=1)
case _: case _:
raise Exception("Unsupported Mime type") raise Exception("Unsupported Mime type")

View file

@ -25,6 +25,12 @@ def getMetaData():
"description": catalog.i18nc("@item:inlistbox", "Makerbot Sketch Printfile"), "description": catalog.i18nc("@item:inlistbox", "Makerbot Sketch Printfile"),
"mime_type": "application/x-makerbot-sketch", "mime_type": "application/x-makerbot-sketch",
"mode": MakerbotWriter.MakerbotWriter.OutputMode.BinaryMode, "mode": MakerbotWriter.MakerbotWriter.OutputMode.BinaryMode,
},
{
"extension": file_extension,
"description": catalog.i18nc("@item:inlistbox", "Makerbot Replicator+ Printfile"),
"mime_type": "application/x-makerbot-replicator_plus",
"mode": MakerbotWriter.MakerbotWriter.OutputMode.BinaryMode,
} }
] ]
}, },

View file

@ -331,7 +331,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
return False return False
[printer, *_] = self._printers [printer, *_] = self._printers
return printer.type in ("MakerBot Method X", "MakerBot Method XL", "MakerBot Sketch") return printer.type in ("MakerBot Method", "MakerBot Method X", "MakerBot Method XL", "MakerBot Sketch", "MakerBot Sketch Large", "MakerBot Sketch Sprint")
@pyqtProperty(bool, notify=_cloudClusterPrintersChanged) @pyqtProperty(bool, notify=_cloudClusterPrintersChanged)
def supportsPrintJobActions(self) -> bool: def supportsPrintJobActions(self) -> bool:

View file

@ -3,5 +3,7 @@
"ultimaker_methodx": "MakerBot Method X", "ultimaker_methodx": "MakerBot Method X",
"ultimaker_methodxl": "MakerBot Method XL", "ultimaker_methodxl": "MakerBot Method XL",
"ultimaker_factor4": "Ultimaker Factor 4", "ultimaker_factor4": "Ultimaker Factor 4",
"ultimaker_sketch": "MakerBot Sketch" "ultimaker_sketch": "MakerBot Sketch",
"ultimaker_sketch_large": "MakerBot Sketch Large",
"ultimaker_sketch_sprint": "MakerBot Sketch Sprint"
} }

View file

@ -97,6 +97,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
CuraApplication.getInstance().getOnExitCallbackManager().addCallback(self._checkActivePrintingUponAppExit) CuraApplication.getInstance().getOnExitCallbackManager().addCallback(self._checkActivePrintingUponAppExit)
CuraApplication.getInstance().getPreferences().addPreference("usb_printing/enabled", False)
# This is a callback function that checks if there is any printing in progress via USB when the application tries # This is a callback function that checks if there is any printing in progress via USB when the application tries
# to exit. If so, it will show a confirmation before # to exit. If so, it will show a confirmation before
def _checkActivePrintingUponAppExit(self) -> None: def _checkActivePrintingUponAppExit(self) -> None:
@ -144,6 +146,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
CuraApplication.getInstance().getController().setActiveStage("MonitorStage") CuraApplication.getInstance().getController().setActiveStage("MonitorStage")
CuraApplication.getInstance().getPreferences().setValue("usb_printing/enabled", True)
#Find the g-code to print. #Find the g-code to print.
gcode_textio = StringIO() gcode_textio = StringIO()
gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter")) gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter"))

View file

@ -0,0 +1,68 @@
import configparser
import io
from typing import Dict, Tuple, List
from UM.VersionUpgrade import VersionUpgrade
_RENAMED_SETTINGS = {
"wall_overhang_speed_factor": "wall_overhang_speed_factors"
} # type: Dict[str, str]
_NEW_SETTING_VERSION = "25"
class VersionUpgrade59to510(VersionUpgrade):
def upgradePreferences(self, serialized: str, filename: str):
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Fix 'renamed'(ish) settings for visibility
if "visible_settings" in parser["general"]:
all_setting_keys = parser["general"]["visible_settings"].strip().split(";")
if all_setting_keys:
for idx, key in enumerate(all_setting_keys):
if key in _RENAMED_SETTINGS:
all_setting_keys[idx] = _RENAMED_SETTINGS[key]
parser["general"]["visible_settings"] = ";".join(all_setting_keys)
# Update version number.
parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ())
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION
if "values" in parser:
for old_name, new_name in _RENAMED_SETTINGS.items():
if old_name in parser["values"]:
parser["values"][new_name] = parser["values"][old_name]
del parser["values"][old_name]
if "wall_overhang_speed_factors" in parser["values"]:
old_value = float(parser["values"]["wall_overhang_speed_factors"])
new_value = [max(1, int(round(old_value)))]
parser["values"]["wall_overhang_speed_factor"] = str(new_value)
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]

View file

@ -0,0 +1,60 @@
# Copyright (c) 2024 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Any, Dict, TYPE_CHECKING
from . import VersionUpgrade59to510
if TYPE_CHECKING:
from UM.Application import Application
upgrade = VersionUpgrade59to510.VersionUpgrade59to510()
def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
("preferences", 7000024): ("preferences", 7000025, upgrade.upgradePreferences),
("machine_stack", 6000024): ("machine_stack", 6000025, upgrade.upgradeStack),
("extruder_train", 6000024): ("extruder_train", 6000025, upgrade.upgradeStack),
("definition_changes", 4000024): ("definition_changes", 4000025, upgrade.upgradeInstanceContainer),
("quality_changes", 4000024): ("quality_changes", 4000025, upgrade.upgradeInstanceContainer),
("quality", 4000024): ("quality", 4000025, upgrade.upgradeInstanceContainer),
("user", 4000024): ("user", 4000025, upgrade.upgradeInstanceContainer),
("intent", 4000024): ("intent", 4000025, upgrade.upgradeInstanceContainer),
},
"sources": {
"preferences": {
"get_version": upgrade.getCfgVersion,
"location": {"."}
},
"machine_stack": {
"get_version": upgrade.getCfgVersion,
"location": {"./machine_instances"}
},
"extruder_train": {
"get_version": upgrade.getCfgVersion,
"location": {"./extruders"}
},
"definition_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./definition_changes"}
},
"quality_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality_changes"}
},
"quality": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality"}
},
"user": {
"get_version": upgrade.getCfgVersion,
"location": {"./user"}
}
}
}
def register(app: "Application") -> Dict[str, Any]:
return {"version_upgrade": upgrade}

View file

@ -0,0 +1,8 @@
{
"name": "Version Upgrade 5.9 to 5.10",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 5.9 to Cura 5.10",
"api": 8,
"i18n-catalog": "cura"
}

View file

@ -120,7 +120,12 @@
"support_z_distance": { "value": "layer_height * 2" }, "support_z_distance": { "value": "layer_height * 2" },
"top_bottom_thickness": { "value": "layer_height * 4" }, "top_bottom_thickness": { "value": "layer_height * 4" },
"wall_overhang_angle": { "value": 55 }, "wall_overhang_angle": { "value": 55 },
"wall_overhang_speed_factor": { "value": 55 }, "wall_overhang_speed_factors":
{
"value": [
55
]
},
"zig_zaggify_infill": { "value": "infill_pattern == 'cross' or infill_pattern == 'cross_3d' or infill_pattern == 'lines'" } "zig_zaggify_infill": { "value": "infill_pattern == 'cross' or infill_pattern == 'cross_3d' or infill_pattern == 'lines'" }
} }
} }

View file

@ -238,7 +238,12 @@
"wall_extruder_nr": { "value": -1 }, "wall_extruder_nr": { "value": -1 },
"wall_line_width_0": { "value": 0.44 }, "wall_line_width_0": { "value": 0.44 },
"wall_overhang_angle": { "value": 45 }, "wall_overhang_angle": { "value": 45 },
"wall_overhang_speed_factor": { "value": 40 }, "wall_overhang_speed_factors":
{
"value": [
40
]
},
"wall_thickness": { "value": 0.84 }, "wall_thickness": { "value": 0.84 },
"wall_x_extruder_nr": { "value": -1 }, "wall_x_extruder_nr": { "value": -1 },
"zig_zaggify_infill": { "value": true } "zig_zaggify_infill": { "value": true }

View file

@ -167,7 +167,12 @@
"travel_avoid_supports": { "value": "True" }, "travel_avoid_supports": { "value": "True" },
"wall_line_width": { "value": "machine_nozzle_size" }, "wall_line_width": { "value": "machine_nozzle_size" },
"wall_overhang_angle": { "value": "75" }, "wall_overhang_angle": { "value": "75" },
"wall_overhang_speed_factor": { "value": "50" }, "wall_overhang_speed_factors":
{
"value": [
50
]
},
"zig_zaggify_infill": { "value": "True" } "zig_zaggify_infill": { "value": "True" }
} }
} }

View file

@ -107,7 +107,7 @@
"travel_retract_before_outer_wall": { "value": true }, "travel_retract_before_outer_wall": { "value": true },
"wall_0_wipe_dist": { "value": 0.0 }, "wall_0_wipe_dist": { "value": 0.0 },
"wall_overhang_angle": { "default_value": 75 }, "wall_overhang_angle": { "default_value": 75 },
"wall_overhang_speed_factor": { "default_value": 50 }, "wall_overhang_speed_factors": { "default_value": "[50]" },
"wall_thickness": { "value": "line_width * 2" }, "wall_thickness": { "value": "line_width * 2" },
"z_seam_corner": { "value": "'z_seam_corner_weighted'" }, "z_seam_corner": { "value": "'z_seam_corner_weighted'" },
"z_seam_type": { "value": "'back'" } "z_seam_type": { "value": "'back'" }

View file

@ -3232,6 +3232,19 @@
"minimum_value": 0.01, "minimum_value": 0.01,
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
},
"material_pressure_advance_factor":
{
"enabled": false,
"label": "Pressure advance factor",
"description": "Tuning factor for pressure advance, which is meant to synchronize extrusion with motion",
"default_value": 0.05,
"maximum_value_warning": 1.0,
"minimum_value": 0,
"type": "float",
"settable_per_mesh": false,
"settable_per_extruder": true,
"settable_per_meshgroup": false
} }
} }
}, },
@ -4715,6 +4728,31 @@
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },
"cool_min_layer_time_overhang":
{
"label": "Minimum Layer Time with Overhang",
"description": "The minimum time spent in a layer that contains overhanging extrusions. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer. Layers may still take shorter than the minimal layer time if Lift Head is disabled and if the Minimum Speed would otherwise be violated.",
"unit": "s",
"type": "float",
"default_value": 5,
"value": "cool_min_layer_time",
"minimum_value": "0",
"maximum_value_warning": "600",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_min_layer_time_overhang_min_segment_length":
{
"label": "Minimum Overhang Segment Length",
"description": "When trying to apply the minimum layer time specific for overhanging layers, it will be applied only if at least one consecutive overhanging extrusion move is longer than this value.",
"unit": "mm",
"type": "float",
"default_value": 5,
"minimum_value": "0",
"maximum_value_warning": "500",
"settable_per_mesh": false,
"settable_per_extruder": true
},
"cool_min_speed": "cool_min_speed":
{ {
"label": "Minimum Speed", "label": "Minimum Speed",
@ -8417,15 +8455,13 @@
"value": "support_angle", "value": "support_angle",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"wall_overhang_speed_factor": "wall_overhang_speed_factors":
{ {
"label": "Overhanging Wall Speed", "label": "Overhanging Wall Speeds",
"description": "Overhanging walls will be printed at this percentage of their normal print speed.", "description": "Overhanging walls will be printed at a percentage of their normal print speed. You can specify multiple values, so that even more overhanging walls will be printed even slower, e.g. by setting [75, 50, 25]",
"unit": "%", "unit": "%",
"type": "float", "type": "[int]",
"default_value": 100, "default_value": "[100]",
"minimum_value": "0.001",
"minimum_value_warning": "25",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"bridge_settings_enabled": "bridge_settings_enabled":

View file

@ -109,7 +109,12 @@
"travel_avoid_other_parts": { "default_value": false }, "travel_avoid_other_parts": { "default_value": false },
"wall_line_width": { "value": "machine_nozzle_size" }, "wall_line_width": { "value": "machine_nozzle_size" },
"wall_overhang_angle": { "default_value": 75 }, "wall_overhang_angle": { "default_value": 75 },
"wall_overhang_speed_factor": { "default_value": 50 }, "wall_overhang_speed_factors":
{
"default_value": [
50
]
},
"zig_zaggify_infill": { "value": true } "zig_zaggify_infill": { "value": true }
} }
} }

View file

@ -61,7 +61,12 @@
"support_pattern": { "default_value": "lines" }, "support_pattern": { "default_value": "lines" },
"switch_extruder_retraction_amount": { "value": 100 }, "switch_extruder_retraction_amount": { "value": 100 },
"switch_extruder_retraction_speeds": { "value": 60 }, "switch_extruder_retraction_speeds": { "value": 60 },
"wall_overhang_speed_factor": { "value": 50 }, "wall_overhang_speed_factors":
{
"value": [
50
]
},
"z_seam_corner": { "default_value": "z_seam_corner_any" }, "z_seam_corner": { "default_value": "z_seam_corner_any" },
"z_seam_relative": { "value": true }, "z_seam_relative": { "value": true },
"z_seam_type": { "default_value": "sharpest_corner" }, "z_seam_type": { "default_value": "sharpest_corner" },

View file

@ -109,7 +109,12 @@
"travel_avoid_other_parts": { "default_value": false }, "travel_avoid_other_parts": { "default_value": false },
"wall_line_width": { "value": "machine_nozzle_size" }, "wall_line_width": { "value": "machine_nozzle_size" },
"wall_overhang_angle": { "default_value": 75 }, "wall_overhang_angle": { "default_value": 75 },
"wall_overhang_speed_factor": { "default_value": 50 }, "wall_overhang_speed_factors":
{
"default_value": [
50
]
},
"zig_zaggify_infill": { "value": true } "zig_zaggify_infill": { "value": true }
} }
} }

View file

@ -10,6 +10,6 @@
"overrides": "overrides":
{ {
"retraction_amount": { "default_value": 5 }, "retraction_amount": { "default_value": 5 },
"retraction_speed": { "value": "machine_max_feedrate_e" } "retraction_speed": { "value": "resolveOrValue('machine_max_feedrate_e')" }
} }
} }

View file

@ -52,15 +52,13 @@
"ultimaker_rapidrinse", "ultimaker_rapidrinse",
"ultimaker_sr30", "ultimaker_sr30",
"ultimaker_petg", "ultimaker_petg",
"ultimaker_metallic_pla",
"basf_", "basf_",
"jabil_", "jabil_",
"polymaker_", "polymaker_",
"ultimaker_rapidrinse", "ultimaker_rapidrinse",
"ultimaker_sr30", "ultimaker_sr30",
"ultimaker_petg", "ultimaker_petg",
"ultimaker_pva", "ultimaker_pva"
"ultimaker_metallic_pla"
], ],
"has_machine_quality": true, "has_machine_quality": true,
"has_materials": true, "has_materials": true,

View file

@ -53,8 +53,7 @@
"ultimaker_pva", "ultimaker_pva",
"ultimaker_rapidrinse", "ultimaker_rapidrinse",
"ultimaker_sr30", "ultimaker_sr30",
"ultimaker_petg", "ultimaker_petg"
"ultimaker_metallic_pla"
], ],
"has_machine_quality": true, "has_machine_quality": true,
"has_materials": true, "has_materials": true,
@ -380,10 +379,12 @@
"wall_0_wipe_dist": { "value": 0.2 }, "wall_0_wipe_dist": { "value": 0.2 },
"wall_line_width_x": { "value": 0.58 }, "wall_line_width_x": { "value": 0.58 },
"wall_overhang_angle": { "value": 35 }, "wall_overhang_angle": { "value": 35 },
"wall_overhang_speed_factor": "wall_overhang_speed_factors":
{ {
"minimum_value_warning": 15, "minimum_value_warning": 15,
"value": 17.5 "value": [
18
]
}, },
"wall_thickness": { "value": 1 }, "wall_thickness": { "value": 1 },
"wall_x_material_flow_layer_0": { "value": "material_flow" }, "wall_x_material_flow_layer_0": { "value": "material_flow" },

View file

@ -119,7 +119,12 @@
"travel_avoid_other_parts": { "default_value": false }, "travel_avoid_other_parts": { "default_value": false },
"wall_line_width": { "value": "machine_nozzle_size" }, "wall_line_width": { "value": "machine_nozzle_size" },
"wall_overhang_angle": { "default_value": 75 }, "wall_overhang_angle": { "default_value": 75 },
"wall_overhang_speed_factor": { "default_value": 50 }, "wall_overhang_speed_factors":
{
"default_value": [
50
]
},
"zig_zaggify_infill": { "value": true } "zig_zaggify_infill": { "value": true }
} }
} }

View file

@ -195,7 +195,12 @@
"travel_avoid_other_parts": { "default_value": false }, "travel_avoid_other_parts": { "default_value": false },
"wall_line_width": { "value": "machine_nozzle_size" }, "wall_line_width": { "value": "machine_nozzle_size" },
"wall_overhang_angle": { "default_value": 75 }, "wall_overhang_angle": { "default_value": 75 },
"wall_overhang_speed_factor": { "default_value": 50 }, "wall_overhang_speed_factors":
{
"default_value": [
50
]
},
"xy_offset_layer_0": { "value": -0.3 }, "xy_offset_layer_0": { "value": -0.3 },
"z_seam_type": { "value": "'back'" }, "z_seam_type": { "value": "'back'" },
"zig_zaggify_infill": { "value": true } "zig_zaggify_infill": { "value": true }

View file

@ -1,4 +1,4 @@
// Copyright (c) 2018 Ultimaker B.V. // Copyright (c) 2025 UltiMaker
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.7 import QtQuick 2.7
@ -12,7 +12,7 @@ Button
id: configurationItem id: configurationItem
property var configuration: null property var configuration: null
hoverEnabled: isValidMaterial hoverEnabled: isValidMaterial && isValidCore
property bool isValidMaterial: property bool isValidMaterial:
{ {
@ -25,7 +25,6 @@ Button
for (var index in extruderConfigurations) for (var index in extruderConfigurations)
{ {
var name = extruderConfigurations[index].material ? extruderConfigurations[index].material.name : "" var name = extruderConfigurations[index].material ? extruderConfigurations[index].material.name : ""
if (name == "" || name == "Unknown") if (name == "" || name == "Unknown")
{ {
return false return false
@ -34,6 +33,25 @@ Button
return true return true
} }
property bool isValidCore:
{
if (configuration === null)
{
return false
}
var extruderConfigurations = configuration.extruderConfigurations
var coresList = configuration.validCoresForPrinterType
for (var index in extruderConfigurations)
{
var name = extruderConfigurations[index].hotendID ? extruderConfigurations[index].hotendID : ""
if (name != "" && ! coresList.includes(name))
{
return false
}
}
return true
}
background: Rectangle background: Rectangle
{ {
color: parent.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") color: parent.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
@ -60,7 +78,7 @@ Button
right: parent.right right: parent.right
rightMargin: UM.Theme.getSize("wide_margin").width rightMargin: UM.Theme.getSize("wide_margin").width
} }
height: childrenRect.height height: unknownMaterial.visible ? unknownMaterial.height : (repeater.count > 0 ? repeater.itemAt(0).height : 0)
spacing: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width
Repeater Repeater
@ -72,21 +90,20 @@ Button
{ {
width: Math.round(parent.width / (configuration !== null ? configuration.extruderConfigurations.length : 1)) width: Math.round(parent.width / (configuration !== null ? configuration.extruderConfigurations.length : 1))
printCoreConfiguration: modelData printCoreConfiguration: modelData
visible: configurationItem.isValidMaterial visible: configurationItem.isValidMaterial && configurationItem.isValidCore
} }
} }
// Unknown material // Unknown material or core ('variant')
Item Item
{ {
id: unknownMaterial id: unknownMaterial
height: unknownMaterialMessage.height + UM.Theme.getSize("thin_margin").width / 2 height: unknownMaterialMessage.height
width: parent.width width: parent.width
anchors.top: parent.top anchors.top: parent.top
anchors.topMargin: UM.Theme.getSize("thin_margin").width / 2
visible: !configurationItem.isValidMaterial visible: ! (configurationItem.isValidMaterial && configurationItem.isValidCore)
UM.ColorImage UM.ColorImage
{ {
@ -102,13 +119,9 @@ Button
UM.Label UM.Label
{ {
id: unknownMaterialMessage id: unknownMaterialMessage
text:
{
if (configuration === null)
{
return ""
}
function whenUnknownMaterial()
{
var extruderConfigurations = configuration.extruderConfigurations var extruderConfigurations = configuration.extruderConfigurations
var unknownMaterials = [] var unknownMaterials = []
for (var index in extruderConfigurations) for (var index in extruderConfigurations)
@ -135,9 +148,47 @@ Button
unknownMaterials = "<b>" + unknownMaterials + "</b>" unknownMaterials = "<b>" + unknownMaterials + "</b>"
var draftResult = catalog.i18nc("@label", "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile."); var draftResult = catalog.i18nc("@label", "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile.");
var result = draftResult.arg(unknownMaterials).arg("<a href=' '>" + catalog.i18nc("@label","Marketplace") + "</a> ") return draftResult.arg(unknownMaterials).arg("<a href=' '>" + catalog.i18nc("@label","Marketplace") + "</a> ")
}
return result function whenMismatchedCore()
{
var extruderConfigurations = configuration.extruderConfigurations
var coresList = configuration.validCoresForPrinterType
var mismatchedCores = []
for (var index in extruderConfigurations)
{
var name = extruderConfigurations[index].hotendID ? extruderConfigurations[index].hotendID : ""
if (name != "" && ! coresList.includes(name))
{
mismatchedCores.push(name)
}
}
mismatchedCores = "<b>" + mismatchedCores + "</b>"
var draftResult = catalog.i18nc("@label", "This configuration is not available because there is a mismatch or other problem with core-type %1. Please visit %2 to check which cores this printer-type supports w.r.t. new slices.");
return draftResult.arg(mismatchedCores).arg("<a href=' '>" + catalog.i18nc("@label","WEBSITE") + "</a> ")
}
text:
{
if (configuration === null)
{
return ""
}
var extruderConfigurations = configuration.extruderConfigurations
var perExtruder = []
for (var index in extruderConfigurations)
{
var matName = extruderConfigurations[index].material ? extruderConfigurations[index].material.name : ""
var coreName = extruderConfigurations[index].hotendID ? extruderConfigurations[index].hotendID : ""
perExtruder.push(` [${coreName}/${matName}]`)
}
var configsStr = "<i>" + perExtruder + "</i>"
var warnStr = isValidMaterial ? whenMismatchedCore() : whenUnknownMaterial()
return configsStr + "<br/>" + warnStr
} }
width: extruderRow.width width: extruderRow.width
@ -225,7 +276,7 @@ Button
onClicked: onClicked:
{ {
if(isValidMaterial) if (isValidMaterial && isValidCore)
{ {
toggleContent() toggleContent()
Cura.MachineManager.applyRemoteConfiguration(configuration) Cura.MachineManager.applyRemoteConfiguration(configuration)

View file

@ -13,7 +13,7 @@ import "."
Item Item
{ {
id: base id: base
height: enabled ? UM.Theme.getSize("section").height + UM.Theme.getSize("narrow_margin").height : 0 height: enabled ? Math.max(UM.Theme.getSize("section").height, label.height) + UM.Theme.getSize("narrow_margin").height : 0
anchors.left: parent.left anchors.left: parent.left
anchors.right: parent.right anchors.right: parent.right

View file

@ -115,7 +115,7 @@ travel_avoid_other_parts = True
travel_avoid_supports = True travel_avoid_supports = True
travel_retract_before_outer_wall = False travel_retract_before_outer_wall = False
wall_overhang_angle = 35.0 wall_overhang_angle = 35.0
wall_overhang_speed_factor = 60.0 wall_overhang_speed_factors = [60]
wall_thickness = =line_width*2 wall_thickness = =line_width*2
z_seam_corner = z_seam_corner_inner z_seam_corner = z_seam_corner_inner
z_seam_position = backright z_seam_position = backright

View file

@ -59,5 +59,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -52,5 +52,5 @@ support_xy_distance = 0.3
support_xy_distance_overhang = 0.25 support_xy_distance_overhang = 0.25
support_z_distance = 0.15 support_z_distance = 0.15
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 50 wall_overhang_speed_factors = [50]

View file

@ -58,5 +58,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -59,5 +59,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -58,5 +58,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -54,5 +54,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.22 support_z_distance = 0.22
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -59,5 +59,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -52,5 +52,5 @@ support_xy_distance = 0.3
support_xy_distance_overhang = 0.25 support_xy_distance_overhang = 0.25
support_z_distance = 0.15 support_z_distance = 0.15
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 50 wall_overhang_speed_factors = [50]

View file

@ -58,5 +58,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -59,5 +59,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -54,5 +54,5 @@ support_xy_distance = 0.3
support_xy_distance_overhang = 0.25 support_xy_distance_overhang = 0.25
support_z_distance = 0.15 support_z_distance = 0.15
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 50 wall_overhang_speed_factors = [50]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -59,5 +59,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -54,5 +54,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.22 support_z_distance = 0.22
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -59,5 +59,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -54,5 +54,5 @@ support_xy_distance = 0.3
support_xy_distance_overhang = 0.25 support_xy_distance_overhang = 0.25
support_z_distance = 0.15 support_z_distance = 0.15
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 50 wall_overhang_speed_factors = [50]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -57,5 +57,5 @@ support_xy_overrides_z = xy_overrides_z
support_z_distance = 0.15 support_z_distance = 0.15
top_skin_expand_distance = 2.4 top_skin_expand_distance = 2.4
wall_overhang_angle = 30 wall_overhang_angle = 30
wall_overhang_speed_factor = 40 wall_overhang_speed_factors = [40]

View file

@ -0,0 +1,15 @@
[general]
definition = ultimaker_sketch
name = Fast
version = 4
[metadata]
material = ultimaker_metallic_pla_175
quality_type = draft
setting_version = 24
type = quality
variant = 0.4mm
weight = -2
[values]

View file

@ -0,0 +1,15 @@
[general]
definition = ultimaker_sketch_large
name = Fast
version = 4
[metadata]
material = ultimaker_metallic_pla_175
quality_type = draft
setting_version = 24
type = quality
variant = 0.4mm
weight = -2
[values]

View file

@ -0,0 +1,28 @@
[general]
definition = ultimaker_sketch_sprint
name = Fast
version = 4
[metadata]
material = ultimaker_metallic_pla_175
quality_type = draft
setting_version = 24
type = quality
variant = 0.4mm
weight = -2
[values]
cool_min_temperature = 230
infill_angles = [45,45,45,45,45,135,135,135,135,135]
material_final_print_temperature = 230
material_initial_print_temperature = 230
speed_print = 125
speed_roofing = 100
speed_support_bottom = 100
speed_support_interface = 125
speed_topbottom = 100
speed_wall = 75
speed_wall_x = 100
support_material_flow = 92
wall_overhang_speed_factor = 23

View file

@ -248,6 +248,7 @@ cool_fan_speed_0
cool_fan_full_at_height cool_fan_full_at_height
cool_fan_full_layer cool_fan_full_layer
cool_min_layer_time cool_min_layer_time
cool_min_layer_time_overhang
cool_min_speed cool_min_speed
cool_lift_head cool_lift_head
cool_during_extruder_switch cool_during_extruder_switch

View file

@ -567,7 +567,7 @@
"section_icon_column": [2.5, 2.5], "section_icon_column": [2.5, 2.5],
"setting": [25.0, 1.8], "setting": [25.0, 1.8],
"setting_control": [11.0, 2.0], "setting_control": [9.0, 2.0],
"setting_control_radius": [0.15, 0.15], "setting_control_radius": [0.15, 0.15],
"setting_control_depth_margin": [1.4, 0.0], "setting_control_depth_margin": [1.4, 0.0],
"setting_unit_margin": [0.5, 0.5], "setting_unit_margin": [0.5, 0.5],