From f7049ca3eafef78e7aa1196bb1c3e69bf1375261 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 11 Feb 2022 10:56:33 +0100 Subject: [PATCH 01/15] fix disallowed areas taking brim_gap into account --- cura/BuildVolume.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index d039a3c68f1..fa230866e99 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1113,7 +1113,8 @@ def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None): # Use brim width if brim is enabled OR the prime tower has a brim. if adhesion_type == "brim": brim_line_count = skirt_brim_stack.getProperty("brim_line_count", "value") - bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 + brim_gap = skirt_brim_stack.getProperty("brim_gap", "value") + bed_adhesion_size = brim_gap + skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 for extruder_stack in used_extruders: bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 @@ -1214,7 +1215,7 @@ def _clamp(self, value, min_value, max_value): return max(min(value, max_value), min_value) _machine_settings = ["machine_width", "machine_depth", "machine_height", "machine_shape", "machine_center_is_zero"] - _skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "initial_layer_line_width_factor"] + _skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_gap", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "initial_layer_line_width_factor"] _raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_layers", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap", "layer_0_z_overlap"] _extra_z_settings = ["retraction_hop_enabled", "retraction_hop"] _prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "prime_blob_enable"] From a35a38c684de8e0e362460c5858deb120ff573af Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 11 Feb 2022 11:48:54 +0100 Subject: [PATCH 02/15] fix inclusion of brim_gap in TestBuildVolume --- tests/TestBuildVolume.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index 7bc629962de..9a1c29da6cb 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -57,6 +57,7 @@ class TestCalculateBedAdhesionSize: "machine_depth": {"value": 200}, "skirt_line_count": {"value": 0}, "skirt_gap": {"value": 0}, + "brim_gap": {"value": 0}, "raft_margin": {"value": 0}, "material_shrinkage_percentage": {"value": 100.0}, "material_shrinkage_percentage_xy": {"value": 100.0}, From 2698cd76c5ff736fb725ee810edaba6527b84430 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 11 Feb 2022 12:20:05 +0100 Subject: [PATCH 03/15] make skirt_brim_extruder_nr an optional_extruder to allow for the brim_per_material feature --- cura/BuildVolume.py | 54 +++++++++++++++-------- cura/Settings/ExtruderManager.py | 2 +- resources/definitions/fdmprinter.def.json | 2 +- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index fa230866e99..aeacba7c03a 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -850,10 +850,14 @@ def _computeDisallowedAreasPrinted(self, used_extruders): result = {} skirt_brim_extruder: ExtruderStack = None - for extruder in used_extruders: - if int(extruder.getProperty("extruder_nr", "value")) == int(self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value")): - skirt_brim_extruder = extruder - result[extruder.getId()] = [] + skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") + if skirt_brim_extruder_nr == -1: + skirt_brim_extruder = used_extruders[0] # The prime tower brim is always printed with the first extruder + else: + for extruder in used_extruders: + if int(extruder.getProperty("extruder_nr", "value")) == int(skirt_brim_extruder_nr): + skirt_brim_extruder = extruder + result[extruder.getId()] = [] # Currently, the only normally printed object is the prime tower. if self._global_container_stack.getProperty("prime_tower_enable", "value"): @@ -1101,27 +1105,39 @@ def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None): # with the adhesion extruder, but it also prints one extra line by all other extruders. As such, the # setting does *not* have a limit_to_extruder setting (which means that we can't ask the global extruder what # the value is. - skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") - try: - skirt_brim_stack = self._global_container_stack.extruderList[int(skirt_brim_extruder_nr)] - except IndexError: - Logger.warning(f"Couldn't find extruder with index '{skirt_brim_extruder_nr}', defaulting to 0 instead.") - skirt_brim_stack = self._global_container_stack.extruderList[0] - skirt_brim_line_width = skirt_brim_stack.getProperty("skirt_brim_line_width", "value") - - initial_layer_line_width_factor = skirt_brim_stack.getProperty("initial_layer_line_width_factor", "value") + # Use brim width if brim is enabled OR the prime tower has a brim. if adhesion_type == "brim": - brim_line_count = skirt_brim_stack.getProperty("brim_line_count", "value") - brim_gap = skirt_brim_stack.getProperty("brim_gap", "value") - bed_adhesion_size = brim_gap + skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 + skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") + bed_adhesion_size = -999 + for extruder_stack in used_extruders: + extruder_nr = int(extruder_stack.getProperty("extruder_nr", "value")) + if extruder_nr == skirt_brim_extruder_nr or skirt_brim_extruder_nr == -1: + initial_layer_line_width_factor = extruder_stack.getProperty("initial_layer_line_width_factor", "value") + brim_line_count = extruder_stack.getProperty("brim_line_count", "value") + skirt_brim_line_width = extruder_stack.getProperty("skirt_brim_line_width", "value") + brim_gap = extruder_stack.getProperty("brim_gap", "value") + bed_adhesion_size_here = brim_gap + skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 + # We don't create an additional line for the extruder we're printing the brim with. + bed_adhesion_size_here -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 + bed_adhesion_size = max(bed_adhesion_size, bed_adhesion_size_here) + + if bed_adhesion_size == -999: + Logger.warning(f"Couldn't find skirt/brim extruder among used extruders.") for extruder_stack in used_extruders: bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - - # We don't create an additional line for the extruder we're printing the brim with. - bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 elif adhesion_type == "skirt": + skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") + try: + skirt_brim_stack = self._global_container_stack.extruderList[int(skirt_brim_extruder_nr)] + except IndexError: + Logger.warning( + f"Couldn't find extruder with index '{skirt_brim_extruder_nr}', defaulting to 0 instead.") + skirt_brim_stack = self._global_container_stack.extruderList[0] + skirt_brim_line_width = skirt_brim_stack.getProperty("skirt_brim_line_width", "value") + + initial_layer_line_width_factor = skirt_brim_stack.getProperty("initial_layer_line_width_factor", "value") skirt_distance = skirt_brim_stack.getProperty("skirt_gap", "value") skirt_line_count = skirt_brim_stack.getProperty("skirt_line_count", "value") diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 0fdc27ec81e..b938ceaccdd 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -275,7 +275,7 @@ def getUsedExtruderStacks(self) -> List["ExtruderStack"]: for extruder_setting in used_adhesion_extruders: extruder_str_nr = str(global_stack.getProperty(extruder_setting, "value")) if extruder_str_nr == "-1": - extruder_str_nr = self._application.getMachineManager().defaultExtruderPosition + continue # An optional extruder doesn't force any extruder to be used if it isn't used already if extruder_str_nr in self.extruderIds: used_extruder_stack_ids.add(self.extruderIds[extruder_str_nr]) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b1cbb07904b..d5c74b5d6ca 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5429,7 +5429,7 @@ { "label": "Skirt/Brim Extruder", "description": "The extruder train to use for printing the skirt or brim. This is used in multi-extrusion.", - "type": "extruder", + "type": "optional_extruder", "default_value": "0", "value": "adhesion_extruder_nr", "enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable'))", From 33e3a45b5c8e0741a0d73287e2a8ec12061c41af Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 14 Feb 2022 16:30:11 +0100 Subject: [PATCH 04/15] fixes for optional skirt_brim_extruder_nr --- cura/BuildVolume.py | 14 +++++++------- cura/Settings/ExtruderManager.py | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index aeacba7c03a..c1106809cb7 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -851,13 +851,13 @@ def _computeDisallowedAreasPrinted(self, used_extruders): result = {} skirt_brim_extruder: ExtruderStack = None skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") - if skirt_brim_extruder_nr == -1: - skirt_brim_extruder = used_extruders[0] # The prime tower brim is always printed with the first extruder - else: - for extruder in used_extruders: - if int(extruder.getProperty("extruder_nr", "value")) == int(skirt_brim_extruder_nr): + + for extruder in used_extruders: + if skirt_brim_extruder_nr == -1: + skirt_brim_extruder = used_extruders[0] # The prime tower brim is always printed with the first extruder + elif int(extruder.getProperty("extruder_nr", "value")) == int(skirt_brim_extruder_nr): skirt_brim_extruder = extruder - result[extruder.getId()] = [] + result[extruder.getId()] = [] # Currently, the only normally printed object is the prime tower. if self._global_container_stack.getProperty("prime_tower_enable", "value"): @@ -1112,7 +1112,7 @@ def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None): bed_adhesion_size = -999 for extruder_stack in used_extruders: extruder_nr = int(extruder_stack.getProperty("extruder_nr", "value")) - if extruder_nr == skirt_brim_extruder_nr or skirt_brim_extruder_nr == -1: + if extruder_nr == skirt_brim_extruder_nr or int(skirt_brim_extruder_nr) == -1: initial_layer_line_width_factor = extruder_stack.getProperty("initial_layer_line_width_factor", "value") brim_line_count = extruder_stack.getProperty("brim_line_count", "value") skirt_brim_line_width = extruder_stack.getProperty("skirt_brim_line_width", "value") diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index b938ceaccdd..0286923cc0f 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -298,7 +298,7 @@ def getInitialExtruderNr(self) -> int: # Starts with the adhesion extruder. adhesion_type = global_stack.getProperty("adhesion_type", "value") if adhesion_type in {"skirt", "brim"}: - return global_stack.getProperty("skirt_brim_extruder_nr", "value") + return max(0, int(global_stack.getProperty("skirt_brim_extruder_nr", "value"))) # optional skirt/brim extruder defaults to zero if adhesion_type == "raft": return global_stack.getProperty("raft_base_extruder_nr", "value") From 0339e4f1ca0da75fb6b303debdc59444a271552b Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Mon, 14 Feb 2022 16:31:03 +0100 Subject: [PATCH 05/15] reduce clearance needed between prime tower and models With the new implementation we don't need that much clearance. --- cura/BuildVolume.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index c1106809cb7..d44347bc0b7 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -820,9 +820,7 @@ def _updateDisallowedAreas(self) -> None: break if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": brim_size = self._calculateBedAdhesionSize(used_extruders, "brim") - # Use 2x the brim size, since we need 1x brim size distance due to the object brim and another - # times the brim due to the brim of the prime tower - prime_tower_areas[extruder_id][area_index] = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(2 * brim_size, num_segments = 24)) + prime_tower_areas[extruder_id][area_index] = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(brim_size, num_segments = 24)) if not prime_tower_collision: result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id]) From 1bd6cbb3d6737e7d97c6bd60c5c520aa750071ae Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 16 Feb 2022 12:10:41 +0100 Subject: [PATCH 06/15] remove brim max With the new brim algorithms the brim will never be generated outside of the volume. It's nice to be able to input 9999 if you want the brim to cover the whole build plate... ... for testing purposes ;) --- resources/definitions/fdmprinter.def.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d5c74b5d6ca..7cbea36d1fa 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4653,7 +4653,6 @@ "default_value": 8.0, "minimum_value": "0.0", "maximum_value_warning": "50.0", - "maximum_value": "0.5 * min(machine_width, machine_depth)", "enabled": "(support_enable or support_meshes_present) and support_brim_enable", "settable_per_mesh": false, "settable_per_extruder": true, @@ -4668,7 +4667,6 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "50 / skirt_brim_line_width", - "maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width", "value": "math.ceil(support_brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", "enabled": "(support_enable or support_meshes_present) and support_brim_enable", "settable_per_mesh": false, @@ -5522,7 +5520,6 @@ "default_value": 8.0, "minimum_value": "0.0", "maximum_value_warning": "50.0", - "maximum_value": "0.5 * min(machine_width, machine_depth)", "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", "settable_per_mesh": false, "settable_per_extruder": true, @@ -5537,7 +5534,6 @@ "default_value": 20, "minimum_value": "0", "maximum_value_warning": "50 / skirt_brim_line_width", - "maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width", "value": "math.ceil(brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", "settable_per_mesh": false, From 1f2ca2aa8f43bb87e5f18190b40b4601b45e213c Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 16 Feb 2022 12:11:02 +0100 Subject: [PATCH 07/15] Fix limit_to_extruder for skirt_brim_extruder --- resources/definitions/fdmprinter.def.json | 27 ++++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 7cbea36d1fa..bebcec26535 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5479,9 +5479,9 @@ "maximum_value_warning": "10", "maximum_value": "0.5 * min(machine_width, machine_depth) / skirt_brim_line_width", "enabled": "resolveOrValue('adhesion_type') == 'skirt'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true }, "skirt_gap": { @@ -5493,9 +5493,9 @@ "minimum_value_warning": "max(extruderValues('machine_nozzle_size'))", "maximum_value_warning": "10", "enabled": "resolveOrValue('adhesion_type') == 'skirt'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true }, "skirt_brim_minimal_length": { @@ -5508,6 +5508,7 @@ "minimum_value_warning": "25", "maximum_value_warning": "2500", "enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -5521,9 +5522,9 @@ "minimum_value": "0.0", "maximum_value_warning": "50.0", "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr", "children": { "brim_line_count": @@ -5536,9 +5537,9 @@ "maximum_value_warning": "50 / skirt_brim_line_width", "value": "math.ceil(brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true } } }, @@ -5552,9 +5553,9 @@ "minimum_value": "0", "maximum_value_warning": "skirt_brim_line_width", "enabled": "resolveOrValue('adhesion_type') == 'brim'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": true, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true }, "brim_replaces_support": { @@ -5563,9 +5564,9 @@ "type": "bool", "default_value": true, "enabled": "resolveOrValue('adhesion_type') == 'brim' and (support_enable or support_meshes_present)", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "support_infill_extruder_nr" + "settable_per_extruder": true }, "brim_outside_only": { @@ -5574,9 +5575,9 @@ "type": "bool", "default_value": true, "enabled": "resolveOrValue('adhesion_type') == 'brim'", + "limit_to_extruder": "skirt_brim_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "limit_to_extruder": "skirt_brim_extruder_nr" + "settable_per_extruder": true }, "raft_margin": { From fb8787f7bd397d088c96bf664211fe63ba6de345 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 18 Feb 2022 15:29:54 +0100 Subject: [PATCH 08/15] fix: fix wrong placement of prime tower disallowed area The prime tower should no longer be displaced by the brim width --- cura/BuildVolume.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index d44347bc0b7..a2ffa404f77 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -868,15 +868,6 @@ def _computeDisallowedAreasPrinted(self, used_extruders): prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left. prime_tower_y = prime_tower_y + machine_depth / 2 - if skirt_brim_extruder is not None and self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": - brim_size = ( - skirt_brim_extruder.getProperty("brim_line_count", "value") * - skirt_brim_extruder.getProperty("skirt_brim_line_width", "value") / 100.0 * - skirt_brim_extruder.getProperty("initial_layer_line_width_factor", "value") - ) - prime_tower_x -= brim_size - prime_tower_y += brim_size - radius = prime_tower_size / 2 prime_tower_area = Polygon.approximatedCircle(radius, num_segments = 24) prime_tower_area = prime_tower_area.translate(prime_tower_x - radius, prime_tower_y - radius) From d9282eabdda51e95ed0a1e0b2d7f46ada71a1ca5 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 17 Mar 2022 10:07:00 +0100 Subject: [PATCH 09/15] brim_inside_margin user setting it allows for removing the brim inside holes completely if set to a high value, or just keep it a small distance away from internal holes --- resources/definitions/fdmprinter.def.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bebcec26535..1499c8ed5e7 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5579,6 +5579,19 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "brim_inside_margin": + { + "label": "Brim Inside Avoid Margin", + "description": "If brim is only on outside then parts fully enclosed inside another part will get a brim which might overlap with the internal holes of the outer part. This setting controls how far to stay away from those internal holes. Set to a high value to prevent any brim from being generated for parts enclosed within the holes of other parts.", + "unit": "mm", + "type": "float", + "default_value": 5, + "minimum_value": "0", + "enabled": "resolveOrValue('adhesion_type') == 'brim' and any(extruderValues('brim_outside_only'))", + "limit_to_extruder": "skirt_brim_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "raft_margin": { "label": "Raft Extra Margin", From 4d146e882e4b362d442d35d55cf390b554a17383 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 17 Mar 2022 14:39:24 +0100 Subject: [PATCH 10/15] remove skirt/brim adhesion size constraint it is handled by CuraEngine now. --- cura/BuildVolume.py | 54 ++------------------------------------------- 1 file changed, 2 insertions(+), 52 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index a2ffa404f77..38f8cc84f0f 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1090,60 +1090,10 @@ def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None): if adhesion_type is None: adhesion_type = container_stack.getProperty("adhesion_type", "value") - # Skirt_brim_line_width is a bit of an odd one out. The primary bit of the skirt/brim is printed - # with the adhesion extruder, but it also prints one extra line by all other extruders. As such, the - # setting does *not* have a limit_to_extruder setting (which means that we can't ask the global extruder what - # the value is. - - # Use brim width if brim is enabled OR the prime tower has a brim. - if adhesion_type == "brim": - skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") - bed_adhesion_size = -999 - for extruder_stack in used_extruders: - extruder_nr = int(extruder_stack.getProperty("extruder_nr", "value")) - if extruder_nr == skirt_brim_extruder_nr or int(skirt_brim_extruder_nr) == -1: - initial_layer_line_width_factor = extruder_stack.getProperty("initial_layer_line_width_factor", "value") - brim_line_count = extruder_stack.getProperty("brim_line_count", "value") - skirt_brim_line_width = extruder_stack.getProperty("skirt_brim_line_width", "value") - brim_gap = extruder_stack.getProperty("brim_gap", "value") - bed_adhesion_size_here = brim_gap + skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 - # We don't create an additional line for the extruder we're printing the brim with. - bed_adhesion_size_here -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 - bed_adhesion_size = max(bed_adhesion_size, bed_adhesion_size_here) - - if bed_adhesion_size == -999: - Logger.warning(f"Couldn't find skirt/brim extruder among used extruders.") - - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - elif adhesion_type == "skirt": - skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") - try: - skirt_brim_stack = self._global_container_stack.extruderList[int(skirt_brim_extruder_nr)] - except IndexError: - Logger.warning( - f"Couldn't find extruder with index '{skirt_brim_extruder_nr}', defaulting to 0 instead.") - skirt_brim_stack = self._global_container_stack.extruderList[0] - skirt_brim_line_width = skirt_brim_stack.getProperty("skirt_brim_line_width", "value") - - initial_layer_line_width_factor = skirt_brim_stack.getProperty("initial_layer_line_width_factor", "value") - skirt_distance = skirt_brim_stack.getProperty("skirt_gap", "value") - skirt_line_count = skirt_brim_stack.getProperty("skirt_line_count", "value") - - bed_adhesion_size = skirt_distance + ( - skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0 - - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - - # We don't create an additional line for the extruder we're printing the skirt with. - bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 - elif adhesion_type == "raft": + if adhesion_type == "raft": bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") # Should refer to the raft extruder if set. - elif adhesion_type == "none": + else: # raft, brim or skirt. Those last two are handled by CuraEngine. bed_adhesion_size = 0 - else: - raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") max_length_available = 0.5 * min( self._global_container_stack.getProperty("machine_width", "value"), From 6da67e3d82b37da365287c8fcdfdf1b3315b0ca1 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 17 Mar 2022 14:41:13 +0100 Subject: [PATCH 11/15] remove special case for prime tower brim disallowed area It's now handled in CuraEngine --- cura/BuildVolume.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 38f8cc84f0f..a0710245c9e 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -818,9 +818,6 @@ def _updateDisallowedAreas(self) -> None: break if prime_tower_collision: # Already found a collision. break - if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft": - brim_size = self._calculateBedAdhesionSize(used_extruders, "brim") - prime_tower_areas[extruder_id][area_index] = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(brim_size, num_segments = 24)) if not prime_tower_collision: result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id]) @@ -1076,7 +1073,7 @@ def _getSettingFromAllExtruders(self, setting_key: str) -> List[Any]: all_values[i] = 0 return all_values - def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None): + def _calculateBedAdhesionSize(self, used_extruders): """Get the bed adhesion size for the global container stack and used extruders :param adhesion_override: override adhesion type. @@ -1086,9 +1083,7 @@ def _calculateBedAdhesionSize(self, used_extruders, adhesion_override = None): return None container_stack = self._global_container_stack - adhesion_type = adhesion_override - if adhesion_type is None: - adhesion_type = container_stack.getProperty("adhesion_type", "value") + adhesion_type = container_stack.getProperty("adhesion_type", "value") if adhesion_type == "raft": bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") # Should refer to the raft extruder if set. From 91a5d154bc645c762a615e82d6d63878144dd122 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 17 Mar 2022 15:27:41 +0100 Subject: [PATCH 12/15] allow any material to set the brim extruder to not overridden --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 1499c8ed5e7..3ae93103a6d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5431,6 +5431,7 @@ "default_value": "0", "value": "adhesion_extruder_nr", "enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable'))", + "resolve": "'-1' if '-1' in extruderValues('skirt_brim_extruder_nr') else adhesion_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": false }, From fabaf2026de43309609a315dedd2f370fc2c4e56 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 18 Mar 2022 09:55:02 +0100 Subject: [PATCH 13/15] reduce testing of bed adhesion size --- tests/TestBuildVolume.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index 9a1c29da6cb..e4b303e68a5 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -86,12 +86,12 @@ def test_noGlobalStack(self, build_volume: BuildVolume): ({"adhesion_type": {"value": "skirt"}}, 0), ({"adhesion_type": {"value": "raft"}}, 0), ({"adhesion_type": {"value": "none"}}, 0), - ({"adhesion_type": {"value": "skirt"}, "skirt_line_count": {"value": 2}, "initial_layer_line_width_factor": {"value": 1}, "skirt_brim_line_width": {"value": 2}}, 0.02), + ({"adhesion_type": {"value": "skirt"}, "skirt_line_count": {"value": 2}, "initial_layer_line_width_factor": {"value": 1}, "skirt_brim_line_width": {"value": 2}}, 0), # Even though it's marked as skirt, it should behave as a brim as the prime tower has a brim (skirt line count is still at 0!) - ({"adhesion_type": {"value": "skirt"}, "prime_tower_brim_enable": {"value": True}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, -0.06), + ({"adhesion_type": {"value": "skirt"}, "prime_tower_brim_enable": {"value": True}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0), ({"brim_line_count": {"value": 1}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0), - ({"brim_line_count": {"value": 2}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0.06), - ({"brim_line_count": {"value": 9000000}, "skirt_brim_line_width": {"value": 90000}, "initial_layer_line_width_factor": {"value": 9000}}, 100), # Clamped at half the max size of buildplate + ({"brim_line_count": {"value": 2}, "skirt_brim_line_width": {"value": 2}, "initial_layer_line_width_factor": {"value": 3}}, 0), + ({"brim_line_count": {"value": 9000000}, "skirt_brim_line_width": {"value": 90000}, "initial_layer_line_width_factor": {"value": 9000}}, 0), # Clamped at half the max size of buildplate ]) def test_singleExtruder(self, build_volume: BuildVolume, setting_dict, result): self.createAndSetGlobalStack(build_volume) @@ -106,14 +106,6 @@ def test_singleExtruder(self, build_volume: BuildVolume, setting_dict, result): with patch.dict(self.setting_property_dict, patched_dictionary): assert build_volume._calculateBedAdhesionSize([]) == result - def test_unknownBedAdhesion(self, build_volume: BuildVolume): - self.createAndSetGlobalStack(build_volume) - patched_dictionary = self.setting_property_dict.copy() - patched_dictionary.update({"adhesion_type": {"value": "OMGZOMGBBQ"}}) - with patch.dict(self.setting_property_dict, patched_dictionary): - with pytest.raises(Exception): - build_volume._calculateBedAdhesionSize([]) - class TestComputeDisallowedAreasStatic: setting_property_dict = {"machine_disallowed_areas": {"value": [[[-200, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]]]}, "machine_width": {"value": 200}, From 24bb1e96fac3c806d75f1000156eafeece9cda1a Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Sun, 30 Oct 2022 11:09:12 +0100 Subject: [PATCH 14/15] Fix unlinked brim settings behaviour. Some brim settings seemed to behave as if they where linked, when in fact for any extruder set to -1 the 'default extruder' was set by some hacky code that supposedly fixes a 'dissallowed area' issue, very likely also related to the skirt/brim settings. Since dissalowed area for skirt/brim will not be a thing anymore, at least in the front-end, due to CURA-9066 (the 'parent' jira ticket that was blocked by this bug); it was sinplest just to remove the hack altogether. (Otherwise we'd have to make an artificial distinction between -1 and None as it relates to 'Not Set/Used' versus 'Not Overridden', only to then force it back to -1 in situations that call for it -- like communicating to the engine.) CURA-9553 --- cura/Settings/ExtruderStack.py | 2 -- cura/Settings/GlobalStack.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index e93193818c6..eba41569b79 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -142,8 +142,6 @@ def getProperty(self, key: str, property_name: str, context: Optional[PropertyEv limit_to_extruder = super().getProperty(key, "limit_to_extruder", context) if limit_to_extruder is not None: - if limit_to_extruder == -1: - limit_to_extruder = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition) limit_to_extruder = str(limit_to_extruder) if (limit_to_extruder is not None and limit_to_extruder != "-1") and self.getMetaDataEntry("position") != str(limit_to_extruder): diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 041bd19d3a4..25fc74b28f1 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -226,8 +226,6 @@ def getProperty(self, key: str, property_name: str, context: Optional[PropertyEv # Handle the "limit_to_extruder" property. limit_to_extruder = super().getProperty(key, "limit_to_extruder", context) if limit_to_extruder is not None: - if limit_to_extruder == -1: - limit_to_extruder = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition) limit_to_extruder = str(limit_to_extruder) if limit_to_extruder is not None and limit_to_extruder != "-1" and limit_to_extruder in self._extruders: if super().getProperty(key, "settable_per_extruder", context): From 45fb71e966b5b47cc152c7df927be250a451dda0 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Sun, 30 Oct 2022 17:07:21 +0100 Subject: [PATCH 15/15] Engine should know to (not) offset the nozzles w.r.t. disallowed areas. part of CURA-9066 --- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 64216f373fe..d06136a2b4b 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -487,6 +487,10 @@ def _buildGlobalSettingsMessage(self, stack: ContainerStack) -> None: settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], initial_extruder_nr) settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], initial_extruder_nr) + # Manually add 'nozzle offsetting', since that is a metadata-entry instead for some reason. + # NOTE: This probably needs to be an actual setting at some point. + settings["nozzle_offsetting_for_disallowed_areas"] = CuraApplication.getInstance().getGlobalContainerStack().getMetaDataEntry("nozzle_offsetting_for_disallowed_areas", True) + # Add all sub-messages for each individual setting. for key, value in settings.items(): setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings")