From 44441dfe5b119e66d7e671f780f3dffe3a66f7aa Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Wed, 3 Jan 2024 15:54:24 +0100 Subject: [PATCH 1/8] Improve the time estimates for the Method machines be increasing the acceleration and reducing the jerk. For dual extrusion a rough switch over time estimate is taken into account. PP-377 --- resources/definitions/ultimaker_method_base.def.json | 6 +++--- .../extruders/ultimaker_methodx_extruder_left.def.json | 1 + .../extruders/ultimaker_methodx_extruder_right.def.json | 1 + .../extruders/ultimaker_methodxl_extruder_left.def.json | 1 + .../extruders/ultimaker_methodxl_extruder_right.def.json | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/definitions/ultimaker_method_base.def.json b/resources/definitions/ultimaker_method_base.def.json index 4f03a8dbe1..972d69e0d3 100644 --- a/resources/definitions/ultimaker_method_base.def.json +++ b/resources/definitions/ultimaker_method_base.def.json @@ -99,7 +99,7 @@ "acceleration_print": { "enabled": false, - "value": 300 + "value": 800 }, "acceleration_print_layer_0": { @@ -234,7 +234,7 @@ "jerk_print": { "enabled": false, - "value": 12.5 + "value": 6.25 }, "jerk_print_layer_0": { @@ -279,7 +279,7 @@ "jerk_travel": { "enabled": false, - "value": 12.5 + "value": "jerk_print" }, "jerk_travel_enabled": { diff --git a/resources/extruders/ultimaker_methodx_extruder_left.def.json b/resources/extruders/ultimaker_methodx_extruder_left.def.json index 97e8a1f2c3..7051f056f3 100644 --- a/resources/extruders/ultimaker_methodx_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_left.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 8 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodx_extruder_right.def.json b/resources/extruders/ultimaker_methodx_extruder_right.def.json index 8a4ef33404..1fea854877 100644 --- a/resources/extruders/ultimaker_methodx_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodx_extruder_right.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 8 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_left.def.json b/resources/extruders/ultimaker_methodxl_extruder_left.def.json index 2bedf9a62c..66670fe994 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_left.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_left.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 10 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, diff --git a/resources/extruders/ultimaker_methodxl_extruder_right.def.json b/resources/extruders/ultimaker_methodxl_extruder_right.def.json index 2fd5b37663..9f483e39bc 100644 --- a/resources/extruders/ultimaker_methodxl_extruder_right.def.json +++ b/resources/extruders/ultimaker_methodxl_extruder_right.def.json @@ -16,6 +16,7 @@ }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, + "machine_extruder_start_code_duration": { "default_value": 10 }, "machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_size": { "default_value": 0.4 }, From b7970dadee75b0c4f029f4503062624f4b873410 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 11 Jan 2024 13:03:48 +0100 Subject: [PATCH 2/8] Setting QT_QUICK_FLICKABLE_WHEEL_DECELERATION only while opening cura application CURA-11468 --- conanfile.py | 1 - cura_app.py | 9 ++++----- packaging/AppImage-builder/AppImageBuilder.yml.jinja | 1 - packaging/AppImage/AppRun | 1 - 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/conanfile.py b/conanfile.py index 5ebcf5a4c4..a3ca8f1c89 100644 --- a/conanfile.py +++ b/conanfile.py @@ -71,7 +71,6 @@ class CuraConan(ConanFile): self._cura_env = Environment() self._cura_env.define("QML2_IMPORT_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "qml"))) self._cura_env.define("QT_PLUGIN_PATH", str(self._site_packages.joinpath("PyQt6", "Qt6", "plugins"))) - self._cura_env.define("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000") if not self.in_local_cache: self._cura_env.define("CURA_DATA_ROOT", str(self._share_dir.joinpath("cura"))) diff --git a/cura_app.py b/cura_app.py index 7e80bbac79..87cd1a59ed 100755 --- a/cura_app.py +++ b/cura_app.py @@ -15,13 +15,12 @@ if "" in sys.path: import argparse import faulthandler import os + +# try converting to integer +os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ.get("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000"))) + if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. os.environ["QT_PLUGIN_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. - try: - # try converting to integer - os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"])) - except ValueError: - os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = "5000" os.environ["QML2_IMPORT_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QT_OPENGL_DLL"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. diff --git a/packaging/AppImage-builder/AppImageBuilder.yml.jinja b/packaging/AppImage-builder/AppImageBuilder.yml.jinja index ae6cabcaa1..9090a5f209 100644 --- a/packaging/AppImage-builder/AppImageBuilder.yml.jinja +++ b/packaging/AppImage-builder/AppImageBuilder.yml.jinja @@ -45,7 +45,6 @@ AppDir: LD_LIBRARY_PATH: "$APPDIR:$APPDIR/runtime/compat/:$APPDIR/usr/lib/x86_64-linux-gnu:$APPDIR/lib/x86_64-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders" PYTHONPATH: "$APPDIR" QT_PLUGIN_PATH: "$APPDIR/qt/plugins" - QT_QUICK_FLICKABLE_WHEEL_DECELERATION: "5000" QML2_IMPORT_PATH: "$APPDIR/qt/qml" QT_QPA_PLATFORMTHEME: xdgdesktopportal GDK_PIXBUF_MODULEDIR: $APPDIR/usr/lib/x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders diff --git a/packaging/AppImage/AppRun b/packaging/AppImage/AppRun index 9926df1878..369ce54c6c 100644 --- a/packaging/AppImage/AppRun +++ b/packaging/AppImage/AppRun @@ -5,7 +5,6 @@ scriptdir=$(dirname $0) export PYTHONPATH="$scriptdir/lib/python3.10" export LD_LIBRARY_PATH=$scriptdir export QT_PLUGIN_PATH="$scriptdir/qt/plugins" -export QT_QUICK_FLICKABLE_WHEEL_DECELERATION="5000" export QML2_IMPORT_PATH="$scriptdir/qt/qml" export QT_QPA_FONTDIR=/usr/share/fonts export QT_QPA_PLATFORMTHEME=xdgdesktopportal From db94117cf18ec9f9ec93ceb9d92844401c52292e Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 11 Jan 2024 13:08:47 +0100 Subject: [PATCH 3/8] description changed CURA-11468 --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 87cd1a59ed..bcea032789 100755 --- a/cura_app.py +++ b/cura_app.py @@ -16,7 +16,7 @@ import argparse import faulthandler import os -# try converting to integer +# set the environment variable QT_QUICK_FLICKABLE_WHEEL_DECELERATION to 5000 as mentioned in qt6.6 update log to overcome scroll related issues os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ.get("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000"))) if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. From fe440a664350441c0d3f9aa8d3a635a16667deac Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 15 Jan 2024 11:52:11 +0100 Subject: [PATCH 4/8] Allow for expressions in start/end machine/extruder code extruder_nr field CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 49 ++++++++++++---------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 935eb81afa..fda1542e0a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -1,4 +1,4 @@ -# Copyright (c) 2023 UltiMaker +# Copyright (c) 2024 UltiMaker # Cura is released under the terms of the LGPLv3 or higher. import uuid @@ -63,13 +63,12 @@ class GcodeStartEndFormatter(Formatter): # will be used. Alternatively, if the expression is formatted as "{[expression], [extruder_nr]}", # then the expression will be evaluated with the extruder stack of the specified extruder_nr. - _extruder_regex = re.compile(r"^\s*(?P.*)\s*,\s*(?P\d+)\s*$") + _extruder_regex = re.compile(r"^\s*(?P.*)\s*,\s*(?P.*)\s*$") - def __init__(self, default_extruder_nr: int = -1, *, - additional_per_extruder_settings: Optional[Dict[str, Dict[str, any]]] = None) -> None: + def __init__(self, all_extruder_settings: Dict[str, Any], default_extruder_nr: int = -1) -> None: super().__init__() + self._all_extruder_settings: Dict[str, Any] = all_extruder_settings self._default_extruder_nr: int = default_extruder_nr - self._additional_per_extruder_settings: Optional[Dict[str, Dict[str, any]]] = additional_per_extruder_settings def get_field(self, field_name, args: [str], kwargs: dict) -> Tuple[str, str]: # get_field method parses all fields in the format-string and parses them individually to the get_value method. @@ -88,22 +87,31 @@ class GcodeStartEndFormatter(Formatter): if expression in post_slice_data_variables: return f"{{{expression}}}" - extruder_nr = self._default_extruder_nr + extruder_nr = str(self._default_extruder_nr) # The settings may specify a specific extruder to use. This is done by - # formatting the expression as "{expression}, {extruder_nr}". If the + # formatting the expression as "{expression}, {extruder_nr_expr}". If the # expression is formatted like this, we extract the extruder_nr and use # it to get the value from the correct extruder stack. match = self._extruder_regex.match(expression) if match: expression = match.group("expression") - extruder_nr = int(match.group("extruder_nr")) + extruder_nr_expr = match.group("extruder_nr_expr") - if self._additional_per_extruder_settings is not None and str( - extruder_nr) in self._additional_per_extruder_settings: - additional_variables = self._additional_per_extruder_settings[str(extruder_nr)] + if extruder_nr_expr.isdigit(): + extruder_nr = extruder_nr_expr + else: + # We get the value of the extruder_nr_expr from `_all_extruder_settings` dictionary + # rather than the global container stack. The `_all_extruder_settings["-1"]` is a + # dict-representation of the global container stack, with additional properties such + # as `initial_extruder_nr`. As users may enter such expressions we can't use the + # global container stack. + extruder_nr = self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1") + + if extruder_nr in self._all_extruder_settings: + additional_variables = self._all_extruder_settings[extruder_nr] else: - additional_variables = dict() + additional_variables = self._all_extruder_settings["-1"] # Add the arguments and keyword arguments to the additional settings. These # are currently _not_ used, but they are added for consistency with the @@ -113,7 +121,7 @@ class GcodeStartEndFormatter(Formatter): for key, value in kwargs.items(): additional_variables[key] = value - if extruder_nr == -1: + if extruder_nr == "-1": container_stack = CuraApplication.getInstance().getGlobalContainerStack() else: container_stack = ExtruderManager.getInstance().getExtruderStack(extruder_nr) @@ -121,7 +129,6 @@ class GcodeStartEndFormatter(Formatter): setting_function = SettingFunction(expression) value = setting_function(container_stack, additional_variables=additional_variables) - return value @@ -131,12 +138,13 @@ class StartSliceJob(Job): def __init__(self, slice_message: Arcus.PythonMessage) -> None: super().__init__() - self._scene = CuraApplication.getInstance().getController().getScene() #type: Scene + self._scene: Scene = CuraApplication.getInstance().getController().getScene() self._slice_message: Arcus.PythonMessage = slice_message - self._is_cancelled = False #type: bool - self._build_plate_number = None #type: Optional[int] + self._is_cancelled: bool = False + self._build_plate_number: Optional[int] = None - self._all_extruders_settings = None #type: Optional[Dict[str, Any]] # cache for all setting values from all stacks (global & extruder) for the current machine + # cache for all setting values from all stacks (global & extruder) for the current machine + self._all_extruders_settings: Optional[Dict[str, Any]] = None def getSliceMessage(self) -> Arcus.PythonMessage: return self._slice_message @@ -471,10 +479,7 @@ class StartSliceJob(Job): # Get "replacement-keys" for the extruders. In the formatter the settings stack is used to get the # replacement values for the setting-keys. However, the values for `material_id`, `material_type`, # etc are not in the settings stack. - additional_per_extruder_settings = self._all_extruders_settings.copy() - additional_per_extruder_settings["default_extruder_nr"] = default_extruder_nr - fmt = GcodeStartEndFormatter(default_extruder_nr=default_extruder_nr, - additional_per_extruder_settings=additional_per_extruder_settings) + fmt = GcodeStartEndFormatter(self._all_extruders_settings, default_extruder_nr=default_extruder_nr) return str(fmt.format(value)) except: Logger.logException("w", "Unable to do token replacement on start/end g-code") From 5da4dfcb705b519ded069245fd0cf5bfbaf0f244 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 15 Jan 2024 12:03:42 +0100 Subject: [PATCH 5/8] Improve unhappy flow CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index fda1542e0a..04345bf747 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -111,6 +111,7 @@ class GcodeStartEndFormatter(Formatter): if extruder_nr in self._all_extruder_settings: additional_variables = self._all_extruder_settings[extruder_nr] else: + Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings") additional_variables = self._all_extruder_settings["-1"] # Add the arguments and keyword arguments to the additional settings. These @@ -125,6 +126,9 @@ class GcodeStartEndFormatter(Formatter): container_stack = CuraApplication.getInstance().getGlobalContainerStack() else: container_stack = ExtruderManager.getInstance().getExtruderStack(extruder_nr) + if not container_stack: + Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings") + container_stack = CuraApplication.getInstance().getGlobalContainerStack() setting_function = SettingFunction(expression) value = setting_function(container_stack, additional_variables=additional_variables) From 9d78c9ed5860de5b94f4a5c301cd9003edd86132 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 15 Jan 2024 12:39:10 +0100 Subject: [PATCH 6/8] Don't mutate/pollute `_all_extruder_settings` with additional values CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 04345bf747..5039e9a3de 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -109,10 +109,10 @@ class GcodeStartEndFormatter(Formatter): extruder_nr = self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1") if extruder_nr in self._all_extruder_settings: - additional_variables = self._all_extruder_settings[extruder_nr] + additional_variables = self._all_extruder_settings[extruder_nr].copy() else: Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings") - additional_variables = self._all_extruder_settings["-1"] + additional_variables = self._all_extruder_settings["-1"].copy() # Add the arguments and keyword arguments to the additional settings. These # are currently _not_ used, but they are added for consistency with the From 1a57f121729a153902c0485d66a400298851fbeb Mon Sep 17 00:00:00 2001 From: HellAholic Date: Tue, 16 Jan 2024 10:01:26 +0100 Subject: [PATCH 7/8] change label to name to align with items in global_container_stack check --- cura/Machines/Models/ExtrudersModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/Models/ExtrudersModel.py b/cura/Machines/Models/ExtrudersModel.py index 2677894bff..f31f7c8717 100644 --- a/cura/Machines/Models/ExtrudersModel.py +++ b/cura/Machines/Models/ExtrudersModel.py @@ -227,7 +227,7 @@ class ExtrudersModel(ListModel): "material_brand": "", "color_name": "", "material_type": "", - "material_label": "" + "material_name": "" } items.append(item) if self._items != items: From 54df08f47fa30a4462317ca40d8328a5649491af Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Tue, 16 Jan 2024 13:14:49 +0100 Subject: [PATCH 8/8] Fix specific extruder not being used CURA-11536 --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 5039e9a3de..6ede9fa219 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -106,7 +106,7 @@ class GcodeStartEndFormatter(Formatter): # dict-representation of the global container stack, with additional properties such # as `initial_extruder_nr`. As users may enter such expressions we can't use the # global container stack. - extruder_nr = self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1") + extruder_nr = str(self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1")) if extruder_nr in self._all_extruder_settings: additional_variables = self._all_extruder_settings[extruder_nr].copy()