From 824c9fd837f26a1554f3b97a95c5f9146e3f0ef2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Jan 2022 13:43:10 +0100 Subject: [PATCH 01/12] 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 02/12] 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 03/12] 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 04/12] 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 05/12] 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 06/12] 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 69d3f0e6f6460f2c8c71a3990bad83f29b55785d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 13 Jan 2022 12:02:59 +0100 Subject: [PATCH 07/12] Add missing default_value and settable_per_mesh Default_value is a required property. Maybe we should have a test for this. Done as a 5 minute fix. Fixes Ultimaker/CuraEngine#1549. --- resources/definitions/fdmprinter.def.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4b33b35daa..7c64362390 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1248,12 +1248,14 @@ "label": "Minimum Feature Size", "description": "Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker than the Minimum Feature Size will be widened to the Minimum Wall Line Width.", "unit": "mm", + "default_value": 0.1, "value": "wall_line_width_0 / 4", "minimum_value": "0", "maximum_value": "wall_line_width_0", "type": "float", "limit_to_extruder": "wall_0_extruder_nr", - "enabled": "fill_outline_gaps" + "enabled": "fill_outline_gaps", + "settable_per_mesh": true }, "min_bead_width": { @@ -1261,13 +1263,14 @@ "description": "Width of the wall that will replace thin features (according to the Minimum Feature Size) of the model. If the Minimum Wall Line Width is thinner than the thickness of the feature, the wall will become as thick as the feature itself.", "unit": "mm", "value": "wall_line_width_0 * (100.0 + wall_split_middle_threshold)/200", - "default_value": "0.2", + "default_value": 0.2, "minimum_value": "0.001", "minimum_value_warning": "min_feature_size", "maximum_value_warning": "wall_line_width_0", "type": "float", "limit_to_extruder": "wall_0_extruder_nr", - "enabled": "fill_outline_gaps" + "enabled": "fill_outline_gaps", + "settable_per_mesh": true }, "xy_offset": { From 73a151ab4983aeafd296aaa3e94baf4f77e9aebb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 13 Jan 2022 13:55:42 +0100 Subject: [PATCH 08/12] Put focus on search bar when Digital Library opens Fixes CURA-8768. --- plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml index 50d3cb61c5..89d282ab83 100644 --- a/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml +++ b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml @@ -50,6 +50,7 @@ Item Layout.fillWidth: true implicitHeight: createNewProjectButton.height leftPadding: searchIcon.width + UM.Theme.getSize("default_margin").width * 2 + focus: true onTextEdited: manager.projectFilter = text //Update the search filter when editing this text field. From 732aefedbb3df132717491ff8f2349be0bc4ba7e Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Fri, 14 Jan 2022 09:05:18 +0100 Subject: [PATCH 09/12] 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 10/12] 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 From b5e7a60a8ada05d73b92863adee23f20091dbefb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 13 Jan 2022 16:38:21 +0100 Subject: [PATCH 11/12] Fix scaling of language and theme drop-downs with width The width was unknown because it's all in a scrollview that could have an infinite width. I now fixed it to scale with the viewport's width. Contributes to issue CURA-8682. --- resources/qml/Preferences/GeneralPage.qml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index e7323393ec..7ea89e34ba 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -17,6 +17,8 @@ UM.PreferencesPage title: catalog.i18nc("@title:tab", "General") id: generalPreferencesPage + width: parent.width + function setDefaultLanguage(languageCode) { //loops through the languageList and sets the language using the languageCode @@ -128,14 +130,14 @@ UM.PreferencesPage ScrollView { + id: preferencesScrollView width: parent.width height: parent.height Column { - - //: Language selection label UM.I18nCatalog{id: catalog; name: "cura"} + width: preferencesScrollView.viewport.width Label { @@ -212,7 +214,7 @@ UM.PreferencesPage Label { id: currencyLabel - text: catalog.i18nc("@label","Currency:") + text: catalog.i18nc("@label", "Currency:") } TextField From 348abad6eb0bd95e959c0aaa742b1806eb91d176 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 14 Jan 2022 17:57:42 +0100 Subject: [PATCH 12/12] Fix maximumWidth properties on ActionButtons Turns out this wasn't really functional. We didn't use it. Now we use it for the MessageStack. Contributes to issue CURA-8682. --- resources/qml/ActionButton.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/ActionButton.qml b/resources/qml/ActionButton.qml index 62bea5df3b..c84018fb07 100644 --- a/resources/qml/ActionButton.qml +++ b/resources/qml/ActionButton.qml @@ -148,8 +148,8 @@ Button // Using parent.width is fine in fixedWidthMode. target: buttonText property: "width" - value: button.fixedWidthMode ? button.width - button.leftPadding - button.rightPadding - : ((maximumWidth != 0 && button.contentWidth > maximumWidth) ? maximumWidth : undefined) + value: button.fixedWidthMode ? (button.width - button.leftPadding - button.rightPadding) + : ((button.maximumWidth != 0 && button.implicitContentWidth > button.maximumWidth) ? (button.maximumWidth - (button.width - button.implicitContentWidth) * 2) : undefined) } }