From ee61854981b88de9c843ae6cb6d7e08f1be45869 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Wed, 23 Oct 2024 06:57:10 -0400 Subject: [PATCH 01/20] Re-write of Search and Replace Added some options: - Replace the 'First Instance Only' of the Search term. - Limit the Search to a layer range. - 'Ignore StartUp G-code' and 'Ignore Ending G-code' --- .../scripts/SearchAndReplace.py | 176 ++++++++++++++++-- 1 file changed, 157 insertions(+), 19 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index dabc6b725a..264531de59 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,16 +1,16 @@ # Copyright (c) 2017 Ghostkeeper # The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. +# Altered by GregValiant (Greg Foresi) February, 2023. +# Added an option to replace the 'First Instance Only' +# Added option to limit the Search to a layer range. +# Added 'Ignore StartUp G-code' and 'Ignore Ending G-code' options -import re # To perform the search and replace. - +import re from ..Script import Script - +from UM.Application import Application class SearchAndReplace(Script): - """Performs a search-and-replace on all g-code. - - Due to technical limitations, the search can't cross the border between - layers. + """Performs a search-and-replace on the g-code. """ def getSettingDataString(self): @@ -23,37 +23,175 @@ class SearchAndReplace(Script): { "search": { - "label": "Search", - "description": "All occurrences of this text will get replaced by the replacement text.", + "label": "Search for:", + "description": "All occurrences of this text (within the search range) will be replaced by the 'Replace with' text. The search string is CASE SPECIFIC so 'LAYER' is not the same as 'layer'.", "type": "str", "default_value": "" }, "replace": { - "label": "Replace", - "description": "The search text will get replaced by this text.", + "label": "Replace with:", + "description": "The 'Search For' text will get replaced by this text. For Multi-Line insertions use the newline character 'backslash plus n' as the delimiter. Also for multi-line insertions the last character must be 'backslash plus n'", "type": "str", "default_value": "" }, "is_regex": { "label": "Use Regular Expressions", - "description": "When enabled, the search text will be interpreted as a regular expression.", + "description": "When disabled the search string is treated as a simple text string. When enabled, the search text will be re-compiled as a 'regular' python expression.", "type": "bool", "default_value": false + }, + "enable_layer_search": + { + "label": "Enable search within a Layer Range:", + "description": "When enabled, You can choose a Start and End layer for the search. When 'Layer Search' is enabled the StartUp and Ending g-codes are always ignored.", + "type": "bool", + "default_value": false, + "enabled": true + }, + "search_start": + { + "label": "Start S&R at Layer:", + "description": "Use the Cura Preview layer numbering. The Start Layer will be included. Enter '1' to start with gcode ';LAYER:0'. Enter ''-6'' to start with the first layer of a raft.", + "type": "int", + "default_value": 1, + "minimum_value": -6, + "enabled": "enable_layer_search" + }, + "search_end": + { + "label": "Stop S&R at end of Layer:", + "description": "Use the Cura Preview layer numbering. Enter '-1' to search and replace to the end of the file. Enter any other layer number and the replacements will conclude at the end of that layer. If the End Layer is equal to the Start Layer then only that single layer is searched.", + "type": "int", + "default_value": -1, + "minimum_value": -1, + "enabled": "enable_layer_search" + }, + "first_instance_only": + { + "label": "Replace first instance only:", + "description": "When enabled only the first instance is replaced.", + "type": "bool", + "default_value": false, + "enabled": true + }, + "ignore_start": + { + "label": "Ignore StartUp G-code:", + "description": "When enabled the StartUp G-code is unaffected. The StartUp G-code is everything from ';generated with Cura...' to ';LAYER_COUNT:' inclusive.", + "type": "bool", + "default_value": true, + "enabled": "not enable_layer_search" + }, + "ignore_end": + { + "label": "Ignore Ending G-code:", + "description": "When enabled the Ending G-code is unaffected.", + "type": "bool", + "default_value": true, + "enabled": "not enable_layer_search" } } }""" def execute(self, data): + curaApp = Application.getInstance().getGlobalContainerStack() + extruder = curaApp.extruderList + retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) + # If retractions are enabled then the CuraEngine inserts a single data item for the retraction at the end of the last layer + # 'top_layer' accounts for that + if retract_enabled: + top_layer = 2 + else: + top_layer = 1 search_string = self.getSettingValueByKey("search") - if not self.getSettingValueByKey("is_regex"): - search_string = re.escape(search_string) #Need to search for the actual string, not as a regex. - search_regex = re.compile(search_string) - replace_string = self.getSettingValueByKey("replace") + is_regex = self.getSettingValueByKey("is_regex") + enable_layer_search = self.getSettingValueByKey("enable_layer_search") + start_layer = self.getSettingValueByKey("search_start") + end_layer = self.getSettingValueByKey("search_end") + ignore_start = self.getSettingValueByKey("ignore_start") + ignore_end = self.getSettingValueByKey("ignore_end") + if enable_layer_search: + ignore_start = True + ignore_end = True + first_instance_only = bool(self.getSettingValueByKey("first_instance_only")) - for layer_number, layer in enumerate(data): - data[layer_number] = re.sub(search_regex, replace_string, layer) #Replace all. + #Find the raft and layer:0 indexes-------------------------------------------------------------------------- + raft_start_index = 0 + layer_0_index = 0 + start_index = 1 + end_index = len(data) + try: + for l_num in range(2,12,1): + layer = data[l_num] + if ";LAYER:-" in layer and raft_start_index == 0: + raft_start_index = l_num + if ";LAYER:0" in layer: + layer_0_index = l_num + break + if raft_start_index == 0: + raft_start_index = layer_0_index + raft_layers = 0 + elif raft_start_index < layer_0_index: + raft_layers = layer_0_index - raft_start_index + else: + raft_layers = 0 + except: + pass + #Determine the actual start and end indexes of the data---------------------------------------------------- + try: + if not enable_layer_search: + if ignore_start: + start_index = 2 + else: + start_index = 1 + if ignore_end: + end_index = len(data) - top_layer + else: + end_index = len(data) + elif enable_layer_search: + if start_layer < 1 and start_layer != -6: + start_index = layer_0_index - raft_layers + elif start_layer == -6: + start_index = 2 + else: + start_index = raft_start_index + start_layer - 1 + if end_layer == -1: + end_index = len(data) - top_layer + else: + end_index = raft_start_index + int(end_layer) + if end_index > len(data) - 1: end_index = len(data) - 1 #For possible user input error + if int(end_index) < int(start_index): end_index = start_index #For possible user input error + except: + start_index = 2 + end_index = len(data) - top_layer - return data \ No newline at end of file + # If "first_instance_only" is enabled: + replaceone = False + if first_instance_only: + if not is_regex: + search_string = re.escape(search_string) + search_regex = re.compile(search_string) + for num in range(start_index, end_index, 1): + layer = data[num] + if re.search(search_regex, layer) and replaceone == False: + data[num] = re.sub(search_regex, replace_string, data[num], 1) + replaceone = True + break + if replaceone: break + return data + + # For all the replacements + if not is_regex: + search_string = re.escape(search_string) + search_regex = re.compile(search_string) + if end_index > start_index: + for index in range(start_index, end_index, 1): + layer = data[index] + data[index] = re.sub(search_regex, replace_string, layer) + elif end_index == start_index: + layer = data[start_index] + data[start_index] = re.sub(search_regex, replace_string, layer) + return data From 349c5284a9e79a082e48ac7f5e22bead4b10aaa4 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:14:47 -0500 Subject: [PATCH 02/20] Update SearchAndReplace.py Update a description Update SearchAndReplace.py Fixed the "descriptions". Cura didn't like the dashes or backslashes. --- .../scripts/SearchAndReplace.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 264531de59..f3261633d0 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,8 +1,7 @@ # Copyright (c) 2017 Ghostkeeper # The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. # Altered by GregValiant (Greg Foresi) February, 2023. -# Added an option to replace the 'First Instance Only' -# Added option to limit the Search to a layer range. +# Added option for a layer search with a Start Layer and an End layer. # Added 'Ignore StartUp G-code' and 'Ignore Ending G-code' options import re @@ -31,21 +30,21 @@ class SearchAndReplace(Script): "replace": { "label": "Replace with:", - "description": "The 'Search For' text will get replaced by this text. For Multi-Line insertions use the newline character 'backslash plus n' as the delimiter. Also for multi-line insertions the last character must be 'backslash plus n'", + "description": "The 'Search For' text will get replaced by this text. For MultiLine insertions use the newline character 'backslash plus n' as the delimiter. If your Search term ends with a 'newline' remember to add 'newline' to the end of this Replace term.", "type": "str", "default_value": "" }, "is_regex": { "label": "Use Regular Expressions", - "description": "When disabled the search string is treated as a simple text string. When enabled, the search text will be re-compiled as a 'regular' python expression.", + "description": "When disabled the search string is treated as a simple text string. When enabled, the search text will be recompiled as a 'regular' python expression.", "type": "bool", "default_value": false }, "enable_layer_search": { "label": "Enable search within a Layer Range:", - "description": "When enabled, You can choose a Start and End layer for the search. When 'Layer Search' is enabled the StartUp and Ending g-codes are always ignored.", + "description": "When enabled, You can choose a Start and End layer for the search. When 'Layer Search' is enabled the StartUp and Ending gcodes are always ignored.", "type": "bool", "default_value": false, "enabled": true @@ -79,7 +78,7 @@ class SearchAndReplace(Script): "ignore_start": { "label": "Ignore StartUp G-code:", - "description": "When enabled the StartUp G-code is unaffected. The StartUp G-code is everything from ';generated with Cura...' to ';LAYER_COUNT:' inclusive.", + "description": "When enabled the StartUp Gcode is unaffected. The StartUp Gcode is everything from ';generated with Cura...' to ';LAYER_COUNT:' inclusive.", "type": "bool", "default_value": true, "enabled": "not enable_layer_search" @@ -87,7 +86,7 @@ class SearchAndReplace(Script): "ignore_end": { "label": "Ignore Ending G-code:", - "description": "When enabled the Ending G-code is unaffected.", + "description": "When enabled the Ending Gcode is unaffected.", "type": "bool", "default_value": true, "enabled": "not enable_layer_search" From be509b66962ecc69374a766011007bec277754d0 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Tue, 7 Jan 2025 12:20:21 -0500 Subject: [PATCH 03/20] Update SearchAndReplace.py Update SearchAndReplace.py Changed comments. Revised code below line 170. Changed 'curaApp' to 'cura_app' --- .../scripts/SearchAndReplace.py | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index f3261633d0..5f440a67e9 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,6 +1,7 @@ # Copyright (c) 2017 Ghostkeeper # The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. # Altered by GregValiant (Greg Foresi) February, 2023. +# Added option for "first instance only" # Added option for a layer search with a Start Layer and an End layer. # Added 'Ignore StartUp G-code' and 'Ignore Ending G-code' options @@ -23,7 +24,7 @@ class SearchAndReplace(Script): "search": { "label": "Search for:", - "description": "All occurrences of this text (within the search range) will be replaced by the 'Replace with' text. The search string is CASE SPECIFIC so 'LAYER' is not the same as 'layer'.", + "description": "CASE SPECIFIC. 'LAYER' is not the same as 'Layer'. All occurrences of this text (within the search range) will be replaced by the 'Replace with' string.", "type": "str", "default_value": "" }, @@ -95,8 +96,8 @@ class SearchAndReplace(Script): }""" def execute(self, data): - curaApp = Application.getInstance().getGlobalContainerStack() - extruder = curaApp.extruderList + cura_app = Application.getInstance().getGlobalContainerStack() + extruder = cura_app.extruderList retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) # If retractions are enabled then the CuraEngine inserts a single data item for the retraction at the end of the last layer # 'top_layer' accounts for that @@ -117,7 +118,7 @@ class SearchAndReplace(Script): ignore_end = True first_instance_only = bool(self.getSettingValueByKey("first_instance_only")) - #Find the raft and layer:0 indexes-------------------------------------------------------------------------- + #Find the raft and layer:0 indexes raft_start_index = 0 layer_0_index = 0 start_index = 1 @@ -139,7 +140,7 @@ class SearchAndReplace(Script): raft_layers = 0 except: pass - #Determine the actual start and end indexes of the data---------------------------------------------------- + #Determine the actual start and end indexes of the data try: if not enable_layer_search: if ignore_start: @@ -167,30 +168,24 @@ class SearchAndReplace(Script): start_index = 2 end_index = len(data) - top_layer - # If "first_instance_only" is enabled: + # Make replacements replaceone = False - if first_instance_only: - if not is_regex: - search_string = re.escape(search_string) - search_regex = re.compile(search_string) - for num in range(start_index, end_index, 1): - layer = data[num] + if not is_regex: + search_string = re.escape(search_string) + search_regex = re.compile(search_string) + for num in range(start_index, end_index, 1): + layer = data[num] + # First_instance only + if first_instance_only: if re.search(search_regex, layer) and replaceone == False: data[num] = re.sub(search_regex, replace_string, data[num], 1) replaceone = True break - if replaceone: break - return data - - # For all the replacements - if not is_regex: - search_string = re.escape(search_string) - search_regex = re.compile(search_string) - if end_index > start_index: - for index in range(start_index, end_index, 1): - layer = data[index] - data[index] = re.sub(search_regex, replace_string, layer) - elif end_index == start_index: - layer = data[start_index] - data[start_index] = re.sub(search_regex, replace_string, layer) - return data + # All + else: + if end_index > start_index: + data[num] = re.sub(search_regex, replace_string, layer) + elif end_index == start_index: + layer = data[start_index] + data[start_index] = re.sub(search_regex, replace_string, layer) + return data \ No newline at end of file From 5678c64f1899375e2d9409dc01778404f586bcb9 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Sun, 12 Jan 2025 10:04:39 -0500 Subject: [PATCH 04/20] Update SearchAndReplace.py Change variable name from cura_app to global_stack. --- plugins/PostProcessingPlugin/scripts/SearchAndReplace.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 5f440a67e9..4d81b9f98d 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -96,8 +96,8 @@ class SearchAndReplace(Script): }""" def execute(self, data): - cura_app = Application.getInstance().getGlobalContainerStack() - extruder = cura_app.extruderList + global_stack = Application.getInstance().getGlobalContainerStack() + extruder = global_stack.extruderList retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) # If retractions are enabled then the CuraEngine inserts a single data item for the retraction at the end of the last layer # 'top_layer' accounts for that @@ -140,6 +140,7 @@ class SearchAndReplace(Script): raft_layers = 0 except: pass + #Determine the actual start and end indexes of the data try: if not enable_layer_search: From a6c9531932c28dfe62c48f4ba32ad92586e73cb0 Mon Sep 17 00:00:00 2001 From: Alan Bjorklund Date: Tue, 21 Jan 2025 16:22:27 -0500 Subject: [PATCH 05/20] PC-ABS & PC-ABS-FR 175 Updates Add PC-ABS & PC-ABS-FR intent and quality files for Method X & Method XL. These materials pair with 1C, 1XA and Labs extruders. Exclude PC-ABS and PC-ABS-FR from sketch printers and Method. PP-550 --- .../definitions/ultimaker_method.def.json | 2 + .../definitions/ultimaker_sketch.def.json | 2 + .../ultimaker_sketch_sprint.def.json | 2 + ...hodx_1c_um-pc-abs-175_0.2mm_solid.inst.cfg | 22 +++++++ ...x_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg | 22 +++++++ ...odx_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg | 22 +++++++ ..._1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg | 22 +++++++ ...dx_labs_um-pc-abs-175_0.2mm_solid.inst.cfg | 22 +++++++ ...labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg | 22 +++++++ ...odxl_1c_um-pc-abs-175_0.2mm_solid.inst.cfg | 22 +++++++ ...l_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg | 22 +++++++ ...dxl_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg | 22 +++++++ ..._1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg | 22 +++++++ ...xl_labs_um-pc-abs-175_0.2mm_solid.inst.cfg | 22 +++++++ ...labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg | 22 +++++++ ...um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg | 66 +++++++++++++++++++ ...methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg | 66 +++++++++++++++++++ ...m_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg | 66 +++++++++++++++++++ ...ethodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg | 66 +++++++++++++++++++ ..._methodx_labs_um-pc-abs-175_0.2mm.inst.cfg | 66 +++++++++++++++++++ ...thodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg | 66 +++++++++++++++++++ ...m_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg | 65 ++++++++++++++++++ ...ethodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg | 65 ++++++++++++++++++ ..._methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg | 65 ++++++++++++++++++ ...thodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg | 65 ++++++++++++++++++ ...methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg | 65 ++++++++++++++++++ ...hodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg | 65 ++++++++++++++++++ 27 files changed, 1056 insertions(+) create mode 100644 resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm_solid.inst.cfg create mode 100644 resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg create mode 100644 resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg diff --git a/resources/definitions/ultimaker_method.def.json b/resources/definitions/ultimaker_method.def.json index 5e78c3f630..d2813ea8a3 100644 --- a/resources/definitions/ultimaker_method.def.json +++ b/resources/definitions/ultimaker_method.def.json @@ -59,6 +59,8 @@ "zyyx_pro_", "octofiber_", "fiberlogy_", + "ultimaker_pc-abs", + "ultimaker_pc-abs-fr", "ultimaker_metallic_pla_175" ], "has_machine_materials": true, diff --git a/resources/definitions/ultimaker_sketch.def.json b/resources/definitions/ultimaker_sketch.def.json index 2f96b52397..9cbe75910a 100644 --- a/resources/definitions/ultimaker_sketch.def.json +++ b/resources/definitions/ultimaker_sketch.def.json @@ -60,6 +60,8 @@ "ultimaker_sr30", "ultimaker_petg", "ultimaker_pva", + "ultimaker_pc-abs", + "ultimaker_pc-abs-fr", "ultimaker_metallic_pla" ], "has_machine_quality": true, diff --git a/resources/definitions/ultimaker_sketch_sprint.def.json b/resources/definitions/ultimaker_sketch_sprint.def.json index cde655e70f..bee97ae0d8 100644 --- a/resources/definitions/ultimaker_sketch_sprint.def.json +++ b/resources/definitions/ultimaker_sketch_sprint.def.json @@ -54,6 +54,8 @@ "ultimaker_rapidrinse", "ultimaker_sr30", "ultimaker_petg", + "ultimaker_pc-abs", + "ultimaker_pc-abs-fr", "ultimaker_metallic_pla" ], "has_machine_quality": true, diff --git a/resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..5dd610ba77 --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1C + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..57e1072c16 --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1C + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..2e11986e66 --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1XA + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..fac9316dcf --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1XA + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..656156ce4d --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = intent +variant = LABS + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..39aba071c9 --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = intent +variant = LABS + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..b1a70679de --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1C + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..ac0f34ef58 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1C + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..64199ae86f --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1XA + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..59f7930e89 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = intent +variant = 1XA + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..2c8d67e0f0 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = intent +variant = LABS + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..164f7c7575 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm_solid.inst.cfg @@ -0,0 +1,22 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = intent +variant = LABS + +[values] +bottom_thickness = =top_bottom_thickness +infill_angles = [45,135] +infill_material_flow = 97 +infill_pattern = zigzag +infill_sparse_density = 99 +top_bottom_thickness = =layer_height * 2 +top_thickness = =top_bottom_thickness + diff --git a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..bc2275eea0 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg @@ -0,0 +1,66 @@ +[general] +definition = ultimaker_methodx +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..93e06d031f --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -0,0 +1,66 @@ +[general] +definition = ultimaker_methodx +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..4ceab63942 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg @@ -0,0 +1,66 @@ +[general] +definition = ultimaker_methodx +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1XA +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..f92b600d51 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -0,0 +1,66 @@ +[general] +definition = ultimaker_methodx +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1XA +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..52de6aa0a6 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg @@ -0,0 +1,66 @@ +[general] +definition = ultimaker_methodx +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..797f6a1c69 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -0,0 +1,66 @@ +[general] +definition = ultimaker_methodx +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..ca9c1719bc --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg @@ -0,0 +1,65 @@ +[general] +definition = ultimaker_methodxl +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..49e6da212c --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -0,0 +1,65 @@ +[general] +definition = ultimaker_methodxl +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..20fbd4217e --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg @@ -0,0 +1,65 @@ +[general] +definition = ultimaker_methodxl +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1XA +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..0a640bd42b --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -0,0 +1,65 @@ +[general] +definition = ultimaker_methodxl +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = quality +variant = 1XA +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..b677bd5a0a --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg @@ -0,0 +1,65 @@ +[general] +definition = ultimaker_methodxl +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs_175 +quality_type = draft +setting_version = 24 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..ed17070ffc --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -0,0 +1,65 @@ +[general] +definition = ultimaker_methodxl +name = Fast +version = 4 + +[metadata] +material = ultimaker_pc-abs-fr_175 +quality_type = draft +setting_version = 24 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = =extruder_nr == support_extruder_nr +cool_fan_speed = 75 +cool_fan_speed_0 = 0 +cool_fan_speed_max = 100 +cool_min_layer_time = 10 +cool_min_layer_time_fan_speed_max = 8 +cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) +cool_min_temperature = 250 +infill_sparse_density = 15 +material_final_print_temperature = =material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 +skin_overlap = 10 +speed_layer_0 = =speed_print * 7/24 +speed_prime_tower = =speed_print * 1/4 +speed_print = 120.0 +speed_roofing = =speed_print * 13/24 +speed_support = =speed_print * 5/6 +speed_support_bottom = 25 +speed_support_interface = =speed_print * 15/24 +speed_topbottom = =speed_print * 11/24 +speed_wall = =speed_print * 5/24 +speed_wall_0 = =speed_print * 1/6 +support_angle = 50 +support_bottom_angles = [135] +support_bottom_density = 15 +support_bottom_distance = 0.1 +support_bottom_enable = True +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] +support_infill_rate = 15.0 +support_interface_density = 85 +support_interface_enable = True +support_interface_pattern = zigzag +support_line_width = 0.3 +support_material_flow = 95 +support_pattern = zigzag +support_roof_density = 85 +support_roof_wall_count = 1 +support_supported_skin_fan_speed = 60.0 +support_top_distance = =support_z_distance +support_xy_distance = 0.35 +support_xy_distance_overhang = 0.25 +support_xy_overrides_z = xy_overrides_z +support_z_distance = 0.203 +top_skin_expand_distance = 2.4 +wall_overhang_angle = 30 +wall_overhang_speed_factor = 40 + From 5068529e2894bb8aa56497b0827863ff1be77a1f Mon Sep 17 00:00:00 2001 From: Alan Bjorklund Date: Tue, 21 Jan 2025 17:16:02 -0500 Subject: [PATCH 06/20] Improve PC-ABS-FR Self Support Reduce the print speed and increase the flow for PC-ABS-FR self support. This is intended to prevent under-extrusion and improve adhesion. PP-550 --- .../um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg | 4 ++-- .../um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg | 4 ++-- .../um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg | 4 ++-- .../um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg | 4 ++-- .../um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg | 4 ++-- .../um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg index 93e06d031f..72b4750e55 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -31,7 +31,7 @@ speed_layer_0 = =speed_print * 7/24 speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 -speed_support = =speed_print * 5/6 +speed_support = =speed_print * 1/2 speed_support_bottom = 25 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 @@ -50,7 +50,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg index f92b600d51..17062adace 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -31,7 +31,7 @@ speed_layer_0 = =speed_print * 7/24 speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 -speed_support = =speed_print * 5/6 +speed_support = =speed_print * 1/2 speed_support_bottom = 25 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 @@ -50,7 +50,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg index 797f6a1c69..976506fc59 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -31,7 +31,7 @@ speed_layer_0 = =speed_print * 7/24 speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 -speed_support = =speed_print * 5/6 +speed_support = =speed_print * 1/2 speed_support_bottom = 25 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 @@ -50,7 +50,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg index 49e6da212c..7c67d5afc3 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -30,7 +30,7 @@ speed_layer_0 = =speed_print * 7/24 speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 -speed_support = =speed_print * 5/6 +speed_support = =speed_print * 1/2 speed_support_bottom = 25 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 @@ -49,7 +49,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg index 0a640bd42b..4aef80925c 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -30,7 +30,7 @@ speed_layer_0 = =speed_print * 7/24 speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 -speed_support = =speed_print * 5/6 +speed_support = =speed_print * 1/2 speed_support_bottom = 25 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 @@ -49,7 +49,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg index ed17070ffc..7d4a6ac29d 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -30,7 +30,7 @@ speed_layer_0 = =speed_print * 7/24 speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 -speed_support = =speed_print * 5/6 +speed_support = =speed_print * 1/2 speed_support_bottom = 25 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 @@ -49,7 +49,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 From 51a7cb1f903acc7174586225be92d467c2276a85 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 27 Jan 2025 10:05:52 +0100 Subject: [PATCH 07/20] Add extra settings for flooring on the basis of roofing CURA-12335 --- resources/definitions/fdmprinter.def.json | 257 ++++++++++++++++++++++ 1 file changed, 257 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index c1392e57ba..2b28b16cda 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1545,6 +1545,90 @@ } } }, + "flooring_extruder_nr": + { + "label": "Bottom Surface Skin Extruder", + "description": "The extruder train used for printing the bottom most skin. This is used in multi-extrusion.", + "type": "optional_extruder", + "default_value": "-1", + "value": "top_bottom_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": true, + "settable_globally": true, + "enabled": "extruders_enabled_count > 1 and max(extruderValues('flooring_layer_count')) > 0 and max(extruderValues('bottom_layers')) > 0" + }, + "flooring_layer_count": + { + "label": "Bottom Surface Skin Layers", + "description": "The number of bottom most skin layers. Usually only one bottom most layer is sufficient to generate higher quality bottom surfaces.", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "bottom_layers - 1", + "type": "int", + "maximum_value": "999999", + "value": "0", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true, + "enabled": "bottom_layers > 0", + "children": + { + "flooring_line_width": + { + "label": "Bottom Surface Skin Line Width", + "description": "Width of a single line of the areas at the bottom of the print.", + "unit": "mm", + "minimum_value": "0.001", + "minimum_value_warning": "0.1 + 0.4 * machine_nozzle_size", + "maximum_value_warning": "2 * machine_nozzle_size", + "default_value": 0.4, + "type": "float", + "value": "skin_line_width", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true, + "enabled": "flooring_layer_count > 0 and bottom_layers > 0" + }, + "flooring_pattern": + { + "label": "Bottom Surface Skin Pattern", + "description": "The pattern of the bottom most layers.", + "type": "enum", + "options": + { + "lines": "Lines", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "lines", + "value": "top_bottom_pattern", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true, + "enabled": "flooring_layer_count > 0 and bottom_layers > 0" + }, + "flooring_monotonic": + { + "label": "Monotonic Bottom Surface Order", + "description": "Print bottom surface lines in an ordering that causes them to always overlap with adjacent lines in a single direction. This takes slightly more time to print, but makes flat surfaces look more consistent.", + "type": "bool", + "value": true, + "default_value": true, + "enabled": "flooring_layer_count > 0 and bottom_layers > 0 and flooring_pattern != 'concentric'", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true + }, + "flooring_angles": + { + "label": "Bottom Surface Skin Line Directions", + "description": "A list of integer line directions to use when the bottom surface skin layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees).", + "type": "[int]", + "default_value": "[ ]", + "value": "skin_angles", + "enabled": "flooring_pattern != 'concentric' and flooring_layer_count > 0 and bottom_layers > 0", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true + } + } + }, "top_bottom_extruder_nr": { "label": "Top/Bottom Extruder", @@ -2953,6 +3037,34 @@ "maximum_value_warning": "150", "limit_to_extruder": "wall_x_extruder_nr", "settable_per_mesh": true + }, + "wall_0_material_flow_flooring": + { + "label": "Bottom Surface Outer Wall Flow", + "description": "Flow compensation on the bottom surface outermost wall line.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "wall_0_material_flow", + "minimum_value": "0.0001", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, + "wall_x_material_flow_flooring": + { + "label": "Bottom Surface Inner Wall(s) Flow", + "description": "Flow compensation on bottom surface wall lines for all wall lines except the outermost one.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "wall_x_material_flow", + "minimum_value": "0.0001", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "wall_x_extruder_nr", + "settable_per_mesh": true } } }, @@ -2986,6 +3098,21 @@ "settable_per_mesh": true, "enabled": "roofing_layer_count > 0 and top_layers > 0" }, + "flooring_material_flow": + { + "label": "Bottom Surface Skin Flow", + "description": "Flow compensation on lines of the areas at the bottom of the print.", + "unit": "%", + "type": "float", + "default_value": 100, + "value": "skin_material_flow", + "minimum_value": "0.0001", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true, + "enabled": "flooring_layer_count > 0 and bottom_layers > 0" + }, "infill_material_flow": { "label": "Infill Flow", @@ -3340,6 +3467,34 @@ "value": "speed_wall_x", "limit_to_extruder": "wall_x_extruder_nr", "settable_per_mesh": true + }, + "speed_wall_0_flooring": + { + "label": "Bottom Surface Outer Wall Speed", + "description": "The speed at which the bottom surface outermost wall is printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "150", + "default_value": 30, + "value": "speed_wall_0", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, + "speed_wall_x_flooring": + { + "label": "Bottom Surface Inner Wall Speed", + "description": "The speed at which the bottom surface inner walls are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "150", + "default_value": 60, + "value": "speed_wall_x", + "limit_to_extruder": "wall_x_extruder_nr", + "settable_per_mesh": true } } }, @@ -3358,6 +3513,21 @@ "settable_per_mesh": true, "enabled": "roofing_layer_count > 0 and top_layers > 0" }, + "speed_flooring": + { + "label": "Bottom Surface Skin Speed", + "description": "The speed at which bottom surface skin layers are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "150", + "default_value": 25, + "value": "speed_topbottom", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true, + "enabled": "flooring_layer_count > 0 and bottom_layers > 0" + }, "speed_topbottom": { "label": "Top/Bottom Speed", @@ -3713,6 +3883,36 @@ "enabled": "resolveOrValue('acceleration_enabled')", "limit_to_extruder": "wall_x_extruder_nr", "settable_per_mesh": true + }, + "acceleration_wall_0_flooring": + { + "label": "Bottom Surface Outer Wall Acceleration", + "description": "The acceleration with which the bottom surface outermost walls are printed.", + "unit": "mm/s\u00b2", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_wall_0", + "enabled": "resolveOrValue('acceleration_enabled')", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, + "acceleration_wall_x_flooring": + { + "label": "Bottom Surface Inner Wall Acceleration", + "description": "The acceleration with which the bottom surface inner walls are printed.", + "unit": "mm/s\u00b2", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_wall_x", + "enabled": "resolveOrValue('acceleration_enabled')", + "limit_to_extruder": "wall_x_extruder_nr", + "settable_per_mesh": true } } }, @@ -3731,6 +3931,21 @@ "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true }, + "acceleration_flooring": + { + "label": "Bottom Surface Skin Acceleration", + "description": "The acceleration with which bottom surface skin layers are printed.", + "unit": "mm/s\u00b2", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_topbottom", + "enabled": "resolveOrValue('acceleration_enabled') and flooring_layer_count > 0 and bottom_layers > 0", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true + }, "acceleration_topbottom": { "label": "Top/Bottom Acceleration", @@ -4040,6 +4255,34 @@ "enabled": "resolveOrValue('jerk_enabled')", "limit_to_extruder": "wall_x_extruder_nr", "settable_per_mesh": true + }, + "jerk_wall_0_flooring": + { + "label": "Bottom Surface Outer Wall Jerk", + "description": "The maximum instantaneous velocity change with which the bottom surface outermost walls are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_wall_0", + "enabled": "resolveOrValue('jerk_enabled')", + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, + "jerk_wall_x_flooring": + { + "label": "Bottom Surface Inner Wall Jerk", + "description": "The maximum instantaneous velocity change with which the bottom surface inner walls are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_wall_x", + "enabled": "resolveOrValue('jerk_enabled')", + "limit_to_extruder": "wall_x_extruder_nr", + "settable_per_mesh": true } } }, @@ -4057,6 +4300,20 @@ "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true }, + "jerk_flooring": + { + "label": "Bottom Surface Skin Jerk", + "description": "The maximum instantaneous velocity change with which bottom surface skin layers are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_topbottom", + "enabled": "resolveOrValue('jerk_enabled') and flooring_layer_count > 0 and bottom_layers > 0", + "limit_to_extruder": "flooring_extruder_nr", + "settable_per_mesh": true + }, "jerk_topbottom": { "label": "Top/Bottom Jerk", From 9830cb580472d9232d866165595804aa354e8861 Mon Sep 17 00:00:00 2001 From: Alan Bjorklund Date: Mon, 27 Jan 2025 16:24:31 -0500 Subject: [PATCH 08/20] Improvements to PC-ABS 175 self support PC-ABS & PC-ABS-FR 175 profile adjustments for self support to prevent under-extrusion while still printing a delicate support structure that is easy to remove. These changes include fan speeds, line widths, material flow settings, and print speeds. PP-550 --- .../um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg | 6 +++--- .../um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg | 9 +++++---- .../um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg | 6 +++--- .../um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg | 9 +++++---- .../um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg | 6 +++--- .../um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg | 9 +++++---- .../um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg | 8 ++++---- .../um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg | 11 ++++++----- .../um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg | 8 ++++---- .../um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg | 11 ++++++----- .../um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg | 8 ++++---- .../um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg | 11 ++++++----- 12 files changed, 54 insertions(+), 48 deletions(-) diff --git a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg index bc2275eea0..5c58684f3d 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -24,6 +23,7 @@ infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 @@ -50,7 +50,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg index 72b4750e55..72864b1f7e 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_1c_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -24,6 +23,7 @@ infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 @@ -32,7 +32,7 @@ speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 speed_support = =speed_print * 1/2 -speed_support_bottom = 25 +speed_support_bottom = =speed_support * 1/4 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 speed_wall = =speed_print * 5/24 @@ -42,7 +42,8 @@ support_bottom_angles = [135] support_bottom_density = 15 support_bottom_distance = 0.1 support_bottom_enable = True -support_bottom_line_width = 0.6 +support_bottom_line_distance = =support_line_distance +support_bottom_line_width = 0.8 support_bottom_stair_step_height = 0 support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] support_infill_rate = 15.0 diff --git a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg index 4ceab63942..7e624a2771 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -24,6 +23,7 @@ infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 @@ -50,7 +50,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg index 17062adace..13e42a1006 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -24,6 +23,7 @@ infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 @@ -32,7 +32,7 @@ speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 speed_support = =speed_print * 1/2 -speed_support_bottom = 25 +speed_support_bottom = =speed_support * 1/4 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 speed_wall = =speed_print * 5/24 @@ -42,7 +42,8 @@ support_bottom_angles = [135] support_bottom_density = 15 support_bottom_distance = 0.1 support_bottom_enable = True -support_bottom_line_width = 0.6 +support_bottom_line_distance = =support_line_distance +support_bottom_line_width = 0.8 support_bottom_stair_step_height = 0 support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] support_infill_rate = 15.0 diff --git a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg index 52de6aa0a6..47db7bee53 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -24,6 +23,7 @@ infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 @@ -50,7 +50,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg index 976506fc59..6bba6de819 100644 --- a/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodx/um_methodx_labs_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -24,6 +23,7 @@ infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_base_thickness = =0.6 if extruder_nr == support_extruder_nr else 0.8 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 @@ -32,7 +32,7 @@ speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 speed_support = =speed_print * 1/2 -speed_support_bottom = 25 +speed_support_bottom = =speed_support * 1/4 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 speed_wall = =speed_print * 5/24 @@ -42,7 +42,8 @@ support_bottom_angles = [135] support_bottom_density = 15 support_bottom_distance = 0.1 support_bottom_enable = True -support_bottom_line_width = 0.6 +support_bottom_line_distance = =support_line_distance +support_bottom_line_width = 0.8 support_bottom_stair_step_height = 0 support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] support_infill_rate = 15.0 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg index ca9c1719bc..a072415f8f 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -23,7 +22,8 @@ cool_min_temperature = 250 infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 -raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 speed_layer_0 = =speed_print * 7/24 @@ -49,7 +49,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg index 7c67d5afc3..272c94e581 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -23,7 +22,8 @@ cool_min_temperature = 250 infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 -raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 speed_layer_0 = =speed_print * 7/24 @@ -31,7 +31,7 @@ speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 speed_support = =speed_print * 1/2 -speed_support_bottom = 25 +speed_support_bottom = =speed_support * 1/4 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 speed_wall = =speed_print * 5/24 @@ -41,7 +41,8 @@ support_bottom_angles = [135] support_bottom_density = 15 support_bottom_distance = 0.1 support_bottom_enable = True -support_bottom_line_width = 0.6 +support_bottom_line_distance = =support_line_distance +support_bottom_line_width = 0.8 support_bottom_stair_step_height = 0 support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] support_infill_rate = 15.0 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg index 20fbd4217e..2bb4fae463 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -23,7 +22,8 @@ cool_min_temperature = 250 infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 -raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 speed_layer_0 = =speed_print * 7/24 @@ -49,7 +49,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg index 4aef80925c..53498a3408 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -23,7 +22,8 @@ cool_min_temperature = 250 infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 -raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 speed_layer_0 = =speed_print * 7/24 @@ -31,7 +31,7 @@ speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 speed_support = =speed_print * 1/2 -speed_support_bottom = 25 +speed_support_bottom = =speed_support * 1/4 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 speed_wall = =speed_print * 5/24 @@ -41,7 +41,8 @@ support_bottom_angles = [135] support_bottom_density = 15 support_bottom_distance = 0.1 support_bottom_enable = True -support_bottom_line_width = 0.6 +support_bottom_line_distance = =support_line_distance +support_bottom_line_width = 0.8 support_bottom_stair_step_height = 0 support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] support_infill_rate = 15.0 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg index b677bd5a0a..ef9005a45f 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -23,7 +22,8 @@ cool_min_temperature = 250 infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 -raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 speed_layer_0 = =speed_print * 7/24 @@ -49,7 +49,7 @@ support_interface_density = 85 support_interface_enable = True support_interface_pattern = zigzag support_line_width = 0.3 -support_material_flow = 95 +support_material_flow = 100 support_pattern = zigzag support_roof_density = 85 support_roof_wall_count = 1 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg index 7d4a6ac29d..3b5a15e0ec 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-pc-abs-fr-175_0.2mm.inst.cfg @@ -13,9 +13,8 @@ weight = -2 [values] cool_fan_enabled = =extruder_nr == support_extruder_nr -cool_fan_speed = 75 cool_fan_speed_0 = 0 -cool_fan_speed_max = 100 +cool_fan_speed_max = 80 cool_min_layer_time = 10 cool_min_layer_time_fan_speed_max = 8 cool_min_speed = =round(speed_wall_0 * 3 / 4) if cool_lift_head else round(speed_wall_0 / 5) @@ -23,7 +22,8 @@ cool_min_temperature = 250 infill_sparse_density = 15 material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature - 5 -raft_airgap = =0.12 if extruder_nr == support_extruder_nr else 0 +raft_airgap = =0.1 if extruder_nr == support_extruder_nr else 0 +raft_base_infill_overlap = 20 raft_surface_speed = =speed_print * 3/4 if extruder_nr == support_extruder_nr else 50 skin_overlap = 10 speed_layer_0 = =speed_print * 7/24 @@ -31,7 +31,7 @@ speed_prime_tower = =speed_print * 1/4 speed_print = 120.0 speed_roofing = =speed_print * 13/24 speed_support = =speed_print * 1/2 -speed_support_bottom = 25 +speed_support_bottom = =speed_support * 1/4 speed_support_interface = =speed_print * 15/24 speed_topbottom = =speed_print * 11/24 speed_wall = =speed_print * 5/24 @@ -41,7 +41,8 @@ support_bottom_angles = [135] support_bottom_density = 15 support_bottom_distance = 0.1 support_bottom_enable = True -support_bottom_line_width = 0.6 +support_bottom_line_distance = =support_line_distance +support_bottom_line_width = 0.8 support_bottom_stair_step_height = 0 support_infill_angles = [45,45,45,45,45,45,45,45,45,45,135,135,135,135,135,135,135,135,135,135] support_infill_rate = 15.0 From 479c34ce3cf73e32cc85d88e00672638955a8b98 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Fri, 7 Feb 2025 11:45:57 +0100 Subject: [PATCH 09/20] Add flooring extruder to settings that limit to extruder CURA-12335 --- cura/Settings/ExtruderManager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 3ce83d27e3..3181016f69 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -257,6 +257,7 @@ class ExtruderManager(QObject): limit_to_extruder_feature_list = ["wall_0_extruder_nr", "wall_x_extruder_nr", "roofing_extruder_nr", + "flooring_extruder_nr", "top_bottom_extruder_nr", "infill_extruder_nr", ] From 36141b082c4b516850ada98ed9bec67ab43c2a15 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Fri, 7 Feb 2025 18:40:19 -0500 Subject: [PATCH 10/20] Update SearchAndReplace.py Replaced the complex method of dealing with rafts to something simpler. Update SearchAndReplace.py Update --- .../scripts/SearchAndReplace.py | 107 +++++++----------- 1 file changed, 41 insertions(+), 66 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 4d81b9f98d..0ad90b4de2 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -24,14 +24,14 @@ class SearchAndReplace(Script): "search": { "label": "Search for:", - "description": "CASE SPECIFIC. 'LAYER' is not the same as 'Layer'. All occurrences of this text (within the search range) will be replaced by the 'Replace with' string.", + "description": "All occurrences of this text (within the search range) will be replaced by the 'Replace with' string. The search string is 'Case Specific' and 'Layer' is not the same as 'layer'.", "type": "str", "default_value": "" }, "replace": { "label": "Replace with:", - "description": "The 'Search For' text will get replaced by this text. For MultiLine insertions use the newline character 'backslash plus n' as the delimiter. If your Search term ends with a 'newline' remember to add 'newline' to the end of this Replace term.", + "description": "The 'Search For' text will get replaced by this text. For MultiLine insertions use the newline character 'backslash n' as the delimiter. If your Search term ends with a 'newline' remember to add 'newline' to the end of this Replace term.", "type": "str", "default_value": "" }, @@ -53,19 +53,19 @@ class SearchAndReplace(Script): "search_start": { "label": "Start S&R at Layer:", - "description": "Use the Cura Preview layer numbering. The Start Layer will be included. Enter '1' to start with gcode ';LAYER:0'. Enter ''-6'' to start with the first layer of a raft.", + "description": "Use the Cura Preview layer numbering.", "type": "int", "default_value": 1, - "minimum_value": -6, + "minimum_value": 1, "enabled": "enable_layer_search" }, "search_end": { "label": "Stop S&R at end of Layer:", - "description": "Use the Cura Preview layer numbering. Enter '-1' to search and replace to the end of the file. Enter any other layer number and the replacements will conclude at the end of that layer. If the End Layer is equal to the Start Layer then only that single layer is searched.", + "description": "Use the Cura Preview layer numbering. The replacements will conclude at the end of this layer. If the End Layer is equal to the Start Layer then only that single layer is searched.", "type": "int", - "default_value": -1, - "minimum_value": -1, + "default_value": 2, + "minimum_value": 1, "enabled": "enable_layer_search" }, "first_instance_only": @@ -99,12 +99,6 @@ class SearchAndReplace(Script): global_stack = Application.getInstance().getGlobalContainerStack() extruder = global_stack.extruderList retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) - # If retractions are enabled then the CuraEngine inserts a single data item for the retraction at the end of the last layer - # 'top_layer' accounts for that - if retract_enabled: - top_layer = 2 - else: - top_layer = 1 search_string = self.getSettingValueByKey("search") replace_string = self.getSettingValueByKey("replace") is_regex = self.getSettingValueByKey("is_regex") @@ -118,71 +112,52 @@ class SearchAndReplace(Script): ignore_end = True first_instance_only = bool(self.getSettingValueByKey("first_instance_only")) - #Find the raft and layer:0 indexes - raft_start_index = 0 - layer_0_index = 0 + # Account for missing layer numbers when a raft is used start_index = 1 - end_index = len(data) - try: - for l_num in range(2,12,1): - layer = data[l_num] - if ";LAYER:-" in layer and raft_start_index == 0: - raft_start_index = l_num - if ";LAYER:0" in layer: - layer_0_index = l_num - break - if raft_start_index == 0: - raft_start_index = layer_0_index - raft_layers = 0 - elif raft_start_index < layer_0_index: - raft_layers = layer_0_index - raft_start_index + end_index = len(data) - 1 + data_list = [0,1] + layer_list = [-1,0] + lay_num = 1 + for index, layer in enumerate(data): + if re.search(";LAYER:(-?\d+)", layer): + data_list.append(index) + layer_list.append(lay_num) + lay_num += 1 + + # Get the start and end indexes within the data + if not enable_layer_search: + if ignore_start: + start_index = 2 else: - raft_layers = 0 - except: - pass - - #Determine the actual start and end indexes of the data - try: - if not enable_layer_search: - if ignore_start: - start_index = 2 - else: - start_index = 1 - if ignore_end: - end_index = len(data) - top_layer - else: - end_index = len(data) - elif enable_layer_search: - if start_layer < 1 and start_layer != -6: - start_index = layer_0_index - raft_layers - elif start_layer == -6: - start_index = 2 - else: - start_index = raft_start_index + start_layer - 1 - if end_layer == -1: - end_index = len(data) - top_layer - else: - end_index = raft_start_index + int(end_layer) - if end_index > len(data) - 1: end_index = len(data) - 1 #For possible user input error - if int(end_index) < int(start_index): end_index = start_index #For possible user input error - except: - start_index = 2 - end_index = len(data) - top_layer + start_index = 1 + + if ignore_end: + end_index = data_list[len(data_list) - 1] + else: + # Account for the extra data item when retraction is enabled + end_index = data_list[len(data_list) - 1] + (2 if retract_enabled else 1) + + elif enable_layer_search: + for index, num in enumerate(layer_list): + if num == start_layer: + start_index = data_list[index] + if num == end_layer: + end_index = data_list[index] # Make replacements - replaceone = False + replace_one = False if not is_regex: search_string = re.escape(search_string) search_regex = re.compile(search_string) - for num in range(start_index, end_index, 1): + for num in range(start_index, end_index + 1, 1): layer = data[num] # First_instance only if first_instance_only: - if re.search(search_regex, layer) and replaceone == False: + if re.search(search_regex, layer) and replace_one == False: data[num] = re.sub(search_regex, replace_string, data[num], 1) - replaceone = True + replace_one = True break - # All + # All instances else: if end_index > start_index: data[num] = re.sub(search_regex, replace_string, layer) From e1bd4baed226af595306fb413d8d791444a08060 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 10 Feb 2025 10:36:44 +0100 Subject: [PATCH 11/20] Adjust settings descriptions --- .../PostProcessingPlugin/scripts/SearchAndReplace.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 0ad90b4de2..aeda053b56 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -14,7 +14,7 @@ class SearchAndReplace(Script): """ def getSettingDataString(self): - return """{ + return r"""{ "name": "Search and Replace", "key": "SearchAndReplace", "metadata": {}, @@ -24,21 +24,21 @@ class SearchAndReplace(Script): "search": { "label": "Search for:", - "description": "All occurrences of this text (within the search range) will be replaced by the 'Replace with' string. The search string is 'Case Specific' and 'Layer' is not the same as 'layer'.", + "description": "All occurrences of this text (within the search range) will be replaced by the 'Replace with' string. The search string is 'Case Sensitive' and 'Layer' is not the same as 'layer'.", "type": "str", "default_value": "" }, "replace": { "label": "Replace with:", - "description": "The 'Search For' text will get replaced by this text. For MultiLine insertions use the newline character 'backslash n' as the delimiter. If your Search term ends with a 'newline' remember to add 'newline' to the end of this Replace term.", + "description": "The 'Search For' text will get replaced by this text. For MultiLine insertions use the newline character '\\n' as the delimiter. If your Search term ends with a '\\n' remember to add '\\n' to the end of this Replace term.", "type": "str", "default_value": "" }, "is_regex": { "label": "Use Regular Expressions", - "description": "When disabled the search string is treated as a simple text string. When enabled, the search text will be recompiled as a 'regular' python expression.", + "description": "When disabled the search string is treated as a simple text string. When enabled, the search text will be interpreted as a Python regular expression.", "type": "bool", "default_value": false }, @@ -119,7 +119,7 @@ class SearchAndReplace(Script): layer_list = [-1,0] lay_num = 1 for index, layer in enumerate(data): - if re.search(";LAYER:(-?\d+)", layer): + if re.search(r";LAYER:(-?\d+)", layer): data_list.append(index) layer_list.append(lay_num) lay_num += 1 From 80fa6aabc343e928f9a8eb1f865fa83b967aebfb Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 10 Feb 2025 13:38:15 +0100 Subject: [PATCH 12/20] Update altered year --- plugins/PostProcessingPlugin/scripts/SearchAndReplace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index aeda053b56..db062f4084 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,6 +1,6 @@ # Copyright (c) 2017 Ghostkeeper # The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. -# Altered by GregValiant (Greg Foresi) February, 2023. +# Altered by GregValiant (Greg Foresi) February, 2025. # Added option for "first instance only" # Added option for a layer search with a Start Layer and an End layer. # Added 'Ignore StartUp G-code' and 'Ignore Ending G-code' options @@ -164,4 +164,4 @@ class SearchAndReplace(Script): elif end_index == start_index: layer = data[start_index] data[start_index] = re.sub(search_regex, replace_string, layer) - return data \ No newline at end of file + return data From a92d15b79be8dbebc3c922d0397bb5045a66121c Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Wed, 12 Feb 2025 08:12:43 +0100 Subject: [PATCH 13/20] Update UltiMaker printers images with up-to-date branding CURA-12409 --- .../images/Ultimaker2PlusConnectbackplate.png | Bin 7020 -> 24548 bytes .../images/UltimakerFactor4Backplate.png | Bin 11822 -> 14992 bytes resources/images/UltimakerS3backplate.png | Bin 3793 -> 13714 bytes resources/images/UltimakerS5backplate.png | Bin 4024 -> 14430 bytes resources/images/UltimakerS7backplate.png | Bin 10378 -> 13976 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/images/Ultimaker2PlusConnectbackplate.png b/resources/images/Ultimaker2PlusConnectbackplate.png index 789a48e8874089cbc7722f5befce3bc82c82b2f3..c03e28936bb9013fc3c0c8d08239b877b4c235c5 100644 GIT binary patch literal 24548 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 F{tsiErJ(=- literal 7020 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 V?U&@KJiYCQsj=1N(u?l@{tr+9G!p;- diff --git a/resources/images/UltimakerFactor4Backplate.png b/resources/images/UltimakerFactor4Backplate.png index c22d88776669e3cdc3d2615e21d655475d34c613..f209c98feea3bbee3aaf13de20c097324809bf78 100644 GIT binary patch literal 14992 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 F{{eAn%3A;c literal 11822 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 diff --git a/resources/images/UltimakerS3backplate.png b/resources/images/UltimakerS3backplate.png index 486c2829341ce20260b5a7d1f80643e1b54ffb3e..f4a9cf478efdc5c32e3966ca1fa3bbdf1d9dafbc 100644 GIT binary patch literal 13714 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%0AA7tirK&rw9Df-2CW zjpDAWcaNkaw)e((-xg`&5>=~OMs$l8Bg{}3_8j_X-!1e-z$y_=F2pjzF?Cb>`Rf+R zu^w`kx_(J8t^?JbY3vZV%)SH&@f@{4hJX18&1G}nt?DguczbD_b52 zO7%x`MmRO(+Uf}U4J{45c-3JM!^WC$yNhjP2g8k}S8Y)n<=8tS=dSQl!5b5wyxLU} z&anRt{l^-+#BaUI%BgVQ?<+6aCsg#7w4hGj^4&ogqA8auay>c~4VY9^j)rCri8ZVZ zCkzd1=<%gh3!-i^VO~D`H!k=X(!MqDK`Fq*C)I2F6Zy`Gw4i+c8@9yFUaq7bJv{rB zoH~yQ?GHrv*M`A!yw)z9|FBq@Q>{M1e#~YA<@nF!fMz9Yf2^(W3!4O71?fgtxLl+e zZ`M$WBzexj+jDBcu%$@HO5f5cd_pfj;x6yq3GQZ6gZ$#*^j}>Yp zhZ*JLt8EmV$1`=lFR(qN*d5hV!LtcP8rpqp)4TdIyH&g}de$OKo|Kf28W5hlz69W* z?m4xNn9h}$^RcX0B~n;qtc9+p1b4)vyWu1+SfFDlNZ|>UgGQn`# zOVg-z?qDh*1?it4>(ae4_!F%%x>3fK7Je!TuO3eZh%$<+;DD|luIu#k> zGW>U2>LZ>e54XFH zJK#7PhMi#8)q~6*G-cq)b0{+sX&vpgb6KZ6(gSsexx0%x+YUH{3HL^|{oNc$4LP{e zF3l1zw2Cdu<872L=4}{huCIyMM-W2@dhIPy4tQcQP?>kWQ2o(NzRcSKRAekl#FiXh zea4inp;97qmw+UlO0KeuzLfkhyH>TRFvUxBzxJ%akXMJxDqm-v-CPXuU*S=~+zr5F z+@18Ok9cN&HHA@ghV>I1#DKfp{H^F9vSdk%uTt^SOEw0t{pCrvg>ISPE1dtEs9(lk zz<4icIHI>)Jx6VE#p(M;o?f^P45r%(ucG6cH;5@tKOB?qQ3MJAtS9hpniQT*mUF#yUWJXOc1Bv~`EjBop0+Kbgm=_u%xB->{?m}rI>S+tGLK&CwZm?cuDXU+vfCTCIFPZSY#RB)SFbuW!Q4~koIMb#7^AB(t7ouNx!PMx z)MhBJ1)fu&R~bkRWzsmIU1-EvC0Iw9+)f*5ylUCQD6;~+kEy9nw;M9E=ykL9Io?9K zS1AP@l!rn+m*|L{%j>R8M6H~@g~%2~MeC{!#_F;V7a01(hx>W{00;Uh{%*{r;4jS- z@IZoGRJ1XUHa(SGQv`%+RvGrJFAhp;lIAMCz~g8`z*=S;vt+~4a%vAmo8C~sj}D9N z5(N)S7R+)k=qyH-N@L0wMFAK?^7~dzY@M{%n(_JeFldo_4kF~5@FFk8u#yGU2_J2j z9X-qqr5ko~Z=eHuuHrs-m`6D>QJf_-_cI8~m$}H~V;^%<^&*wYn-nGI-%=asBv5+( zd%C~bhIm}r)FJ=A{%il|hyP;WzZm%c5(ASP+f?2LdpFiiZaxeJxqj933dz7V{{I01 CDsB@1 literal 3793 zcmds4`#)4`7vFL!C!rg?#n4f2QzRuH&-y(3`L4B|o$TT6 zthH+MDgXeqTz)$I3jk=K0H6kFsAI_H^i^-LDaOOq%L$vAOeO?Dxw*NRl9iQ(jkj*y zV*M?de@jM228LjA^X5$qz!c04vttUj{HA;ZF^6v;Hhy#de*|;>w#2NR)%H19Y<%P| z?!N+S));NsvUjh8hezP=zlTRe(CLYZ%o{f#=uTPL6Fy%c5cKv=PX4%)(~TXc-{tTj zub6JRcs%Of+hvKK&FO1vE?9GLwo$D=8LUfCS=qhN{OM$RcBQytj^AK1@*7yZRHXqy5Kt+A<=AT2iVC?${Zj&AVDqV zv)iM4I_&m_?_!%ito3Y_}bd6)vgg=MG7%n-CYCSgw7mWg_Be zsqJUKAl?)(#Twx3i-V2e^&E3r^)Q3%)CZar5P@ru`8A`hM9()p{>Rp`2s+Ty1vLjW z!3zya!RJw^-ti;y*v|}V3Upp1B-AXvC6!OqK!3X&LpRV?a`%(t>xyYb=Bzx>9bJa)^b?x;g{+)N0+(K_A+DWut7xv^_(!F;mF1JuRAR1HjtJ~> zpS4XGJ+708%wI$NaO`$F`sUP!dK<~rR_!KWfLW@NG@kl6aw$TTNRbnJYofyz4hFxy zXa+P0oEu27$`hqYM`zsHqr-E3(b|dj;xr#uSJa zpXN54exCig262>FF-x)ts?Z|>Q$N70tENZn#^cT`a;(KxLLqV3DdKEV=PvDjZ(CNa z^@$Ckx3p5BVeb{Hg9(gbMehY({Xm~+Zv2Aoz)ApYLtHvva&=cU2&D5L=?11`Zk(a{ zrj6%|qYS;8d6{n<2RMA%!7KxL%*8GwmLM(S1^5P{H#y1BfQ7RFa6mtVBZ_m;*AbCK zH8W%S+}c~<#!$|8D$Ygq4oLB%p%Ag^so9e=?pH&?8pmSL+PPKsf}?-9(k9i`5b+p+ z-aRWCPDDiiE->qVV8cIL+RgT=D^4&yCB;()+q@N?fv+!mZ@Y`ce$)-rpOf4Ei%V!0 z1+Wg`Th$YhF3CcU<^bx<`^S8w@!ZC=Nrmotrm zdp7IG7(VKyH#L9(S%s9d`!b1IrzNp4vQ!F-l0DFpF&)a|h6S!_`E>{M=E~((DM)tJ zq+bTj;G;9J1#CA4C8tOJB5hhvWIWC589r11i_@c(zJ20tPT@&hFZ}a`zpAL}*at!1 z!_*sVX6{1Mrz>7i#Pm2jaG{(0!GQP3Co84Jjao^0k0VCc`~WK!>gC6~f=B`XDa##S zj`1xRb+ytN<1bm|)P=>MUO62!_sAsoE;l*rufWX4?m>~TzbF#aH`q0n3Q1E2yat7uY>x~y030lks)RRum}_>SX38~`iSd}B=077Lr+khn3XnLV$M#k?3TQa$%w zI7XO>J;=ZpXKaOq*}`ABUEl4g!K)t#FiuHslLEzMTkyQM4F-#P+WTo@dx=u|N)Nz#X1#&$a_G#do+`it3> zIEzNRgJ6|*j9R^@iA3G~Kvw8^U@usH4QXcX9+~-Ftf=m-*}k|tj=TnEb(Vx`lR$#q zg!gW(MWEiVi8OwHV!@4W6<$4`h_I{lxFZMM#tO-$o)RuqujcJ7*UQ6lOmul)haX?jmgTUBw;WrW(d?js=Fq9xM8p zjf&w1xUw(q=+AgR&`;mAsE{}FwW2eiZ3aXZg18hqg|okN2LGF{X=@~*VL3@=mwLu| zU+qeptftGWJ5MitCA6gGuPNblBW9EwkA;WCzDJEv#`0Vb^_mT|6Y9Z~dHqA}JGl=D<{}!(C5-hA+fP z))Q;S%~PT7tMsC5&Ew1}?F2Q4!{{JC3~i_+g`ts*$EXr{WPkF*fz`j7)Tldj)@&bn zsWV%qODvvUrjyfQ47HsWqFS(UpIo+jKsK{UsvWFb$JPW?D@Nf1hxn=@SokyBdv4D= zm})KO5c=n%bgR&MBv#zz*;IGh@$+hcPe)zj=>9rsS-J6O$))i#PEDkac&A~PGY>in zq!##8NOXg{|Gkx2i5kFXh~GidU6FCKFPccYwYh(Wp(sm_CIsJ0*B259V8#!mtlRKv zVCZSf=iryR_;x#Rd%w5KR;g@yNvlJ%=(aNQdU+7-G1^FEQLjP!Q7^1)itY_s+Q~Wle%VlQrUC1V zGyh4)_r?QDZJU3MYne4eR8jpGI$y&TgjszRRZ8aRuOYU*q70op5HTWCA0Y1!YJb-j zzwzeE#9jwUZFXBNcs!I+(&HI~p1_4(5~M*#Hm6RmXe3Gdd_ucP_NSv-O82z+2$>AX zTSgY{v2DCG4NMguE$ZZ=nIhq2{K3$&RR=Na5z~YoP8(`2C9l(9m3-2|IMMfUf32dl zM|#>Nz+$UR37Z?fH-9kS4n*u#Dn?3o+h#Ua;~L+PsN$skg7UE2W-T;9!Vz>^P3d<> zGt)!kJE|U@=fzXI1@~S&C|+F6+18SB`EBee^ok76?6GGlUG0DSydrg-T77uQwG;Pt zG14IAM`K^;&-B;BQMbBM{CK~}h6&c-kq(;%fpJL19|Pn_e|kd|K~DZtx!ip%Q74vV zWKi-mPmH@V`Z|A4^)EYnc%P!>COY-}fZ4*?(G;lBrh&9hlHFF1P_(Bk3Kv_6J3+&= zBYG`N-z z6R3q_Q7jj#U1)|CzI~40huH#C9=LH{U@JW>pm4s=b$k*FQ=qJh|HL6!=x!nwoITY| zqRPZet;i!@>VT9?>#xxU1j8=_r*=((hr`iGL#>4gWYdG5*H-663Gq*1VXhu8RT7&u z`bEl_eA^vtPJUmUfBqpu69pW^l~g6!TuVz&*+g<)b90{DBf_aLm1>EXd)r2b3N0f%&YF_#lU%l^)KR){<;6MO zGpcEqImdBgvx{6MhYM??j@$NxSm9bJ?6N@1N7XM{wew4trlpcSMf{6SlC?XyZFRkU zGr>_$6y@FKt8-%#(uc+ulBlX>v3j+Wf6#=_Ckv%*03hJ!vL-y^G6Gwg@Hyz9U)3n5 zE?G(GrF{yu=R34=6w`-J4_klzm;0y5l>P$I=c+(IPDncS^=vLq?uSc%{Qc7Z0PSoh ARR910 diff --git a/resources/images/UltimakerS5backplate.png b/resources/images/UltimakerS5backplate.png index cb37c296a431fbbc3400c81e460e2b8c99cbb01b..cda59e4b23a32184b1e3e3edbfa4eebe9bfb60a0 100644 GIT binary patch literal 14430 zcmeHt_g7Qf^L7*!1pzxE0xFivML?y5-YnqN2ucYp6j6GIP!bY~T?ABABq4yJ0TL2G zdLR@VC`|~59zZ~l6CeVHXfWZ8fcNwL3*MjZSt~1NpRAoTduH~`GtcZhmKV$<#P*0m zAP|YO=BF+}Ae+Y^kTsBv8-!2t*ycXMuXUa#FcS!*C|UfM+j>V$_dru5QzC5f>nfF3U`;`5cjH-t!dA)$N|Otjg4FEpKo~xal5`{ zoAJ9Fx5aFC?A)4eZu2%C5Hly-9?ANv!qepLZHELKC+!)9ft*qdiakBO*u7Xikv{RO zHL6W2cI&po55}MSKy)tM(AVuzNVYJ4`+*+2cBlF9x_w*5n_hdae+Pkl6N!q%h7}t9 zT2l}RSqljQR1a=z_`GzDW_cJ6+4lf4d|=yz_?r8dAdRZljXNNXyCH>E#aF~2k021g zsA$sz5RwFB>ib#4^^l&tlmTf-&-1-`8zG5nAZdS@9b9W%1#z{ByL5DI-D^lzzVQLo zb#>G=vG!#r%+|)z*F(aS?Cwh$yFy~qOpi80_Gzz$oRr_*BC_wiNY=5A+TlExpc@tD zYan$^k6TjDb*S&Cc>HNk#N4;xk^LjD{fbQ8q?NXKY#KX|o{Cr8ZayJ$zI8JMvgc=e zy+GUO{>1p$=W&k-Klb-`&jr5U0uLDOpB)lZ-&?y5vgJY>yU*pzmoAZ@hBbxATHicJ zNS`glYv?CJy?;}dgV-n3&x9!LU&ito&nz4D<@Sn+i%%cA{EU8VG{JC5{d3@O0(L?8 ztDqnC4HAqqPNURiU*iY61%y*CB~3J~Gd&)_olq1s+=$^PDYcJi6geH;d3Ve|S8yZ8GM>tiluirj!T?Nd8TWx(j8ZrA>Zy*qJqJ6C~|A!Xd`kd6j#6 z#2-Mmcxs%8;zA%PwLg=MmDfO8QeTWhAk|-YJLNu-KL36r1ac}X?(aeq(arTc^6Mni z>*cEJq}RG_IAy%~V4eOJ(+y*>d&QpZeqthHU8mc#uC!2OPu5o4=Pf1m$F(IUhPOGz zv4W&GxbDt)y}SD6rgbKb8@Idd*S)>N$U={nQJ_ZeX(!y_Ku4O-Zh52 zSes|+^8jJ4IHwY_LnqP6n0LRwao>r%zwTC>9e)(}>Y_;JTBLDhuEL(X@3TVN!!)E2 zu}_}+w(lvCH;65Jp3{ErD>4j%xtru3+kRZq<6f_u)4f}#UGLcKIozNw;+~9nSh^gAMlJ0;aXlk7tJ<`M&#C->2Rc?cc6{ z&fVJNMSJkpE4%${_K}LiGq*fPH6x`BJ@NzhUe4DTygJ~k?{?YyME{GoFW!ySD78HD z#d*-$OBi9z&5cI~@_X_>OeN_6>Ao3mHNDmSzY=e}Je~gTp9HOhh9`YbqMOz~fj!~o zKeaWqjk4v~cITh%a$+52`FFwnEM?*N&3IjWQ&}zrPk9@T_aE9ZvLjikLy2P*(06?5 z*Ob^4Zfe7{&Vt**p#}eiHo4}#+vK|R!t|m;!jR43enHi&7oRoWKW0LJmIX_5A$_HRo_=d*?;EyhU;P;f$_h{*C=_9f#>nXjffBgR8vO zNfE>MhHEoXnYU_)H3xs;bFx3()dxI};@Wq9+(_8zAj><} zeE7V4*Vd$)Z5xNSU;~Li&rdd&ZM;2f=6Ab7!CNLx`X^?G(%&aYs^G;EtFYiO?$NIN zG5bYNdeUri-n~k_exI_CaL;@nze|4ZQ}~M53Q|Q}vO< zliNOb9e=~(bj|a`=NF60EB?`cI8LyAyr9k0!<^)K-LyD^e6POA;*xUI1DS`Fit{kr zQ(c4kZN0(0DmstSAEjqslJI^~qTGF~{I7Bg4`t;PiLt10|BtdMw?1;m6n}=!_wV$( zalSpf%cU5HNASmw;Zv%WHaXzH87WS=~~CjmnW6u;Tn(g9(`yE zpni9#bl>Ur_=*kNClzqCjrm*pu}gkXelGP#;hBo@5%>icAes~9-`6+zPx;4bmO1MM zD!Pc&$O}^ zP=pvnlP#Y@F0bi5+}Bmhj6lyzUX$CYH^_c8Rb8qa3HPO+#&7~UX5yL2doIh;YR9q6 z3bP1{cNxj(muS(2(`=ScSfJlPL2d1;P5zg(66MWxgTCNn1N-pPxQNmqhrcCXn|!H1 zGDM6c3C!!xo7e;LgF9E(pG&AF13LAYRK(3v(6#XbKk%@=VILH9h_mSH3vHgmq*h5KQC za3UG;tvcxY0q*7gL*?fv22=wxY!Lsmd4Xdf>ngWt8m>jKXF^*oH7ajDgiX#X&}~p`P^fN=GMFX)qO|s7*cEKrPy<~d?XO?P z0?YY!o_j;iCkw9OM6}?S8u$AAqKcVzn-FB~b2q;PgFsM+A&}VX5C~8BDE2D^f;d{qCd-iOg z=k;R;jkl#qxI;Ewi$8HHZr{37CYEo-H^w_ZI9q?m z@t^Ac=NSLF&Hr@q-Q(Y7q_J>!zVAkB9b33ifvty9y2n?=cO1?~k`D=yBX=o)y8 zVc<)5eCsoV-b`mHTX!>#3NTH=Ytbj1vvp~-IaQ<{xy>ds-_V+#gEHfc6S?y?x>Vhu zcj)|vr6uP4Z8QDL369ID$93mw&RIa@NOtO1p_=b5_5ekR93&h3BJM*qtmq<;tTupJ z{a<~9n~1XgX3T8VWn@1QKRFQ@&0(o0+uv-`!X)1c2qLr?W|nuHBjeR_e~b0R(+p|K zc>~Z%*&C88JNib?0C%eNxp811NgB>Z_~bBZ*bZ~JrdNmAd&&uTX|uf8=h_o~PGH3V~uR)!6Cz2gh0uKy&50H8dwUuv^8;w1 zRhabWU(T#%>6&&JIYkttS`jMyY;Vf-X?(scbHOiEM5m#o@6O)3mwGRFO`x-5$8}uE8ztbfv=lj`Bx&^g3UqL7Iyx^E zwlcTo^9&FQb<4a))(d=XSl7)Y@!lc#M)+`~fGRSB)MlL-i1Q154E6ynWIfx6JV`>O zz=~8(oj(50%8FxE6z{J9oW)xO8q8BM=E%|YrANwi;?nzV;dYjx7dW56To6=dZ(P8% z1&FoZ`{Bc>26cd23zpn8kPooPLsZEEc?Z5J5|E+u-H<8ZKs`@UT0h2?Gc2>H#?UMC za#&~jS{Su2ww>EdFyzvH9aBFok$*NVi`t&qm96i9j%Wy3# zqN=pvc7zSrU#zbg8NlH1M1cahl!E>Y2(-a#HSB7=Ok2%_&fdND_d8<4GV&jPyNWBC#>*U-)XTCGCuI_j; zC8PJdd}ZU~UHVHO;xv~9cSW2LWJ8y43j<{~RSsa@8SF(cLrhw7$Pon)S^312ORTo<@3fz-h$-0Z)O-L#ZeTS(Nj64NN zB1kooVPQPqf+P^mHWOv-S|8FX@3ev)J+`k{K9=7WW9=d|iW4$%=fbgVKV;IzMDA6# zyE47JJPhO=G03bL4?t5C6izlgUih2xg+TI~OdOfZcaXwK)m%Xyts$PaoowV(FA&YA z&>LCsLhhNpHp~j8+%RjT9Wo892G0RGWGOg1&#+umWhRAcgQ(?=gSWvs*u=L~a+|e6 z{$TBbP8IZoTn>m(p8EU-I7b$h=o~EKrL5OX5L#5eXGQR?)2m*_Z+8RERz(GTCvt{J z!f4682Vzp^IKJ@O6G6XH$i*AbxY0+uL_=n}eAem=ImlIJjo$;CcTO2Jv;%Z}+WebjP=*x@FT? z^wq+dTyS9L!mI_*>Lauc{%EA&ZxJ*mBv)}+KD%2S!Pb>X*;7R)^QPi)ilji7`oSZT zo%hz=d@_9oVBv`Q1LQA!xi7iIvt~I^EtxA-mFF2R9tvZw89DQ5rQjl+1f z5Lg15IqDz3Y9L9)(s*p*9ShmuA#g@^#*3A1XvejJr4-ptW|AXRBah+&ivPM_T&#n4?&-X((n;FSb9Ae5X!Itle|6SY+fWN-X3kf-$N z#0ZoGmFSZ1(Wo3(BP+KA`j+|H7UX60@U9tgU7YnCN9Zt<>eET&4BCjZydCp${b+`G zm)(xWpJDDpYRj+6PgwPcsoD!Nxs^7IE2&py(vHpDJTz0@SO8D%d&^f1=MwjQ3J;HD zoXXr9SdgJ%hc@Rte1FZbDa4plLi`4xOm&7{4TNhkrO7ce`503UnS#C4dgiEDNLtcz z$gTV5--WSi$rh@)I$5-)ZCw4}ERW)~I@~-gme4Sh-%2rb#P}0@f1OImiS>IqVcoqa zckvSEO(I=V5BFM|MbHYxGJLTCtW4}&3XBmot{XyF^gj}#lf58~H$^v4h>s;4HTHY9 zqx-3ndDM$?R?ML3(XA}+-#sEoEdSQOD-E|TP{^(7f4ER}HbF#w0=`u7g1<0!7nt|x z%!Kp3t!_^|CDs=0ZQmiL{X!`}*p%^>klbv?O#@8SL1+_Q7y`NsX}Xxg1toy*@jciL z8NyKnkmM#U`nXv>2FoCBG7D`>%OuI4n19MS5A+5&ckb}mgN)|1f-ixHQo8fC({bq* z)8njL@S&lwX~HGUbDj?ai9Unu>uYGUb;%oq^O2kiP_NIqV5J6k^wJZ=t%Mre>1wd3 zDr$xYD2jGP`XF14nO>G|y=e#75?wXy-M{GT($A8Y_ ziTeBqs|s)&2-GrcpZp2LShF+Q83)t?vD#i~i)wT4zz;yN=icIM-m}t%MLc%!2y{KX ztixuPe$2ulfzTUngYv-D4P5OK-SFw)%+dl(HLsW$I&-fcx$J>GqN~nPXvFj3 zej*OHPvfa^SAR5wFAcsz=ofgKHWRvnrzFTZ1qOrNVVG(nFO?YE>ER&UGjIDE*j~J} z0gtnb&JF2o%LOI@~l@OsS-VY^% zdqj|)aH#<2-Jb9xP?($jSQ4zDE&SUjFhc|>Z6lR$s8=yFO7fNH#MID2=ig{op|BhS zSW4lpN*Kpow#PRx%#Bfk=L*rRtWB*Yy~x|4X9%7gAU5rHQ&}Za5DKW1%S)<-sX1JO zZj^4z{~^}3>@%+T)w~LE*0Bs7*}$zh$vE}UKquQ9d{1Ix3umHWP)^`m2ALr4BS{UQ z*JGZ1e)>MAN4ujGx|ZekR;R-!V!_kE&J8|84*X0RU!zyFW@Dy0 z3EFHI@t~H3jmVlo0a9wgL-coMI4aA?xxTN#TB^X=3PVGATe*6s)#nH|8~JE(!B#1f zbB5(|n6Ja0Tm>oGrMw^UxNGF?T7?bf`zADH?P8L$MSWVSgS9XC7i4pPjvtyXbx!ui zT`p;qCW~52Z>FMyIE8UEb#jg*Ri|OQV{`zV-y^m#C>x!pWFFE+%+n$V-2iWqY6}b< z42o%jZC!{RjlE(KfnsG8)ZbFe%kQr{v7~0bd|Nl@?P;}pe7`t&Azu(6$5LR7Y&z!R zUCFq(Fm?z~68AY{x;ML3KDW2=`?Eye6R>-OuYwJ~?OrL{Nlw#}+er*{?XCHw5jD{( z4$fF2$h>c2s2kW)w z!~_(xR6C?`eBv2we|6$ImvB!rjtFd`fo+pqU>;?o7-FTYk&<2S7zw z!IH2ca;(f_mh*6!+kKm#mpF5AG(BqJE&7KWzz2Y91ED>a% z_(N{x8LO`oZr3>Qw4w!dk{+C$(ch`6nwx=;b0HW+Hq-I(ziDI$WGY*-4_tx0vHqhr z0AW{Wx}8D9dt5o0T9`G?2PW0K1}>=f?>Jlm_BA9J)sFWykm22f&j(d!JhQQ-yj0{~ z=!vKtA5U`Tg<|)taT2h#MM{2JO*KQ~`&?;^OMz0ZP_9qRt+Gx_bwqCsQR_ArOFiBF z6FP}ETF=nwG+#~|;3mQ`LhyfVcU45D&0Adr(41UhjG7wBxl&c@pB)* zA-ji1InkBAhLnQeR6yV2>X#@`H(4$%$qG5A+wF40om?J(+>XApWRI@SQaV5H58GZc zW5x6nVHpPcGrMP=c^tey?*g<1WF<3okp9fm&z|9k)&|wQKC$1-I|SmIu$oRF(&#|W zGZ4?U47KAB0G4R?Z@f{pE<`dfsbFSchw6_quu)~&%a;H*D5SX(8rYNieN-yJxE1AO zNB5teeFV~kfL6*^a6MNJ$ke)#-P#Ll!ILxnaF)n-#QVcvaKvCa2Sg2z&=oVII){c0 z^{edalpECGPa>7U<(v?!a&WcioC0?Oib9o8ii}&KHswy1^It#((JqIVvNp-o85g;t zQi`AQgtfvz-K?V3`7*q+KT>4zwv=tHtwA;~1C%EBH){(T!Blc)U&}n(9_{xyf#hkc zCX;JmxKdTeVmj9RTmDe)ohQqrq0}9?H$mlVER}v6lC&1HXX*C!VAaVz05@RxN7GUA z16bHwTWDc&Wv<~$YAoWX{I7P6!Bx9C;_et3poIVB(=HA zg~)Ru`+B~qv7=wjn%O`OSl&gkl>I9@Dvar$k{y@oALBn|SA#GSWCY^duQmQd#;p?g zc(d-ocsf_Bn}T&CG+=|%68#>k2|E^x73!qzq+(GP^u#l7_3F^9aXfrbc+}^&%p-pY zlUNnxW7r@&x1Od}P$Ir7$_B|@uNgrR1WC0GJ%2aRjV7tzs&YuWMykzCavH%+*mxpF zW3Fs&mle9o?_fY=e)a zbCmS*tNk|pu}OChDOo*0mLaV})o$!D5GwS9%D#)!18?RN{N9D7i`teu zH3VlC2#fOwPCfCgf`X6O;8EPd>|^9q`DS*Wb4k{C2*6g&tvoN}3osrt!jc`glwadN zPHW~$12)o~(G|Q0u&*zP*o=z^cN6AkU(J3_#OumG9^q)V631PKkRHM~4)v$?VvE;` zWJ3otD?c8#`zowbfy4#N&@0GdkWdvRs1jX>0-9@{e14$r(?)T&r046F(!37I`BRo0 z4QRUICQM6OQO2 zKJ|>@u4-RNSy*BAWOZHtu#Q*5r62VG^}sAS;7UszASVh6dB&1H+ug^uJ?UlcNIywt zI|WS%Yl{q^{XL?X2Dnb2Be|0rps@G7(r>giZ%AVU3Kw)*#P>zJW{npTU8TvI+sZ0K z5>BQ!g>|_yKUYO#O|3rpS|l@Y*df20WMSG`G1JLa5VA-um+0aT|5NpYrdJyI$^@t_ zpl!Wb9g^h{VHFhMhzPGQDj>IJ3SZ9*FPveM6)1+~FECK$y@k#NUO3xVjS{5Hw4xck zJ&Q6!nD@B+Hgjzf7_K}$BAe*E)o}K$27Oip@%+JEw9}5 z+{TqkbE>K}U*MZH69TjqlsyixVTNYSJO?$EXKoyK@eR&pg#ZywAG_K5g#z1O>B;iB zKTX~DKh&XCjd5&06M%#bpd=ZKeos?Oc@og&bEMd*Sl44X_>&mA$7e~yE@BA8+x9l9 z)*uUK-Uy8l&Y6vKmp@iZ=nd%VDdkgbpeto>*J`VugQ zA|&=+GC-d7^?x$t!>d#a8GT#0e z6g%V8$G)CIR@=N6-2_UDa??h$z+@bieOge%n-W8<_>=4(6LJkGMM^q05u`zDgs={k zzhsbu;@xx4=<8XxU90=Kx0a}F#K4!K2xrTf08W9dx0guko?M*@UF_LK1F~-TZ{gHz zgmmZP3(!YM6;ce3Sw@r+3*Vhsd$GY*ZBIVNpVNA1s**`B@ZR?6_8T&^{0Az7wF^+j zo2n#4zc`oK!FfqEZoZvkEwwvet|(hcJAAR8H-s1&T-oyKf3|!L7v6@yxHJt^k#3dN zEG0!(ffOLybMJiX`@js(PQ)g?dpUDvR9(v!Yb zR7k-JUe0DV1(q*5XI{iy4I-p!u(|CsPS1E`A(hHmvLn2@j#+U+;-B`1lm*F9J6rG% zAdY*jpG=_^WeEzw8X*@JP*L;l9$ht8-T|R8x?8KQpA@>QQ$Gt8<<5Zaf(_WejPad1 zEI`{PJ50zoSQk*S;e>`jQEAP=B|ceibElAHxLdEuwxeT$n22dFv2)cgX$!;0)p7;y zyP-v<}=9^^-kZts!w!u2eG<6IX; z6f%>T1!9CPl`P&Qa%wpd*EwIgvUdfwqHEP`jXJ)^Ol8gw-7M(Vko%klcnkS^DGDXR z3kiT{fN~qrg5vTc@TJOD_wo)Gja@U5=iM1+%E;pQfGaU|@;*tV8O@48U#)?59_A&l zAH<53w)yLpXLg0nFCBpT;{N7*0#C5MP7468%g1hoPd$&GUq!oH#g3yzeKH*}z6nPZ z_-vxmX)~$(C<1ZvKurG*qV`MXtp!O6Hfz$Mic{Aotw-nGkl`%e9rD8YaG2^zl_8wB zr449&d@7r2*wHP5hWp_TgmOS4(1NEX$f++bI&kinCZp%R6Me^@Tw@JVl&`dXS-nW|5qmyBrFF@7 z{k+1s{=k5sE(*WJ9%ngznIKicMOAb4sHjs`K^_){?K{$=P9hs!rMM30bmn*Ya0gCh z>1e^LGHy9MRnCchS=dAgpSzLPFfFc1!WN=J87ydbVz)ebF86o*a`ENK)XZp_!qI<&H#UE8GAQFd=@I8S)WvfZN$4L3*Rn|G5T7?};bFYPkaV-rK8Z`k&*0}jjJ74_IfuZ&umI#`jub`hQSsjvx!Axn z{4{`TUEq)Vq~4H3R0`_GM-60DQ@s0t8|R#aXK;je@b}4%(O$;tuI%{|FsHoYRxN3! zePMHLv>#cv=cXZ}=k49o&h+b=Pd;B%kxV+;l!A*l&+L7{e=?nle=VEfRK(-dYr6Dl zD0wPVm)f8(e$?o$DLON{n%7DU8ne}_RVpdVxZ@p2nQ_4Q2I*a4s?|XvzSX5P zB!_)&(kp`i1RlD#LR<~4)@?m8bRx~3^9t6-CcqfGGi(thXVKJd6j5V}3{clcatOw4dTgz$NEwX{~vZ8(OZ;K0CW&yyC zkDp}`ojdkcMd9^SCeFdOKMiOPiP!M7DJNsy{HI&K)ewh#jfNIbF)Mc1{s)^38D8XD zA{W6#<-XAvl7cU7R-mHX=icjV#~0W_i(0C)c|SHJ4Sl^%u=&9Sp8%O^!7Xr&^_x{? zPW+7I6qd#8p6-Y)MGd%4tKe$dE>39NNDY9~!<`+)r}G6wT`I2kql+Xin>cd_*8SG8yQskyZ9f`Eb3rul0`o5T;V#ctgAA74=w(lvT4!b!FYf%i zG}a?2+kZ(cPUr_5A#(Bcks26gRD9$C< zHCHl9!gNn%=!7lzx9>yh#L~k$&dMT2Ho*21@EYrp!j^0v%@p~~p`{X#CM9bzzY7M5 zL2b3AJlV%m_ALJgjQ$^wt}ENX9s5J6%;}h3BAzC#L(vU1X=(Hg9_(|F4Yo!mBKLAj z!CI&r+X6~RkPSY?cyyml3K$F;=#0sqAOWXWScd zzt)YK0B1xMZ=4tk79v2yp|HeE8%!Yz%_%EQW{Ev99NC&|7r|K8lb_4#E?pi$AjjVP zTWPO8nS!lm>ecaor<_(5A^iI9l+*uo@!u(@e|7Qy`;^mv$5H>N{y)wC(S(pKzPTh? XIBfXZ{oHQi@26)^UpPfIb&daj(TY^E literal 4024 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 Z6&lTAo)SWB)AquEvOt@c{d(i^{{gPBz$gF! diff --git a/resources/images/UltimakerS7backplate.png b/resources/images/UltimakerS7backplate.png index c35f819d7da31cd264eb00bd5c18a8d2e4ce9b1f..5cef95e7a4597a8a2f90300cb345d24d27e78dde 100644 GIT binary patch literal 13976 zcmeHtcT^Kw`*jor1pzCF2&i23az(IFC4hPr6e&^?dJ!)@^iTo>5D^>221;m(Qc?)L z1VR86R7w;wfPn;*5*Y}gg-9^)Mb!6w*ZThd{dH$8R%Rwl&Y69l^E`X+b8cIh8A*!o z5r;q^k{6BtwuC^oj6xvmAe%&mcZxa2KEjU;o@Y$YKpG&PT&P&*ER7~jse3b%d8lhGgI{UZ%K+dos5;TI1%pp4)2cB|d zH@0p!e3N)f9JX`Uwk%_t*Vh4Y{J9TA$1+h*w_hpM-1zl7a@_h|#={%-Z5?lK@!a?Z0+|tsj6jE$ z8hl?z41lbM1OjS*Y;XI#nn1ER1c&Uq4;enNoh7j@%@Xof&HC+5$lKkJQmcw<;*duW zh+ky%*#i))BxGvgqW(rmfAPaXSxEo$y~Ud#$?G6b|1|nzyJvumCM(*mbp8Omzd>6ea z{B~skH3JFCG<-^E%1;mkx%r2cSf;SrH=I50&toaCv?az0QdB;EIaTJUy6euY?d@8N z1Ey_}b(Z)4-v93Lm+cd=CuWt>1)Cp+OG5BB&6~`s#j4uDBiYNXn;?+C^Wy(1JtMZIc_+R} zDyvzcp-FbVo9N$$TmER$+j>@XG;Xi>v)$=u zCG8ZK{@nNDo=Qb%T=nz9k0xJ{p^%t6DeiF}k4t&n`{d?$FX_DNZQDJE+GO0vY&Br1 z8tw|VT4B57n{wPZoBmjTH*Uw&Cg&SlTl}u4r5V{?wmnyLa7wvyJ82VqbHa_|Er$<0 zEHbY=h}ypNI^wEsS(@zy{GsXniu-d8IvH0ja(VOfKP+E7+I~sn zAA_+CFLO_veVT{8(pj8C+l0NPn`?g&kr!s6Zk1HL;}kOUU?)cAT>Fco`M`%vZ%=QY zm-<8~X)_~1@qEUIjBekrViT;1goW@ek~bw2+KjLMDd#H}C0Dq+Mo#_d<${ep8BgC@ zAL~0I|J3t|^pgM^+rJk7ir#hq{r1PYk719|k6Bo2n-CiVAQCHKjkA%)Im2QKF4$C9 zj1+IC$>4xu1)KU}&5|z5aLZH+>J^v#Mi;?#zPn`k&BP0NH;wbH-D_IqlK0EBp7>|h z_H1u3Ok`5k_lfCMhw`PV%V8Ur<-^pYE?b=o!Fu35?t5g92X(HKYAqX{(fO2hscV0i zWLMNtk)sAj%X)nX9t1Q&i;ki<(yy|E*)r@&ItLk;ZJ4c^&DBNd@{pTJnxreFMA86~ z3hMW`Pex8`=Dz1jO)x$haS;poTv?FQ%lW9Jb?nq8%``c`LLP$@Hz~G7~1(|XR1oK3fIb?ethct zl=xKUlqg$g(QWbIB4UxM(6M*BLhtF&)6v19$c`|-z=p{epHICieqH=(0`4jA`79)R zUPHFPB&~gWMp%Zd6{7G?p?@x_{qfkIX;ODp4>uoEj~OITvLIn3G4d6}$eUXgVur}r4*?Z9h?VRCzvtFAuuAAZ+_ zh<>a7`dn0QQe#2mfgxz4GP)Q26fO2WXZbY0U6A^X@;P!&X4Y(@>$>K3W9!KAd*UlZ zd_|NtJl*h8Ok-p6#(GipE&998ZrLnprxg4!phl)$6fC?W$&_==O61h zbXl=?Tgpx9rlGCqfP$sV6CKr?ZVemx-KtgcmU}9@6th$1uM=1`@JgjsXiz9mwHH5X zx9mwynN2OeS9f~Ar#d*y6Yt|^>E}L$sg0|}*2YI9eLFv!u|0IhADh{?M_>29hTa|t zSBM&7m%{ww5+?K9PfSDV7P{FJGQJavgr^aq**f?fxYT z_I2*N+#X-E;rL_#4zSq2WFNcW1Mx*A-%2mkj(>rhxd74JNCchEyj1g^J!w4oV$vVa zv!f6%k$uhpA8yV_669x-$K+iQmzbf?P(Iw0&dSdBogx};8f=G-YW%?5GtK-(RCcUW zJ4`^p)ii!OMDL|A!lUM;5)^iwW^x`)HB=pmfcuiq$8i0-r>`?o_gs}HQO41XTBC6D zH#wJE(G>$ydtxG}TkLDxtpwGyhulMq^6`U1}8f#Y3oZ}w=9MD{#K%`uP-oxWV-!h1K*WTiUI zGz2aj;9VU!SYtwfmOzcrfr8J*M2CRMe|YU|xL!%UH_?v5!EA^F~ zG)HQ4QqIbw)t;o!-9{Zofbs?9C3(p`Oq zySEj7Fz4yBqF27F^KQ&9A2rgZ3Q6WZcVkOa2n2Nq0*Si;f$)X5;=V#4$YT%)=n8@8 zK7l}F1G7k1^n_n*4m7q4fj}g7{Ph%7cEvX;$@=B;{;pV>OU z+udGrPsLyM8!mnzNg{SBd=1U8v^QZ5B*7@kHyYpmDU3X zH2!#CjE;>CM@z!H>~c9wUpATgDYXq5L(Iw&te}~kieCDpBYY7xMy4jpIt!cr?{Umy zh@kl2OX1n#AM17g_r|dVL#hA0?%0??%-2=sEAxhQ8@%y)XeA=w zOnTjq9yR%F{#jF|w(y8%!p3idx;UjVhlVoJ)b&gQoZ_j#-giKiEKRQr)zW0=@R=5$ zDF#=65;We4S?OrA5$nieQE|Chk<{{rl4OdE3yk6W>fw}JjswH(Oy^hLHpf9UAZ=}6 zEpWX%L{ulS?)dg46x2(*wddsTF=f}0Y<`dkSYII-dKJ#v;nc$RsRqs{2{RjlWlmf)Z2mLmCuK)2X zP3c?TuDxO$nOcR>e2zbSE95@TTFb6WyJBz6MrizM5D`oOtZ>ROntN^m;q)pDO7zD3 zEWlG&7KgyKry;JG`aZ)>icKLgB1Ol{iyl~Zr47z;ZqW(ZG}_dwU8GygFE*WC9tNiY z5nLZ4IN(R)5L>PIy=y1^~F9{iabxAiPU-tAJ%}5B4OkA``tBkqDvyQ*6C;c+n!} z(?}gau~B*wITSWK_KViU0Xu#no;?BeUDYGeJ++XST@UI!kog-mTnPG>PSvC?tk`w3 zFeZ9DXt6I*m$-)kR+tqpQ8*Is01gaZtZ12S;p9=;cLvCX*OaLBpYKeCiAm?ws7m9e zPh0R>ZKQvWZtw55*lyQM-eA)EIR(C}(cwLZ?mE@^bF+b@jQ-^Z_cp}lz@g7caPEW0 zW+G9PC>tZG-o|I7SngBg!V(eO3{+q}iCl%CyWn9Qi}PhNz@bf5KFFA>C4%JO^&9C| z)`04l+7P^U;u;mvEW?GqWQYZ0Qv$g0S@n{%@AG#&mx@ZqDGWw&)i^YmM7Q7|!JWfIAw+e|c`|Phl46D}C zOmqrkJpuD}bp>L;nT;A8e3$*_Eu{|!U+6~UO-}%_@DHnST=pmY`>r3_V-$DDS3%i0i)43nu5dv?Hi27X6T!Og!YuoZ_j)1Xf?yY9JJ5B_4s;y{; zs85%#_|FtldTxpW{35Il(@5Z`EN$-)c=ot*d{!T!h=+1&RG|eXgYQkBy*!5t!4hp; ziu9ex6n?i%XRVg*bKP=MSP$&wtIQS!7hG47zP*4&Cw{6rB2CMJ$9N^4Y#^XQko6mp z872N@Fv_kJAJnSDXaJ5{5+U=m_uGE;zUZ(`AH7LnV8sZ^n^wocIbVF$ch|1g0hrbc znPZQ@;}Sk8ICSJjGSPzJbEZ=VaDab^N@<51STG2r7-Xj$5B(fSTeYnBup z8E&PEXXL+zOn^*)foW_jIT0~rlNy z4Ntf%J|ac7N;}O88R{VWHgeRJ(F51nu-4mw)L&em2E}3ghF1nO7N5<9*Gw9AnM)1E zUczl2ZFuG_-@2~8xGu)QQgTiRsK}sYjmae@(0I0mwGhG``pJ|4d{6Lplk3aFcOGKj~JJr zXBl=aiD+aLOZis~MXjE&4X25F_Gce~863CZEmleV=xUt8wg2Sf{$Lj(^SDL$lsHOB z%VM6sYr$#M9vISqs__B@Zdn205!@qyH}J}S?*+QQ6xO-Fe`NM)0sBgbV=)TNRWfym z=-tt}6qXSnZWB|5_=M)IuCeu zXfG$>q-~^qG|s$Cz!}+ah|`tL6^gbot2YnRb(NIxQMA93yy&#~n;=x82brgB!~4Mf zKm|;@T>&1kcwvx8q8lq9HJV4Nxu8X&`a8N2U0+>AW1<7$+0? zH%4Aq3D{VJf$NPSdwWlfyrrg_A%bcr4~SXEGRG5x)XD>_HhGb$yySH4cGx#B?)_%E zCrsMqv+4k_Sww@SvGHem>yQ7H=i;y-*qSXg1J?Kt z18b<4hyczm29RQ4qcek2*5;O5kVX~h)#<4NGBOpHC3+)U-LXUVZ81ssilMN%=gp)T z+zwo<*OW%7R_!@tMLbE?X0_@!z6HPAz1!fC=V2G0^(s^ImFgULkUNkqf;Av4%Hs`) z{CW@#+&47{5Wasj(gIlrF5?bsA`ZxL>k-tvHYhe%0S|q~|KQ5rk=b%Ozl*rih;l`e z3)(<&(^SEJ;3Mz~+eg)|0Q>A?|MW5svz%Xl&EUhrpneVM&80(h{R`D2)=>ACR%=6E zN?`xaWlfqhV!-3D*(!rQwW~yI_!e5Hq_|%-+=fz-H=b^~|JF&({>di=`#Pqh@%$Ol z<$JOOy^3@vA{#=f4pOO|rEAqX4?lvlc2}C^cdToMPg~rmiFRRZ@6tsOUJ2|bB z$DgR0q!maSseAWP+jG9Y1#?7@0f?y>rL}2Ge)K!TtPXVcU0AO}EO9Q)x>8Mx%G7@m zo6Mk1IWVgDlahzE^EsjsEHQ8_8aYFVFr;m$5l#6?fS zd*Ng>)I}-qn0{=Oeb0zs4$RFw``3_TceKN2S@|eLPAz!m=QLw3GJcV+IK)T`s3Zoa zxSS;lYixth<`|hekDlJ#^Iav19~zEzy~*zW!ahgnEXN^CG3<4Kv^34hR`B8UG`4k#3dk#K5WCs@bN6L+7JRxNpFK%=Pwt^x--T zd#1o*Q22@~{#E%uV}S9C8$)Dy@8dJw5^v@Yk~CwSW)hr??BC zya+P?B%xaaYoLf1yaJI4Rd9l$hDG=pWG=`~U`=SLw8R`iIF5kSl^5s=DDUUuMp2C~$pqfP+ONT0cn_OUV^Q1&{2{-4^?4 z=T^JXB9Lh^RbQx0AR&=+;$8Y!l^a|>NWrcS?1a#bivo5n5*76=!u`32kL3I$7|^(1 zffN|zQq0u02>&jM+N))8vb@++PR+m~1kFu3$X%w!XDX-De94O4l^eb96K$luqOIPp z1E|upmOD%xmu9d8?<-^$QA`*WyK>88XCM$znzY*Jo%E`=4%l$QFQ&7& z756Q5d@V+sa@Yw#n+$EQ1tU_ya|n?)ZZoMJ9#Bq|;l^Bce|E!MYvZ5e_LazD@C{Hm zsU1bL1CEG-7d#l7yAa~WjF%*j9@q;lm@Ga|$hb#vv4qB`jVw;r*RZTYV(5>Bf1ykH zr{*u)F=O;G@JiU0137xUu1#vuqb{Y`nUpuKD8h2I6-01fJ{1scW7-TEz8*RCibOm* z;!G!7%Pj@k>4{mdVop@+TOdcL7L;}Y>HVw=fCENzKC9t%Ncb2Xh!F$zodkkAo@=r0 zDt+KrrFVSr&|&XexldssLGXat@w-HLz>~=7u%N)6+*z#Yz~3dLMUJe1zX#anaB5(i z2`E?wDEN^^jAXBq1tUm-MJ?kPc5*Xws39=D_8hPSJnsuP-Je-s;uKz_R@FSO4(!}l zAHbEC*YmxfWV0+u%eKy@{4Prgzx~#X(MJWxTAGDi%o%wNNgsaNCQWN7;kOP)V%VT* zEOXLviquL+atjFiqbkB}Qe9Z&K6!l9gf7*kItI(ZGwXqbsr^h!7?hw}%4Z6tB3XXm zUg$-sq7@Q}OaFumwB=R^r*BbC#dEne(EHE*&OI5UQw4z?P#Kzn3p8Y=LrBJ*H6nVk zY&fGpw}77mrUN$Bq0b3OGj1H%fMmup4tAB>r5Nw?gmw{}g)J74g1Aj!A?`@0-sFb@ zi>^-l&M={b&rm2@#(@$?zDoaSuSwDGzZ|dnLd$XG{g}-4YT*h+rz2+?Z0ca#M_>jla6p>qO(k`b`>$C_iLpfkj_zN5g6>a4sEc-9x>oblf)T zi#UHx6O<O<0y)Jf?8*a@$h%d{!oeZrm1Ts^3x~8aFfzBaRpLS>sN4!^lIbix{4KwL6$QO;)?uJ?#R1yn3|pes}*Z! zObOh6!*KY;6y@K_US=U1vmqtz>6V!*SAsNN>24^;>>7tGue}vKXf7sMs_{Z zi9RaD-fNw0%W(HtJ)de~nmTdRBd0x@=!+@|XVJhLrcYjia=-{yL>S&xFVJuzIy7%O z3)C?IH~#>s$=Ud)wiWixy>xmU;k=KPo`B4?o!F@w>}+K_&J^a+LXs8ti&L~fO(e!F zN2l+E-n9$tzRZ@tVjaj;{Ba?(v!@c#Wh$;!r^AWUcI4>RPfAKfOC<$)Z<*iv{SRvu zmz3steC*4Z=m4_;ge=VotBdD@qRY_AH=lE{6u<8rvmbqdgyo%I)zV!%U6jg|!`F}e zmGn)sZA))9sas|D?49^bMxy_;Uf`;MR9CsGm{y|#YYaf*j9>vi9Lal*7Eqtk#nep2 zS67r2i*zdAxb4%N?hw{YhlcZ>PcI~7)DO@!zNCRHF<wPey zP)j*;zsj*13;C^v3@_t5T=~sL3XY7cK!RgOT>_GYD5a)qRSQ^>ro>-z=itwnkIVjy zOOC1i<^zynr!Uz^W7RY)c$vGX%}=P65mq0$*h$A0PO4CbL{1x;%qS!vDK^=Z*NsW) zvv`}xPLdA(HbGOw8wMGUJ!G+IBFv<}dT2m8iUFrsMnPHJV3bxr>wW_AutxR%wK5y0VD>B2S>IeoFx${X5+LqT8^!(FOsDuP zxozs@uz?Jr@T{Y=uCAi3k=%{EhHBkdkq|=nGZTGI7f_WEJ&uiTU;w|jsdZZKpWEb5wE?iz+Pv{gK)B1)kSwCD81;s9nEs?f z)MwEL$1InG}@ih`iAX z$r~d&(2f)JQB!QGYc~`;PorY9^lf{kDt_}w8GIM`&j-;Fkqm8sHz>*N&h!jW+Cs}7`o`n2Gc}O}7MXRx z2u>`KQYs?nsn}LpeSd$C?t3aR7)|g_pkLT)4K14xTwCBI9uCMGqQb?bY1x*7Wzio? z;}A&ct6#-%N{>if3B4fD2h>j?c1HT#t@%T!`Wl6*<9-2KJ4CO9|E(jcf3Ihyc2>}3 zZnx0!Di?Otx#jXC(w;2E zdnq5k#M7CmV*IVV z;KOSbHp;4}8IXok`WKu}38k7_Q}+0AKp``y;tHIA4rl9Dsr1jUfDZw9ua6W_%}L=( z43EBKL~w6BiAxev(Ytzir1yr5HjJ~&+SnYs{JW&_eYgpxN-r9}>rPXyB5PinSu2&G zUpU2nK%cH}7BYSlp&8|&UB~Y{m^J?rWSeMvD(BchpO={`@QCP2m8`jH@SLezyacxW z)J7A3`py$|EB;+e@9A>&%PXHKCQP-^;ifFy+!HVdSSJCdU=^8_roQ1TIFh;5rho-1 zm(p9J4h!%{Np)eRe8e{>GIqA;T$^dQn^mRR-sj1z(b6tdfh_hG%yc+vIn={GUoQv* z4r>OsDvM3#e9Bo0|2bX`ze_ZWA87R_%f>YRI$>c#NO9#HgkD-*p0~)>hgLYM2I5`+ zEjWB=@SC=LuswI`huOd@ZVX`C6O*(y?oL&P3Zp+mQHb#u@>LHtKk*<0?L?RD%{I-%9?e%hSOZ)a;|02X(ZLjx zEK?WC6-)4JEFuLs%s_YEWrlyQ$m948NHy;c5c8)O%pp+Q4@F z(kxB&SO?9-5X}J-?0|Ld;B{ucb3Gv9caAtXENBaDV>FeLBU(kH z*78y5Z=qn(BlekN0WIOv4=pTTcY8j|kk5D=_J@&W3_y=phcivGj#q`sZ^1 z0#mJVbYKa{$0jWp>`%&oc?uPvM+9snwMPlQEZy5!L5k$Y_MN0{8N#E9DhomMJ5lW0 zT?F9*n0@urf#614C|+f2jx68%62d92g-2KE3ON7=!E|Pj_|35T^IsQ) zMFxpk@7NxZOLpYu3Cm%|hqYLZQ@HeV?!^W0K7lN(FN|VM&QFdp=6?qz0V=G|i+}99 zoqSeMg^)Zqf`F;KW)a+fn91J#wwQm3`vGhPa;q8fxkVzmh>2)qnEp@U>bwAu6CESYJ?U*$%``s4nW?Gk1{e3ZPADoCl$Bmvab*oB{p|QawgJ482W2u`iXb*lPCtzlCATcNF8 zK_E}u{-b1n-T8N$)h{4~AOF`IAO78;_8a?uk^havzdO|aiv$Gn?+&&9pz;6hP~}?~=2w*Z&^~>y60( literal 10378 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 Date: Fri, 14 Feb 2025 14:17:29 +0100 Subject: [PATCH 14/20] Update ultimaker_s8.def.json --- resources/definitions/ultimaker_s8.def.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index c1b7bac66c..60f980db32 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -69,7 +69,7 @@ "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'" }, + "adhesion_type": { "value": "skirt" }, "bottom_thickness": { "value": "3*layer_height if top_layers==4 else top_bottom_thickness" }, "bridge_skin_material_flow": { "value": 200 }, "bridge_skin_speed": @@ -386,7 +386,7 @@ "support_infill_rate": { "value": "80 if gradual_support_infill_steps != 0 else 15" }, "support_interface_enable": { "value": true }, "support_pattern": { "value": "'gyroid' if support_structure == 'tree' else 'lines'" }, - "support_structure": { "value": "'normal'" }, + "support_structure": { "value": "normal" }, "support_z_distance": { "value": "0.4*material_shrinkage_percentage_z/100.0" }, "top_bottom_thickness": { "value": "round(4*layer_height, 2)" }, "travel_avoid_other_parts": { "value": false }, @@ -399,8 +399,8 @@ "wall_material_flow": { "value": 95 }, "wall_overhang_angle": { "value": 45 }, "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'" } + "z_seam_corner": { "value": "z_seam_corner_weighted" }, + "z_seam_position": { "value": "backright" }, + "z_seam_type": { "value": "sharpest_corner" } } } \ No newline at end of file From 0771b38c913df7fbed33d4b9e862c810ae3e96b9 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Fri, 14 Feb 2025 14:25:00 +0100 Subject: [PATCH 15/20] Update ultimaker_s8.def.json --- resources/definitions/ultimaker_s8.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index 60f980db32..78c10adcf0 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -91,7 +91,7 @@ "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'" }, + "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 }, From f2389104a98b58a184b87796a9dcef6836c969aa Mon Sep 17 00:00:00 2001 From: HellAholic Date: Fri, 14 Feb 2025 15:19:45 +0100 Subject: [PATCH 16/20] Setting override name correction skirt_brim_speed --- resources/definitions/ultimaker_s8.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index 78c10adcf0..465fe1d774 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -311,7 +311,7 @@ "maximum_value_warning": 300, "value": "speed_wall" }, - "speed_skirt_brim": + "skirt_brim_speed": { "maximum_value_warning": 300, "value": "speed_layer_0" From cbb63249b313aee3b84fc5e570d8b34a82abde3a Mon Sep 17 00:00:00 2001 From: HellAholic <28710690+HellAholic@users.noreply.github.com> Date: Fri, 14 Feb 2025 14:20:56 +0000 Subject: [PATCH 17/20] Apply printer-linter format --- resources/definitions/ultimaker_s8.def.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index 465fe1d774..f5de105085 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -273,6 +273,11 @@ "skin_material_flow": { "value": 95 }, "skin_overlap": { "value": 0 }, "skin_preshrink": { "value": 0 }, + "skirt_brim_speed": + { + "maximum_value_warning": 300, + "value": "speed_layer_0" + }, "skirt_line_count": { "value": 5 }, "small_skin_on_surface": { "value": false }, "small_skin_width": { "value": 4 }, @@ -311,11 +316,6 @@ "maximum_value_warning": 300, "value": "speed_wall" }, - "skirt_brim_speed": - { - "maximum_value_warning": 300, - "value": "speed_layer_0" - }, "speed_support": { "maximum_value_warning": 300, From ac06e913d21bfb119c958a8b42f0dac1a0233a89 Mon Sep 17 00:00:00 2001 From: Frederic Meeuwissen <13856291+Frederic98@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:24:23 +0100 Subject: [PATCH 18/20] Remove non-existent "support_density" setting --- resources/definitions/ultimaker_s8.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index f5de105085..03b63fafe8 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -382,7 +382,6 @@ "value": "speed_wall" }, "support_brim_line_count": { "value": 5 }, - "support_density": { "value": "15 if support_structure == 'tree' else 20" }, "support_infill_rate": { "value": "80 if gradual_support_infill_steps != 0 else 15" }, "support_interface_enable": { "value": true }, "support_pattern": { "value": "'gyroid' if support_structure == 'tree' else 'lines'" }, From 524ec70012f3d0a7172b44ee80af481b7ebbd8d5 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Fri, 14 Feb 2025 15:33:25 +0100 Subject: [PATCH 19/20] Revert "Update ultimaker_s8.def.json" This reverts commit 63429d76264b0f47c312e3f877fb3e5ddf742bb2. --- resources/definitions/ultimaker_s8.def.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index 03b63fafe8..0ff6ca1794 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -69,7 +69,7 @@ "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" }, + "adhesion_type": { "value": "'skirt'" }, "bottom_thickness": { "value": "3*layer_height if top_layers==4 else top_bottom_thickness" }, "bridge_skin_material_flow": { "value": 200 }, "bridge_skin_speed": @@ -385,7 +385,7 @@ "support_infill_rate": { "value": "80 if gradual_support_infill_steps != 0 else 15" }, "support_interface_enable": { "value": true }, "support_pattern": { "value": "'gyroid' if support_structure == 'tree' else 'lines'" }, - "support_structure": { "value": "normal" }, + "support_structure": { "value": "'normal'" }, "support_z_distance": { "value": "0.4*material_shrinkage_percentage_z/100.0" }, "top_bottom_thickness": { "value": "round(4*layer_height, 2)" }, "travel_avoid_other_parts": { "value": false }, @@ -398,8 +398,8 @@ "wall_material_flow": { "value": 95 }, "wall_overhang_angle": { "value": 45 }, "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" } + "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, + "z_seam_position": { "value": "'backright'" }, + "z_seam_type": { "value": "'sharpest_corner'" } } } \ No newline at end of file From 26cac4a131eb544d261083446a1908881ffdb8b9 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Fri, 14 Feb 2025 15:34:19 +0100 Subject: [PATCH 20/20] Revert "Update ultimaker_s8.def.json" This reverts commit 0771b38c913df7fbed33d4b9e862c810ae3e96b9. --- resources/definitions/ultimaker_s8.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s8.def.json b/resources/definitions/ultimaker_s8.def.json index 0ff6ca1794..da040a0e13 100644 --- a/resources/definitions/ultimaker_s8.def.json +++ b/resources/definitions/ultimaker_s8.def.json @@ -91,7 +91,7 @@ "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" }, + "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 },