From 824c9fd837f26a1554f3b97a95c5f9146e3f0ef2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Jan 2022 13:43:10 +0100 Subject: [PATCH 1/8] Add new raft extruder settings We want to be able to print the layers of the raft with different extruders. To this end, we'll make sub-settings of the adhesion extruder that allow setting the extruder for each part of the raft differently from the rest. Contributes to issue CURA-8868. --- resources/definitions/fdmprinter.def.json | 49 ++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4b33b35daa..8ecb6e30ea 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5411,7 +5411,54 @@ "value": "int(defaultExtruderPosition())", "enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') != 'none' or resolveOrValue('prime_tower_brim_enable'))", "settable_per_mesh": false, - "settable_per_extruder": false + "settable_per_extruder": false, + "children": + { + "skirt_brim_extruder_nr": + { + "label": "Skirt/Brim Extruder", + "description": "The extruder train to use for printing the skirt or brim. This is used in multi-extrusion.", + "type": "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'))", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_base_extruder_nr": + { + "label": "Raft Base Extruder", + "description": "The extruder train to use for printing the first layer of the raft. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "adhesion_extruder_nr", + "enabled": "extruders_enabled_count > 1 and resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_interface_extruder_nr": + { + "label": "Raft Interface Extruder", + "description": "The extruder train to use for printing the second layer of the raft. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "adhesion_extruder_nr", + "enabled": "extruders_enabled_count > 1 and resolveOrValue('adhesion_type') == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "raft_surface_extruder_nr": + { + "label": "Raft Surface Extruder", + "description": "The extruder train to use for printing the top layer(s) of the raft. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "adhesion_extruder_nr", + "enabled": "extruders_enabled_count > 1 and resolveOrValue('adhesion_type') == 'raft' and raft_surface_layers > 0", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } }, "skirt_line_count": { From 262a005e5463346db6a1fa352e4f8128507348c0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Jan 2022 13:52:47 +0100 Subject: [PATCH 2/8] Get extruder values from appropriate sub-adhesion-extruder The adhesion extruder is now split up into multiple sub-settings. Where applicable to the brim or skirt, get it from the skirt/brim extruder. Where applicable to a specific part of the raft, get it from that part's extruder. Where applicable to the whole raft, get it from the adhesion extruder. Contributes to issue CURA-8868. --- resources/definitions/fdmprinter.def.json | 74 +++++++++++------------ 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8ecb6e30ea..e8f7f5530f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3232,7 +3232,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled')", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" }, "speed_z_hop": { @@ -3561,7 +3561,7 @@ "maximum_value_warning": "10000", "enabled": "resolveOrValue('acceleration_enabled') and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled'))", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" }, "jerk_enabled": { @@ -3836,7 +3836,7 @@ "value": "jerk_layer_0", "enabled": "resolveOrValue('jerk_enabled') and (resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('draft_shield_enabled') or resolveOrValue('ooze_shield_enabled'))", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" } } }, @@ -5438,8 +5438,8 @@ }, "raft_interface_extruder_nr": { - "label": "Raft Interface Extruder", - "description": "The extruder train to use for printing the second layer of the raft. This is used in multi-extrusion.", + "label": "Raft Middle Extruder", + "description": "The extruder train to use for printing the middle layer of the raft. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", "value": "adhesion_extruder_nr", @@ -5472,7 +5472,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'skirt'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" }, "skirt_gap": { @@ -5486,7 +5486,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'skirt'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" }, "skirt_brim_minimal_length": { @@ -5515,7 +5515,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr", + "limit_to_extruder": "skirt_brim_extruder_nr", "children": { "brim_line_count": @@ -5531,7 +5531,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'brim' or resolveOrValue('prime_tower_brim_enable')", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" } } }, @@ -5547,7 +5547,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'brim'", "settable_per_mesh": true, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" }, "brim_replaces_support": { @@ -5569,7 +5569,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'brim'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "skirt_brim_extruder_nr" }, "raft_margin": { @@ -5611,7 +5611,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "layer_0_z_overlap": { @@ -5626,7 +5626,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_surface_layers": { @@ -5639,7 +5639,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_surface_thickness": { @@ -5655,7 +5655,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_surface_line_width": { @@ -5671,7 +5671,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_surface_line_spacing": { @@ -5687,7 +5687,7 @@ "value": "raft_surface_line_width", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_interface_thickness": { @@ -5703,7 +5703,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_interface_line_width": { @@ -5719,7 +5719,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_interface_line_spacing": { @@ -5735,7 +5735,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_base_thickness": { @@ -5751,7 +5751,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_base_line_width": { @@ -5767,7 +5767,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_base_line_spacing": { @@ -5783,7 +5783,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" }, "raft_speed": { @@ -5816,7 +5816,7 @@ "value": "raft_speed", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_interface_speed": { @@ -5832,7 +5832,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_base_speed": { @@ -5848,7 +5848,7 @@ "value": "0.75 * raft_speed", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" } } }, @@ -5881,7 +5881,7 @@ "maximum_value_warning": "10000", "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_interface_acceleration": { @@ -5896,7 +5896,7 @@ "maximum_value_warning": "10000", "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_base_acceleration": { @@ -5911,7 +5911,7 @@ "maximum_value_warning": "10000", "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" } } }, @@ -5944,7 +5944,7 @@ "maximum_value_warning": "100", "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_interface_jerk": { @@ -5959,7 +5959,7 @@ "maximum_value_warning": "50", "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_base_jerk": { @@ -5974,7 +5974,7 @@ "maximum_value_warning": "50", "enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')", "settable_per_mesh": false, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" } } }, @@ -6006,7 +6006,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_surface_extruder_nr" }, "raft_interface_fan_speed": { @@ -6021,7 +6021,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_interface_extruder_nr" }, "raft_base_fan_speed": { @@ -6036,7 +6036,7 @@ "enabled": "resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, - "limit_to_extruder": "adhesion_extruder_nr" + "limit_to_extruder": "raft_base_extruder_nr" } } } @@ -6098,7 +6098,7 @@ "unit": "mm", "enabled": "resolveOrValue('prime_tower_enable')", "default_value": 200, - "value": "machine_width - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_x'))) - 1", + "value": "machine_width - max(extruderValue(skirt_brim_extruder_nr, 'brim_width') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_x'))) - 1", "maximum_value": "machine_width / 2 if machine_center_is_zero else machine_width", "minimum_value": "resolveOrValue('prime_tower_size') - machine_width / 2 if machine_center_is_zero else resolveOrValue('prime_tower_size')", "settable_per_mesh": false, @@ -6112,7 +6112,7 @@ "unit": "mm", "enabled": "resolveOrValue('prime_tower_enable')", "default_value": 200, - "value": "machine_depth - prime_tower_size - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(adhesion_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_y'))) - 3", + "value": "machine_depth - prime_tower_size - max(extruderValue(skirt_brim_extruder_nr, 'brim_width') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') else (extruderValue(adhesion_extruder_nr, 'raft_margin') if adhesion_type == 'raft' else (extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if adhesion_type == 'skirt' else 0)), max(extruderValues('travel_avoid_distance'))) - max(extruderValues('support_offset')) - sum(extruderValues('skirt_brim_line_width')) * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - max(map(abs, extruderValues('machine_nozzle_offset_y'))) - 3", "maximum_value": "machine_depth / 2 - resolveOrValue('prime_tower_size') if machine_center_is_zero else machine_depth - resolveOrValue('prime_tower_size')", "minimum_value": "machine_depth / -2 if machine_center_is_zero else 0", "settable_per_mesh": false, From 304f57293dc3392d25afc9bbe252494eeca2cc76 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Jan 2022 14:09:57 +0100 Subject: [PATCH 3/8] Adjust build volume depending on new adhesion extruder sub-settings It should get these settings from the correct extruders even if they are different from one another. Contributes to issue CURA-8868. --- cura/BuildVolume.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index fc5691f034..8cbe535ea7 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -848,10 +848,10 @@ class BuildVolume(SceneNode): """ result = {} - adhesion_extruder = None #type: ExtruderStack + skirt_brim_extruder = None #type: ExtruderStack for extruder in used_extruders: - if int(extruder.getProperty("extruder_nr", "value")) == int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")): - adhesion_extruder = extruder + 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()] = [] # Currently, the only normally printed object is the prime tower. @@ -865,11 +865,11 @@ class BuildVolume(SceneNode): 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 adhesion_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": + 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 = ( - adhesion_extruder.getProperty("brim_line_count", "value") * - adhesion_extruder.getProperty("skirt_brim_line_width", "value") / 100.0 * - adhesion_extruder.getProperty("initial_layer_line_width_factor", "value") + 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 @@ -1100,18 +1100,18 @@ class BuildVolume(SceneNode): # 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. - adhesion_extruder = self._global_container_stack.getProperty("adhesion_extruder_nr", "value") + skirt_brim_extruder_nr = self._global_container_stack.getProperty("skirt_brim_extruder_nr", "value") try: - adhesion_stack = self._global_container_stack.extruderList[int(adhesion_extruder)] + skirt_brim_stack = self._global_container_stack.extruderList[int(skirt_brim_extruder_nr)] except IndexError: - Logger.warning(f"Couldn't find extruder with index '{adhesion_extruder}', defaulting to 0 instead.") - adhesion_stack = self._global_container_stack.extruderList[0] - skirt_brim_line_width = adhesion_stack.getProperty("skirt_brim_line_width", "value") + 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 = adhesion_stack.getProperty("initial_layer_line_width_factor", "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 = self._global_container_stack.getProperty("brim_line_count", "value") + 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 for extruder_stack in used_extruders: @@ -1120,8 +1120,8 @@ class BuildVolume(SceneNode): # 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_distance = self._global_container_stack.getProperty("skirt_gap", "value") - skirt_line_count = self._global_container_stack.getProperty("skirt_line_count", "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 @@ -1132,7 +1132,7 @@ class BuildVolume(SceneNode): # 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": - bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") + bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") # Should refer to the raft extruder if set. elif adhesion_type == "none": bed_adhesion_size = 0 else: @@ -1220,7 +1220,7 @@ class BuildVolume(SceneNode): _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y", "prime_tower_brim_enable"] _ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"] _distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts", "travel_avoid_supports", "wall_line_count", "wall_line_width_0", "wall_line_width_x"] - _extruder_settings = ["support_enable", "support_bottom_enable", "support_roof_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used. - _limit_to_extruder_settings = ["wall_extruder_nr", "wall_0_extruder_nr", "wall_x_extruder_nr", "top_bottom_extruder_nr", "infill_extruder_nr", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "adhesion_extruder_nr"] + _extruder_settings = ["support_enable", "support_bottom_enable", "support_roof_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "skirt_brim_extruder_nr", "raft_base_extruder_nr", "raft_interface_extruder_nr", "raft_surface_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used. + _limit_to_extruder_settings = ["wall_extruder_nr", "wall_0_extruder_nr", "wall_x_extruder_nr", "top_bottom_extruder_nr", "infill_extruder_nr", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "skirt_brim_extruder_nr", "raft_base_extruder_nr", "raft_interface_extruder_nr", "raft_surface_extruder_nr"] _material_size_settings = ["material_shrinkage_percentage", "material_shrinkage_percentage_xy", "material_shrinkage_percentage_z"] _disallowed_area_settings = _skirt_settings + _prime_settings + _tower_settings + _ooze_shield_settings + _distance_settings + _extruder_settings + _material_size_settings From a363bda25ef1ed4d261917972233860ff46fcf04 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Jan 2022 14:12:06 +0100 Subject: [PATCH 4/8] Add raft top extruder to expert settings You could want to change that if you're an expert. The skirt/brim extruder is really only relevant for the prime tower brim if you're using a raft. If not using a raft, setting the adhesion extruder is equivalent. Contributes to issue CURA-8868. --- resources/setting_visibility/expert.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 7882dfda15..0c10d9581b 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -289,6 +289,7 @@ support_mesh_drop_down prime_blob_enable adhesion_type adhesion_extruder_nr +raft_surface_extruder_nr skirt_line_count skirt_gap skirt_brim_minimal_length From 403d92a7601fcbeed6472c5fd6f076b47d612cb2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Jan 2022 14:29:01 +0100 Subject: [PATCH 5/8] Fix getting used and starting extruders with new adhesion extruder settings Getting more involved than I thought. But it's not complex yet. Contributes to issue CURA-8868. --- cura/Settings/ExtruderManager.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 701d3d987b..3095d7111b 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -259,11 +259,20 @@ class ExtruderManager(QObject): if support_roof_enabled: used_extruder_stack_ids.add(self.extruderIds[self.extruderValueWithDefault(str(global_stack.getProperty("support_roof_extruder_nr", "value")))]) - # The platform adhesion extruder. Not used if using none. - if global_stack.getProperty("adhesion_type", "value") != "none" or ( - global_stack.getProperty("prime_tower_brim_enable", "value") and - global_stack.getProperty("adhesion_type", "value") != 'raft'): - extruder_str_nr = str(global_stack.getProperty("adhesion_extruder_nr", "value")) + # The platform adhesion extruders. + used_adhesion_extruders = set() + adhesion_type = global_stack.getProperty("adhesion_type", "value") + if adhesion_type == "skirt" and (global_stack.getProperty("skirt_line_count", "value") > 0 or global_stack.getProperty("skirt_brim_minimal_length", "value") > 0): + used_adhesion_extruders.add("skirt_brim_extruder_nr") # There's a skirt. + if (adhesion_type == "brim" or global_stack.getProperty("prime_tower_brim_enable", "value")) and (global_stack.getProperty("brim_line_count", "value") > 0 or global_stack.getProperty("skirt_brim_minimal_length", "value") > 0): + used_adhesion_extruders.add("skirt_brim_extruder_nr") # There's a brim or prime tower brim. + if adhesion_type == "raft": + used_adhesion_extruders.add("raft_base_extruder_nr") + used_adhesion_extruders.add("raft_interface_extruder_nr") + if global_stack.getProperty("raft_surface_layers", "value") > 0: + used_adhesion_extruders.add("raft_surface_extruder_nr") + 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 if extruder_str_nr in self.extruderIds: @@ -286,8 +295,11 @@ class ExtruderManager(QObject): global_stack = application.getGlobalContainerStack() # Starts with the adhesion extruder. - if global_stack.getProperty("adhesion_type", "value") != "none": - return global_stack.getProperty("adhesion_extruder_nr", "value") + adhesion_type = global_stack.getProperty("adhesion_type", "value") + if adhesion_type in {"skirt", "brim"}: + return global_stack.getProperty("skirt_brim_extruder_nr", "value") + if adhesion_type == "raft": + return global_stack.getProperty("raft_base_extruder_nr", "value") # No adhesion? Well maybe there is still support brim. if (global_stack.getProperty("support_enable", "value") or global_stack.getProperty("support_structure", "value") == "tree") and global_stack.getProperty("support_brim_enable", "value"): From f4bcf9d89e56ae3d91ed8cdbefe0e68214e578b5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Jan 2022 17:55:33 +0100 Subject: [PATCH 6/8] Add more settings for test of build volume limits These new settings are necessary or the test will get exceptions that these settings don't exist. Contributes to issue CURA-8868. --- tests/TestBuildVolume.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/TestBuildVolume.py b/tests/TestBuildVolume.py index f59d83df5e..843b9e9d12 100644 --- a/tests/TestBuildVolume.py +++ b/tests/TestBuildVolume.py @@ -96,7 +96,12 @@ class TestCalculateBedAdhesionSize: self.createAndSetGlobalStack(build_volume) patched_dictionary = self.setting_property_dict.copy() patched_dictionary.update(setting_dict) - patched_dictionary.update({"adhesion_extruder_nr": {"value": 0}}) + patched_dictionary.update({ + "skirt_brim_extruder_nr": {"value": 0}, + "raft_base_extruder_nr": {"value": 0}, + "raft_interface_extruder_nr": {"value": 0}, + "raft_surface_extruder_nr": {"value": 0} + }) with patch.dict(self.setting_property_dict, patched_dictionary): assert build_volume._calculateBedAdhesionSize([]) == result From 732aefedbb3df132717491ff8f2349be0bc4ba7e Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Fri, 14 Jan 2022 09:05:18 +0100 Subject: [PATCH 7/8] Change label to "Raft Top Extruder" To be consistent with Cura's terminology --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e8f7f5530f..60a3ca2408 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5449,7 +5449,7 @@ }, "raft_surface_extruder_nr": { - "label": "Raft Surface Extruder", + "label": "Raft Top Extruder", "description": "The extruder train to use for printing the top layer(s) of the raft. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", From 41f1029dc0691fb9631ca7df5ac2e4146c6fd302 Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Fri, 14 Jan 2022 09:07:41 +0100 Subject: [PATCH 8/8] Use updated python type notation --- cura/BuildVolume.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 8cbe535ea7..64dc4faceb 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -848,7 +848,7 @@ class BuildVolume(SceneNode): """ result = {} - skirt_brim_extruder = None #type: ExtruderStack + 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